首页 > 教程 > Modbus通讯协议及相关控制代码详解

Modbus通讯协议及相关控制代码详解

时间:2024-06-02 | 来源: | 阅读:131

话题: T Net 协议 控制 S 松下 代码

先上两个通用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报文如何编写?

Modbus通讯协议及相关控制代码详解

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

Modbus通讯协议及相关控制代码详解

根据计算器可以直观的看到十进制-200w=FFE1 7B80

接下来说说两个通用帮助类如何使用

1. 网口通讯

发送的字节数组是上面曾说过的06功能码,每个厂家都有自己的操作指令

2. 串口通讯

我的Modbus 通用帮助类 ,你可以选择用Using连接Dispose自动垃圾回收,也可以自己控制连接和关闭,建议每次发完一组操作指令后就断开和硬件的连接

接下来说鸣志步进电机的指令和控制代码

在 region 鸣志步进-多线程不安全模式 endregion,这个折叠标签里。从上到下依次是常用的十几个命令如下:

调用方式如下:

接下来说鸣志伺服电机的指令和控制代码

在 region Servo_Moons endregion,这个折叠标签里。从上到下依次是常用的十几个命令如下:

伺服和步进的区别在于,伺服是闭环控制自带编码器,步进是开环控制没有数据反馈容易丢步。伺服更精准更贵。

在软件层面,步进电机通过写入简单明了的字符串指令轻易控制,但是同品牌的伺服电机要写地址操作起来更复杂。

调用方式如下:

接下来说华庆军继电器模块的指令和控制代码

示例如下:

又是一串很熟悉的开关线圈字节数组指令,华庆军官网上下载调试软件QingJunTestV3.0.exe

左侧设置开关量型选择,比如我选择的是32路输入输出

左侧下方输入地址或者IP

右侧点击对应的Y1-32,蓝色的一条操作码就是我们需要的字节数组指令

Modbus通讯协议及相关控制代码详解

上面是华庆军输出指令,输入指令如下

接下来说松下伺服电机的指令和控制代码

松下modbus请求报文

以下为本人编辑好的Block动作一览

Modbus通讯协议及相关控制代码详解

//松下电机 Block相关动作编号
//从站地址10 桶盖
//0 正10w
//1 负10w
//2 正1000
//3 负1000
//4 163w3k
//5 正3k
//6 负3k
//7 绝对定位 0 回原点
//8 减速停止/即刻停止

比如调用紧急刹车如下

这里就要用到CRC动态生成校验数组了

以下为工厂部分硬件实拍

Modbus通讯协议及相关控制代码详解

以下为部分UI实拍

Modbus通讯协议及相关控制代码详解

Modbus通讯协议及相关控制代码详解

祝各位在工控/自动化的道路越走越舒坦

推荐

最新好玩手游

更多

手游风云榜

更多

资讯阅读

更多


湘ICP备2022002427号-10 湘公网安备:43070202000427号
© 2013~2024 haote.com 好特网