Modbus协议初识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/geek_liyang/article/details/82115384

 Modbus名称取自Modicon公司,该公司于1978年发明了这个协议,作为第一个真正用于工业现场的总线协议。Modbus因其本身作为面向消息的协议,可以支持多种电气接口的特性,加上协议本身简单紧凑的帧格式和标准、开放的设计理念,使之成为在世界范围内被广泛使用的协议标准

一提到Modbus,总是有人会直接将其与485总线联系在一起,其实Modbus协议官方手册上有明确说明,Modbus作为一种应用层的信息交换协议,它为通过不同总线、以太网等链路连接的设备,提供了一种C/S架构的通信方式。不同的设备诸如PLC,Control Panel,I/O Device等,通过不同的链路诸如RS485,TCP/IP等都可以基于Modbus协议进行通信。

                                      

如上图所示,不同类型的设备通过Modbus进行通信,交换业务信息。这里边值得一提是GateWay这种设备,在整个有线通信系统中扮演着链路层转化的工作,他可以将在以太网上跑的Modbus设备与在RS232上跑的设备互通有无。

Modbus协议定义了一种独立于链路层的数据交换单元(PDU),报文由功能码以及数据内容构成,功能码分为三类:1.公共功能码。2.用户自定义功能码。3.保留的功能码。作为一个Modbus设备,建议将所有共有的功能码实现,应该就能满足用户的所有业务需求,如果有自定义功能码的需求,需要从用户自定义功能码中选择未使用的实现私有的功能。

公共功能码分为三类:1.为数据访问类功能码。2.诊断类功能码。3.其他类别功能码。其中数据访问类为功能码的主体部分,其主要根据Modbus对数据模型的定义,分为四小类,第一种为只读的单Bit位操作,针对名为Discretes Input数据模型。第二种是可读写的单Bit位操作,针对名为Coils的数据模型。第三种为只读的16-bit字的操作,针对名为Input Registers数据模型。最后一种为读写的16-bit字的操作,针对名为Holding Registers的数据模型。具体的工作方式如下图:

                                     

Modbus协议一次通信的流程首先由客户端生成Request报文发送给服务器端,服务器端执行相应操作之后,再生成Response报文回复给客户端,如果在执行的过程中正常,则回复的Response报文中功能码与Request的报文一致,如果在执行功能异常,则将功能码最高位置一作为Response报文回复给客户端。

我们先对其中一个功能码举一个具体通信的例子,比如公共功能码0x03,它的定义是读取Holding Registers.ModBus协议,他的Request报文包含功能码0x03,以及读取的起始地址以及读取寄存器数,而Response报文报文则包含功能码,返回字节数,以及寄存器具体数据,详细报文内容见下图:

          

上边的例子是Modbus协议中定义的比较简单的例子,文档《Modbus_Application_Protocol_V1_1b3》有针对所有功能码的详细解释以及功能执行状态图。值得注意的是除了文档定义的基本的四种数据模型,公共功能码中还支持对File record这种类型的读写。

下边我们将对ModBus在串行网络以及TCP/IP上的实现分别举例说明。

猜你喜欢

转载自blog.csdn.net/geek_liyang/article/details/82115384