Modbus的ASCII和RTU通信

Modbus介绍

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

Modbus 是一个请求/应答协议。也叫做 SlaveMasterServerClient

同一种设备在不同领域的不同叫法,Slave和Server意思相同,Master和Client意思相同。

  • Slave:工业自动化用语;响应请求;
  • Master:工业自动化用语;发送请求;
  • Server:IT用语;响应请求;
  • Client:IT用语;发送请求;

协议分类

ModBus协议是应用层报文传输协议(OSI模型第7层),它定义了一个与通信层无关的协议数据单元(PDU),即PDU=功能码+数据域

Modbus通信栈

ModBus协议能够应用在不同类型的总线或网络。对应不同的总线或网络,Modbus协议引入一些附加域映射成应用数据单元(ADU),即ADU=附加域+PDU。目前Modbus有下列三种通信方式:

  1. 以太网,对应的通信模式是 MODBUS TCP
  2. 异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等),对应的通信模式是 MODBUS RTUMODBUS ASCII
  3. 高速令牌传递网络,对应的通信模式是 Modbus PLUS

ASCII模式

| : | 地址 | 功能代码 | 数据数量 | 数据1 | … | 数据n | LRC高4位字节值 | LRC低4位字节值 | 回车 | 换行 |

RTU模式

| 地址 | 功能代码 | 数据数量 | 数据1 | … | 数据n | CRC高字节 | CRC低字节 |

两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。

另外Modbus协议是一个主从协议,子节点在没有收到主节点的请求时并不主动发送数据,也不与其他子节点通信。

Modbus主从协议关系

Modebus中有单播模式(通过地址向单一设备)地址1到247之间,广播模式(所有设备接收)和子节点通信,地址0是专门用于广播数据的地址。

01 ~ 247248 ~ 255
广播地址子节点单独地址保留

主节点没有地址,只有子节点必须有一个地址,而且该地址必须在Modbus串行总线上唯一。

各种情形的主从通信时序图

帧格式

通用Modbus帧

ADU: 应用数据单元
PDU: 协议数据单元

通用Modbus帧格式中用一个字节作为功能码域,有效范围是十进制1到255(128到255为异常响应保留)。

对于异常响应,服务器返回一个与原始功能码等同的功能码,将功能码最高有效位逻辑1(即 逻辑与 0x80 ),数据位为错误code(占1字节)

对于正常响应,功能码为1字节,数据码有一个最大长度约束,因为Modbus PDU的最大长度为256字节,所以串行链路的数据位最大长度为253字节。

ASCII帧

使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。

其它域可以使用的传输字符是十六进制的0…9,A…F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。

消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:

起始位设备地址功能代码数据LRC校验结束符
1个字符2个字符2个字符n个字符2个字符2个字符

RTU帧

使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0…9,A…F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。

Modbus报文RTU帧

整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:

起始位设备地址功能代码数据CRC校验结束符
T1-T2-T3-T48Bit8Bitn个8Bit16BitT1-T2-T3-T4

消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。可能的从设备地址是0…247 (十进制)。单个设备的地址范围是1…247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。地址0是用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替。

应答包中,数据包括了数据字节长度+数据值,请求包中数据只包含数据值。

校验

我们的系统编码一个字节是8位,而在modbus的RTU模式中每个字节11位,格式为:

1811
起始位数据位作为奇偶校验停止位

例如:RTU字符帧的数据为 1100 0101

1 + 1 + 0 + 0 + 0 + 1 + 0 + 1 = 4

如果我们采用的是偶校验,4是偶数校验位就是0, 如果我们采用的是奇校验,则是1。

奇偶校验是默认的,但是也可以不使用奇偶校验,这样后两位(Bit)就都是停止位。

有奇偶校验:

| 起始 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 校验 | 停止 |

无奇偶校验:

| 起始 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 停止 | 停止 |

CRC校验

在RTU模式包含一个对全部报文内容执行的基于循环沉余校验算法的错误检验。无论有没有奇偶校验均执行此校验。

评论

Ajax Android AndroidStudio Animation Anroid Studio AppBarLayout Babel Banner Buffer Bulma ByteBuffer C++ C11 C89 C99 CDN CMYK COM1 COM2 CSS Camera Raw, 直方图 Chrome ContentProvider CoordinatorLayout C语言 DML DOM Dagger Dagger2 Darktable Demo Document DownloadManage ES2015 ESLint Element Error Exception Extensions File FileProvider Flow Fresco GCC Git GitHub GitLab Gradle Groovy HTML5 Handler HandlerThread Hexo Hybrid I/O IDEA IO ImageMagick IntelliJ Intellij Interpolator JCenter JNI JS Java JavaScript JsBridge Kotlin Lab Lambda Lifecycle Lint Linux Looper MQTT MVC MVP Maven MessageQueue Modbus Momentum MySQL NDK NIO NexT Next Nodejs ObjectAnimator Oracle VM Permission PhotoShop Physics Python RGB RS-232 RTU Remote-SSH Retrofit Runnable RxAndroid RxJava SE0 SSH Spring SpringBoot Statubar Task Theme Thread Tkinter UI UIKit UML VM virtualBox VS Code VUE ValueAnimator ViewPropertyAnimator Vue Web Web前端 Workbench api apk bookmark by关键字 compileOnly css c语言 databases demo hexo hotfix html iOS icarus implementation init jQuery javascript launchModel logo merge mvp offset photos pug query rxjava2 scss servlet shell svg tkinter tomcat transition unicode utf-8 vector virtual box vscode 七牛 下载 中介者模式 串口 临潼石榴 主题 书签 事件 享元模式 仓库 代理模式 位运算 依赖注入 修改,tables 光和色 内存 内核 内部分享 函数 函数式编程 分支 分析 创建 删除 动画 单例模式 压缩图片 发布 可空性 合并 同向性 后期 启动模式 命令 命令模式 响应式 响应式编程 图层 图床 图片压缩 图片处理 图片轮播 地球 域名 基础 增加 备忘录模式 外观模式 多线程 大爆炸 天气APP 太白山 头文件 奇点 字符串 字符集 存储引擎 宇宙 宏定义 实践 属性 属性动画 岐山擀面皮 岐山肉臊子 岐山香醋 工具 工厂模式 年终总结 开发技巧 异常 弱引用 恒星 打包 技巧 指针 插件 摄影 操作系统 攻略 故事 数据库 数据类型 数组 文件 新功能 旅行 旋转木马 时序图 时空 时间简史 曲线 杂谈 权限 枚举 架构 查询 标准库 标签选择器 样式 核心 框架 案例 桥接模式 检测工具 模块化 模板引擎 模板方法模式 油泼辣子 泛型 洛川苹果 浅色状态栏 源码 源码分析 瀑布流 热修复 版本 版本控制 状态栏 状态模式 生活 留言板 相册 相对论 眉县猕猴桃 知识点 码云 磁盘 科学 笔记 策略模式 类图 系统,发行版, GNU 索引 组件 组合模式 结构 结构体 编码 网易云信 网格布局 网站广播 网站通知 网络 美化 联合 膨胀的宇宙 自定义 自定义View 自定义插件 蒙版 虚拟 虚拟机 补码 补齐 表单 表达式 装饰模式 西安 观察者模式 规范 视图 视频 解耦器模式 设计 设计原则 设计模式 访问者模式 语法 责任链模式 贪吃蛇 转换 软件工程 软引用 运算符 迭代子模式 适配器模式 选择器 通信 通道 配置 链表 锐化 错误 键盘 闭包 降噪 陕西地方特产 面向对象 项目优化 项目构建 黑洞
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×