鈴~~~!電話響起------您好!歡迎您撥打西門子技術(shù)支持熱線。
客戶:我這邊是個S7-200的PLC系統(tǒng),226 CN PLC 的port0口做modbus主站,讀取一個儀表的數(shù)據(jù),數(shù)據(jù)能通信,但是讀過來的數(shù)據(jù)不對。
工程師:根據(jù)您的描述,那么應(yīng)該已經(jīng)通信上了,我們可以最后再排查程序問題。首先請檢查接線,引腳3是信號+,引腳8是信號-。
另外,請問有核實兩邊的數(shù)據(jù)存儲格式是否一致嗎?因為西門子plc的數(shù)據(jù)存儲格式是低位高字節(jié),按照以VW0為例,就是高8位為VB0,低8位為VB1.如果儀表那邊是高位高字節(jié),即:高8位為VB1,低8位為VB0.那么兩邊正好相反,即便通信上了,數(shù)據(jù)對不上是可能的。西門子的低位高字節(jié)數(shù)據(jù)存儲格式示意請參見:
客戶:好,我先去核實一下。= = = = = =
客戶:您好,modbus通信已經(jīng)沒問題了。PLC這邊數(shù)據(jù)已經(jīng)讀取進來,我想問下讀到的數(shù)應(yīng)該是什么格式的。我這邊一個數(shù)65500,PLC這邊為什么是負數(shù)。
工程師:PLC在程序中監(jiān)控和運算多是以有符號整數(shù)進行的,VW或者VD的最高位是符號位,如果對于Word來說,大于32767后數(shù)據(jù)為負。
通過modbus通信過來的數(shù)都是負數(shù)是嗎?剛才65500的數(shù)是多少?除了程序塊監(jiān)控外,狀態(tài)表在線監(jiān)控,數(shù)據(jù)格式選擇無符號后數(shù)據(jù)讀取是否正常。
客戶:哦,都是大數(shù)才為負數(shù),應(yīng)該是都大于32767的。狀態(tài)表里譬如VW100吧,無符號數(shù)是65500,有符號數(shù)是-35,數(shù)據(jù)格式選擇無符號的就正確。
工程師:數(shù)據(jù)存儲實際上都是按照二進制進行的,只是讀取它時的數(shù)據(jù)格式不同而已,您可以在狀態(tài)表中選擇無符號數(shù)。
客戶:不是啊,我就是要正數(shù)。關(guān)鍵是我把這個數(shù)轉(zhuǎn)換成實數(shù)后還帶著負號,我port 1口連了第三方的觸摸屏,觸摸屏上選擇的是實數(shù)連接,讀上來后屏那邊顯示的是負數(shù),不行啊。
工程師:嗯~,請問您是怎么進行編程轉(zhuǎn)換的。
客戶:我就是先用I_DI,再DI_R。不行啊,大數(shù)就錯了,小數(shù)才不帶符號。
工程師:您先別著急,按照正常的編程方式,您的思路是正確的,可對于負數(shù)來說就不行了。可以換種思路來考慮,對于word或者d-word的格式來說,數(shù)據(jù)的最高位是符號位。那么我們最開始轉(zhuǎn)換成雙字的時候,去掉符號就行了。
客戶:我也試過,讓這個數(shù)與16#7F相乘來去掉符號位,那就不對了,數(shù)就不對了。你這也不行啊
工程師:請先不要著急,我說的不是這個方法。在轉(zhuǎn)換成雙字的時候不要把最高位當(dāng)作符號位,如下圖,先來了解符號位的定義:
通過I_DI的轉(zhuǎn)化,實際上是將VW0-VD0,可是如果將VW0直接放在VW2上,同時VW0清0,直接去讀取VD0是什么情況?原先VW0中的符號位,在VW2中,并不是VD0的最高位即符號位,在VD0里就是數(shù)據(jù)了。而與此同時,我們?nèi)サ袅素撎柺菃帷?BR>舉例:VW0=65500(無符號整數(shù)),經(jīng)過I_DI給VD10.
對比:VD0,雙字轉(zhuǎn)換后的VD10,和僅僅將VW0傳送給VW6后的VD4,這幾個數(shù)的比較,請參見下面的實驗結(jié)果: