modbus tcp 协议解析

在modbus服务器端,数据是使用地址的方式来公开的,这很好理解,服务器端保存了很多数据,你想要访问某个数据肯定需要指定唯一的身份标识,从连续的地址来区分数据是最常用的做法,不仅好理解,还便于扩展,比如你还可以读取连续地址的数据块。如果采用字符串名字来标识数据,就没有这个特点。

对于位操作来说(各种线圈和离散量),一个地址代表了一个bool变量,即 0 和 1,要么通要么断,就好比一些普通的开关。

对于寄存器来说,一个地址代表了2个byte,共有65536种方式,可以满足大多数日常使用了,比如我们读取地址0的寄存器,返回 00 00 及代表寄存器0数据为0,如果返回 01 00 ,那么代表寄存器0数据为 256

主机帧格式 以01功能码为例

byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11]

byte[0] byte[1] : 消息号---------随便指定,服务器返回的数据的前两个字和这个一样

byte[2] byte[3] :modbus标识,强制为0即可

byte[4] byte[5] :指示排在byte[5]后面所有字节的个数,也就是总长度-6

byte[6]: 站号,随便指定,00 – FF 都可以

byte[7] : 功能码,这里就需要填入我们的真正的想法了

byte[8] byte[9] :起始地址,比如我们想读取地址0的数据,就填 00 00 ,如果我们想读取地址1000的数据,怎么办,填入 03 E8 ,也就是将1000转化十六进制填进去。

byte[10] byte[11] :指定想读取的数据长度,比如我们就想读取地址0的一个数据,这里就写 00 01,如果我们想读取地址0-999共计一个数据的长度,就写 03 E8。和起始地址是一样的。

发送如下数据帧
00 00 00 00 00 06 FF 01 00 00 00 01

消息号设为0,站号FF,功能码01,地址01,长度01:将上面的指令在客户端程序里进行输入,点击发送,这样就在下面的响应框里接收到服务器反馈的数据,我们最终需要的信息就在反馈的数据里了。

从机响应帧格式

返回的数据就是 00 00 00 00 00 04 FF 01 01 00 共计10个字节的数据,

byte[0] byte[1] : 消息号,我们之前写发送指令的时候,是多少,这里就是多少。

byte[2] byte[3]: 必须都为0,代表这是modbus 通信

byte[4] byte[5]: 指示byte[5]后面的所有字节数,你数数看是不是4个?所以这里是00 04,如果后面共有100个,那么这里就是 00 64

byte[6]: 站号,之前我们写了FF,那么这里也就是FF

byte[7]: 功能码,我们之前写了01的功能码,这里也是01,和我们发送的指令是一致的

byte[8]: 指示byte[8]后面跟随的字节数量

byte[9]: 真实的数据,一个byte有8位,但是我们只读取了一个位数据,所有这里的有效值只是byte[9]的最低位,二进制为 0000 0000 我们看到最低位为0,所以最终我们读取的地址0的线圈为断。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值