TIA V13 SP1版本軟件中提供了2個版本的Modbus RTU指令:編程
圖1. 兩個版本Modbus RTU指令服務器
早期版本的Modbus RTU指令(圖1. 中 MODBUS (V2.2))僅可經過CM1241通訊模塊或CB1241通訊板進行Modbus RTU通訊。
新版本的 Modbus RTU指令(圖1. 中 MODBUS(RTU) V3.0)擴展了Modbus RTU的功能,該指令除了支持CM1241通訊模塊、CB1241通訊板,還支持 PROFINET 或 PROFIBUS 分佈式 I/O 機架上的PTP通訊模塊實現Modbus RTU通訊。網絡
新版本 Modbus RTU指令所支持的PTP模塊以下圖2.所示:異步
圖2. 新版本 Modbus RTU指令所支持的PTP模塊 分佈式
新版本Modbus RTU指令中包含Modbus RTU 主站指令和從站指令。本文以 CPU1217C+CM1241 RS422/485+ET200SP CM PTP 模塊爲例,介紹新版本 Modbus RTU 指令主從通訊的編程步驟。
其中CPU 機架CM1241 RS422/485做爲Modbus RTU從站,分佈式機架ET200SP 中 CMPTP 模塊做爲Modbus RTU主站。網絡結構圖以下:函數
圖3. Modubus RTU 網絡通訊結構圖測試
本項目中使用到的硬件和軟件以下:優化
硬件:
① CPU1217C (定貨號: 6ES7 217-1AG40-0XB0),固件版本V4.1.3
② CM1241 RS422/485模塊 (定貨號:6ES7 241-1CH32-0XB0),固件版本V2.1
③ 24V 電源PS307(定貨號:6ES7307-1KA02-0AA0)
④ ET200 SP IM155-6PN HF(定貨號:6ES7155-6AU00-0CN0)
⑤ CM PTP模塊(定貨號:6ES7137-6AA00-0BA0)操作系統
軟件:
① TIA V13 SP1 UP 93d
打開設備視圖,添加S7-1200CPU,並在硬件目錄裏找到「通訊模塊」→「點到點」→「CM1241(RS422/485)」,拖拽此模塊至CPU左側便可,以下圖4.所示:
圖4. 添加 CM 1241 RS422/485模塊
注意:
固件版本>=V2.1 的CM 1241 RS422/485模塊,才支持新版本Modbus RTU指令。
接下來,在「設備視圖」中用鼠標選中CM1241(RS422/485)模塊,在「屬性」→「端口組態」中配置此模塊硬件接口參數,
本例以傳輸率=9.6Kbps,奇偶校驗=無奇偶校驗,數據位=8位字符,中止位=1爲例。如CM 1241 端口組態設置以下圖5.所示:
圖5. CM1241 RS422/485 模塊端口組態
最後在「硬件標識符」裏確認一下硬件標識符爲269(該參數在程序編程中會被使用),以下圖6.所示:
圖6 硬件標識符
另外,S7-1200 還提供了系統和時鐘存儲器功能,爲了便於後續指令,建議使能該功能。在CPU 「屬性」→「常規」→「系統和時鐘存儲器」使能系統和時鐘存儲器功能,如圖7. 所示。
圖7. 系統和時鐘存儲器功能
打開網絡視圖並拖入一個ET200SP站點,並將其分配給相應的IO 控制器(本例CPU1217C 爲 IO 控制器),如圖8.所示。
圖8. 插入ET200SP站點
在ET200SP的"設備視圖"環境下,爲ET200SP 站點添加信號、通訊模塊和服務器模塊,在本例中只添加了CM PTP模塊和服務器模塊。
注意:
ET200SP站點中,服務器模塊是必須組態的。服務器模塊隨接口模塊一塊兒採購,無需單獨購買。
ET200SP接口模塊須要爲其分配IP地址和Device Name, 有關ET200 SP 分佈式IO 組態詳細步驟,請參考《ET200 SP 使用快速入門》,本例再也不描述Profinet IO通訊的相關設置與步驟。
《ET200 SP 使用快速入門》下載連接:
https://support.industry.siemens.com/cs/cn/zh/view/78304711
在ET200SP"設備視圖"中用鼠標選中CM PTP,在「屬性」→「常規」→「接口」→「操做模式」中配置此模塊硬件接口參數,
本例設定「指定工做模式":"半雙工(RS485)2線制操做";"接收線路的初始狀態":"無"。以下圖9.所示:
圖9. CM PTP 操做模式
接下來,在「屬性」→「常規」→「接口」→「端口組態」中配置此模塊端口組態參數,
本例設定"協議":"Freeport/Modbus";"端口參數"設置:傳輸率=9.6Kbps,奇偶校驗=無奇偶校驗,數據位=8位字符,中止位=1爲例。端口組態設置以下圖10.所示:
圖10. CM PTP 端口組態
最後須要在「硬件標識符」裏確認一下CM PTP 模塊硬件標識符,該參數在程序編程中會被使用。
Modbus RTU主站編程須要調用Modbus_Comm_Load 指令和Modbus_Master 指令,其中Modbus_Comm_Load 指令經過 Modbus RTU 協議對通訊模塊進行組態,Modbus_Master 指令可經過由 Modbus_Comm_Load 指令組態的端口做爲 Modbus 主站進行通訊, Modbus_Comm_Load 指令的 MB_DB 參數必須鏈接到 Modbus_Master 指令的(靜態)MB_DB 參數。
本例中分佈式機架ET200SP 中 CM PTP 模塊做爲Modbus RTU主站,其相關編程步驟以下:
圖11. 拖入Modbus RTU 主站指令
Modbus_Comm_Load指令各參數意義以下表1所示:
引腳 |
說明
|
---|---|
REQ |
上升沿觸發
|
PORT |
通訊端口的硬件標識符
|
BAUD |
波特率選擇:3600,6000,12000,2400,4800,9600,19200,38400,57600,76800,115200
|
PARITY |
奇偶檢驗選擇:0-無;1-奇校驗;2-偶校驗
|
FLOW_CTRL |
流控制選擇:0-(默認值)無流控制
|
RTS_ON_DLY |
RTS延時選擇:0-(默認值)
|
RTS_OFF_DLY |
RTS關斷延時選擇:0-(默認值)
|
RESP_TO |
響應超時: 默認值 = 1000 ms。MB_MASTER 容許用於從站響應的時間(以毫秒爲單位)。 |
MB_DB |
對 Modbus_Master 或 Modbus_Slave 指令的背景數據塊的引用。 |
DONE |
若是上一個請求完成而且沒有錯誤,DONE 位將變爲 TRUE 並保持一個週期。 |
ERROR |
若是上一個請求完成出錯,則 ERROR 位將變爲 TRUE 並保持一個週期。 STATUS 參數中的錯誤代碼僅在 ERROR = TRUE 的週期內有效。 |
STATUS |
端口組態錯誤代碼,請參考TIA 軟件在線幫助或S7-1200 系統手冊。
|
表1 MB_COMM_LOAD指令參數意義
Modbus_Master指令各參數意義以下表2所示:
引腳 |
說明
|
---|---|
EN |
使能端
|
REQ |
TRUE = 請求向 Modbus 從站發送數據 ,建議採用上升沿觸發
|
MB_ADDR |
Modbus RTU從站地址。默認地址範圍:0至247;擴展地址範圍:0至65535。值0被保留用於將消息廣播到全部Modbus從站。 |
MODE |
模式選擇: 指定請求類型(讀取或寫入)。
|
DATA_ADDR |
從站中的起始地址:指定Modbus從站中將供訪問的數據的起始地址。
|
DATA_LEN |
數據長度:指定要在該請求中訪問的位數或字數。
|
DATA_PTR |
數據指針: 指向要進行數據寫入或數據讀取的標記或數據塊地址。
|
DONE |
完成位:上一請求已完成且沒有出錯後,DONE 位將保持爲 TRUE 一個掃描週期時間。
|
BUSY |
FALSE – Modbus_Master 無激活命令: |
ERROR |
對 Modbus_Master 或 Modbus_Slave 指令的背景數據塊的引用。 |
STATUS |
若是上一個請求完成而且沒有錯誤,DONE 位將變爲 TRUE 並保持一個週期。 |
ERROR |
若是上一個請求完成出錯,則 ERROR 位將變爲 TRUE 並保持一個週期。 STATUS 參數中的錯誤代碼僅在 ERROR = TRUE 的週期內有效。 |
STATUS |
錯誤代碼
|
表2 Modbus_Master指令參數意義
注意:
①Modbus_Comm_Load指令不建議在啓動組織塊OB100中調用,建議在OB1中調用。Modbus_Comm_Load指令在OB1中調用時,其輸入位「REQ」需使用上升沿觸發,本例中該輸入位採用 「FirstScan」 系統存儲器位。
②Modbus_Comm_Load指令背景數據塊中的靜態變量「MODE」用於描述PTP模塊的工做模式,有效的工做模式包括:
該靜態變量「MODE」默認數據爲0(RS232 全雙工模式),須要根據CM PTP模塊實際組態修改該數值,本例中CM PTP模塊工做在RS485半雙工模式須要將該數值修改成4,如圖12.所示。
圖12. Modbus_Comm_Load背景數據塊靜態變量「MODE」修改成4
③Modbus_Master指令的「DATA_PTR」參數用於指向要進行數據寫入或數據讀取的數據區域地址,該數據區域支持優化訪問的數據塊或者非優化(標準的)數據塊,建議採用非優化訪問的數據塊。
本例中使用的數據區爲非優化訪問的數據塊,在數據塊的屬性中取消「優化的塊訪問」便可將數據塊修改成非優化訪問的數據塊(鼠標右鍵數據塊,選擇「屬性」,取消「優化的塊訪問」),如圖13. 所示。
圖13. 設置數據塊爲非優化訪問
當Modbus_Master指令的「DATA_PTR」指向非優化訪問的數據塊時,該輸入參數須要使用指針方式填寫如P#DB3.DBX0.0 WORD 5 方式填寫。
④當Modbus RTU網絡中存在多個modbus RTU從站或一個modbus RTU從站同時須要讀操做和寫操做,則須要調用多個Modbus_Master指令,Modbus_Master指令之間須要採用輪詢方式調用。
下圖14. 用於描述兩個Modbus_Master指令輪詢調用的方式。
圖14.Modbus_Master輪詢調用方式
本例中Modbus RTU主站模塊安裝在分佈式IO站點上,所以程序中須要考慮分佈式IO站點故障、CM PTP 模塊插拔模塊等故障。
分佈式IO站點中插出、拔入模塊時,操做系統都會調用一次OB83。經過OB83接口區的輸入變量「16#Event_Class」判斷故障的模塊和類型:事件類型16#39表示模塊被拔出,事件類型16#38表示模塊被插入。
CM PTP 模塊被從新插入的時候,須要在中斷OB83中調用Modbus_Comm_Load 指令對通訊模塊進行從新組態,如圖15. 所示。
圖15. OB83中再次調用Modbus_Comm_Load 指令
注意:
①OB83 中調用Modbus_Comm_Load指令的背景數據塊須要與OB1中調用的Modbus_Comm_Load指令的背景數據塊相同。
②CM PTP模塊的硬件標識符也能夠在"PLC變量"--->"系統常數"中查詢,如圖16. 所示。
圖16. 系統常量
分佈式IO站點故障和恢復時,操做系統都會調用一次OB86。經過OB86接口區的輸入變量「16#Event_Class」判斷故障的模塊和類型:事件類型16#39表示站點故障,事件類型16#38表示站點恢復。
CM PTP 模塊所在的IO站點恢復時,須要在中斷OB86中調用Modbus_Comm_Load 指令對通訊模塊進行從新組態,如圖17. 所示。
圖17. OB86中調用Modbus_Comm_Load 指令
注意:
①OB86 中調用Modbus_Comm_Load指令的背景數據塊須要與OB1中調用的Modbus_Comm_Load指令的背景數據塊相同。
②分佈式IO 站點的硬件標識符也能夠在"PLC變量"--->"系統常數"中查詢。
Modbus RTU從站編程須要調用Modbus_Comm_Load 指令和Modbus_Slave 指令,其中Modbus_Comm_Load 指令經過 Modbus RTU 協議對通訊模塊進行組態,Modbus_Slave 指令可經過由 Modbus_Comm_Load 指令組態的端口做爲 Modbus 從站進行通訊, Modbus_Comm_Load 指令的 MB_DB 參數必須鏈接到 Modbus_Slaver 指令的(靜態)MB_DB 參數。
本例中CPU 機架CM1241 RS422/485做爲Modbus RTU從站,其相關編程步驟以下:
圖18. 拖入Modbus RTU 從站指令
Modbus_Slave指令各參數意義以下表3所示:
引腳 |
說明
|
---|---|
MB_ADDR |
Modbus 從站的標準尋址: |
MB_HOLD_REG |
數據指針,指向Modbus 保持寄存器的地址, Modbus 保持寄存器能夠爲M存儲區或DB數據區。 |
NDR
|
可用的新數據:
|
DR
|
讀取數據:
|
ERROR |
若是上一個請求完成出錯,則 ERROR 位將變爲 TRUE 並保持一個週期。 若是執行因錯誤而終止,則 STATUS 參數中的錯誤代碼僅在 ERROR = TRUE 的週期內有效。 |
STATUS |
錯誤代碼
|
表3 Modbus_Slave指令參數意義
注意:
①Modbus_Comm_Load指令不建議在啓動組織塊OB100中調用,建議在OB1中調用。Modbus_Comm_Load指令在OB1中調用時,其輸入位「REQ」需使用上升沿觸發,本例中該輸入位採用 「FirstScan」 系統存儲器位。
②Modbus_Comm_Load指令背景數據塊中的靜態變量「MODE」用於描述PTP模塊的工做模式,有效的工做模式包括:
該靜態變量「MODE」默認數據爲0(RS232 全雙工模式),須要根據CM1241 RS422/485模塊實際組態修改該數值,本例中CM1241 RS422/485模塊工做在RS485半雙工模式須要將該數值修改成4,如何修改「MODE」靜態變量見圖12.所示。③Modbus_Slave指令的「MB_HOLD_REG」用於指向Modbus 保持寄存器的數據區域地址,該數據區域支持優化訪問的數據塊或者非優化(標準的)數據塊,建議採用非優化訪問的數據塊。
本例中使用的數據區爲非優化訪問的數據塊,固該輸入參數須要使用指針方式填寫如P#DB6.DBX0.0 WORD 100 方式填寫。
如何在數據塊的屬性中取消「優化的塊訪問」,見圖13. 所示。
將程序下載到PLC中,並使用Profibus DP通訊電纜將CM1241 RS422/485與CM PTP串口模塊鏈接起來,便可測試Modbus RTU通訊了。
1. 新版本 Modbus RTU指令的使用是否存在些限制條件?
新版本 Modbus RTU指令經過CM1241通訊模塊或CB1241通訊板進行Modbus RTU通訊時,須要知足以下條件:
a. S7-1200 CPU 的固件版本不能低於V4.1;
b. CM1241通訊模塊或CB1241通訊板的固件不能低於V2.1。
S7-1200 V4.0 固件CPU能夠經過固件更新到V4.1版本,V2.0固件的CM1241通訊模塊也能夠經過固件更新的方式更新到V2.1版本。
相關固件更新的方法請參考 S7-1200 固件更新 。
2 .Modbus_Comm_Load指令背景數據塊中的靜態變量「MODE」的做用是什麼?爲何通常項目中,都須要對該變量進行修改?
新版本的 Modbus RTU指令擴展了Modbus RTU的功能,該指令除了支持CM1241通訊模塊、CB1241通訊板還支持 PROFINET 或 PROFIBUS 分佈式 I/O 機架上的PTP通訊模塊實現Modbus RTU通訊。
而分佈式 I/O 機架上的PTP通訊模塊能夠支持多種工做模式,以ET200SP CM PtP模塊(定貨號:6ES7137-6AA00-0BA0)爲例,其能夠支持RS23二、RS485以及RS422等多種工做模式。
Modbus_Comm_Load指令背景數據塊中的靜態變量「MODE」則用於定義PTP模塊的工做模式。
「MODE」的默認數值爲0,表明「全雙工 (RS232)」工做模式,實際項目組態中則須要根據實際工做模式對該變量進行修改。
3. Modbus_Comm_Load指令可否在啓動組織塊OB100中調用?
Modbus_Comm_Load指令不建議在啓動組織塊OB100中調用。新版本的Modbus RTU指令擴展了Modbus RTU的功能,該指令支持 PROFINET 或 PROFIBUS 分佈式 I/O 機架上的PtP通訊模塊實現Modbus RTU通訊。
操做系統須要調用讀取數據記錄和寫入數據記錄等指令來實現與分佈式I/O機架上PtP模塊的Modbus RTU通訊。讀取數據記錄和寫入數據記錄指令爲異步讀寫指令,指令的執行須要N個掃描週期,因此不建議Modbus_Comm_Load指令在啓動組織塊OB100中調用。
4. 如何查詢Modbus RTU通訊錯誤時的錯誤代碼?
以Modbus_Master指令爲例,當通訊出現錯誤時,Modbus_Master指令的「ERROR」輸出位將變爲 TRUE 可是隻保持一個掃描週期,因此經過TIA 軟件程序監控時沒法查詢到錯誤。
Modbus_Master指令「STATUS」 參數中的錯誤代碼僅在「ERROR」 = TRUE 的掃描週期內有效,爲了獲取了Modbus RTU通訊錯誤的錯誤代碼咱們能夠採用下圖19. 方式編程。
圖19. 獲取STATUS