先上两个通用Modbus帮助类,下面这个是多线程不安全版,在多线程多电机同一端口通信下,可能造成步进电机丢步或者输出口无响应等,还有个多线程安全版,只是基于这个不安全版加上了LOCK,THIS using Modbus.Device; using Sunny.UI; using System; us
先上两个通用Modbus帮助类,下面这个是多线程不安全版。在多线程多电机同一端口通信下,可能造成步进电机丢步或者输出口无响应等。还有个多线程安全版,只是基于这个不安全版加上了LOCK,THIS。
以下是多线程安全版,基于上方代码封装的版本。支持串口通讯,也支持网口通讯。Modbus通讯是软件部署在工控机上作上位机控制下位机运转,比如各种电机和继电器模块(将电脑的小电流信号转换为大电流信号发送到硬件上)。
ModbusRTU的报文格式: 从站地址/设备Id(1个字节)+功能码(1个字节)+数据部分(N个字节)+校验、CRC检验(2个字节)。
一般常用的01,03,05,06,10。01是读线圈,03是读寄存器。05是写线圈,06是写寄存器。10是往多个寄存器里写数值(16)。15不怎么用。
线圈是开关阀门。寄存器是一个存放数值的地址,每个地址有不同的作用,写入不同的数值发挥不同的效应。
Modbus报文如何编写?
举几个栗子:
01 功能码示例:
请求报文:01 ,从站地址 ,一般一个485占一个COM口能接入31轴地址
01 ,Modbus 功能码 读取线圈地址
00 a0 ,读取地址00a0
00 01 ,读取一个字节长度,modbus通讯里,基本上是两个字节为一个地址
FD E8 ,crc 16位校验,可以自行生成
应答报文:01, 从站地址
01, 响应功能码01
01,返回一位字节
01,这时候返回的响应字节,就得看每个厂家是如何解释的了,比如这里,00 就是 off ,01 就是 on
9048,crc 16位校验,可以自行生成
03 功能码示例:
请求报文:01 ,从站地址 ,一般一个485占一个COM口能接入31轴地址
03 ,Modbus 功能码 读取寄存器地址
602c ,读取地址602c
00 02 ,读取2字节长度,modbus通讯里,基本上是两个字节为一个地址
1B C2 ,crc 16位校验,可以自行生成
应答报文:01, 从站地址
03, 响应功能码03
04,返回4位字节
05280005,这时候返回的响应字节,就得看每个厂家是如何解释的了,比如这里,一般是高位在前低位在后,但是这个厂家,低位在前高位在后,所以两组字节要反过来转换十进制。
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的正确应答报文一般都是把请求报文原样输出回来表示已经执行
06 功能码示例:
请求报文:01 ,从站地址 ,一般一个485占一个COM口能接入31轴地址
06 ,Modbus 功能码 写寄存器
4600,写寄存器4600
01f4, 十六进制的500,modbus中全部都是十六进制字节请求和应答
这里还有两节CRC,因为速度经常改变,所以没有带CRC,每次请求报文的字节发生变化时CRC一定会变化。
应答报文:05,06的正确应答报文一般都是把请求报文原样输出回来表示已经执行
10 功能码示例:
这里展示一个稍微复杂一点的报文
请求报文:0E , 是十进制从站地址14
10,Modbus 功能码 写多个寄存器
015E,写寄存器015E
0002, 从015e开始写两个寄存器地址
04,四组字节
00 1E 84 80 ,高位字节在前低位字节在后,两组字节为一个寄存器地址,两个寄存器地址合起来存放一个大数值。比如这里的200w, 00 1E 84 80 转换为十进制=200w
这里还有两节CRC,因为速度经常改变,所以没有带CRC,每次请求报文的字节发生变化时CRC一定会变化。
应答报文:10的正确应答报文一般都是把请求报文原样输出回来表示已经执行
下面一组报文其实同上,只是写入的数值是-200w
根据计算器可以直观的看到十进制-200w=FFE1 7B80
接下来说说两个通用帮助类如何使用
1. 网口通讯
发送的字节数组是上面曾说过的06功能码,每个厂家都有自己的操作指令
2. 串口通讯
我的Modbus 通用帮助类 ,你可以选择用Using连接Dispose自动垃圾回收,也可以自己控制连接和关闭,建议每次发完一组操作指令后就断开和硬件的连接
接下来说鸣志步进电机的指令和控制代码
在 region 鸣志步进-多线程不安全模式 endregion,这个折叠标签里。从上到下依次是常用的十几个命令如下:
调用方式如下:
接下来说鸣志伺服电机的指令和控制代码
在 region Servo_Moons endregion,这个折叠标签里。从上到下依次是常用的十几个命令如下:
伺服和步进的区别在于,伺服是闭环控制自带编码器,步进是开环控制没有数据反馈容易丢步。伺服更精准更贵。
在软件层面,步进电机通过写入简单明了的字符串指令轻易控制,但是同品牌的伺服电机要写地址操作起来更复杂。
调用方式如下:
接下来说华庆军继电器模块的指令和控制代码
示例如下:
又是一串很熟悉的开关线圈字节数组指令,华庆军官网上下载调试软件QingJunTestV3.0.exe
左侧设置开关量型选择,比如我选择的是32路输入输出
左侧下方输入地址或者IP
右侧点击对应的Y1-32,蓝色的一条操作码就是我们需要的字节数组指令
上面是华庆军输出指令,输入指令如下
接下来说松下伺服电机的指令和控制代码
松下modbus请求报文
以下为本人编辑好的Block动作一览
//松下电机 Block相关动作编号
//从站地址10 桶盖
//0 正10w
//1 负10w
//2 正1000
//3 负1000
//4 163w3k
//5 正3k
//6 负3k
//7 绝对定位 0 回原点
//8 减速停止/即刻停止
比如调用紧急刹车如下
这里就要用到CRC动态生成校验数组了
以下为工厂部分硬件实拍
以下为部分UI实拍
祝各位在工控/自动化的道路越走越舒坦
山东通 官网下载 2.7.92000 272.1 MB
下载
湘ICP备2022002427号-10 湘公网安备:43070202000427号
© 2013~2024 haote.com 好特网