在自动化控制系统中,PLC(可编程逻辑控制器)常常需要处理与时间相关的数据类型,比如TIME、TIME_OF_DAY、DAY、DAY_AND_TIME等格式。很多工程师在使用这些时间类型时,往往只会进行简单的赋值操作,但对其背后的存储机制并不了解。这导致在数据转换或设备间传递时间信息时,往往遇到困难。最近,我在工作中就遇到了这个问题:需要通过倍福PLC将日期数据(格式为DAY_AND_TIME)传递给西门子PLC,而两者之间只能通过字节(byte)进行通信,初时让我一度无从下手。接下来,我将详细分享我的解决思路和过程。
设备间的通信
在我们使用倍福PLC与西门子的Profibus模块进行通信时,配置选项中只有BYTE类型可供选择。为了让数据正确传输,我选择了一个64字节的输入/输出接口,只能通过BYTE格式传输数据,然后将其转换为所需的日期时间数据格式。
在这个项目中,我们需要传输四种类型的时间和日期数据,分别是TIME、TIME_OF_DAY、DAY、DAY_AND_TIME。接下来,我将逐一分析这些数据类型。
TIME数据类型
TIME类型表示时间数据,它的最小单位为1毫秒。其格式为:
T#xxdxxhxxmxxsxxms
其中,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进制数为0000EA60。这个数转换为十进制是60000,恰好等于1分钟(即60000毫秒)。dwTime存储的是TIME类型的最小单位——毫秒数。然后,我将这个32位16进制数0000EA60传送给西门子PLC,西门子会将其转换为对应的时间值。
TIME_OF_DAY数据类型
TIME_OF_DAY类型表示的是一天中的时间,其最小单位也是1毫秒。其格式为:
TOD#HH:mm:ss
其中,TOD表示时间常量的起始标记,#表示后面是立即数,HH表示小时,mm表示分钟,ss表示秒。
例如,TOD#13:30:30表示130分30秒。
在模拟程序中,同样使用指令TOD_TO_DWORD将TIME_OF_DAY数据转换为DWORD格式。我为todTime变量赋值1:00,最终得到的dwTime存储的32位16进制数为0036EE80。转换为十进制,得到的数值是3600000,表示从12:00 AM起经过了1小时(即3600000毫秒)。将此数据传输给西门子PLC,西门子会自动进行时间的转换。
DATE数据类型
DATE类型表示日期,其最小单位为秒,起始时间为1970年1月1日。其格式为:
DATE#YY-MM-DD
例如,DATE#1970-01-02表示1970年1月2日。
同样,我通过编写程序,使用DATE_TO_DWORD指令将DATE类型转换为DWORD。为dTime变量赋值为1970年1月2日,dwTime存储的32位16进制数为00015180,转换为十进制是86400,表示从1970年1月1日到1970年1月2日的秒数(86400秒)。这个数字可以通过西门子PLC进行日期转换。
DATE_AND_TIME数据类型
DATE_AND_TIME类型是日期和时间的组合,最小单位为秒,起始时间为1970年1月1日12:00 AM。其格式为:
DT#YY-MM-DD-HH:mm:ss
例如,DT#1970-01-02-13:30:30表示1970年1月2日130分30秒。
在程序中,我为datTime赋值为1970年1月2日00:01,经过DT_TO_DWORD指令转换后,dwTime的32位16进制数为000151BC,转换为十进制是86460,表示从起始时间1970年1月1日12:00 AM到1970年1月2日00:01的秒数(86460秒)。同样,这个值可以通过西门子PLC进行转换。
注意事项
尽管倍福PLC和西门子的时间数据结构有所不同,但它们在原理上是相通的。两者都将不同的数据类型分解为不同字节进行存储。西门子PLC的时间格式和Codesys平台的格式有所差异,但它们的转换原理是一致的。我们只需注意各自的数据存储方式,就能顺利进行数据交换。
通过上述分析和实验,我们成功解决了倍福PLC与西门子PLC之间关于时间和日期数据传输的问题。虽然不同设备的数据结构可能有所不同,但基本原理相同。掌握了这些时间数据类型的存储机制,设备间的时间数据传输将变得更加简便。如果在使用过程中遇到类似问题,可以参考上述方法进行调试和解决。欢迎大家在评论区分享您的经验与问题,我们一起探讨更多技术细节。