Modbus家族之开篇

Posted 夏沫の浅雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Modbus家族之开篇相关的知识,希望对你有一定的参考价值。

写在前面:

本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。


目录

系列文章:

Modbus家族之 RTU

Modbus家族之 ASCII


历史溯源

Modbus是由 Modicon公司(现在的施耐德电气 Schneider Electric)在 1979年开发的一种消息传递结构,为使用可编程逻辑控制器(PLC)通信而发表,用于在智能设备之间建立客户端 - 服务器通信;这是一个划时代、里程碑式的网络协议,因此为工业网络拉开了序幕。Modbus已经成为工业领域通信协议事实上的业界标准,并且现在是工业电子设备之间常用的连接方式。

Modbus在工业环境下很流行,因为它是公开发表并且无著作权要求的。它是为工业应用开发的,与其他标准相比,它相对易于部署和维护,除了要传输的数据格式的大小外,几乎没有其他限制。Modbus通常使用 RS485作为其物理层。

发展史

Modicon,即今天的施耐德电气,于 1979 年向市场推出了 Modbus原始协议(Modbus ASCII和 Modbus RTU);随着通信领域的迅速发展以及传输速度的提高,扩展版本 Modbus Plus(Modbus+或者MB+)紧接着出现,不过此协议是 Modicon专有的,和 Modbus并不相同;直到以太网技术的标准化和商品化,以太网成为了企业系统的业界标准,同时也成为了工业网络的业界标准;为了将 Modbus带入 21 世纪,一个开放的 Modbus TCP/IP规范于 1999 年修订发行;到了 2004 年 4 月,Modbus 协议从施耐德电气转移到 Modbus组织,这标志着对开放的承诺(该规范可免费下载,并且使用 Modbus 或 Modbus TCP/IP 协议无需后续许可费用);至此,在 Modbus TCP/IP 因为它的开放性、简单、低成本的开发以及支持它所需的最少硬件等特点,存在多个 Modbus TCP变种,而 Modbus ASCII和 Modbus RTU在小型的嵌入式设备当中得到广泛应用。


协议版本

Modbus协议目前存在用于串口以太网以及其他支持互联网协议的网络的版本。

Modbus是一种请求 / 回复协议,提供由功能代码指定的服务。Modbus功能代码是 Modbus Request(请求) / Response(响应) PDU 的元素。

串行端口和以太网存在多种版本的 Modbus协议,最常见的是:

  • Modbus RTU
  • Modbus ASCII
  • Modbus TCP
  • Modbus Plus

Modbus RTU

Modbus RTU 是一种紧凑的,采用二进制表示数据的方式;因为使用二进制编码和 CRC错误检查的结合使得 Modbus RTU适用于工业应用,因为它比 ASCII字符的替代方案更有效地传输。在 Modbus RTU与 ASCII之间进行选择时,如果考虑性能,则 RTU是首选。

Modbus ASCII

Modbus ASCII 是当设备设置为使用 ASCII美国信息交换标准代码)模式时,在 MODBUS 串行线上把通信消息中的每个 8位字节将作为两个 ASCII 4位字符发送。当物理通信链路或设备的功能不允许符合 RTU计时器管理要求时,使用此模式。所以此模式的效率不如 RTU,因为每个字节需要两个字符。示例:字节0x7D编码为两个字符: 0x350x42(在 ASCII表中为 0x37 = '7',而 0x44 = 'D')。

Modbus TCP

Modbus TCP 是在 TCP/IP 网络上运行的 Modbus的实现,旨在允许 Modbus ASCII / RTU协议在基于 TCP / IP的网络上传输。Modbus / TCP将 Modbus消息嵌入 TCP / IP帧内。尽管实现起来非常简单,但是与网络相关的特性增加了一些挑战。例如,由于Modbus主机期望并要求在一定时间范围内对其轮询做出响应,因此必须考虑 TCP / IP网络的不确定性(和其他方面)。Modbus ASCII和 Modbus TCP之间的主要区别在于,Modbus ASCII所需的 LRC错误检查由 IP层执行。

对于以上 TCP/ RTU/ ASCII的这三种通信协议在数据模型和功能调用上都是相同的,只有封装方式是不同的。

Modbus Plus

Modbus Plus (Modbus+或者MB+)属于 Modbus的一个扩展版本,不过此协议是Modicon专有的,和 Modbus不同。它需要一个专门的协处理器来处理类似 HDLC的高速令牌旋转。它使用 1Mbit/s的双绞线,并且每个节点都有转换隔离设备,是一种采用转换/边缘触发而不是电压/水平触发的设备。连接 Modbus Plus到计算机需要特别的接口,通常是支持 ISA(SA85),PCI或者 PCMCIA总线的板卡。


通信和设备

Modbus有下列三种通信方式:

(1)以太网:对应的通信模式是 Modbus TCP/IP

(2)异步串行传输(各种介质如有线 RS-232/422/485/、光纤、无线等):对应的通信模式是 Modbus RTUModbus ASCII

(3)高速令牌传递网络:对应的通信模式是 Modbus PLUS

Modbus通过多种类型的物理介质进行通信,例如:

  • 串行RS-232
  • 串行RS-485
  • 串行RS-422
  • 以太网

Modbus RTU和 Modbus ASCII协议应用于串口链接(RS232、RS485、RS422),Modbus TCP/IP协议应用于以太网链接。


消息结构

Modbus的主要消息结构是点对点,能够在点对点和多点网络上运行。

Modbus协议遵循 主 / 从(客户端 / 服务器) 架构,主(客户端)向从(服务器)发送请求并等待响应。注意!目前 Modbus中使用的术语 “主” 和 “从” 已被术语 “客户端” 和 “服务器” 所取代了。


帧格式

MODBUS协议定义了一个独立于底层通信层的简单协议数据单元(PDU);在特定总线或网络上的映射可以在应用数据单元(ADU)上引入一些附加字段。
Modbus帧由 ADU (Application Data Unit)和 PDU (Protocol Data Unit)组成:

  • ADU = Address + PDU + Error check
  • PDU = Function code + Data

Note:
在 Modbus数据帧中,值的字节顺序是大端字节(MSB,先收到值的最重要字节)。


对象类型

Modbus从设备提供给 Modbus主设备的对象类型如下表所示:

ObjectAccess SizeMaster AccessSlave Access
Coil1 bitRead / WriteRead / Write
Discrete Input1 bitRead OnlyRead / Write
Input Register16 bitsRead OnlyRead / Write
Holding Register16 bitsRead / WriteRead / Write

常见 Modbus开源库

FreeModbus

FreeMODBUS 是流行的 Modbus 协议的免费实现,专门针对嵌入式系统。FreeMODBUS 提供了 Modbus 应用协议 v1.1a 的实现,并支持 Modbus over serial line 规范 1.0 中定义的 RTU/ASCII 传输模式 ;自 0.7 版以来,FreeModbus 还支持 Modbus/TCP;0.9 版添加了第一个 Modbus/TCP 端口嵌入式使用 LWIP TCP/IP 堆栈的系统。唯一可惜的是,该 FreeMODBUS 只对从机开放了源码,主机部分并未实现开源。

以下是该 FreeMODBUS 的下载链接:

https://www.embedded-experts.at/en/freemodbus-downloads/

libmodbus

libmodbus是一个多平台的 Modbus 源库,适用于 Linux、Mac OS X、FreeBSD、QNX 和 Win32 等操作系统;可以根据 Modbus协议发送和接收数据。支持 RTU(串行)和 TCP(以太网)通信。

以下是该 libmodbus 的下载链接:

https://libmodbus.org/download/


参考

Modbus主页

Modbus - wiki

WHAT IS MODBUS?

modbus communication manual

MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b

Modbus Fieldbus Networking

Modbus Protocol Reference Guide

Modbus RTU通信指南

高级Modbus ASCII教程

modbus tools

以上是关于Modbus家族之开篇的主要内容,如果未能解决你的问题,请参考以下文章

Modbus家族之 ASCII

Modbus家族之 RTU

Modbus家族之 RTU

Modbus家族之 ASCII

Modbus家族之 RTU

Modbus家族之 ASCII