2.6 Modbus RTU 從站常見問題
Modbus 從(cong) 站的網絡地址與(yu) S7-200 的 CPU 網絡地址有什麽(me) 關(guan) 係?
沒有關(guan) 係。支持網絡通信的通信協議必須有其自己的網絡尋址規定。 Modbus 從(cong) 站的地址隻是它在 Modbus 網絡上的地址,而通常所說的 S7-200 CPU 地址是 CPU 在西門子的 PPI 網絡上的站地址。S7-200 CPU 的大部分通信功能都通過 PPI 網絡完成,例如編程、網絡讀寫(xie) 通信等。
如何理解 Modbus 地址與(yu) 功能碼的區別?
Modbus 地址與(yu) Modbus 的功能碼是兩(liang) 個(ge) 層次的概念。
根據 Modbus 通信協議,Modbus 數據的地址使用 00xxx、10xxx、30xxx 和 40xxx 的形式,分別表示數字量輸出、數字量輸入、模擬量輸入等數據地址。在使用 S7-200 的指令庫時,Modbus 數據地址與(yu) S7-200 的 I/O 和數據存儲(chu) 區地址間有特定的對應關(guan) 係。
有些設備表明它支持 Modbus RTU 通信協議,但也詳細提供了讀寫(xie) 數據的詳細通信幀格式,其中包括如何指定 Modbus 站的地址,需要讀寫(xie) 數據類型、長度等等。數據幀有特定字節指出此指令讀寫(xie) 的數據類型和地址,此字節的數據內(nei) 容即所謂"功能碼",如功能 1 指定讀取單個(ge) /多個(ge) 數字量輸出點的值。
支持 Modbus 協議的設備或軟件,使用時用戶直接設置或看到的應當是 Modbus 數據地址。Modbus 地址所訪問的數據,是通過各種"功能"讀寫(xie) 而來。功能碼是 Modbus 地址的底層。如果 Modbus 通信的一方提供的所謂 Modbus 協議隻有功能碼,則需要注意了解此功能號與(yu) Modbus 地址間的對應關(guan) 係。
Modbus 指令庫啟動後,如何通過同一個(ge) 通信端口進行 CPU 監控?
Modbus 指令庫使用的是 CPU 的自由口通信功能,工作在自由口模式下的通訊口不能使用 Micro/WIN 的 PPI 編程通信監控。如果通信口都已經被占用,可以考慮:
- 加一個通信模塊(如 EM 277、CP 243-1、EM 241 等)擴展出一個編程通信口
- 中止自由口模式,可以將 CPU 上的模式開關從 RUN 撥到 STOP;或者保持處於 RUN 狀態,用程序停止指令庫的 Modbus 模式(參見指令庫應用)
為(wei) 何有些 HMI 軟件使用 Modbus RTU 讀取S7-200中的實數會(hui) 出現錯誤?
有些HMI軟件使用Modbus RTU通信協議時,處理存儲(chu) 在數據保持寄存器中的實數(浮點數)的方式與(yu) 西門子的實數保存格式不同。西門子的PLC遵循"高字節低地址、低字節高地址"的規律。
Modbus RTU的保持寄存器總是以"字(雙字節)"為(wei) 單位,而一個(ge) 實數需要4個(ge) 字節(雙字)表示。HMI軟件在處理時可能會(hui) 把保持寄存器的兩(liang) 個(ge) "字"互換位置,造成不能識別以西門子格式表示的實數。如果HMI軟件一方無法處理這種實數,則可在S7-200 CPU中編程將存入數據緩衝(chong) 區(保持寄存器區)的實數的高字和低字互換。
為(wei) 何有的HMI軟件用Modbus RTU可以讀取作為(wei) 從(cong) 站的S7-200的內(nei) 容,但不能寫(xie) 入?
可能此軟件使用了Modbus功能15(寫(xie) 多個(ge) 離散量)或類似功能(功能 16)。S7-200從(cong) 站協議遵守"以整字節地址邊界(如Q0.0、Q2.0)開始、以8的整數倍為(wei) 位個(ge) 數"的規約。如果HMI軟件未嚴(yan) 格執行此規律就可能發生寫(xie) 入錯誤的情況。
S7-200是否支持 Modbus ASCII 模式?
S7-200可以支持上述模式,但是沒有現成的指令庫,需要用戶自己編程。
項目編譯後為(wei) 何出現很多錯誤?
使用指令庫時,若編譯後出現很多錯誤,一般是因為(wei) 未指定庫指令數據存儲(chu) 區。
分配庫指令數據區調用STEP 7 - Mciro/WIN32 V3.2 Instruction Library(指令庫)需要分配庫指令數據區(Library Memory)。庫指令數據區是相應庫的子程序和中斷程序所要用到的變量存儲(chu) 空間。
如果在編程時不分配庫指令數據區,編譯時會(hui) 產(chan) 生許多相同的錯誤(錯誤18)。
操作步驟(以Modbus RTU庫指令為(wei) 例):
在指令樹的Project(項目)中,以鼠標右鍵單擊Program Block(程序塊),在彈出的快捷菜單中選擇Library Memory。如圖2所示:

圖2
在彈出的選項卡中設置庫指令數據區,如圖2所示:

圖3.缺省情況下是從(cong) VB0開始,但因為(wei) 與(yu) Modbus的保持寄存區衝(chong) 突,所以手動改為(wei) VB2000。按"Suggest Address"按鈕也可以自動分配。
可以使用Suggest Address(推薦地址)設置數據區,但要注意編程軟件設置的數據區地址,隻考慮到了其他一般尋址,而未考慮到諸如Modbus數據保持寄存器區等的設置。應當確保不與(yu) 其他任何已使用的數據區重疊、衝(chong) 突。不應重複按Suggest Address按鈕,否則也會(hui) 造成混亂(luan) 。
在STEP 7-Micro/WIN32 V3.1中,有分配庫指令數據區時有不同的操作方法,需要在Symbol Table(符號表)中設置一個(ge) 首地址。我們(men) 強烈建議使用當時最新的編程版本。
S7-200 CPU的Port1是否可以支持Modbus RTU協議?
可以。用戶可以自己編程實現。
在S7-200的"Tips and Tricks"幫助文檔中,Tip041是Modbus RTU從(cong) 站程序,用戶可以參考。
S7-200是否可以組成Modbus RTU通信網絡?如何組網?
S7-200可以組成RS-485基礎上的Modbus RTU網絡。如果通信對象是不同標準的通信口,可能還需要轉換。
參見:RS-485網絡組成