先上兩個(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ě)?
舉幾個(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
根據(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ù)組指令
上面是華慶軍輸出指令,輸入指令如下
接下來(lái)說(shuō)松下伺服電機(jī)的指令和控制代碼
松下modbus請(qǐng)求報(bào)文
以下為本人編輯好的Block動(dòng)作一覽
//松下電機(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í)拍
以下為部分UI實(shí)拍
祝各位在工控/自動(dòng)化的道路越走越舒坦
小編推薦閱讀機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀基于鴻蒙NEXT的血型遺傳計(jì)算器開(kāi)發(fā)案例
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(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)