首页 > 其他分享 >Modbus详解

Modbus详解

时间:2022-10-28 17:44:44浏览次数:34  
标签:00 01 06 Modbus 详解 寄存器 ASCII

@

目录

简介

Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。

协议

ModBus协议是应用层报文传输协议(OSI模型第7层),它定义了一个与通信层无关的协议数据单元(PDU),即PDU=功能码+数据域。
ModBus协议能够应用在不同类型的总线或网络。对应不同的总线或网络,Modbus协议引入一些附加域映射成应用数据单元(ADU),即ADU=附加域+PDU。

img

目前,Modbus有下列三种通信方式:

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

特点

Modbus具有以下几个特点:

  1. 标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。目前,支持Modbus的厂家超过400家,支持Modbus的产品超过600种。
  2. Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
  3. Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。

标准的Modbus口是使用RS-232-C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。

传输方式

在ModBus系统中有2种传输模式可选择。这2种传输模式与从机PC通信的能力是同等的。选择时应视所用ModBus主机而定,每个ModBus系统只能使用一种模式,不允许2种模式混用。一种模式是ASCII(美国信息交换码),另一种模式是RTU(远程终端设备)。
用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。在其它网络上(像MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。

ASCII模式

当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,一个信息中的每8个比特作为2个ASCII字符传输,如数值63H用ASCII方式时,需发送两个字节,即ASCII“6"(0110110)和ASCII”3“(0110011),ASCII字符占用的位数有7位和8位,国际通用7位为多。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。

  • 代码系统
    • 十六进制,ASCII字符0...9,A...F
    • 消息中的每个ASCII字符都是一个十六进制字符组成  ASCII”3“(0110011) ASCII“6"(0110110)
  • 每个字节的位
    • 1个起始位
    • 7个数据位,最小的有效位先发送
    • 1个奇偶校验位,无校验则无
    • 1个停止位(有校验时),2个Bit(无校验时)
    • 错误检测域
    • LRC(纵向冗长检测)

img

RTU模式

当控制器设为在Modbus网络上以RTU模式通信,在消息中的每个8Bit字节按照原值传送,不做处理,如63H,RTU将直接发送01100011。这种方式的主要优点是:数据帧传送之间没有间隔,相同波特率下传输数据的密度要比ASCII高,传输速度更快[1]。

  • 代码系统
    • 8位二进制,十六进制数0...9,A... F
  • 消息中的每个8位域都是一或两个十六进制字符组成每个字节的位
    • 1个起始位
    • 8个数据位,最小的有效位先发送
    • 1个奇偶校验位,无校验则无
    • 1个停止位(有校验时)
    • 2个Bit(无校验时)

img

// 报文实例
0x11 读取从机设备ID   正常
发送  01 11 C0 2C
返回  01 11 FF FF 50 6D 

0x01 取得一组逻辑线圈的当前状态(没有使用,返回值恒等于0)
     从机 功能码  起始线圈  线圈数量   按位表示
发送:01 01 00 00 00 01 FD CA   (当设置为FF 读1,当设置成00 读0)
     从机 功能码  字节数  数据  CRC
返回:01 01 01 00 51 88 

0x02 读取离散输入状态,00是第一个数据地址   IO是输入模式 正常
      从机 功能码   线圈地址  线圈数量
 发送:01 02 00 00 00 01 B9 CA
 返回:01 02 01 00 A1 88

0x03 读取保持寄存器值(寄存器起始地址是从01开始的)
发送  01 03 00 01 00 05 D4 09
     从机  功能码  数据长度  数据   CRC
返回  01 03 0A A0 02 A0 03 A0 04 A0 05 A0 06 21 4F

0x04 读取输入寄存器值(寄存器起始地址是从01开始的) ADC模式用
发送  01 04 01 E3
返回  01 84 03 03 01    错误帧返回(功能码会变成84)
     从机 功能码  寄存器起始地址   寄存器个数  CRC
发送  01 04 00 01 00 05 61 C9
     从机  功能码  数据长度  数据   CRC
返回  01 04 0A 03 87 A0 03 A0 04 A0 05 A0 06 7C 9F

0x05 强制单个线圈通断   IO是输出模式 正常
配置IO口1 输出模式  低电平 :
     从机 功能码  线圈地址  线圈数据  协议本身规定
发送: 01 05 00 00 00 00 CD CA 
返回: 01 05 00 00 00 00 CD CA 
  
配置IO口1 输出模式  高电平 :
发送:01 05 00 00 FF 00 8C 3A (只能配置FF00或者0000)
返回:01 05 00 00 FF 00 8C 3A 

0x06 写入单个保持寄存器(寄存器起始地址是从01开始的)
     从机 功能码  寄存器起始地址 CRC
发送:01 06  00 02 12 34  25 7D
返回:01 06  00 02 12 34  25 7D

0x0F 强制一连串线圈通断   IO是输出模式 正常
     从机 功能码  线圈地址  线圈数量  数据长度   数据  CRC校验
发送:01 0F 00 01 00 03 01 07 F3 55
返回:01 0F 00 01 00 03 44 0A

0x10 写入多个保持寄存器(寄存器起始地址是从01开始的)
     从机 功能码   寄存器起始地址 寄存器个数 数据个数  数据 CRC
发送:01 10 00 00 00 03 06 11 22 33 44 55 66 ED ED
     从机 功能码   寄存器起始地址 寄存器个数 CRC
返回:01 10 00 00 00 03 80 08

TCP模式

img


0x11 读取从机设备ID   正常
    通信事务处理标识符  协议标识符   数据长度 设备地址  功能码
发送  00 00 00 00 00 02 01 11
返回  00 00 00 00 00 02 01 11 

0x04 读取输入寄存器值(寄存器起始地址是从01开始的) ADC模式用
发送  00 00 00 00 00 06 01 04 00 01 00 05
返回  00 00 00 00 00 0D 01 04 0A 01 91 00 00 00 00 00 00 00 00
发送   00 00 00 00 00 06 01 04 00 01 00 01
返回   00 00 00 00 00 05 01 04 02 00 00 

0x10 写入多个保持寄存器(寄存器起始地址是从01开始的)
发送:00 00 00 00 00 0D 01 10 00 01 00 03 06 11 22 33 44 55 66 
返回:00 00 00 00 00 06 01 10 00 00 00 03 

0x03 读取保持寄存器值(寄存器起始地址是从01开始的)
发送:00 00 00 00 00 06 01 03 00 01 00 05 
返回:00 00 00 00 00 0D 01 03 0A 00 00 00 00 00 00 00 00 00 00 
     00 00 00 00 00 0D 01 03 0A 11 22 33 44 55 66 00 00 00 00

0x06 写入单个保持寄存器(寄存器起始地址是从01开始的)
发送:00 00 00 00 00 06 01 06  00 02 12 34
返回:00 00 00 00 00 06 01 06 00 02 12 34

0x01 取得一组逻辑线圈的当前状态(没对应的测试点)
发送:00 00 00 00 00 06 01 01 00 01 00 01 (当设置为FF 读1,当设置成00 读0)
返回:00 00 00 00 00 04 01 01 01 00 

0x05 强制单个线圈通断   IO是输出模式 正常
     从机 功能码  线圈地址  线圈数据  协议本身规定
    配置IO口1 输出模式  低电平
发送: 00 00 00 00 00 06  01 05 00 00 00 00
返回: 00 00 00 00 00 06 01 05 00 00 00 00 
    配置IO口2 输出模式  高电平
发送: 00 00 00 00 00 06  01 05 00 00 FF 00
返回: 00 00 00 00 00 06 01 05 00 00 FF 00 

0x0F 强制一连串线圈通断   IO是输出模式 正常
发送:00 00 00 00 00 08 01 0F 00 00 00 01 01 01
返回:00 00 00 00 00 06 01 0F 00 00 00 01 

0x02 读取一组开关的当前输入状态,00是第一个数据地址   IO是输入模式 正常
     从机 功能码   线圈地址  线圈数量
发送:00 00 00 00 00 06 01 02 00 00 00 01
返回:00 00 00 00 00 04 01 02 01 00 

校验方式

CRC校验

CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节和当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相异或(XOR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相异或(XOR)。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
CRC添加到消息中时,低字节先加入,然后高字节。

LRC校验

LRC错误校验用于ASCII模式。这个错误校验是一个8位二进制数,可作为2个ASCII十六进制字节传送。把十六进制字符转换成二进制,加上无循环进位的二进制字符和二进制补码结果生成LRC错误校验(参见图)。这个LRC在接收设备进行核验,并与被传送的LRC进行比较,冒号(:)、回车符号(CR)、换行字符(LF)和置入的其他任何非ASCII十六进制字符在运算时忽略不计。

功能码

功能码可以分为位操作和字节操作,位操作的最小单位时Bit,字节操作的最小单位为2个字节(Byte)。

  1. 位操作指令:
    • 读线圈状态01H
    • 读离散输入状态02H
    • 写单个线圈05H
    • 写多个线圈0FH
  2. 字节操作指令:
    • 读保存寄存器03H
    • 读输入寄存器04H
    • 写单个保存寄存器06H
    • 写多个保存寄存器10H

img

标签:00,01,06,Modbus,详解,寄存器,ASCII
From: https://www.cnblogs.com/Wei-Ting/p/16836894.html

相关文章