先上兩個通用Modbus幫助類,下面這個是多線程不安全版,在多線程多電機同一端口通信下,可能造成步進電機丟步或者輸出口無響應等,還有個多線程安全版,只是基于這個不安全版加上了LOCK,THIS using Modbus.Device; using Sunny.UI; using System; us
先上兩個通用Modbus幫助類,下面這個是多線程不安全版。在多線程多電機同一端口通信下,可能造成步進電機丟步或者輸出口無響應等。還有個多線程安全版,只是基于這個不安全版加上了LOCK,THIS。
以下是多線程安全版,基于上方代碼封裝的版本。支持串口通訊,也支持網(wǎng)口通訊。Modbus通訊是軟件部署在工控機上作上位機控制下位機運轉,比如各種電機和繼電器模塊(將電腦的小電流信號轉換為大電流信號發(fā)送到硬件上)。
ModbusRTU的報文格式: 從站地址/設備Id(1個字節(jié))+功能碼(1個字節(jié))+數(shù)據(jù)部分(N個字節(jié))+校驗、CRC檢驗(2個字節(jié))。
一般常用的01,03,05,06,10。01是讀線圈,03是讀寄存器。05是寫線圈,06是寫寄存器。10是往多個寄存器里寫數(shù)值(16)。15不怎么用。
線圈是開關閥門。寄存器是一個存放數(shù)值的地址,每個地址有不同的作用,寫入不同的數(shù)值發(fā)揮不同的效應。
Modbus報文如何編寫?
舉幾個栗子:
01 功能碼示例:
請求報文:01 ,從站地址 ,一般一個485占一個COM口能接入31軸地址
01 ,Modbus 功能碼 讀取線圈地址
00 a0 ,讀取地址00a0
00 01 ,讀取一個字節(jié)長度,modbus通訊里,基本上是兩個字節(jié)為一個地址
FD E8 ,crc 16位校驗,可以自行生成
應答報文:01, 從站地址
01, 響應功能碼01
01,返回一位字節(jié)
01,這時候返回的響應字節(jié),就得看每個廠家是如何解釋的了,比如這里,00 就是 off ,01 就是 on
9048,crc 16位校驗,可以自行生成
03 功能碼示例:
請求報文:01 ,從站地址 ,一般一個485占一個COM口能接入31軸地址
03 ,Modbus 功能碼 讀取寄存器地址
602c ,讀取地址602c
00 02 ,讀取2字節(jié)長度,modbus通訊里,基本上是兩個字節(jié)為一個地址
1B C2 ,crc 16位校驗,可以自行生成
應答報文:01, 從站地址
03, 響應功能碼03
04,返回4位字節(jié)
05280005,這時候返回的響應字節(jié),就得看每個廠家是如何解釋的了,比如這里,一般是高位在前低位在后,但是這個廠家,低位在前高位在后,所以兩組字節(jié)要反過來轉換十進制。
0005在前0528在后,所以最后得到的電壓是 00050528HEX = 329000 DEC
05 功能碼示例:
請求報文:01 ,從站地址 ,一般一個485占一個COM口能接入31軸地址
05 ,Modbus 功能碼 寫線圈
0061 ,寫線圈0061
FF00,寫入FF00,硬件的編碼器看到FF00編譯為NO,機器開,00000編譯為0FF,機器關
DDE4 ,crc 16位校驗,可以自行生成
應答報文:05,06的正確應答報文一般都是把請求報文原樣輸出回來表示已經(jīng)執(zhí)行
06 功能碼示例:
請求報文:01 ,從站地址 ,一般一個485占一個COM口能接入31軸地址
06 ,Modbus 功能碼 寫寄存器
4600,寫寄存器4600
01f4, 十六進制的500,modbus中全部都是十六進制字節(jié)請求和應答
這里還有兩節(jié)CRC,因為速度經(jīng)常改變,所以沒有帶CRC,每次請求報文的字節(jié)發(fā)生變化時CRC一定會變化。
應答報文:05,06的正確應答報文一般都是把請求報文原樣輸出回來表示已經(jīng)執(zhí)行
10 功能碼示例:
這里展示一個稍微復雜一點的報文
請求報文:0E , 是十進制從站地址14
10,Modbus 功能碼 寫多個寄存器
015E,寫寄存器015E
0002, 從015e開始寫兩個寄存器地址
04,四組字節(jié)
00 1E 84 80 ,高位字節(jié)在前低位字節(jié)在后,兩組字節(jié)為一個寄存器地址,兩個寄存器地址合起來存放一個大數(shù)值。比如這里的200w, 00 1E 84 80 轉換為十進制=200w
這里還有兩節(jié)CRC,因為速度經(jīng)常改變,所以沒有帶CRC,每次請求報文的字節(jié)發(fā)生變化時CRC一定會變化。
應答報文:10的正確應答報文一般都是把請求報文原樣輸出回來表示已經(jīng)執(zhí)行
下面一組報文其實同上,只是寫入的數(shù)值是-200w
根據(jù)計算器可以直觀的看到十進制-200w=FFE1 7B80
接下來說說兩個通用幫助類如何使用
1. 網(wǎng)口通訊
發(fā)送的字節(jié)數(shù)組是上面曾說過的06功能碼,每個廠家都有自己的操作指令
2. 串口通訊
我的Modbus 通用幫助類 ,你可以選擇用Using連接Dispose自動垃圾回收,也可以自己控制連接和關閉,建議每次發(fā)完一組操作指令后就斷開和硬件的連接
接下來說鳴志步進電機的指令和控制代碼
在 region 鳴志步進-多線程不安全模式 endregion,這個折疊標簽里。從上到下依次是常用的十幾個命令如下:
調用方式如下:
接下來說鳴志伺服電機的指令和控制代碼
在 region Servo_Moons endregion,這個折疊標簽里。從上到下依次是常用的十幾個命令如下:
伺服和步進的區(qū)別在于,伺服是閉環(huán)控制自帶編碼器,步進是開環(huán)控制沒有數(shù)據(jù)反饋容易丟步。伺服更精準更貴。
在軟件層面,步進電機通過寫入簡單明了的字符串指令輕易控制,但是同品牌的伺服電機要寫地址操作起來更復雜。
調用方式如下:
接下來說華慶軍繼電器模塊的指令和控制代碼
示例如下:
又是一串很熟悉的開關線圈字節(jié)數(shù)組指令,華慶軍官網(wǎng)上下載調試軟件QingJunTestV3.0.exe
左側設置開關量型選擇,比如我選擇的是32路輸入輸出
左側下方輸入地址或者IP
右側點擊對應的Y1-32,藍色的一條操作碼就是我們需要的字節(jié)數(shù)組指令
上面是華慶軍輸出指令,輸入指令如下
接下來說松下伺服電機的指令和控制代碼
松下modbus請求報文
以下為本人編輯好的Block動作一覽
//松下電機 Block相關動作編號
//從站地址10 桶蓋
//0 正10w
//1 負10w
//2 正1000
//3 負1000
//4 163w3k
//5 正3k
//6 負3k
//7 絕對定位 0 回原點
//8 減速停止/即刻停止
比如調用緊急剎車如下
這里就要用到CRC動態(tài)生成校驗數(shù)組了
以下為工廠部分硬件實拍
以下為部分UI實拍
祝各位在工控/自動化的道路越走越舒坦
小編推薦閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權,請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)