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