在工業(yè)自動化領(lǐng)域,PLC(可編程邏輯控制器)的應(yīng)用十分廣泛,而西門子 PLC 更是其中的佼佼者。西門子在 STEP 7 - Micro/WIN SMART 中正式推出了 Modbus RTU 主站協(xié)議庫(西門子標(biāo)準(zhǔn)庫指令),這使得 PLC 能夠通過 modbus 方式控制其他器件,實現(xiàn)對 Modbus RTU 從站的數(shù)字量、模擬量 I/O 以及保持寄存器的讀寫操作。下面將詳細(xì)介紹西門子 PLC 使用 Modbus 485 通訊傳輸接收數(shù)據(jù)的具體步驟。
首先要準(zhǔn)備好相關(guān)設(shè)備和工具,包括電腦、S7 - 200smart st30 以及 485 通訊線。這里將以 S7 - 200smart 作為主站,電腦串口調(diào)試助手作為從站進(jìn)行操作演示。關(guān)于接線部分,本文暫不詳細(xì)闡述。
調(diào)用 Modbus RTU 主站初始化和控制子程序,使用 SM0.0 調(diào)用 MBUS_CTRL 完成主站的初始化,并啟動其功能控制。各參數(shù)意義如下:
- EN(使能):必須保證每一掃描周期都被使能,通常使用 SM0.0。
- Mode(模式):為 1 時,使能 Modbus 協(xié)議功能;為 0 時恢復(fù)為系統(tǒng) PPI 協(xié)議。
- Baud(波特率):支持的通訊波特率有 1200、2400、4800、9600、19200、38400、57600、115200。
- Parity(校驗):有多種校驗方式可供選擇,0 表示無校驗(通常默認(rèn)選擇),1 表示奇校驗,2 表示偶校驗。
- Port(端口號):0 代表 CPU 集成的 RS 485 通訊口,1 代表可選 CM 01 信號板。
- Timeout(超時):主站等待從站響應(yīng)的時間,以毫秒為單位,典型設(shè)置值為 1000 毫秒(1 秒),允許設(shè)置的范圍為 1 - 32767。需要注意的是,這個值必須設(shè)置足夠大以保證從站有時間響應(yīng)。
- Done(完成位):初始化完成后,此位會自動置 1。
- Error:表示有錯誤。

調(diào)用 Modbus RTU 主站讀寫子程序 MBUS_MSG,發(fā)送一個 Modbus 請求。各參數(shù)意義如下:
- EN(使能):同一時刻只能有一個讀寫功能(即 MBUS_MSG)使能。建議每一個讀寫功能都用上一個 MBUS_MSG 指令的 Done 完成位來激活,以保證所有讀寫指令循環(huán)進(jìn)行。
- First(讀寫請求位):每一個新的讀寫請求必須使用脈沖觸發(fā)。
- Slave(從站地址):可選擇的范圍是 1 - 247。
- RW(讀寫請求):0 表示讀,1 表示寫。
- Addr(讀寫從站的數(shù)據(jù)地址):可以選擇讀寫的數(shù)據(jù)類型,如 00001 至 0xxxx 表示數(shù)字量輸出,10001 至 1xxxx 表示數(shù)字量輸入,30001 至 3xxxx 表示模擬量輸入,40001 至 4xxxx 表示保持寄存器。
- Count(數(shù)據(jù)個數(shù)):通訊的數(shù)據(jù)個數(shù)(位或字的個數(shù))。需要注意的是,Modbus 主站可讀 / 寫的數(shù)據(jù)量為 120 個字(是指每一個 MBUS_MSG 指令)。
- DataPtr(數(shù)據(jù)指針):如果是讀指令,讀回的數(shù)據(jù)放到這個數(shù)據(jù)區(qū)中;如果是寫指令,要寫出的數(shù)據(jù)放到這個數(shù)據(jù)區(qū)中。
- Done(完成位):讀寫功能完成位。
- Error(錯誤代碼):只有在 Done 位為 1 時,錯誤代碼才有效,不同的錯誤代碼代表不同的錯誤情況。

通常支持 485 通訊的器件給的使用說明書,其指令是 16 進(jìn)制的字符串代碼,很難與當(dāng)前 PLC 庫指令對應(yīng)起來,尤其是命令地址。以 IAI 馬達(dá)給的使用說明書為例,該示例是 PLC 通過 modbus 去讀取馬達(dá)的位置,讀取控制器地址 9000 這個寄存器里面的數(shù)據(jù)。RW 填 0,表示去讀取數(shù)據(jù)。Plc 庫里面需要填的 Addr(e)是十進(jìn)制,需要將 16 進(jìn)制的 9000 轉(zhuǎn)成十進(jì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 操作手冊示例一致,測試成功。
- 只有在操作被控方寄存器的時候(無論讀取還是寫入),轉(zhuǎn)換的成十進(jìn)制的地址后位需要加個 4。
- 注意發(fā)送命令和讀取命令的字符長度,需要正確填寫。
- 需要注意波特率要填寫正確,與被控方保持一致,否則發(fā)出去的信號與收到的信號不相符。
- 發(fā)出去的內(nèi)容填寫到 DataPtr 中。
通過 MB_MSG,向 1 號從站讀取從 36865(Addr)這個地址開始 2 位(Count)的數(shù)據(jù),并把讀取到的數(shù)據(jù)寫入 VB2000;如果是寫入,則是將 PLC 的 VB2000 開始的 2 位寄存器內(nèi)的數(shù)據(jù),寫入到 1 號從站的 36865 寄存器中。



總之,掌握西門子 PLC 使用 Modbus 485 通訊傳輸接收數(shù)據(jù)的方法,對于工業(yè)自動化系統(tǒng)的設(shè)計和維護(hù)具有重要意義。在實際應(yīng)用中,要嚴(yán)格按照步驟操作,并注意相關(guān)的注意事項,以確保通訊的穩(wěn)定和數(shù)據(jù)的準(zhǔn)確傳輸。