前言
西門子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站協(xié)議庫(西門子標(biāo)準(zhǔn)庫指令)。使用 Modbus RTU 主站指令庫,可以讀寫 Modbus RTU 從站的數(shù)字量、模擬量 I/O 以及保持寄存器,從而實現(xiàn)PLC通過modbus方式控制其他器件。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、準(zhǔn)備工作
電腦
S7-200smart st30
485通訊線
說明:這里將以S7-200smart作為主站,電腦串口調(diào)試助手作為從站。做操作演示。
此處省略接線。
二、寫梯形圖
1.MBus_CTRL
1. 調(diào)用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 調(diào)用 MBUS_CTRL 完成主站的初始化,并啟動其功能控制:
圖 2. 用 SM0.0 調(diào)用 Modbus RTU 主站初始化與控制子程序
各參數(shù)意義如下:
a. |
EN |
使能: |
必須保證每一掃描周期都被使能(使用 SM0.0) |
---|---|---|---|
b. |
Mode |
模式: |
為 1 時,使能 Modbus 協(xié)議功能;為 0 時恢復(fù)為系統(tǒng) PPI 協(xié)議 |
c. |
Baud |
波特率: |
支持的通訊波特率為1200,2400,4800,9600,19200,38400,57600,115200。 |
d. |
Parity |
校驗: |
校驗方式選擇 |
0=無校驗(通常默認(rèn)選擇0) | |||
1=奇較驗 | |||
2=偶較驗 | |||
e. |
Port |
端口號: |
0 = CPU 集成的 RS 485 通訊口 ; 1 = 可選 CM 01 信號板 。 |
f. |
Timeout |
超時: |
主站等待從站響應(yīng)的時間,以毫秒為單位,典型的設(shè)置值為 1000 毫秒(1 秒),允許設(shè)置的范圍為 1 - 32767。 |
注意: 這個值必須設(shè)置足夠大以保證從站有時間響應(yīng)。 | |||
g. |
Done |
完成位: |
初始化完成,此位會自動置1。 |
h. |
Error |
有錯誤 |
1.MBus_MSG
調(diào)用 Modbus RTU 主站讀寫子程序MBUS_MSG,發(fā)送一個Modbus 請求;
各參數(shù)意義如下:
a. |
EN |
使能: |
同一時刻只能有一個讀寫功能(即 MBUS_MSG)使能 |
---|---|---|---|
注意:建議每一個讀寫功能(即 MBUS_MSG)都用上一個 MBUS_MSG 指令的 Done 完成位來激活,以保證所有讀寫指令循環(huán)進行(見例程)。 | |||
b. |
First |
讀寫請求位: |
每一個新的讀寫請求必須使用脈沖觸發(fā) |
c. |
Slave |
從站地址: |
可選擇的范圍 1 - 247 |
d. |
RW |
讀寫請求: |
0 = 讀, 1 = 寫 |
e. |
Addr |
讀寫從站的 |
選擇讀寫的數(shù)據(jù)類型 |
數(shù)據(jù)地址: |
00001 至 0xxxx - 數(shù)字量輸出 | ||
10001 至 1xxxx - 數(shù)字量輸入 | |||
30001 至 3xxxx - 模擬量輸入 | |||
40001 至 4xxxx - 保持寄存器 | |||
f. |
Count |
數(shù)據(jù)個數(shù) |
通訊的數(shù)據(jù)個數(shù)(位或字的個數(shù)) |
注意: Modbus主站可讀/寫的最大數(shù)據(jù)量為120個字(是指每一個 MBUS_MSG 指令) | |||
g. |
DataPtr |
數(shù)據(jù)指針: |
1. 如果是讀指令,讀回的數(shù)據(jù)放到這個數(shù)據(jù)區(qū)中 2. 如果是寫指令,要寫出的數(shù)據(jù)放到這個數(shù)據(jù)區(qū)中 |
h. |
Done |
完成位 |
讀寫功能完成位 |
i. |
Error |
錯誤代碼: |
只有在 Done 位為1時,錯誤代碼才有效 |
0 = 無錯誤 | |||
1 = 響應(yīng)校驗錯誤 | |||
2 = 未用 | |||
3 = 接收超時(從站無響應(yīng)) | |||
4 = 請求參數(shù)錯誤(slave address, Modbus address, count, RW) | |||
5 = Modbus/自由口未使能 | |||
6 = Modbus正在忙于其它請求 | |||
7 = 響應(yīng)錯誤(響應(yīng)不是請求的操作) | |||
8 = 響應(yīng)CRC校驗和錯誤 | |||
101 = 從站不支持請求的功能 | |||
102 = 從站不支持?jǐn)?shù)據(jù)地址 | |||
103 = 從站不支持此種數(shù)據(jù)類型 | |||
104 = 從站設(shè)備故障 | |||
105 = 從站接受了信息,但是響應(yīng)被延遲 | |||
106 = 從站忙,拒絕了該信息 | |||
107 = 從站拒絕了信息 | |||
108 = 從站存儲器奇偶錯誤 |
三、使用難點與解答
通常支持485通訊的器件給的使用說明書,給的指令是16進制的字符串代碼。很難與當(dāng)前PLC庫指令對應(yīng)起來,尤其是命令地址。我們以IAI馬達(dá)給的使用說明書為例子。如圖所示:
該示例是PLC通過modbus去讀取馬達(dá)的位置。讀取控制器地址9000這個寄存器里面的數(shù)據(jù)
RW填0,表示去讀取數(shù)據(jù)。
Plc庫里面需要填的Addr(e)是十進制,需要將16進制的9000轉(zhuǎn)成十進制。
通過計算器得知:16#9000=36864
注意事項:這里博主也比較奇怪,實際使用讀取寄存器地址的時候需要+1,36865
不知道有沒有人可以解釋一下的。
由于這里是讀取寄存器,所以Addr=436865.
count是寄存器數(shù)量:按照示例,這里有2個寄存器。所以count填2
通過串口調(diào)試助手來測試一下:接通M15.0發(fā)送信號,串口調(diào)試助手收到了PLC發(fā)送的信號。且可以看到收到的數(shù)據(jù)與IAI操作手冊示例一致。測試成功
以上是通過modbus讀取的示例。
注意事項:
1、只有在操作就被控方寄存器的時候(無論讀取還是寫入),轉(zhuǎn)換的成十進制的地址后第一位需要加個4
2、注意發(fā)送命令和讀取命令的字符長度,需要正確填寫
3、需要注意波特率要填寫正確,與被控方保持一致。否則發(fā)出去的信號與收到的信號不相符
4、發(fā)出去的內(nèi)容填寫到DataPtr中。
通過MB_MSG,向1號從站讀取從36865(Addr)這個地址開始2位(Count)的數(shù)據(jù),并把讀取到的數(shù)據(jù)寫入VB2000
如果是寫入:通過MB_MSG,將PLC的VB2000開始的2位寄存器內(nèi)的數(shù)據(jù),寫入到1號從站的36865寄存器中