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