485总线Modbus通信协议详解

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

目录

Modbus相关概念介绍

点对点通信流程

串行线总线数据结构实施

主/从站通信模拟


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是一种主-从式的协议,它的实现定义根据OSI模型的数据链路层,这种协议规定了在一个总线系统中,只有一个设备节点扮演Master(主设备),其余所有设备扮演Slave(从设备),只有主设备有主动发起通信的权力,从设备是由接收主设备的指令或者回复主设备询问的权利。Modbus 应用层协议定义Modbus中的Client由Master扮演,而Server由Slave扮演。

Modbus串行线协议的协议数据结构由如下四部分构成:1.Address filed,这一部分指明Slave的地址, 主控制器发送的报文有两种格式,一种为单播报文,地址范围必须为1到247,并且对应的唯一Slave需要进行回复。另外一种为广播报文,广播报文一般为必要的写操作,总线上所有的设备都应该接收广播报文并完成被写的操作。地址0为广播报文,地址1~247为终端,248~255为保留的地址。2.Function code,这部分与MODBUS PDU中的Functon code一致。3.Data,数据区域与MODBUS PDU中的数据一致。4.Error checking field.为了保证报文完整性的错误检测部分。

             

这种主从模式被高级数据链路控制(High-Level Data Link Control或简称HDLC)称为非平衡配置,MODBUS简单描述了Master需要实现的行为:开机进入空闲模式,如果有需要发送广播报文(不需要Slave回复),则等待一个Turnaround delay时间(等待从站执行指令完毕),然后回到空闲模式等待下一次发送,如果需要发送的单播指令,发送完毕之后进入等待回复状态,若正确收到回复则处理回复,并回到空闲模式,若等待超时,则进行错误处理,并回到空闲模式。MODBUS同样描述了Slave的行为:开机进入空闲模式,等待接收数据,当接收数据有帧错误的时候,进入错误处理并回到空闲模式。当接收到的整个MODBUS PDU有错误,或者接收指令再执行的过程中遇到错误,则回复Master错误信息,若成功执行指令,则回复正确的指令回复。下图为主从通信的时间图,对理解整个通信的过程有很大的帮助:

               

根据不同的需求,两种不同的传输模式都可以在串行总线上实施,第一种是RTU模式,所有的ModBus串行设备都应该实施这种模式,这种模式根据实际的传输的物理层定义,在串行线的基础上又对其逻辑链路层做了进一步扩充。串口对帧的定义包括起始位,数据位,奇偶校验位,停止位,而RTU这种模式的帧格式与其保持一致,在传输MPDBUS PDU时,首先将其按字节拆分,并将1位起始位,和8位字节数据,和一个偶校验位(偶校验作为必须实施的默认配置)以及一位停止位,形成一个串口帧发送。接收设备通过帧间隔来区分出属于一个MODBUS PDU的帧有哪些。RTU规定,帧与帧之间时间间隔小于等于1.5个帧传输时间的帧同属于一个MODBUS PDU,而属于不同MODBUS PDU的帧之间的时间间隔必须大于等于3.5个帧传输时间。在这种模式下,错误检测部分采用的是CRC校验。

第二种模式为ASCII Transmission Mode,这种模式将在串行线传输的数据根据ASCII进行编码(The byte 0X5B is encoded as two characters : 0x35 and 0x42 ( 0x35 ="5", and 0x42 ="B" in ASCII )),传输的具体帧格式为1位起始位,7位数据位(ASCII码值),一位校验位以及一位停止位,接收设备通过识别“:”来判断MODBUS PDU的起始,通过“CR","LF"两个字符来判断结束。错误校验通过LRC来判断。

Modbus也有自己的校验算法,来保证通信报文的有效性。如下:

uint16_t mobus_crc16(const uint8_t *CRC_Buf,uint8_t CRC_Leni)
{
    uint8_t i,j;
    uint16_t CRC_Sumx;
 
    CRC_Sumx=0xffff;
    for(i=0;i<CRC_Leni;i++)
    {
        CRC_Sumx^=*(CRC_Buf+i);
         for(j=0;j<8;j++)
        {
            if(CRC_Sumx&0x01)
            {
                CRC_Sumx>>=1;
                CRC_Sumx^=0xA001;
            }
            else
            {
                CRC_Sumx>>=1;
            }
        }
    }
    return (CRC_Sumx);
}

主/从站通信模拟

下面我们通过软件Modbus Poll与Modbus Slave来模拟一个Master向Slave发送命令读取寄存器值的实例。

首先使用VSPD虚拟两个连接的串口,我这里虚拟的为串口3和串口4,分别打开Modbus Poll与Modbus Slave,分别点开Connection中选择Connect,选择串口模式,并配置两端的串口参数一致,分别点击OK。

                  

选择Modbus Slave中的Setup,点击Slave Definition,配置Slave相关的参数,例如地址,支持的功能码,存储单位起始地址,以及存储数量,并修改寄存器地址方便看结果,如下图                                                                  

 

然后选择Modbus Poll,点开Set up 并点击Read/Write Definition,配置从站地址,以及读取寄存器的功能码以及相关的参数,配置完成之后,点击Read/Write Once,完成一次读取寄存器操作,能够看到Master这里的寄存器值与Slave变成了一致。

如果想要看具体发送的协议内容,在Modbus Poll中的Display中点开Communication Traffic,就能看到具体的协议交互内容,对比文档Modbus_Application_Protocol_V1_1b3就能解析发送与回复的报文内容,截图如下:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值