初步学习通讯协议之modbus

初步学习通讯协议之modbus

学习协议需要学习进制转换,下面是在线转换的网址,可以辅助学习:
二进制十进制八进制十六进制在线转换
ASCII编码转换
学习可以看下

modus-rtu协议功能码说明

Modbus常用功能码协议详解

格式
一整个指令称为ADU(应用数据单元)
功能码+数据称之为PDU(协议数据单元)

地址域功能码数据差错校验
一个字节一个字节若干个两个字节

0x01: 读线圈寄存器

发送:地址域(1字节),功能码(1字节),起始地址(2字节),线圈数量(2字节),校验位(2字节)
接收:地址域(1字节),功能码(1字节),字节数N(1字节),线圈状态(N字节),校验位(2字节)
错误:地址域(1字节),功能码(1字节),错误代码(1字节)(01/02/03/04)
N=输入点个数/8,如果余数不为0,则N=N+1
例如:
读取36个线圈的状态
发送:

地址域(1字节)功能码(1字节)起始地址(2字节)线圈数量(2字节)校验位(2字节)
010100 0000 24FD CD

注:十六进制,36十六进制为24
返回:

地址域(1字节)功能码(1字节)字节数N(1字节)线圈状态1(1字节)线圈状态2(1字节)线圈状态3(1字节)线圈状态4(1字节)线圈状态5(1字节)校验位(2字节)
0101050F03800101FD CD
05=36/8 — 4余4,余数不为0,n=n+1,4+1=50F十六进制转二进制00 00 11 11 ,则八个线圈的状态出来了。不够8位,字节高位填充为0,00 00 00 01,前四位为不够八位填充的0

0x02: 读离散输入寄存器

发送:地址域(1字节),功能码(1字节),起始地址(2字节),输入点数量N(2字节),校验位(2字节)
接收:地址域(1字节),功能码(1字节),字节数N(1字节),输入点状态(N字节),校验位(2字节)
错误:地址域(1字节),功能码(1字节),错误代码(1字节)(01/02/03/04)
N=输入点个数/8,如果余数不为0,则N=N+1
线圈的状态是用bit来表示的,查询的线圈数量要小于8的最小倍数。
如果查询线圈的个数,对8取余不等于零,则返回的字节数为对8整除+1.

(和读取线圈状态类似,不举例说明了)

0x03: 读保持寄存器

发送:地址域(1字节),功能码(1字节),起始地址(2字节),寄存器数量N(2字节),校验位(2字节)
接收:地址域(1字节),功能码(1字节),字节数N2(1字节),寄存器值(N2字节),校验位(2字节)
错误:地址域(1字节),功能码(1字节),错误代码(1字节)(01/02/03/04)
N= 寄存器数量
例如:
读取3个保持寄存器
发送:

地址域(1字节)功能码(1字节)起始地址(2字节)寄存器数量(2字节)校验位(2字节)
010300 0000 03FD CD

注:十六进制,3十六进制为3
返回:

地址域(1字节)功能码(1字节)字节数N*2(1字节)data1(2字节)data2(2字节)data3(2字节)校验位(2字节)
01030600 0100 0100 01FD CD
每个寄存器的值由2个byte组成

0x04: 读输入寄存器

发送:功能码(1字节),起始地址(2字节),寄存器数量(2字节)
接收:功能码(1字节),字节数N2(1字节),寄出去你值(N2字节)
错误:功能码(1字节),错误代码(1字节)(01/02/03/04)
(和读取保持寄存器类似,不举例说明了)

0x05: 写单个线圈寄存器

发送:功能码(1字节),线圈地址(2字节),写入值(2字节)
接收:功能码(1字节),线圈地址(2字节),写入值(2字节)
错误:功能码(1字节),错误代码(1字节)(01/02/03/04)
写单个线圈寄存器。FF00H值请求线圈处于ON状态,0000H值请求线圈处于OFF状态。05H指令设置单个线圈的状态,15H指令可以设置多个线圈的状态,两个指令虽然都设定线圈的ON/OFF状态,但是ON/OFF的表达方式却不同。
例如:
发送:

地址域(1字节)功能码(1字节)线圈地址(2字节)写入状态(2字节)校验位(2字节)
010500 00FF 00FD CD

*注:FF00是设置线圈状态为ON
返回:

地址域(1字节)功能码(1字节)线圈地址(2字节)写入状态(2字节)校验位(2字节)
010500 00FF 00FD CD

0x06: 写单个保持寄存器

发送:功能码(1字节),寄存器地址(2字节),写入值(2字节)
接收:功能码(1字节),寄存器地址(2字节),写入值(2字节)
错误:功能码(1字节),错误代码(1字节)(01/02/03/04)
(和05写单一寄存器类似)

0x0f: 写多个线圈寄存器

发送:功能码(1字节),起始地址(2字节),写入线圈个数N(2字节),写入字节数N(1字节),写入值(N字节)
接收:功能码(1字节),起始地址(2字节),写入线圈个数(2字节)
错误:功能码(1字节),错误代码(1字节)(01/02/03/04)

  • N= 写入线圈的个数/8,如果余数不为0,则N= N+1
  • 写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则为状态为OFF。
  • 线圈的个数来判断写入的字节数,每个线圈的状态使用bit位来表示。

0x10: 写多个保持寄存器

发送:功能码(1字节),起始地址(2字节),写入寄存器个数N(2字节),写入字节数N2(1字节),写入值(N2字节)
接收:功能码(1字节),起始地址(2字节),写入寄存器个数(2字节)
错误:功能码(1字节),错误代码(1字节)(01/02/03/04)

  • N = 写入寄存器的个数
  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程背景Modbus 协议是工业自动化控制系统中常见的通信协议,协议的全面理解是个痛点。本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。课程名称   协议讲解及实现>>课程内容1、Modbus 协议的基础。2、Modbus协议栈函数编程实现。3、Modbus协议在串行链路编程实现。4、Modbus协议在以太网链路编程实现。5、常见问题的解决方法。带给您的价值通过学习本课程,您可以做到如下:1、全面彻底的理解Modbus协议。2、理解在串行链路,以太网链路的实现。3、掌握Modbus协议解析的函数编程方法,调试工具的使用。4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。5、掌握Modbus协议下,负数,浮点数等处理方法。讲师简介许孝刚,山东大学工程硕士,副高职称,技术总监。10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。2017年获得“华为开发者社区杰出贡献者”奖励。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值