开发者中心 开发者中心
  • 简体中文
  • English
视频教程
敢为云网站
  • 6.0版本
  • 6.1 版本
视频教程
敢为云网站
  • 平台概述
  • 平台功能
  • 平台安装
  • 开发者指南
  • 项目实战
  • 附录
    • 常用协议说明
      • MODBUS
        • 1 协议简介
          • 1.1 Modbus特点
          • 1.2 Modbus标准网络
          • 1.3 其他网络
          • 1.4 查询回应周期
        • 2 常用的传输方式与格式(RTU/ASCII/TCP)
          • 2.1 串口通信
          • 2.2 TCP 通信
          • 2.3 地址域
          • 2.4 如何处理功能域
          • 2.5 数据域
          • 2.6 错误检测域
          • 2.7 字符的连续传输
          • 2.8 错误的检测方法
        • 3 Modbus 功能码
          • 3.1 读可读写数字量寄存器(线圈状态)
          • 3.2 读只可读数字量寄存器(输入状态)
          • 3.3 写数字量(线圈状态)
          • 3.4 读可读写模拟量寄存器(保持寄存器)
          • 3.5 读只可读模拟量寄存器(输入寄存器)
          • 3.6 写单个模拟量寄存器(保持寄存器)
        • 4 Modbus 调试工具和敢为数据库配置
      • SNMP
      • OPC
      • BACNet
      • 字符协议
    • 常用调试工具
    • 接口说明
    • 数据库说明
    • 平台接入能力
    • 如何使用gRPC
    • 敢为公共库
    • 内网平台获取外网平台数据
    • 扩展插件使用说明
    • VForm3开发者文档
    • 虚拟计算表达式
    • 基于K8s负载均衡云服务配置
    • Q&A

Modbus

# 常用协议说明

# 1 协议简介

  • ​Modbus 是一个工业上常用的通讯协议、是一种通讯约定,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。

  • 不同厂商生产的控制设备可以连成工业网络,进行集中监控。 Modbus 协议包括 RTU、ASCII、TCP 三种,其中 Modbus-RTU 最常用,也相对比较简单。

  • 以往的项目中使用 Modbus-RTU 协议的设备有:电量仪、UPS、精密空调、温湿度、配电柜、列头柜、照明继电器模块、太阳能逆变器等。

  • 以下是要介绍的 Modbus 热图

# 1.1 Modbus特点

  • Modbus 可以支持多种电气接口,如 RS-232\485 等(串口),还支持 TCP/IP 网络接口。

  • Modbus 的帧格式简单,通俗易懂好开发。

  • 可靠性好。Modbus 协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII 模式采用 LRC 校验,RTU 模式采用 16 位 CRC 校验,但 TCP 模式没有额外规定校验,因为 TCP 协议是一个面向连接的可靠协议(PS:也就是说 modbusTCP 实际上是 Modbus 利用 TCP 打包数据传输的一种方式)。另外,Modbus 采用主从方式定时收发数据,在实际使用中如果某 Slave 站点断开后(如故障或关机),Master 端可以诊断出来,而当故障修复后,网络又可自动接通。

# 1.2 Modbus标准网络

  • ​ModBus 网络只有一个主机,所有通信都由他发出。网络可支持 247 个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各 PC 可以和中心主机交换信息而不影响各 PC 执行本身的控制任务。

  • 当在 Modbus 网络上通信时,每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用 Modbus 协议发出。在其它网络上,包含了 Modbus 协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

  • 标准的 Modbus 接口是使用 RS-232C 兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由 Modem 组网。控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。

  • 目前通用的是 RS-485 (主要是我觉得好用),事实上,由于 Modbus 并不设定物理层,所以可以选用多种物理介质(如特点中所述)。关于串口硬件部分,参考串口硬件分类 (opens new window)

# 1.3 其他网络

  • 在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。

  • 在消息位,Modbus 协议仍提供了主—从原则,尽管网络通信方法是“对等”。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器

# 1.4 查询回应周期

  • 查询

    • 查询消息中的功能代码告之被选中的从设备要执行何种功能。

      例如功能代码 03 是要求从设备读保持寄存器并返回它们的内容。

    • 数据段包含了从设备要执行功能的任何附加信息。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。

    • 错误检测域为从设备提供了一种验证消息内容是否正确的方法。

  • 回应

    • 如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。

    • 如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。

    • 数据段包括了从设备收集的数据:像寄存器值或状态。

    • 错误检测域允许主设备确认消息内容是否可用。

# 2 常用的传输方式与格式(RTU/ASCII/TCP)

根据常用传输介质,Modbus 可使用串口和网线(含光纤)方式进行传输

# 2.1 串口通信

控制器能设置为两种传输模式(ASCII 或 RTU)中的任何一种在标准的 Modbus 网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个 Modbus 网络上的所有设备都必须选择相同的传输模式和串口参数。

  • Modbus 消息帧

  • 通用消息帧

  • ASCII 模式
地址 功能代码 数据数量 数据1 ... 数据n LRC高字节 LRC低字节 回车 换行
  • RTU 模式
地址 功能代码 数据数量 数据1 ... 数据n CRC低字节 CRC高字节

所选的 ASCII 或 RTU 方式仅适用于标准的 Modbus 网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。在其它网络上(像 MAP 和 Modbus Plus)Modbus 消息被转成与串行传输无关的帧。

ASCII 模式和 RTU 模式详解

  • ASCII 模式

    当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。

    • 代码系统

    十六进制,ASCII 字符0...9,A...F
    消息中的每个 ASCII 字符都是一个十六进制字符组成每个字节的位:
    1 个起始位
    7 个数据位,最小的有效位先发送
    1 个奇偶校验位,无校验则无
    1 个停止位(有校验时),2 个 Bit(无校验时)
    LRC (纵向冗长检测)

    • ASCII 消息帧格式

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

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

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

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

    当控制器设为在 Modbus 网络上以 RTU(远程终端单元)模式通信,在消息中的每个 8 Bit 字节包含两个 4 Bit 的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比 ASCII 方式传送更多的数据。

    • 代码系统

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

    • RTU帧

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

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

    起始位 设备地址 功能代码 数据 LRC校验 结束符
    T1-T2-T3-T4 8 Bit 8 Bit n个8 Bit 16 Bit T1-T2-T3-T4

ASCII 和 RTU 两种方式的对比

  • ASCII 协议和 RTU 协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的 ASCII 字符,所以进行调试时就更加的直观,另外它的 LRC 校验也比较容易。

  • 因为它传输的都是可见的 ASCII 字符,RTU 传输的数据每一个字节 ASCII 都要用两个字节来传输。

    比如 RTU 传输一个十六进制数 0xF9,ASCII 就需要传输’F’’9’的 ASCII 码 0x39 和 0x46 两个字节。

    这样 ASCII 的传输的效率就比较低。

  • 一般来说,如果所需要传输的数据量较小可以考虑使用 ASCII 协议,如果所需传输的数据量比较大,最好能使用 RTU 协议。

# 2.2 TCP 通信

TCP 和 RTU 协议非常类似,我们只要把 RTU 协议的两个字节的校验码去掉,然后在 RTU 协议的开始加上 5 个 0 和一个 6 并通过 TCP/IP 网络协议发送出去即可。其数据格式如下:

00 00 事务标识符
00 00 协议标识符
00 06 长度标识符
站号(1 个 byte)
功能码(1 个 byte)
首个寄存器地址 (2 个 byte)
读取寄存器的个数 (2 个 byte)

# 2.3 地址域

  • 消息帧的地址域包含两个字符(ASCII)或 8 Bit(RTU)。可能的从设备地址是 0...247 (十进制)。单个设备的地址范围是 1...247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。

  • 地址 0 是用作广播地址,以使所有的从设备都能认识。当 Modbus 协议用于更高水准的网络,广播可能不允许或以其它方式代替。

# 2.4 如何处理功能域

  • 消息帧中的功能代码域包含了两个字符(ASCII)或8Bits(RTU)。可能的代码范围是十进制的 1...255。当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。

  • 当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为。例如去读取输入的开关状态,读一组寄存器的数据内容,读从设备的诊断状态,允许调入、记录、校验在从设备中的程序等。

  • 当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应)。对正常回应,从设备仅回应相应的功能代码。对异议回应,从设备返回一等同于正常代码的代码,但最重要的位置为逻辑 1。

    例如:一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码:0 0 0 0 0 0 1 1 (十六进制03H)。
    对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回:1 0 0 0 0 0 1 1 (十六进制83H)

  • 除功能代码因异议错误作了修改外,从设备将一独特的代码放到回应消息的数据域中,这能告诉主设备发生了什么错误。主设备应用程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从设备的消息并报告给操作员。

# 2.5 数据域

  • 数据域是由两个十六进制数集合构成的,范围 00...FF。根据网络传输模式,这可以是由一对 ASCII 字符组成或由一 RTU 字符组成。

  • 从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的所为。这包括了像不连续的寄存器地址,要处理项的数目,域中实际数据字节数。

    例如,如果主设备需要从设备读取一组保持寄存器(功能代码 03),数据域指定了起始寄存器以及要读的寄存器数量。如果主设备写一组从设备的寄存器(功能代码 10 十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。
    如果没有错误发生,从从设备返回的数据域包含请求的数据。
    如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。

  • 在某种消息中数据域可以是不存在的(0 长度)。

    例如,主设备要求从设备回应通信事件记录(功能代码 0B 十六进制),从设备不需任何附加的信息。

# 2.6 错误检测域

  • 标准的 Modbus 网络有两种错误检测方法。错误检测域的内容视所选的检测方法而定。

  • ASCII——当选用 ASCII 模式作字符帧,错误检测域包含两个 ASCII 字符。这是使用 LRC(纵向冗长检测)方法对消息内容计算得出的,不包括开始的冒号符及回车换行符。LRC 字符附加在回车换行符前面。

  • RTU——当选用 RTU 模式作字符帧,错误检测域包含一 16 Bits值(用两个 8 位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC 域附加在消息的最后,添加时先是低字节然后是高字节。故 CRC 的高位字节是发送消息的最后一个字节。

# 2.7 字符的连续传输

当消息在标准的 Modbus 系列网络传输时,每个字符或字节以如下方式发送(从左到右):最低有效位→最高有效位

使用 ASCII 字符帧时,位的序列是:

有奇偶校验

起始位 1 2 3 4 5 6 7 奇偶位 停止位

无奇偶校验位

起始位 1 2 3 4 5 6 7 停止位 停止位

使用 RTU 字符帧时,位的序列是:

有奇偶校验

起始位 1 2 3 4 5 6 7 8 奇偶位 停止位

无奇偶校验位

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

ASCII 的停止位是两位,所以要少一位。

# 2.8 错误的检测方法

  • 标准的 Modbus 串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测(LRC 或 CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。

  • 用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作为正常反应。如果从设备测到一传输错误,消息将不会接收,也不会向主设备作出回应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生超时。

# 3 Modbus 功能码

功能码 名称 作用 可读/写
01 读取线圈状态 取得一组逻辑线圈的当前状态(开/关) 读
02 读取输入状态 取得一组开关输入的当前状态(开/关) 读
03 读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值 读
04 读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值 读
05 强置单线圈 强置一个逻辑线圈的通断状态 单个写
06 预置单寄存器 把具体二进制值装入一个保持寄存器 单个写
15 强置多线圈 强置一串连续逻辑线圈的通断 多个写
16 预置多寄存器 把具体二进制值装入一串连续的保持寄存器 多个写

在这些功能码中较长使用的是 1、2、3、4、5、6 号功能码,使用它们即可实现对下位机的数字量和模拟量的读写操作。

# 3.1 读可读写数字量寄存器(线圈状态)

  • 计算机发送命令:[设备地址] [命令号 01] [起始寄存器地址高 8 位] [低 8 位] [读取的寄存器数高 8 位] [低 8 位] [CRC校验的低 8 位] [CRC 校验的高 8 位]

    例:[11][01][00][13][00][25][CRC低][CRC高]
    意义如下:
    (1)设备地址:在一个 485 总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。例子中为想和 17 号(十进制的 17 是十六进制的 11)通讯。
    (2)命令号 01:读取数字量的命令号固定为 01。
    (3)起始地址高 8 位、低 8 位:表示想读取的开关量的起始地址(起始地址为 0)。比如例子中的起始地址为 19。
    (4)寄存器数高 8 位、低 8 位:表示从起始地址开始读多少个开关量。例子中为 37 个开关量。
    (5)CRC 校验:是从开头一直校验到此之前。在此协议的最后再作介绍。此处需要注意,CRC 校验在命令中的高低字节的顺序和其他的相反。

  • 设备响应:[设备地址] [命令号 01] [返回的字节个数][数据 1][数据 2]...[数据 n][CRC校验的低 8 位] [CRC 校验的高 8 位]

    例:[11][01][05][CD][6B][B2][0E][1B][CRC低][CRC高]
    意义如下:
    (1)设备地址和命令号和上面的相同。
    (2)返回的字节个数:表示数据的字节个数,也就是数据 1,2...n 中的 n 的值。
    (3)数据 1...n:由于每一个数据是一个 8 位的数,所以每一个数据表示 8 个开关量的值,每一位为 0 表示对应的开关断开,为1表示闭合。比如例子中,表示 20 号(索引号为 19)开关闭合,21 号断开,22 闭合,23 闭合,24 断开,25 断开,26 闭合,27 闭合...如果询问的开关量不是 8 的整倍数,那么最后一个字节的高位部分无意义,置为 0。
    (4)CRC 校验同上。

# 3.2 读只可读数字量寄存器(输入状态)

和读取线圈状态类似,只是第二个字节的命令号不再是 1 而是 2。

# 3.3 写数字量(线圈状态)

  • 计算机发送命令:[设备地址] [命令号 05] [需下置的寄存器地址高 8 位] [低 8 位] [下置的数据高 8 位] [低 8 位] [CRC 校验的低 8 位] [CRC 校验的高 8 位]

    例:[11][05][00][AC][FF][00][CRC低][CRC高]
    意义如下:
    (1)设备地址和上面的相同。
    (2)命令号:写数字量的命令号固定为 05。
    (3)需下置的寄存器地址高 8 位,低 8 位:表明了需要下置的开关的地址。
    (4)下置的数据高 8 位,低 8 位:表明需要下置的开关量的状态。例子中为把该开关闭合。注意,此处只可以是[FF][00]表示闭合[00][00]表示断开,其他数值非法。
    (5)注意此命令一条只能下置一个开关量的状态。

  • 设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

# 3.4 读可读写模拟量寄存器(保持寄存器)

  • 计算机发送命令:[设备地址] [命令号 03] [起始寄存器地址高 8 位] [低 8 位] [读取的寄存器数高 8 位] [低 8 位] [CRC 校验的低 8 位] [CRC 校验的高 8 位]

    例:[11][03][00][6B][00][03][CRC低][CRC高]
    意义如下:
    (1)设备地址和上面的相同。
    (2)命令号:读模拟量的命令号固定为 03。
    (3)起始地址高 8 位、低 8 位:表示想读取的模拟量的起始地址(起始地址为 0)。比如例子中的起始地址为 107。
    (4)寄存器数高 8 位、低 8 位:表示从起始地址开始读多少个模拟量。例子中为 3 个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。

  • 设备响应:[设备地址] [命令号 03] [返回的字节个数][数据 1][数据 2]...[数据 n][CRC校验的低 8 位] [CRC 校验的高 8 位]

    例:[11][03][06][02][2B][00][00][00][64][CRC低][CRC高]
    意义如下:
    (1)设备地址和命令号和上面的相同。
    (2)返回的字节个数:表示数据的字节个数,也就是数据 1,2...n 中的 n 的值。例子中返回了 3 个模拟量的数据,因为一个模拟量需要 2 个字节所以共 6 个字节。
    (3)数据 1...n:其中[数据 1][数据 2]分别是第 1 个模拟量的高 8 位和低 8 位,[数据 3][数据 4]是第2个模拟量的高 8 位和低 8 位,以此类推。例子中返回的值分别是 555,0,100。
    (4)CRC 校验同上。

# 3.5 读只可读模拟量寄存器(输入寄存器)

和读取保存寄存器类似,只是第二个字节的命令号不再是2而是4。

# 3.6 写单个模拟量寄存器(保持寄存器)

  • 计算机发送命令:[设备地址] [命令号 06] [需下置的寄存器地址高 8 位] [低 8 位] [下置的数据高 8 位] [低 8 位] [CRC 校验的低 8 位] [CRC 校验的高 8 位]

    例:[11][06][00][01][00][03][CRC低][CRC高]
    意义如下:
    (1)设备地址和上面的相同。
    (2)命令号:写模拟量的命令号固定为 06。
    (3)需下置的寄存器地址高 8 位,低 8 位:表明了需要下置的模拟量寄存器的地址。
    (4)下置的数据高 8 位,低 8 位:表明需要下置的模拟量数据。比如例子中就把 1 号寄存器的值设为 3。
    (5)注意此命令一条只能下置一个模拟量的状态。

  • 设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

# 4 Modbus 调试工具和敢为数据库配置

Modbus 协议调试我们推荐使用“ModScan”工具。工具的详细使用和数据库配置请参考 Modbus 调试说明。

上次更新: 2025/1/24 13:38:21

← 基于Nginx主备模式的双机热备 SNMP→

目录
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式