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