組網概述
本文以 ZKA-4488-WIFI 為(wei) 例介紹西門子PLC與(yu) 深圳市綜科智控科技開發有限公司的IO設備進行Modbus通訊的步驟設置。ZKA-4488-WIFI 是 8 路數字量輸入(DI),8 路數字量輸出(DO),4 路模擬量輸入(AI,0/4-20mA),4 路模擬量輸出設備(AO,0/4-20mA),無線WIFI通信。
以 ZKA-4488-WIFI為(wei) 例,出廠默認通訊參數如下:
ZK模塊 IP 為(wei) :192.168.0.105
TCP 端口為(wei) :10001
(注意:我們(men) 模塊出廠時默認端口為(wei) 10001,客戶也可以通過ZK模塊的配置文件把ZK通訊端口改成modbus-tcp的默認端口502)
工作模式為(wei) :服務器模式
S7-200 Modbus TCP通信
1 S7-200 Modbus TCP 通信簡介
Modbus 是公開通信協議,詳細的協議和規範,請訪問 Modbus 組織的網站:https://www.modbus.org/
Modbus TCP 是通過工業(ye) 以太網 TCP/IP 網絡傳(chuan) 輸的 Modbus 通信。S7-200 SMART 采用客戶端-服務器方法,Modbus 客戶端設備通過該方法發起與(yu) Modbus 服務器設備的 TCP/IP 連接。
建立連接後,客戶端向服務器發出請求,服務器將響應客戶端的請求。客戶端可請求從(cong) 服務器設備讀取部分存儲(chu) 器,或將一定數量的數據寫(xie) 入服務器設備的存儲(chu) 器。如果請求有效,則服務器將響應該請求;如果請求無效,則會(hui) 回複錯誤消息。
S7-200 SMART 支持做 Modbus TCP 的客戶端或者服務器,可以實現 PLC 之間通信,也可以實現與(yu) 支持此通信協議的第三方設備通信。通信夥(huo) 伴數量比較多的時候,可以使用交換機,擴展以太網接口。
2 Modbus TCP 指令庫
STEP7-Micro/WIN SMART 從(cong) V2.4 版本開始,軟件中直接集成 Modbus TCP 庫指令。
安裝軟件後,Modbus TCP 指令位於(yu) STEP7-Micro/WIN SMART 項目樹中“指令”文件夾的“庫”文件夾中。如圖2.Modbus TCP庫指令所示。
指令分為(wei) 客戶端和服務器兩(liang) 種,目前指令版本為(wei) V1.0。客戶端指令會(hui) 占用開放式用戶通信資源主動連接,最多8個(ge) ;服務器指令會(hui) 占用開放式用戶通信資源的被動連接資源,最多也是8個(ge) 。
圖2.Modbus TCP庫指令
Modbus TCP 客戶端:
Modbus 客戶端指令MBUS_CLIENT使用 CPU 的以下資源:
占用主動連接資源。最多有8個(ge) 主動連接資源
連接多個(ge) 服務器夥(huo) 伴時,自動生成連接 ID。
Modbus TCP 客戶端使用以下程序實體(ti) :
1 個(ge) 子程序
2849 個(ge) 字節的程序空間
V 存儲(chu) 器的 638 字節模塊,用於(yu) 指令符號
Modbus TCP 服務器:
Modbus 服務器指令 MBUS_SERVER 使用 CPU 的以下資源
占用被動連接資源。最多有8個(ge) 被動連接資源
連接多個(ge) 客戶端夥(huo) 伴時,自動生成連接 ID。
Modbus TCP 服務器使用下列程序實體(ti) :
1 個(ge) 子程序
2969 個(ge) 字節的程序空間
V 存儲(chu) 器的 445 字節模塊,用於(yu) 指令符號
指令庫編程後,必須從(cong) STEP 7-Micro/WIN SMART 的為(wei) 使用的指令分配庫存儲(chu) 區地址。
3 Modbus TCP 功能編程
下麵以一台S7-200 SMART和一台ZKA-4488-ETH 之間進行Modbus TCP 通信為(wei) 例,詳細闡述客戶端與(yu) 服務器側(ce) 如何編程及通信的過程。具體(ti) 的實驗環境見表1.;通信任務見表2:
表1.實驗環境
操作係統 | WIN7 SP1 專業版 64位 |
編程軟件 | STEP7-Micro/WIN SMART V2.4版本 |
硬件 | CPU SR60:6ES7288-1SR60-0AA0 固件:V2.4 版本ZKA-4488-WIFI:綜科智控4AI+4AO+8DI+8DO以太網modbus-tcp通信交換機:CSM 127 6GK7 277-1AA10-0AA0 |
表2.通信任務
硬件 | 通信角色 | IP地址 | 端口號 | 讀/寫 | 數據區域 |
CPU SR60 | 客戶端 | 192.168.0.60 | 0 | 讀 | VB20-VB31 |
ZKA-4488-WIFI | 服務器 | 192.168.0.105 | 10001 | 響應 | AI1~AI3模擬量采集值 |
客戶端側指令編程
1、係統塊中設置客戶端的IP地址,以確保IP地址設置無誤。此步驟為(wei) 可選,如果確定IP地址設置無誤,可忽略此步驟。設置方法如圖2.所示。
圖2.係統塊設置IP地址
2、鼠標點擊 MAIN 主程序的程序段1的編程區域,從(cong) 庫文件夾下找到 Modbus TCP 客戶端指令 MBUS_CLIENT,鼠標雙擊,指令出現在程序段1中,操作如圖3.所示。
圖3.添加客戶端指令
3、填寫(xie) 客戶端指令參數,如圖4.所示。
圖4.填寫(xie) 客戶端參數
程序塊具體(ti) 參數詳細解釋介紹見表3.
參數及類型 | 數據類型 | 說明 | |
Req | IN | BOOL | =1:表示向服務器發送Modbus 請求 |
Connect | IN | BOOL | =1:嚐試與分配的IP地址及端口號建立連接;=0:嚐試斷開已經建立的連接,忽略Req的任何請求 |
ipadsdr1-4 | IN | BYTE | 填寫 Modbus TCP 服務器的IP地址ipadsdr1-4為高到低字節 |
IP_Port | IN | BYTE | 填寫Modbus TCP 服務器的端口號 |
RW | IN | BYTE | 指定操作模式 =0:讀;=1寫 |
Addr | IN | DWORD | 要進行讀寫的參數的 Modbus 起始地址,本例中也即ZKA-4488-ETH寄存器地址 |
Count | IN | INT | 要進行讀寫的參數數據長度;數字量輸入/輸出Count=1表示1 bit,最大1920位對於模擬量輸入和保持寄存器,最大 Count 值為 120 字。本例中讀取AI1~AI3模擬輸入的讀數,因為每個AI輸入通道占用2個WORD寄存器地址,所以讀取3個通道AI1~AI3就需要讀取6個WORD寄存器 |
DataPtr | IN_OUT | DWORD | 數據寄存器地址指針,指向本地用於讀/寫操作的數據地址區域的首地址 |
Done | OUT | BOOL | TRUE:以下任一條件時為真:客戶端已與服務器建立連接;客戶端已與服務器斷開連接;客戶端已接收 Modbus 響應;發生錯誤 FALSE:客戶端正忙於建立連接或等待來自服務器的 Modbus 響應。 |
Error | OUT | BOOL | 出現錯誤,僅一個周期有效 |
4、鼠標選中程序塊文件夾,單擊右鍵,下拉菜單中選擇庫存儲(chu) 器,如圖5.所示。
圖5.點擊庫存儲(chu) 器
5、在庫存儲(chu) 區分配對話框中手動輸入存儲(chu) 區的起始地址。此實例為(wei) VB5000開始,以使指令庫可以正常工作。確保庫存儲(chu) 區與(yu) 程序中其他已使用的地址不衝(chong) 突。使用建議地址無法確定是否有地址重疊,所以推薦手動輸入正確的庫存儲(chu) 區首地址。如圖6.所示。

圖6.庫存儲(chu) 區地址分配
6、編譯項目,下載程序。
將M0.0置位為(wei) 1,然後在狀態圖表中創建變量,VW20-VW30 共6個(ge) 字,監視值如圖7.所示。

圖7.讀取ZKA-4488-ETH的數據
4 關(guan) 於(yu) Modbus TCP協議及地址
S7-200 SMART 做 Modbus TCP 通信,可以支持的功能碼及功能描述及所占用的地址區,如表4.所示。客戶端會(hui) 主動的發送請求,服務器響應。在通信指令填寫(xie) 參數中沒有直接填寫(xie) 功能碼,而是通過多個(ge) 參數填寫(xie) 共同確定功能碼的。
表4.功能碼概況說明
功能碼(十進製) | 功能描述 | RW | Addr | Count | CPU地址 |
01 | 讀數字量輸出 位 | 0 | 00001-09999 | 1-1920 位 | Q0.0-1151.7 |
02 | 讀數字量輸入 位 | 0 | 10001-19999 | 1-1920 位 | I0.0-1151.7 |
03 | 讀寄存器 字 | 0 | 40001-49999400001-465535 | 1-120 字 | V區 |
04 | 讀模擬量輸入 字 | 0 | 30001-39999 | 1-120 字 | AIW0-AIW110 |
05 | 寫數字量輸出 單個位 | 1 | 00001-09999 | 1位 | Q0.0-Q1151.7 |
06 | 寫寄存器 單個字 | 1 | 40001-49999400001-465535 | 1個字 | V區 |
15 | 寫數字量輸出 多個位 | 1 | 00001-09999 | 1-1920 位 | Q0.0-1151.7 |
16 | 寫寄存器 多個字 | 1 | 40001-49999400001-465535 | 1-120 字 | V區 |
舉(ju) 例:
和Modbus TCP服務器交換數據參數支持功能碼:03,在客戶端指令中設置兩(liang) 個(ge) 參數確定03功能碼:
RW=0:確定讀取數據,(篩選出可能會(hui) 使用的功能碼:01,02,03,04),
Addr:40001-49999/400001-465535,表示交換數據為(wei) 寄存器類型的數據。
5 Modbus TCP 常問問題
1、如何判斷Modbus TCP連接是否建立?
答:進行Modbus TCP通信,需要建立連接,
S7-200 SMART CPU作為(wei) Modbus TCP客戶端時:通過Modbus TCP Client指令 MBUS_CLIENT 的符號表中的 mConnected 參數來判斷,如圖1.所示
mConnected=1 表示已經建立連接,mConnected=0 表示尚未建立連接

圖1.mConnected判斷連接狀態
注意:當PLC內(nei) 存在多個(ge) 客戶端或者多個(ge) 服務器時,不建議參考該狀態點。
2、如何查看錯誤代碼?
答:出現錯誤時,MBUS_CLIENT 指令輸出參數Done 會(hui) 為(wei) 1,但是,Done在連接建立完成,連接斷開,響應完成時都會(hui) 出現置位為(wei) 1的情況。
出現錯誤時,還有Error字節會(hui) 顯現出錯誤代碼,僅(jin) 保留一個(ge) 周期時間。
綜上所述,查看錯誤代碼,可以按照圖3.所示的方法進行。

圖3.查看錯誤代碼
3、進行 Modbus TCP 通信寄存器類型數據,數據量大超過120個(ge) 字如何處理?
答:如果數據量超過120個(ge) 字,可以進行如下兩(liang) 種方法操作:
A、建立多個(ge) 連接,不同連接之間,可以並行操作,因為(wei) 占用的通信資源不同;
B、建立一個(ge) 連接,進行多個(ge) 操作,不同操作之間需要進行輪詢,同一時刻隻有一個(ge) 操作在進行。
4、Modbus TCP通信時,如何訪問地址範圍大於(yu) 49999 的保持寄存器?
Modbus 保持寄存器地址在 40001 到 49999 這一範圍內(nei) 。該範圍足以滿足大多數應用的要求,但有些 Modbus 從(cong) 站設備將數據映射到地址範圍更大的保持寄存器中。 MBUS_CLIENT 指令允許參數 Addr 的附加範圍,以支持 400001 至 465536 的保持寄存器地址的擴
展範圍。例如,要訪問保持寄存器 16768,請將 MBUS_CLIENT 的 Addr 參數設置為(wei) 416768。 擴展尋址允許訪問 Modbus 協議支持的全部 65536 個(ge) 可能地址。此擴展尋址僅(jin) 適用於(yu) 保持寄存器。
5、S7-200 SMART作為(wei) Modbus TCP客戶端, 服務器為(wei) 網關(guan) 模塊,連接多個(ge) Modbus RTU 設備時如何區分 Modbus RTU 從(cong) 站地址能?
答:S7-200 SMART CPU 作為(wei) Modbus TCP 客戶端與(yu) Modbus TCP 服務器通信,當嚐試訪問比 Modbus TCP 服務器更低端的串行子網中的設備,會(hui) 有報錯 "無法建立連接"。如果 Modbus TCP 服務器用於(yu) Modbus RTU 協議的網關(guan) ,則 MB_UNIT_ID 可用於(yu) 識別串行網
絡上連接的從(cong) 站設備。MB_UNIT_ID 用於(yu) 將請求轉發到正確的 Modbus RTU 從(cong) 站地址。一些 Modbus TCP 設備可能要求 MB_UNIT_ID 參數在限製範圍內(nei) 。該參數所在位置,如圖4.所示
mModbusUnitID默認值為(wei) 255(16#FF),如果從(cong) 站設備有多個(ge) ,可以S7-200 SMART 和網關(guan) 模塊建立一個(ge) 連接,在這個(ge) 連接上通過修改UnitID的值進行UnitID的輪詢。
圖4.mModbusUnitID
6、對於(yu) 一些服務器不支持寫(xie) 單個(ge) 數字量輸出位(功能碼 5)/單個(ge) 保持寄存器(功能碼 6),S7-200 SMART 如何實現寫(xie) 單個(ge) 位/字。
答:一些 Modbus 服務器設備不支持 Modbus 功能寫(xie) 入單個(ge) 離散輸出位(Modbus 功能 5)或寫(xie) 入單個(ge) 保持寄存器(Modbus 功能 6)。相反,這些設備隻支持多位寫(xie) 入(Modbus 功能 15)或多寄存器寫(xie) 入(Modbus 功能 16)。如果服務器設備不支持單個(ge) 位/字 Modbus
功能,則 MBUS_CLIENT 指令將返回錯誤代碼 1。Modbus 客戶端協議允許強製 MBUS_CLIENT 指令使用多個(ge) 位/字 Modbus 功能,而非使用單個(ge) 位/字 Modbus 功能。可通過在 Modbus 客戶端符號表中查找符號 mModbusForceMulti,並在程序執行 MBUS_CLIENT 之前
更改此值,來強製多個(ge) 位/字指令。將 mModbusForceMulti 設置為(wei) TRUE,可在寫(xie) 入單個(ge) 位或寄存器時強製使用多個(ge) 位/字功能。如圖5.所示。