Modbus 協(xié)議可以走串口,可以走網(wǎng)口。
我們就先以Modbus RTU為主,畢竟Modbus RTU用的實(shí)在太多了。
其實(shí)只要把Modbus RTU掌握了,理解了,其它衍生出來(lái)的協(xié)議,自然也就理解了。
那Modbus 協(xié)議長(zhǎng)啥樣呢。
我們先來(lái)直接看一組數(shù)據(jù)。
主站發(fā)送:01 03 00 14 00 01 C4 0E
從站回復(fù):01 03 02 00 63 F8 6D
好,不管你有沒(méi)有學(xué)過(guò)Modbus協(xié)議,我們先假裝看懂了上面的報(bào)文。
我們進(jìn)入情景中。
現(xiàn)場(chǎng)有一個(gè)HMI。
還有一個(gè)PLC。
PLC接了100個(gè)燈,100個(gè)門(mén),100個(gè)稱(chēng)。
“誰(shuí)家PLC會(huì)接這么多個(gè)燈,接這么多稱(chēng)呀。”
“你管的著么,雙十一打折,多買(mǎi)了幾個(gè)不行呀?!?/p>
那燈的數(shù)據(jù)呢,就只有開(kāi)還是關(guān)。也就是非0即1了。是開(kāi)關(guān)類(lèi)型。
那稱(chēng)的數(shù)據(jù)呢,如果單位是克,那可以是0到9999克,比如,這個(gè)稱(chēng)只能稱(chēng)到9999克上限。
那HMI通過(guò)Modbus協(xié)議,理應(yīng)可以讀到100個(gè)燈里,任意一個(gè)或者連續(xù)幾個(gè)燈的數(shù)據(jù)。
也可以讀一個(gè)稱(chēng)或者連續(xù)幾個(gè)稱(chēng)的數(shù)據(jù)。
也就是報(bào)文上,要能把這些表現(xiàn)出來(lái)。
比如HMI想讀第20個(gè)稱(chēng)的數(shù)據(jù),只讀一個(gè)。
那20,也就是十六進(jìn)制0x14。
讀一個(gè),1,也就是0x01 。
我們看一下報(bào)文。
01 03 00 14 00 01 C4 0E。
真的有14 這個(gè)字節(jié)。
但是是00 14 呢還是14 00 還是14 呢。
如果只有一個(gè)字節(jié),只能表示0到255。不行,數(shù)量太少了,肯定不夠。那必須兩個(gè)字節(jié)表示。
所以,0014就是第20個(gè)稱(chēng)。也就是我們所說(shuō)的地址了。
這么乍一看,好像只需要三個(gè)字段,就可以表示HMI所需要讀的數(shù)據(jù)了。
確實(shí)也是呀。HMI只是想讀一個(gè)稱(chēng)的數(shù)據(jù),沒(méi)必要發(fā)其它不相關(guān)的數(shù)據(jù)的呀。
“HMI可以連接多個(gè)PLC嘛,怎么連接?”
“HMI可以通過(guò)485,接幾個(gè)PLC的哦?!?/p>
“可是我要怎么知道我要讀哪個(gè)PLC的數(shù)據(jù)呢”
“這樣吧,我們給不同的PLC起一個(gè)編號(hào),也就是站號(hào),這樣就可以了。”
“那Modbus協(xié)議上,我是不是也帶這個(gè)站號(hào)呢?!?/p>
“是的,我們?cè)贛odbus上面加個(gè)站號(hào)就是行了。這樣,如果PLC收到的報(bào)文,是自己的站號(hào)的,就回復(fù),不是自己站號(hào)的,就不要回復(fù),就解決了呀?!?/p>
“嗯,好辦法。那就用第一個(gè)字節(jié)表示吧?!?/p>
這樣,一個(gè)Modbus RTU協(xié)議,就此誕生了。
我們?cè)倩剡^(guò)頭來(lái)總結(jié)看一下,這個(gè)modbus 協(xié)議,大概就五個(gè)參數(shù)。
我們每個(gè)字段開(kāi)始聊一下。
第一個(gè)字段,就是站號(hào)。
主設(shè)備是沒(méi)有站號(hào)的。只有從設(shè)備有站號(hào)。
為什么主設(shè)備沒(méi)有站號(hào)呢。
主要是因?yàn)樵谝粋€(gè)modbus 通信里,有且只能有一個(gè)主站。只有主站才能主動(dòng)發(fā)報(bào)文,從設(shè)備接到報(bào)文再判斷是否要回復(fù)。
那從設(shè)備是否只能一個(gè)呢。
如果是接到485總線上面,從站就可以有多個(gè)了。一般建議不超過(guò)32個(gè)。這個(gè)梗下期會(huì)聊的。
主設(shè)備要訪問(wèn)哪個(gè)設(shè)備的時(shí)候呢,就根據(jù)站號(hào)來(lái)區(qū)分了。
不過(guò),有時(shí)候呢,如果需要同時(shí)操作多個(gè)從設(shè)備,比如,想讓10個(gè)從設(shè)備同時(shí)開(kāi)燈,怎么做比較合適呢。
逐個(gè)發(fā)送寫(xiě)請(qǐng)求,那效率就有點(diǎn)慢了。
于是就有廣播站號(hào)的概念了。站號(hào)0代表廣播站號(hào),當(dāng)主站對(duì)站號(hào)0進(jìn)行寫(xiě)操作的時(shí)候,所有的從設(shè)備收到命令之后,一般只執(zhí)行,不回復(fù)。
第二個(gè)字段,是功能碼。
這個(gè)功能碼呢,我們換一個(gè)角度去講解。
我們回歸到協(xié)議本身,這個(gè)協(xié)議主要就是用于通信,采集和控制的。那采集什么數(shù)據(jù)呢。
就是位變量和數(shù)值變量。有只讀的,可讀可寫(xiě)的。
其實(shí)到這里,我們基本就把modbus協(xié)議掌握了。
modbus ascii和modbus tcp 也離不了這幾個(gè)參數(shù)。
一般來(lái)說(shuō)新手只要了解到這里,基本可以了。modbus 就算是入門(mén)了。
至于是要繼續(xù)還是從入門(mén)到放棄,就看緣分了。
筆者從事物聯(lián)網(wǎng)以來(lái),接觸的設(shè)備支持modbus的,不在少數(shù)??梢哉f(shuō),99%就只用到前面介紹的內(nèi)容,真的不能更多了。
所以,本文就不再深入講解modbus rtu更多的功能碼和內(nèi)容了。
國(guó)內(nèi)外常見(jiàn)的PLC,還有各種單片機(jī)做出來(lái)的控制器,基本也就圍繞0X,1X,4X,3X功能碼的這幾個(gè)功能碼。
所以當(dāng)你網(wǎng)上搜索出來(lái)各種中英文介紹Modbus 協(xié)議,講一大堆,不知道哪些要看,哪些不要看。筆者的經(jīng)驗(yàn)告訴我,不需要全都了解。
我們先看看讀的。
位寄存器比較特殊,8個(gè)位占一個(gè)字節(jié)。在Modbus回復(fù)的數(shù)據(jù)里,并不是用一個(gè)字節(jié)表示一個(gè)位寄存器。而是用一個(gè)位,表示一個(gè)位寄存器。
這樣讀20個(gè)寄存器,就需要3個(gè)字節(jié)了。
這樣從站回復(fù)的數(shù)據(jù)就是FF FF 0F了。
也就是從站是至少一個(gè)字節(jié)起回復(fù),不夠一個(gè)字節(jié)的位,按一個(gè)字節(jié)回復(fù)。
大概的公式就是 位寄存器個(gè)數(shù)/8 得到字節(jié)個(gè)數(shù),然后再看是否整除,如果不整除,有余數(shù),則再補(bǔ)一個(gè)寄存器。
20/8=2,然后有余數(shù),余數(shù)是4。所以是三個(gè)字節(jié)。最后一個(gè)字節(jié),只取低4位有效。
4.[功能碼02]讀1X寄存器,地址10,讀16個(gè)寄存器
總結(jié)起來(lái),Modbus協(xié)議,也就常見(jiàn)8種功能碼。由于多寫(xiě)可以兼容單寫(xiě),甚至有的控制器,直接去掉單寫(xiě)命令,用多寫(xiě)實(shí)現(xiàn),這樣就只有6種功能碼了。
-
單片機(jī)
+關(guān)注
關(guān)注
6030文章
44491瀏覽量
632023 -
ModBus協(xié)議
+關(guān)注
關(guān)注
3文章
173瀏覽量
33367 -
CRC校驗(yàn)
+關(guān)注
關(guān)注
0文章
84瀏覽量
15174 -
RTU
+關(guān)注
關(guān)注
0文章
403瀏覽量
28598 -
PLC控制器
+關(guān)注
關(guān)注
0文章
40瀏覽量
9111
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論