本文主要目的是为了写一个简单的MODBUS-TCP服务器-客户端程序而记录的知识点,里面包含了编程所需要的必要背景知识和协议解析流程图。

MODBUS基本数据类型

  MODBUS有四种基本数据类型:
  离散量输入:客户端只能读取它,由服务器提供,占1个比特位,可以传输现实中的开关量输入,比如接近开关的通断信息等。
  线圈:客户端可以可写入和读取,服务器根据客户端的设定改变其值,占1个比特位,可以控制现实中的继电器的吸合与断开。
  输入寄存器:客户端只能读取它,最小单位是16比特字,它也可以传输8位数据。传输超过16比特数据的时候需要多个输入寄存器,现实中的温度,电压等数据可通过输入寄存器来传输。
  保持寄存器:客户端可以写入或者读取,最小单位是16比特字,可以设置一些参数,以及现实中的电压等物理量。

MODBUS-TCP数据格式

一个正常的MODBUS-TCP数据帧包括以下三部分:

  这三部分合称为ADU,也就是应用数据单元,其中功能码和数据合称为PDU,也就是协议数据单元。ADU中的MBAP(MODBUS Application Protocol)是MODBUS-TCP特有的内容。PDU在所有MODBUS中格式完全相同。
  MODBUS-TCP数据帧使用端口502发送,端口502是互联网组织专门为MODBUS-TCP协议保留的端口号。

MBAP报文头格式:

  MBAP报文头(MODBUS协议报文头)共7个字节,其含义如下:
  事务元标识符:2字节,由于客户端可以同时发送多条请求,为了区分服务器响应的是哪条请求,客户端在请求帧中使用计数器值填充此区域,服务器可以在响应帧中返回相同的计数值供客户端来区分请求。
  协议标识符:2字节,保持为0,表示是MODBUS协议
长度:2字节,后续字节数
  单元标识符:1字节,对于需要转发给串行链路的MODBUS设备才有意义,一般无需考虑,写0即可。

PDU格式

  由于不同功能码对应着不同的数据格式,因此需要将功能码和数据部分一起阐释,我这里只介绍我的程序将要涉及到的功能码3和16。之所以只选择了这两个功能码,是由于这两个功能码基本上就可以涵盖数据采集相关的所有功能,写多个寄存器可以设置采集参数、DA输出、设置开关量输出……读多个寄存器可以读取各种采集结果。

03 (0x03)读保持寄存器

  每个寄存器的宽度是16位,2个字节,由于是大端模式(Big-endian),因此高字节在前,低字节在后,其具体数据格式如下:
请求:

功能码 1个字节 3(0x03)
起始地址 2个字节 0~65535(0xFFFFF)
寄存器数量 2个字节 N=1~125(0x7D)

响应:

功能码 1个字节 3(0x03)
字节数 1个字节 N*2
寄存器值 N*2个字节

举例:
下列是请求读地址偏移0一个寄存器的值,寄存器值是0
字节序号(10进制):00 01 02 03 04 05 06 07 08 09 10 11
发送字符(16进制):00 00 00 00 00 06 00 03 00 00 00 01
接受字符(16进制):00 00 00 00 00 05 00 03 02 00 00

寄存器数量是受限于MODBUS-RTU的协议数据帧(PDU)长度不能超过252,PDU中的功能码和字节数占用两个字节,因此(252-2)/2=125

读保持寄存器流程图

16 (0x10)写保持寄存器

  写保持寄存器是读多个寄存器的反向操作,它可以与读多个寄存器是同一个功能项的读写操作,也可以是不同功能项的单独操作。例如在DA(数模转换)中,使用写多个寄存器设置DA输出值,然后可以用读多个寄存器返回之前设定的值。也可以相同的地址,返回AD(模数转换)的采集值,这取决于实际应用。其具体格式如下:
请求:

功能码 1个字节 16(0x10)
起始地址 2个字节 0~65535(0xFFFFF)
寄存器数量 2个字节 N=1~123(0x7B)
字节数 1个字节 2*N
寄存器值 N*2个字节 大端排列的值

PDU最大字节数为252,减去功能码,起始地址,寄存器数量,字节数所占用的6个字节为246,因此寄存器数量最大为123。

响应:

功能码 1个字节 16(0x10)
起始地址 2个字节 与请求起始地址相同
寄存器数量 2个字节 N

举例:
下列是请求写地址偏移0一个寄存器的值,寄存器值是0
字节序号(10进制):00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
发送字符(16进制):00 00 00 00 00 09 00 10 00 00 00 01 02 00 00
接受字符(16进制):00 00 00 00 00 06 00 10 00 00 00 01

写多个寄存器流程图:

异常响应

  当请求失败的时候,服务器将会返回异常响应,异常响应帧会在功能码的位置将原有功能码+0x80,后面的数据是异常码,其具体格式如下:
异常响应:

功能码 1个字节 0x80+请求功能码
异常码    1个字节   常用异常码:
01:不支持的功能码
02:地址错误,起始地址+寄存器数量如果超范围,也属于地址错误
03:数据错误,这里的数据还包括了PDU数据本身,比如请求的寄存器数量超过了PDU所允许的最大长度。
04:从站故障,在服务器处理请求过程中遇到了错误。

MODBUS-TCP请求响应流程

  服务器在接收到客户端请求后,首先判断协议标识符,如果是MODBUS协议,才能继续处理,然后根据MBAP报文头中的后续字节数来拆出一个完整的数据帧。如果客户端是使用请求-响应方式来发送请求,则服务器接收到的每包数据都应该是且只有一个完整的数据包。最后根据功能码来将请求交给各个功能码子程序来处理。流程图如下:

接下来就要真正写程序了!

MODBUS-TCP协议简介与编程流程图相关推荐

  1. DI计数器Modbus TCP协议2路PWM输出WiFi模块

    产品特点: ● 3路开关量输入,2路开关量输出 ● DI每一路都可用作计数器或者频率测量 ● DO每一路都可独立输出PWM信号 ● 支持Modbus TCP 通讯协议 ● 内置网页功能,可以通过网页查 ...

  2. 3路DI计数器,2路PWM输出,Modbus TCP协议,WiFi模块WJ165

    产品特点: ●  3路开关量输入,2路开关量输出 ●  DI每一路都可用作计数器或者频率测量 ●  DO每一路都可独立输出PWM信号 ● 支持Modbus TCP 通讯协议 ● 内置网页功能,可以通过 ...

  3. 4路DI开关检测计数器, Modbus TCP协议,WiFi模块 WJ160

    产品特点: ●  4路开关量输入,支持NPN和PNP输入 ●  DI每一路都可用作计数器或者频率测量 ● 支持Modbus TCP 通讯协议 ● 可以设置每转脉冲数用于转速测量 ● 内置网页功能,可以 ...

  4. ModBus/TCP协议分析

    ModBus/TCP协议分析 一.术语 1 word = 2 byte; 1 byte = 8 bit. 校验码:校验码是由前面的数据通过某种算法得出的,用以检验该组数据的正确性.代码作为数据在向计算 ...

  5. 1路编码器或2路DI脉冲计数器,Modbus TCP协议,WiFi模块

    ● 编码器解码转换成标准Modbus TCP协议 ● 可用作编码器计数器或者转速测量 ● 支持编码器计数,可识别正反转,支持4倍频计数 ● 也可以设置作为2路独立DI高速计数器 ● 计数值断电自动保存 ...

  6. Modbus和Modbus/TCP协议

    Modbus和Modbus/TCP协议 文章目录 Modbus和Modbus/TCP协议 一. 概述 二. 协议规范 (1) Modbus应用协议 (2)通用Modbus帧结构--协议数据单元(PDU ...

  7. C# modbus TCP协议应用

    C# modbus TCP协议应用 协议简介 Modbus由MODICON公司(现施耐德公司)于1979年开发,是一种工业现场总线协议标准.主要分为了RTU,ASCII,TCP三种协议类型.本文我们只 ...

  8. MODBUS TCP协议实例数据帧详细分析

    MODBUS TCP协议实例数据帧详细分析 1.简介 2.ModbusTCP数据帧 2.1.报文头MBAP 2.2.帧结构PDU 3.ADU详细结构 3.1. 0x01:读线圈 3.2. 0x02:读 ...

  9. 编码器AB信号或2路DI脉冲计数器,Modbus TCP协议,WiFi模块

    ● 编码器解码转换成标准Modbus TCP协议 ● 可用作编码器计数器或者转速测量 ● 支持编码器计数,可识别正反转,支持4倍频计数 ● 也可以设置作为2路独立DI高速计数器 ● 计数值断电自动保存 ...

最新文章

  1. CentOS通过 All-in-One 模式安装 KubeSphere技巧
  2. 毛坦厂中学是“高考工厂”?白岩松:我做不出嘲讽它的事情!
  3. 如果你陷入职业迷茫,就看看这些建议!
  4. 前端学习(2373):项目介绍
  5. 解决Eclipse 项目报错:Unbound classpath container: ‘JRE System Library [JavaSE-1.7]
  6. 检查python模块_Python输入模块–有效使用类型检查器
  7. Babelua 调试
  8. centerX: 用中国特色社会主义的方式打开centernet
  9. 常用路由器术语缩略语表
  10. Learn Git Branching 笔记
  11. 【Datawhale数据可视化组队学习】Task05 - 样式色彩秀芳华
  12. 清华大学计算机系刘斌,Tsinghua University Outstanding Master Student 清华大学优秀硕士毕业生...
  13. html 调用es2015模块,在浏览器中懒加载ES2015模块
  14. 【金猿案例展】上海市儿童基金会——管理会计云平台建设
  15. 耳机的危害有多严重?哪种耳机对耳朵伤害小?
  16. Unable to locate appropriate constructor on class
  17. 谷歌浏览器突然打不开
  18. JCE问题 :error constructing MAC: java.lang.SecurityException: JCE cannot authenticate the provider BC
  19. QT QTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能
  20. 人工智能之设计师构想一

热门文章

  1. 跨平台的进程管理工具 watchdog (支持 http 接口调用)
  2. 艾永亮:智能玩具无法下沉市场,超级产品玩具难再现
  3. CPOS正式上线非小号,添加自选随时掌握资产行情
  4. 帝国CMS百度实时主动推送插件
  5. [实战篇]关于QQ邮箱注册之测试用例
  6. 非禁用validateRequest=false使用Page_Error()错误处理
  7. 解决Sybase数据库死锁的方法
  8. 生成器对象(Generator)
  9. 海华AW_CM276NF模块驱动调试
  10. 运维人生攻城狮第八次搬家