PLC时间和日期类型,一文彻底搞懂各种时间日期相互转换问题
PLC经常用到的时间格式TIME; TIME_OF_DAY; DAY ; DAY_AND_TIME; 很多人只会赋值,不明白存储机制,所以数据之间相互转换和不同设备之间需要传递时间参数,会遇到搞不定的问题,我就遇到了这个问题,我的倍福PLC需要给西门子PLC发送DAY_AND_TIME日期数据,之间只能通过byte传输,一时间没了办法。下面就由我来一步一步解决这个问题。
第一步:配置确定
倍福plc和西门子Profibus模块通讯,数据交换。配置里只有BYTE选项,如下图,选了一个64BYTE的输入输出接口,只能通过BYTE传输数据,再转换成需要的日期数据。
第二步:数据技术分析
我们在项目中需要传输4个时间和日期的数据,TIME; TIME_OF_DAY; DAY ; DAY_AND_TIME;下面一一给列出分析:
TIME类型是时间数据,最少单位为1ms。格式为:T# xx d xx h xx m xx s xx ms。其中:T表示时间常数起始,#表示其后为立即数,d表示天,h表示小时,m表示分,s表示秒,ms表示毫秒。如T#1d2h3m4s500ms,表示1天2小时3分钟4秒500毫秒。
写个模拟程序如下图:把时间存储到DWORD里看每个字节是怎么显示的。如下图程序,time类型无法直接赋值给DWORD,所以需要指令TIME_TO_DWORD,进行转换。
让程序运行起来,给tTime赋值1分钟,如下图,DWORD数据结构dwTime里存储的32位16进制数为00 00 EA 60; 转换为10进制数是60000,而我输入的1分钟即为60000毫秒,所以dwTime里存储的为tTIME最小单位表示的数字。 项目里把32位16进制数00 00 EA 60发给西门子模块就可以,西门子再把它转换为时间就可以了。
总结一下1分钟时间的数据存储结构如下图:
TIME_OF_DAY类型是一天中的时间,时间起始时间12:00AM ,最少单位为1ms。TIME_OF_DAY类型数据格式为:TOD#HH:mm:ss。其中:TOD表示TIME_OF_DAY常数起始,#表示其后为立即数,HH表示小时,mm表示分,ss表示秒。如TOD#13:30:30,表示13点30分30秒。
写个模拟程序如下图:把时间存储到DWORD里看每个字节是怎么显示的。如下图程序,time类型无法直接赋值给DWORD,所以需要指令TOD_TO_DWORD,进行转换。
让程序运行起来,给todTime赋值1:00,如下图,DWORD数据结构dwTime里存储的32位16进制数为00 36 EE 80;转换为10进制数是3600000,而我输入的1:00比起始时间12:00大1小时,也就是3600000ms,所以dwTime里存储的为tTIME最小单位表示的数字。项目里把32位16进制数00 36 EE 80发给西门子模块就可以,西门子再把它转换为时间就可以了。
总结一下1:00的数据存储结构如下图:
DATE类型是日期,最小单位为秒,起始时间1970年1月1日。数据类型的格式为:DATE#YY-MM-DD。其中:DATE表示DATE常数起始,#表示其后为立即数,YY表示年,MM表示月,DD表示日。如DATE#1970-1-2,表示1970年1月2日。
写个模拟程序如下图:把时间存储到DWORD里看每个字节是怎么显示的。如下图程序,time类型无法直接赋值给DWORD,所以需要指令DATE_TO_DWORD,进行转换。
让程序运行起来,给dTime赋值1970-01-02,如下图,DWORD数据结构dwTime里存储的32位16进制数为00 01 51 80;转换为10进制数是86400,而我输入的1970-01-02比起始时间1970-01-01大1天,最小单位为s,也就是86400s,所以dwTime里存储的为dTIME最小单位表示的数字。项目里把32位16进制数00 01 51 80发给西门子模块就可以,西门子再把它转换为时间就可以了。
总结一下1970-01-02的数据存储结构如下图:
DATE_AND_TIME类型是日期和时间组合的数据,最小单位为秒,起始时间1970年1月1日12:00AM。数据格式为:DT#YY-MM-DD-HH:mm:ss。其中:DT表示DATE_AND_TIME常数起始,#表示其后为立即数,YY表示年,MM表示月,DD表示日,HH表示小时,mm表示分,ss表示秒。如1970-1-2-13:30:30,表示1970年1月2日13点30分30秒。
写个模拟程序如下图:把时间存储到DWORD里看每个字节是怎么显示的。如下图程序,time类型无法直接赋值给DWORD,所以需要指令DT_TO_DWORD,进行转换。
让程序运行起来,给datTime赋值1970-01-02-00:01,如下图,DWORD数据结构dwTime里存储的32位16进制数为00 01 51 BC;转换为10进制数是86460,而我输入的1970-01-02-00:01比起始时间1970-01-01大1天1分钟,最小单位为s,也就是86460s,所以dwTime里存储的为dTIME最小单位表示的数字。项目里把32位16进制数00 01 51 BC发给西门子模块就可以,西门子再把它转换为时间就可以了。
总结一下1970-01-02-00:01的数据存储结构如下图:
第三步:西门子侧技术
西门子的数据结构和Codesys平台有些不同,比如DATE_AND_TIME数据结构是下图这样的,转换时候还是要注意下,这里不多说西门子的,以后单独写西门子的数据结构。
最后,时间和日期的数据结构,到此就研究差不多了,不同型号的设备都大同小异,原理都一样,上面西门子的数据结构不同,原理也是一样的,只不过分了不同的字节存储不同的数据。有问题可以评论区问我。
S7-200SMART时钟指令如何正确应用?资深工程师详解
一、导读
(1)时钟指令的认识
西门子S7-200SMART时钟指令分为设置时钟和读取时钟两类,通过设置时钟指令可对CPU的系统时钟进行修改而通过读取时钟指令可读取CPU的系统时钟,时钟指令分为读取和设置时钟指令与读取和设置扩展时钟指令,如图1 所示。
图1:时钟指令(左侧为读取时钟指令,右侧为设置时钟指令)
①读取时钟指令: 当指令EN端条件满足时读取实时时钟指令从 CPU 读取当前时间和日期,并将其装载到从字节地址 T 开始的 8 字节时间缓冲区中。
②设置时钟指令: 设置实时时钟指令通过由 T 分配的 8 字节时间缓冲区数据将新的时间和日期写入到 CPU。
需要注意的是读取出来的值和需要设定的值均需要进行数据格式的转换才行。
(2)时钟指令存储区格式说明
所有日期和时间值必须采用BCD格式(BCD码通俗的说法是用16进制的形式来表示2进制数)分配(例如, 16#12 代表2012年)。00 至99的BCD值范围可分配范围为2000至2099的年份;时间缓冲区如图2所示。
图2
时钟指令的管脚T 就是缓冲区的起始字节地址,可以由用户自由设置(在CPU允许的V存储区范围内)。如果设置T为VB10,那么读取时钟后, “年”的信息就会保存在VB10中, “月”保存在VB11中。
二、时钟指令应用
接下来我们通过一个简单的应用示例来充分理解时钟指令;要求读取CPU实时时间显示在上位机上,同时还可以在上位机上设定CPU时间。读取时间如图3所示。
图3:时钟读取
调用时钟读取指令并以系统时钟SM0.5触发,由于读取出来的均是BCD码,因此需要通过转换指令进行转换过后才是最终的日期时间。
另外还需要进行时间的设定,由于我们需要在上位机上进行时间的设定,考虑到设定的数据格式依然是BCD码,但是上位机上通常使用的是十进制数,因此我们同样需要进行转换之后,再使用其设定地址的低字节进行传送至各个字节地址中,如图4所示。
图4:设定时钟
三、结语
通过本示例的分享,相信大家已经掌握了其基本的使用。下面为大家分享关于时钟指令的几点需要注意的:
(1)进行时钟的设定时,只需要导通一个周期即可把设定值写入。不能一直导通EN端,否则读取时钟指令的时间将会有错误。
(2)调用时钟指令时需要在EN位中使用SM0.5系统时钟进行调用。
(3)时钟指令需要使用连续的8个字节作为时间缓冲区的存储,其中缓冲区中的第6个字节为保留,并且这连续的8个字节不能和其他存储区重复使用。
(4)除了通过令设定时钟之外,还可以通过编程软件 Micro/WIN SMART 设置 CPU 的时钟,必须先建立编程通信连接。在 Micro/WIN SMART 菜单中选择“PLC “→”设置实时时钟”,打开“PLC 时钟操作”对话框进行设定。
(5)S7-200 SMART CPU 靠内置超级电容为实时时钟提供电源缓冲,保持时间为典型值7天,最小值6天。缓冲电源放电完毕后,再次上电后时钟将停止在缺省值,并不开始走动,所以如果设备停电时间超过一周时,需要添加电池信号板,电池板的时钟保持时间约为1年。
(技成培训网原创,作者:眭相建,未经授权不得转载,违者必究)
更多相关PLC应用和案例
相关问答
三菱plc时间d如何改为秒?
要将三菱PLC的时间单位从"D"(天)改为"秒",可以按照以下步骤进行设置:进入PLC编程软件(如GXWorks2或GXDeveloper)。打开你的P...
wincc怎么样读取并显示plcs7-300的日期和时间-ZOL问答
S7-300的日期跟时间可以存到一个地址上,WINCC再读这个地址就可以了。是哪个SFC你要查一下。有用(0)回复1729468020SFC0设置时钟,SFC1读取时钟。在程序编辑...
我想把整数转换成时间:小时:分钟:1200plc该怎么编啊?
方法一:=(DAY(C10)*24+HOUR(C10))*60+MINUTE(C10)方法二:=INT(C10*24*60)方法一:=(DAY(C10)*24+HOUR(C10))*60+MINUT...
plc内部电池坏了,时针需要校正吗?
如果PLC内部电池坏了,时针可能会失去准确性。因此,校正时针是必要的,以确保PLC的时间记录和操作的准确性。校正时针可以通过重新设置PLC的时间或更换内部电池...
西门子s7-200smartplc怎么样改系统时间-ZOL问答
在你已经建立与PLC连接后,通过下面图片操作,会弹出对话框,根据PC时间,点确定就好。有用(0)回复kjlrnmruoj程序发panyaodong126.com,我有空帮看有用(0)回....
三菱PLC在梯形图中通过语句表的指令写一个时间怎么写?-盖德...
自学gx软件,在梯形图中通过语句表的指令写一个时间怎么写?比如写一个x0,可以不选图形直接写ldx0,那么时间的怎么写?是不是直接写t0k6000?我这样...
汇川时间比较的编写方法?
编写汇川时间比较的方法可以通过以下步骤实现:首先,获取需要比较的两个时间。然后,将两个时间转换为统一的时间格式,例如UNIX时间戳或日期对象。接下来,使...
怎么把plc中计时器的时间用数码管动态显示出来?
将十进制的数值转换为二进制的输出点,就可以了,例如三菱中,一个C10的计数器,如{BCDC10K4Y0}通过BCD码将十进制数(C10)转成二进制的数(Y0到Y15),把Y0到Y15接...
plc电加热器器不到时间就停了是怎么回事?
1.是因为电加热器的PLC控制系统出现了故障。2.PLC控制系统是一种用于自动化控制的计算机系统,它通过编程控制电加热器的运行。如果电加热器在设定的加热时间...
plc电池多久换新?
1)三菱fx2n-32PLC锂电池寿命5年左右,到时候需要更换电池。2)三菱fx2n-32PLC面板上有电池报警灯(BATT.V),如果电池报警灯亮说明电池快要是失效,一般需要在...