Modbus

Modbus

百度文库 MODBUS协议最简单又是最直白的解释

  • 分为RTU(发Hex)模式和ASCII(发字符)模式

  • 从机地址 0-247 (其中0为广播地址)

  • 通信格式

  • ASCII

    起始符+设备地址(1Byte)+功能码(1Byte)+数据(nByte n<253)+校验(2Byte LRC)+结束符

    • 起始符——ASCII的起始符为‘:’一个冒号
    • 设备地址——0-247
    • 功能码——见下文
    • 数据——略
    • 校验——起始符 和 校验符 之间的所有数据 一般用LRC校验
    • 结束符——Chr$(13)+Chr(10)
    • 例—— : (起) 02(地址) 03(功能) 0a00(数据) 0004(校验) Chr$(13)Chr(10)(终)
    • 设备地址、功能码、数据、校验 都是用的十六进制的字符形式 例如发送0x16就发送“16”
  • RTU

    起始符+设备地址(1Byte)+功能码(1Byte)+数据(nByte n<253)+校验(2Byte CRC16)+结束符

    • 起始符——3.5个字符的时间间隔
    • 设备地址——0-247
    • 功能码——见下文
    • 数据——略
    • 校验——起始符 和 校验符 之间的所有数据 一般用CRC16校验
    • 结束符——3.5个字符的时间间隔

功能表

功能码名称作用
1读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)
2读取输入状态取得一组开关输入的当前状态(ON/OFF)
3读取保持寄存器在一个或多个保持寄存器中取得当前的二进制值
4读取输入寄存器在一个或多个输入寄存器中取得当前的二进制值
5强置单线圈强置一个逻辑线圈的通断状态
6预置单寄存器把具体二进值装入一个保持寄存器
7读取异常状态取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定
8回送诊断校验把诊断校验报文送从机,以对通信处理进行评鉴
9编程(只用于484)使主机模拟编程器作用,修改PC从机逻辑
10控询(只用于484)可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
11读取事件计数可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时
12读取通信事件记录可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误
13编程(184/384 484 584)可使主机模拟编程器功能修改PC从机逻辑
14探询(184/384 484 584)可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送
15强置多线圈强置一串连续逻辑线圈的通断
16预置多寄存器把具体的二进制值装入一串连续的保持寄存器
17报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态
18(884和MICRO 84)可使主机模拟编程功能,修改PC状态逻辑
19重置通信链路发生非可修改错误后,是从机复位于已知状态,可重置顺序字节
20读取通用参数(584L)显示扩展存储器文件中的数据信息
21写入通用参数(584L)把通用参数写入扩展存储文件,或修改之
22~64保留作扩展功能备用
65~72保留以备用户功能所用留作用户功能的扩展编码
73~119非法功能
120~127保留留作内部作用
128~255保留用于异常应答

0x01 读取线圈状态(数字量)

0x01号命令,读取一个或多个 可读写数字量寄存器 (读取线圈状态):

设备地址+功能码起始地址高八位+低八位读取寄存器数量高八位+低八位CRC16
0x11+0x010x00+0x130x00+0x25高8+低8

意义如下:

  1. 设备地址与功能码:在一个485总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。例子中为想和0x11通讯。读取数字量的命令号固定为0x01。
  2. 起始地址高8位、低8位:表示想读取的开关量的起始地址(起始地址为0)。比如例子中的起始地址为0x0013。
  3. 寄存器数高8位、低8位:表示从起始地址开始读多少个开关量。例子中为37(0x0025)个开关量。
  4. CRC校验:是从开头一直校验到此之前。

设备响应

设备地址+功能码返回的字节个数返回的数据1+数据2+….+数据nCRC16
0x11+0x010x050xcd+0x6b+0xb2+0x0e+0x1b高8+低8

意义如下:

  1. 设备地址与功能码:上同,0x01。

  2. 返回的字节个数:表示数据的字节个数,也就是数据的n的值。

  3. 数据1…n:由于每一个数据是一个8位的数,所以每一个数据表示8个开关量的值,每一位为0表示对应的开关断开,为1表示闭合。

    如果询问的开关量不是8的整倍数,那么最后一个字节的高位部分无意义,置为0。

  4. CRC校验同上。

0x05强制单线圈(写一个开关数字量)

0x05号命令,写一个数字量(强制单线圈) 可广播:

设备地址+功能码需操作的寄存器地址高8位+低8位需操作的寄存器数据高8位+低8位CRC16
0x11+0x050x00+0xac0xff+0x00高8+低8

意义如下:

  1. 设备地址与功能码:上同,0x05。

  2. 需下置的寄存器地址高8位,低8位:表明了需要置位(操作)的开关的地址。

  3. 置位(操作)的数据高8位,低8位:表明需要置位的开关量的状态。例子中为把该开关闭合。

    注意,此处只可以是[FF][00]表示ON状态 闭合 [00][00]表示OFF状态 断开,其他数值非法。

  4. 注意此命令一条只能下置一个开关量的状态。

设备响应:

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

0x03读取保持寄存器(模拟量)

0x03号命令,读可读写模拟量寄存器(保持寄存器):

设备地址+功能码起始寄存器地址高8位+低8位读取的寄存器数量高8位+低8位CRC16
0x11+0x030x00+0x6b0x00+0x03高8+低8

意义如下:

  1. 设备地址与功能码:上同,0x03。
  2. 起始地址高8位、低8位:表示想读取的模拟量的起始地址(起始地址为0)。比如例子中的起始地址为0x006b。
  3. 寄存器数高8位、低8位:表示从起始地址开始读多少个模拟量。例子中为3个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。

设备响应:

设备地址+功能码返回的字节个数返回的数据1+数据2+….+数据nCRC16
0x11+0x030x060x02+0x2b+0x00+0x00+0x00+0x64高8+低8

意义如下:

  1. 设备地址与功能码:上同,0x03。
  2. 返回的字节个数:表示数据的字节个数,也就是数据1,2…n中的n的值。例子中返回了3个模拟量的数据,因为一个模拟量需要2个字节所以共6个字节。
  3. 数据1…n:[数据1][数据2]分别是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。例子中返回的值分别是555,0,100。

0x06预置单寄存器(写一个模拟量)

0x06号命令,写单个模拟量寄存器(保持寄存器):

设备地址+功能码需操作的寄存器地址高8位+低8位需操作的寄存器数据高8位+低8位CRC16
0x11+0x060x00+0x010x00+0x03高8+低8

意义如下:

  1. 设备地址与功能码:上同,0x06。
  2. 需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。
  3. 下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为3。
  4. 注意此命令一条只能下置一个模拟量的状态。

设备响应:

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

0x16 预置多寄存器(写多个模拟量)

0x16号命令,写多个模拟量寄存器(保持寄存器):

设备地址+功能码需操作的地址高8位+低8位需操作数据的数量高8位+低8位操作的数据1 高8位+低8位
0x11+0x160x00+0x010x00+0x010x00+0x05
操作的数据2 高8位+低8位………操作的数据n 高8位+低8位CRC16
高8+低8

意义如下:

  1. 设备地址与功能码:上同,0x16。
  2. 需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。
  3. 需下置的数据数量高8位,低8位:表明了需要下置的数据数量,这里为1。
  4. 下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为5。

设备响应:

如果成功把计算机返回的如下命令,否则不响应。

设备地址+功能码需操作的寄存器地址高8位+低8位需操作的寄存器数量高8位+低8位CRC16
0x11+0x160x00+0x010x00+0x01高8+低8

Modbus
https://www.oikiou.top/2020/7d358aa2/
作者
Oikiou
发布于
2020年8月21日
许可协议