S7-1200?作為Modbus RTU 從站 ? ? ? ?
?
S7-1200 支持Modbus RTU通信模式的模塊可作為Modbus RTU從站。以下以 CPU1215C DC/DC/DC和CM1241 RS485為例,介紹S7-1200 Modbus RTU 從站通信組態及編程步驟。
硬件和軟件需求及所完成的通信任務:
硬件:① CPU1215C DC/DC/DC (訂貨號:6ES7 215-1AG31-0XB0)② CM1241 RS485 (訂貨號:6ES7 241-1CH30-0XB0)③ PS 307電源(訂貨號:6ES7307-1KA02-0AA0)?④ PC(帶以太網卡)?⑤ TP以太網電纜軟件:① STEP 7 V11 Professional SP2 UPD4 +HSP② ModScan(該軟件是第三方軟件,可以從 Internet 網絡下載)所完成的通信任務:將Modbus RTU從站CPU1215C中地址從DB1.DBW0開始的5 個字中的數據,分別讀取到Modbus RTU主站ModScan中Modbus地址從40001開始的5個字中。
?
1組態Modbus RTU通信模塊
在硬件目錄里找到“通信模塊”→“點到點”→“CM1241(RS485)”,雙擊或拖拽此模塊至CPU左側即可,如下圖1所示:
?圖1 組態通信模塊
接下來,在“設備視圖”中用鼠標選中CM1241(RS485)模塊,在“屬性”→“端口組態”中配置此模塊硬件接口參數。如下圖2所示:
以下以傳輸率=9.6Kbps,奇偶校驗=無奇偶校驗,數據位=8位字符,停止位=1,其它保持默認設置為例。
?圖2 RS485 端口設置
最后在“硬件標識符”里確認一下硬件標識符為271,如下圖3所示:
?圖3 硬件標識符
2添加啟動OB
在項目樹下選擇“CPU1215C DC/DC/DC”→“程序塊”→“添加新塊”,在彈出的窗口中選擇“OB 組織塊”→ “Startup”,添加啟動OB 100,如下圖4所示:
?圖4 添加啟動OB
3調用MB_COMM_LOAD指令
為使端口一啟動就被設置為Modbus RTU通信模式,可在OB 100中調用“MB_COMM_LOAD”指令。調用“MB_COMM_LOAD”指令時會自動彈出創建相應背景數據塊的界面,如下圖5所示:
?圖5 調用MB_COMM_LOAD指令
點擊“確認”為該指令創建背景數據塊后,為各輸入/輸出引腳分配地址。尤其需注意MB_DB輸入引腳需指向“MB_SLAVE”指令的背景數據塊,如下圖6所示:
注意:“MB_COMM_LOAD”指令輸入位“REQ”需使用上升沿觸發。由于OB 100只在S7-1200啟動時執行一次,因此,此例中將“REQ”設為“TRUE”。
?圖6 MB_COMM_LOAD指令
MB_COMM_LOAD指令參數意義如下表1所示:
引腳 | 說明 |
EN | 使能端 |
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 | 對 MB_MASTER 或 MB_SLAVE 指令所使用的背景數據塊。 |
DONE | 完成位:指令執行完成且未出錯置1 |
ERROR | 錯誤位:0-未檢測到錯誤;1-檢測到錯誤。在參數STATUS中輸出錯誤代碼。 |
STATUS | ? |
表1 MB_COMM_LOAD指令參數意義
4創建MB_HOLD_REG數據塊
通過“程序塊”→ “添加新塊”,選擇“數據塊(DB)”創建 DB 塊,選擇“標準與S7- 300/400兼容” ,點擊“確認”鍵,定義數據區為5個字的數組,如下圖7所示:
注意:MB_HOLD_REG使用的DB訪問類型必須是標準與S7- 300/400兼容。
?圖7 創建MB_HOLD_REG數據塊
5調用MB_SLAVE指令
在OB1中調用MB_SLAVE指令, 調用該指令時會自動彈出創建相應背景數據塊的界面,如下圖8所示:
?圖8 調用MB_SLAVE指令
點擊“確認”為該指令創建背景數據塊后,并為各輸入/輸出引腳分配地址,如下圖9所示:
S7-1200作為Modbus RTU從站,MB_HOLD_REG指向Modbus保持寄存器數據塊的指針。設置如下所示:MB_HOLD_REG=P#DB3.DBX0.0 WORD 5。
對應關系如下表2所示:
Modbus RTU主站Modbus地址 | Modbus RTU從站CPU1215C 數據緩沖區地址 |
40001 | DB3.DBW0 |
40002 | DB3.DBW2 |
40003 | DB3.DBW4 |
40004 | DB3.DBW6 |
40005 | DB3.DBW8 |
表2 Modbus地址對應關系
?圖9 MB_SLAVE指令
引腳 | 說明 |
EN | 使能端 |
MB_ADDR | Modbus 從站的站地址 。默認地址范圍:0 至 247;擴展地址范圍:0 至 65535 |
MB_HOLD_REG | 指向 Modbus 保持寄存器數據塊的指針。必須使用“標準 - 與 S7-300/400 兼容”訪問類型創建該數據塊。 |
NDR | 新數據就緒:0-無新數據;1-表示Modbus主站已寫入新的數據 |
DR | 數據讀取:0-無數據讀取;1-表示Modbus主站已讀取新的數據 |
ERROR | 錯誤位 |
STATUS | ? |
表3 MB_SLAVE指令參數意義
MB_SLAVE Modbus功能 | S7-1200 | ||||
代碼 | 功能 | 數據區 | 地址范圍 | 數據區 | CPU地址 |
01 | 讀位 | 輸出 | 1到8192 | 輸出過程映像區 | Q0.0到Q1023.7 |
02 | 讀位 | 輸入 | 10001到18192 | 輸入映像區 | I0.0到I1023.7 |
04 | 讀字 | 輸入 | 30001到30512 | 輸入映像區 | IW0到IW1022 |
05 | 寫位 | 輸出 | 1到8192 | 輸出過程映像區 | Q0.0到Q1023.7 |
15 | 寫位 | 輸出 | 1到8192 | 輸出過程映像區 | Q0.0到Q1023.7 |
表4 Modbus地址到過程映象區的映射
MB_SLAVE Modbus功能 | S7-1200 | ||||
代碼 | 功能 | 數據區 | 地址范圍 | CPU DB數據區 | CPU地址 |
03 | 讀字 | 保持寄存器 | 40001到49999 | MB_HOLD_REG | 字1到字9999 |
400001到465535 | 字1到字65535 | ||||
06 | 寫字 | 保持寄存器 | 40001到49999 | MB_HOLD_REG | 字1到字9999 |
400001到465535 | 字1到字65535 | ||||
16 | 寫字 | 保持寄存器 | 40001到49999 | MB_HOLD_REG | 字1到字9999 |
400001到465535 | 字1到字65535 |
表5 Modbus地址到CPU存儲區的映射
6Modbus 主站軟件設置
注意:客戶機采用ModScan軟件測試,該軟件是第三方軟件,可以從 Internet 網絡上下載。
首先在打開的ModScan軟件中建立連接,并設置RTU模式的參數:波特率Baud=9600,數據位Data=8,停止位Stop=1,校驗Parity=NONE,如下圖10所示:
圖10 建立ModScan連接
選擇“File”→“New” 打開ModScan通信界面,設置Modbus RTU從站的地址Device Id=1,數據開始地址Address=0001,數據長度Length=5,Modbus數據類型功能碼03,如下圖11所示:
注意:Device Id設置必須與“MB_SLAVE”指令中輸入引腳“MB_ADDR”設置的地址一致。
?圖11 設置ModScan
7Modbus RTU測試結果
在STEP 7 V11 Professional SP2 UPD4軟件中打開該項目CPU1215 DC/DC/DC的“監控表”,對DB3.DBW0寫入數值21,DB3.DBW2寫入數值22,DB3.DBW4寫入數值23,DB3.DBW6寫入數值24,DB3.DBW8寫入數值25。ModScan主站將S7-1200 Modbus RTU從站地址DB3.DBW0的數值21,DB3.DBW2的數值22,DB3.DBW4的數值23,DB3.DBW6的數值24,DB3.DBW8的數值25,分別讀取到了地址40001,40002,40003,40004,40005中。如下圖12所示:
?圖12 Modbus RTU測試結果
MB_COMM_LOAD和MB_SLAVE指令STATUS錯誤代碼
STATUS(W#16#) | 說明 |
0000 | 端口無錯誤 |
8180 | 端口ID值無效 |
8181 | 波特率值無效 |
8182 | 奇偶校驗值無效 |
8183 | 流控制值無效 |
8184 | 響應超時值無效 |
8185 | MB_DB參數不是MB_MASTER或MB_SLAVE的背景數據塊 |
表6 MB_COMM_LOAD指令STATUS錯誤代碼
STATUS(W#16#) | 說明 |
0000 | 無錯誤 |
80D1 | 接收方發出了暫停主動傳輸的流控制請求并且在指定的等待時間內未重新激活該傳輸 |
80D2 | 傳送請求終止 |
80E0 | 因接收緩沖區滿,消息被終止 |
80E1 | 因出現奇偶校驗錯誤,消息被終止 |
80E2 | 因組幀錯誤,消息被終止 |
80E3 | 因出現超限錯誤,消息被終止 |
80E4 | 因指定長度超出總緩沖區大小,消息被終止 |
8180 | 無效端口ID值或MB_COMM_LOAD指令出錯 |
8186 | Modbus站地址無效 |
8187 | 指向MB_HOLD_REG指針無效 |
818C | 指向M存儲器或DB(DB區域允許符號地址和直接地址)的MB_HOLD_REG指針無效 |
表7 MB_SLAVE指令STATUS參數意義(通信和組態錯誤)
STATUS(W#16#) | 從站的響應代碼 | 說明 |
8380 | 無響應 | CRC錯誤 |
8381 | 01 | 不支持功能代碼或者在廣播中不支持功能代碼 |
8382 | 03 | 數據長度錯誤 |
8383 | 02 | 數據地址錯誤或地址超出DATA_PTR取的有效范圍 |
8384 | 03 | 數據值錯誤 |
8385 | 03 | 不支持此數據診斷代碼值 |
表8 MB_SLAVE指令STATUS參數意義(Modbus協議錯誤)? ? ? ?
常見問題
為什么觸發“MB_SLAVE”指令出錯,輸出位“ERROR”=1,輸出狀態字“STATUS”=16#8187?
輸出狀態字”STATUS“=16#8187表示指向MB_HOLD_REG指針無效。以下兩種情況會造成如上錯誤:
程序中不存在“MB_SLAVE”指令的輸入引腳“MB_HOLD_REG”對應的DB塊。
在創建“MB_SLAVE”指令的輸入引腳“MB_HOLD_REG”對應的DB塊時選擇了“僅符號尋址”。
解決方法分別如下:
新建“MB_SLAVE”指令的輸入引腳“MB_HOLD_REG”對應的DB塊。
創建“MB_SLAVE”指令的輸入引腳“MB_HOLD_REG”對應的DB塊時只能選擇了“標準與S7-300/400兼容”。
編輯:黃飛
?
評論
查看更多