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