Modbus協(xié)議你必須知道的十件事情
—— 看似簡單的協(xié)議,其實一點都不簡單

1 它比很多程序員都老
Modbus協(xié)議是1979年由Modicon公司搞出來的,那時候還沒有互聯(lián)網,更別說什么5G了。它是工業(yè)通信界的“爺爺輩”,但至今還在堅強服役,活躍在PLC、電表、溫濕度傳感器等各類設備中。
2 RTU 和 TCP,不是一個味兒
Modbus RTU 是串口協(xié)議(用RS485或232線連的),Modbus TCP 是以太網協(xié)議(網口的)。它倆“長得像”,但“走的路不一樣”。別想著一個驅動搞定兩種,直接套用只會調不通。
3 它不主動發(fā)消息,得你先問
Modbus是個“社恐協(xié)議”,自己不說話,全靠主設備一個個輪著問:“你那邊數據有了嗎?”它不支持MQTT那種“我有消息就推給你”的玩法,所以實時性差點意思。
4 常用功能碼沒你想象的多
Modbus指令多?其實常用的就這幾個:
01:讀開關量(線圈)
03:讀模擬量(保持寄存器)
05:寫一個開關
06:寫一個數值
15/16:一次寫多個開關/寄存器
其他功能碼?大部分人一輩子都用不上。
5 沒加密,數據是“裸奔”的
Modbus的數據是明文傳輸的,誰在網絡中“蹲守”,都能看到你采集了什么值。想安全點,就得靠VPN、TLS等方式“穿件衣服”,否則很容易被“偷聽”甚至被“改數”。
6 最多只能帶247個設備
Modbus RTU里,從設備的地址范圍是1~247。理論上可以接247個從站,但現實里你掛太多設備,主機輪詢就忙不過來,通信速度越來越慢,掉線、超時的情況說來就來。
7 03和04,有時候壓根沒區(qū)別
標準上說:
03:讀“保持寄存器”
04:讀“輸入寄存器”
但很多設備廠家懶得分這兩個區(qū)域,直接都放在一個地方了——你用03或04,拿到的數據可能一樣,只不過名字不一樣,別太認真。
8 地址40001,其實是0
文檔里寫40001,你要是真在程序里填40001,就慘了。從設備可能直接懵了:“這是誰?”因為實際發(fā)送的地址是從0開始的,40001 = 0,40002 = 1,以此類推。Modbus這個“地址系統(tǒng)”,經常讓人腦袋打結。
9 RTU里那個CRC校驗,小小一個卻至關重要機
你發(fā)的每一條Modbus RTU指令,最后兩個字節(jié)都是校驗碼,確保傳輸沒出錯。如果CRC不對,從設備壓根不理你。很多時候設備“裝死”,問題就出在這。
10 不同廠家的Modbus ≠ 相同的Modbus
Modbus雖然是標準協(xié)議,但每家廠商的實現都不一樣,有的從0開始,有的從1開始;有的高字節(jié)在前,有的低字節(jié)在前;有的用整數,有的用浮點……通用驅動?聽起來很美,真用起來——小心翻車。
深圳市鋇錸技術有限公司提供全系列 Modbus協(xié)議轉換網關與解決方案,可實現 Modbus 與多種工業(yè)協(xié)議之間的靈活互通,包括:
通訊協(xié)議轉換:
Modbus RTU / TCP → MQTT、OPC UA、HTTP、DNP3.0
Modbus ? PROFINET / EtherCAT / Ethernet/IP(對接西門子、倍福、AB等PLC)
Modbus ? IEC104 / IEC61850(適配電力調度、能源監(jiān)測)
Modbus ? DLT645(國網電表讀數不是問題?。?/span>
多協(xié)議混合采集 + 一站式轉發(fā):
無論你是現場用485采集 Modbus、電表用 DLT645、PLC用 PROFINET,還是遠端需要上傳到 MQTT 云平臺,我們都能讓它們“互相聽懂彼此的話”!
