您的位置:首頁(yè) > 軟件教程 > 教程 > Modbus通訊協(xié)議及相關(guān)控制代碼詳解

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

來(lái)源:好特整理 | 時(shí)間:2024-06-02 11:47:32 | 閱讀:104 |  標(biāo)簽: T Net 協(xié)議 控制 S 松下 代碼   | 分享到:

先上兩個(gè)通用Modbus幫助類,下面這個(gè)是多線程不安全版,在多線程多電機(jī)同一端口通信下,可能造成步進(jìn)電機(jī)丟步或者輸出口無(wú)響應(yīng)等,還有個(gè)多線程安全版,只是基于這個(gè)不安全版加上了LOCK,THIS using Modbus.Device; using Sunny.UI; using System; us

先上兩個(gè)通用Modbus幫助類,下面這個(gè)是多線程不安全版。在多線程多電機(jī)同一端口通信下,可能造成步進(jìn)電機(jī)丟步或者輸出口無(wú)響應(yīng)等。還有個(gè)多線程安全版,只是基于這個(gè)不安全版加上了LOCK,THIS。

以下是多線程安全版,基于上方代碼封裝的版本。支持串口通訊,也支持網(wǎng)口通訊。Modbus通訊是軟件部署在工控機(jī)上作上位機(jī)控制下位機(jī)運(yùn)轉(zhuǎn),比如各種電機(jī)和繼電器模塊(將電腦的小電流信號(hào)轉(zhuǎn)換為大電流信號(hào)發(fā)送到硬件上)。

ModbusRTU的報(bào)文格式: 從站地址/設(shè)備Id(1個(gè)字節(jié))+功能碼(1個(gè)字節(jié))+數(shù)據(jù)部分(N個(gè)字節(jié))+校驗(yàn)、CRC檢驗(yàn)(2個(gè)字節(jié))。

一般常用的01,03,05,06,10。01是讀線圈,03是讀寄存器。05是寫(xiě)線圈,06是寫(xiě)寄存器。10是往多個(gè)寄存器里寫(xiě)數(shù)值(16)。15不怎么用。

線圈是開(kāi)關(guān)閥門(mén)。寄存器是一個(gè)存放數(shù)值的地址,每個(gè)地址有不同的作用,寫(xiě)入不同的數(shù)值發(fā)揮不同的效應(yīng)。

Modbus報(bào)文如何編寫(xiě)?

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

舉幾個(gè)栗子:

01 功能碼示例:

請(qǐng)求報(bào)文:01 ,從站地址 ,一般一個(gè)485占一個(gè)COM口能接入31軸地址

01 ,Modbus 功能碼 讀取線圈地址

00 a0 ,讀取地址00a0

00 01 ,讀取一個(gè)字節(jié)長(zhǎng)度,modbus通訊里,基本上是兩個(gè)字節(jié)為一個(gè)地址

FD E8 ,crc 16位校驗(yàn),可以自行生成

應(yīng)答報(bào)文:01, 從站地址

01, 響應(yīng)功能碼01

01,返回一位字節(jié)

01,這時(shí)候返回的響應(yīng)字節(jié),就得看每個(gè)廠家是如何解釋的了,比如這里,00 就是 off ,01 就是 on

9048,crc 16位校驗(yàn),可以自行生成

03 功能碼示例:

請(qǐng)求報(bào)文:01 ,從站地址 ,一般一個(gè)485占一個(gè)COM口能接入31軸地址

03 ,Modbus 功能碼 讀取寄存器地址

602c ,讀取地址602c

00 02 ,讀取2字節(jié)長(zhǎng)度,modbus通訊里,基本上是兩個(gè)字節(jié)為一個(gè)地址

1B C2 ,crc 16位校驗(yàn),可以自行生成

應(yīng)答報(bào)文:01, 從站地址

03, 響應(yīng)功能碼03

04,返回4位字節(jié)

05280005,這時(shí)候返回的響應(yīng)字節(jié),就得看每個(gè)廠家是如何解釋的了,比如這里,一般是高位在前低位在后,但是這個(gè)廠家,低位在前高位在后,所以兩組字節(jié)要反過(guò)來(lái)轉(zhuǎn)換十進(jìn)制。

0005在前0528在后,所以最后得到的電壓是 00050528HEX = 329000 DEC

05 功能碼示例:

請(qǐng)求報(bào)文:01 ,從站地址 ,一般一個(gè)485占一個(gè)COM口能接入31軸地址

05 ,Modbus 功能碼 寫(xiě)線圈

0061 ,寫(xiě)線圈0061

FF00,寫(xiě)入FF00,硬件的編碼器看到FF00編譯為NO,機(jī)器開(kāi),00000編譯為0FF,機(jī)器關(guān)

DDE4 ,crc 16位校驗(yàn),可以自行生成

應(yīng)答報(bào)文:05,06的正確應(yīng)答報(bào)文一般都是把請(qǐng)求報(bào)文原樣輸出回來(lái)表示已經(jīng)執(zhí)行

06 功能碼示例:

請(qǐng)求報(bào)文:01 ,從站地址 ,一般一個(gè)485占一個(gè)COM口能接入31軸地址

06 ,Modbus 功能碼 寫(xiě)寄存器

4600,寫(xiě)寄存器4600

01f4, 十六進(jìn)制的500,modbus中全部都是十六進(jìn)制字節(jié)請(qǐng)求和應(yīng)答

這里還有兩節(jié)CRC,因?yàn)樗俣冉?jīng)常改變,所以沒(méi)有帶CRC,每次請(qǐng)求報(bào)文的字節(jié)發(fā)生變化時(shí)CRC一定會(huì)變化。

應(yīng)答報(bào)文:05,06的正確應(yīng)答報(bào)文一般都是把請(qǐng)求報(bào)文原樣輸出回來(lái)表示已經(jīng)執(zhí)行

10 功能碼示例:

這里展示一個(gè)稍微復(fù)雜一點(diǎn)的報(bào)文

請(qǐng)求報(bào)文:0E , 是十進(jìn)制從站地址14

10,Modbus 功能碼 寫(xiě)多個(gè)寄存器

015E,寫(xiě)寄存器015E

0002, 從015e開(kāi)始寫(xiě)兩個(gè)寄存器地址

04,四組字節(jié)

00 1E 84 80 ,高位字節(jié)在前低位字節(jié)在后,兩組字節(jié)為一個(gè)寄存器地址,兩個(gè)寄存器地址合起來(lái)存放一個(gè)大數(shù)值。比如這里的200w, 00 1E 84 80 轉(zhuǎn)換為十進(jìn)制=200w

這里還有兩節(jié)CRC,因?yàn)樗俣冉?jīng)常改變,所以沒(méi)有帶CRC,每次請(qǐng)求報(bào)文的字節(jié)發(fā)生變化時(shí)CRC一定會(huì)變化。

應(yīng)答報(bào)文:10的正確應(yīng)答報(bào)文一般都是把請(qǐng)求報(bào)文原樣輸出回來(lái)表示已經(jīng)執(zhí)行

下面一組報(bào)文其實(shí)同上,只是寫(xiě)入的數(shù)值是-200w

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

根據(jù)計(jì)算器可以直觀的看到十進(jìn)制-200w=FFE1 7B80

接下來(lái)說(shuō)說(shuō)兩個(gè)通用幫助類如何使用

1. 網(wǎng)口通訊

發(fā)送的字節(jié)數(shù)組是上面曾說(shuō)過(guò)的06功能碼,每個(gè)廠家都有自己的操作指令

2. 串口通訊

我的Modbus 通用幫助類 ,你可以選擇用Using連接Dispose自動(dòng)垃圾回收,也可以自己控制連接和關(guān)閉,建議每次發(fā)完一組操作指令后就斷開(kāi)和硬件的連接

接下來(lái)說(shuō)鳴志步進(jìn)電機(jī)的指令和控制代碼

在 region 鳴志步進(jìn)-多線程不安全模式 endregion,這個(gè)折疊標(biāo)簽里。從上到下依次是常用的十幾個(gè)命令如下:

調(diào)用方式如下:

接下來(lái)說(shuō)鳴志伺服電機(jī)的指令和控制代碼

在 region Servo_Moons endregion,這個(gè)折疊標(biāo)簽里。從上到下依次是常用的十幾個(gè)命令如下:

伺服和步進(jìn)的區(qū)別在于,伺服是閉環(huán)控制自帶編碼器,步進(jìn)是開(kāi)環(huán)控制沒(méi)有數(shù)據(jù)反饋容易丟步。伺服更精準(zhǔn)更貴。

在軟件層面,步進(jìn)電機(jī)通過(guò)寫(xiě)入簡(jiǎn)單明了的字符串指令輕易控制,但是同品牌的伺服電機(jī)要寫(xiě)地址操作起來(lái)更復(fù)雜。

調(diào)用方式如下:

接下來(lái)說(shuō)華慶軍繼電器模塊的指令和控制代碼

示例如下:

又是一串很熟悉的開(kāi)關(guān)線圈字節(jié)數(shù)組指令,華慶軍官網(wǎng)上下載調(diào)試軟件QingJunTestV3.0.exe

左側(cè)設(shè)置開(kāi)關(guān)量型選擇,比如我選擇的是32路輸入輸出

左側(cè)下方輸入地址或者IP

右側(cè)點(diǎn)擊對(duì)應(yīng)的Y1-32,藍(lán)色的一條操作碼就是我們需要的字節(jié)數(shù)組指令

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

上面是華慶軍輸出指令,輸入指令如下

接下來(lái)說(shuō)松下伺服電機(jī)的指令和控制代碼

松下modbus請(qǐng)求報(bào)文

以下為本人編輯好的Block動(dòng)作一覽

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

//松下電機(jī) Block相關(guān)動(dòng)作編號(hào)
//從站地址10 桶蓋
//0 正10w
//1 負(fù)10w
//2 正1000
//3 負(fù)1000
//4 163w3k
//5 正3k
//6 負(fù)3k
//7 絕對(duì)定位 0 回原點(diǎn)
//8 減速停止/即刻停止

比如調(diào)用緊急剎車如下

這里就要用到CRC動(dòng)態(tài)生成校驗(yàn)數(shù)組了

以下為工廠部分硬件實(shí)拍

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

以下為部分UI實(shí)拍

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

Modbus通訊協(xié)議及相關(guān)控制代碼詳解

祝各位在工控/自動(dòng)化的道路越走越舒坦

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號(hào)!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]

湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)