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數據結構是下圖這樣的,轉換時候還是要注意下,這裡不多說西門子的,以後單獨寫西門子的數據結構。
最後,時間和日期的數據結構,到此就研究差不多了,不同型号的設備都大同小異,原理都一樣,上面西門子的數據結構不同,原理也是一樣的,隻不過分了不同的字節存儲不同的數據。有問題可以評論區問我。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!