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+0x01 | 0x00+0x13 | 0x00+0x25 | 高8+低8 |
意义如下:
- 设备地址与功能码:在一个485总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。例子中为想和0x11通讯。读取数字量的命令号固定为0x01。
- 起始地址高8位、低8位:表示想读取的开关量的起始地址(起始地址为0)。比如例子中的起始地址为0x0013。
- 寄存器数高8位、低8位:表示从起始地址开始读多少个开关量。例子中为37(0x0025)个开关量。
- CRC校验:是从开头一直校验到此之前。
设备响应:
设备地址+功能码 | 返回的字节个数 | 返回的数据1+数据2+….+数据n | CRC16 |
---|---|---|---|
0x11+0x01 | 0x05 | 0xcd+0x6b+0xb2+0x0e+0x1b | 高8+低8 |
意义如下:
设备地址与功能码:上同,0x01。
返回的字节个数:表示数据的字节个数,也就是数据的n的值。
数据1…n:由于每一个数据是一个8位的数,所以每一个数据表示8个开关量的值,每一位为0表示对应的开关断开,为1表示闭合。
如果询问的开关量不是8的整倍数,那么最后一个字节的高位部分无意义,置为0。
CRC校验同上。
0x05强制单线圈(写一个开关数字量)
0x05号命令,写一个数字量(强制单线圈) 可广播:
设备地址+功能码 | 需操作的寄存器地址高8位+低8位 | 需操作的寄存器数据高8位+低8位 | CRC16 |
---|---|---|---|
0x11+0x05 | 0x00+0xac | 0xff+0x00 | 高8+低8 |
意义如下:
设备地址与功能码:上同,0x05。
需下置的寄存器地址高8位,低8位:表明了需要置位(操作)的开关的地址。
置位(操作)的数据高8位,低8位:表明需要置位的开关量的状态。例子中为把该开关闭合。
注意,此处只可以是[FF][00]表示ON状态 闭合 [00][00]表示OFF状态 断开,其他数值非法。
注意此命令一条只能下置一个开关量的状态。
设备响应:
- 如果成功把计算机发送的命令原样返回,否则不响应。
0x03读取保持寄存器(模拟量)
0x03号命令,读可读写模拟量寄存器(保持寄存器):
设备地址+功能码 | 起始寄存器地址高8位+低8位 | 读取的寄存器数量高8位+低8位 | CRC16 |
---|---|---|---|
0x11+0x03 | 0x00+0x6b | 0x00+0x03 | 高8+低8 |
意义如下:
- 设备地址与功能码:上同,0x03。
- 起始地址高8位、低8位:表示想读取的模拟量的起始地址(起始地址为0)。比如例子中的起始地址为0x006b。
- 寄存器数高8位、低8位:表示从起始地址开始读多少个模拟量。例子中为3个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。
设备响应:
设备地址+功能码 | 返回的字节个数 | 返回的数据1+数据2+….+数据n | CRC16 |
---|---|---|---|
0x11+0x03 | 0x06 | 0x02+0x2b+0x00+0x00+0x00+0x64 | 高8+低8 |
意义如下:
- 设备地址与功能码:上同,0x03。
- 返回的字节个数:表示数据的字节个数,也就是数据1,2…n中的n的值。例子中返回了3个模拟量的数据,因为一个模拟量需要2个字节所以共6个字节。
- 数据1…n:[数据1][数据2]分别是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。例子中返回的值分别是555,0,100。
0x06预置单寄存器(写一个模拟量)
0x06号命令,写单个模拟量寄存器(保持寄存器):
设备地址+功能码 | 需操作的寄存器地址高8位+低8位 | 需操作的寄存器数据高8位+低8位 | CRC16 |
---|---|---|---|
0x11+0x06 | 0x00+0x01 | 0x00+0x03 | 高8+低8 |
意义如下:
- 设备地址与功能码:上同,0x06。
- 需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。
- 下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为3。
- 注意此命令一条只能下置一个模拟量的状态。
设备响应:
如果成功把计算机发送的命令原样返回,否则不响应。
0x16 预置多寄存器(写多个模拟量)
0x16号命令,写多个模拟量寄存器(保持寄存器):
设备地址+功能码 | 需操作的地址高8位+低8位 | 需操作数据的数量高8位+低8位 | 操作的数据1 高8位+低8位 |
---|---|---|---|
0x11+0x16 | 0x00+0x01 | 0x00+0x01 | 0x00+0x05 |
操作的数据2 高8位+低8位 | ……… | 操作的数据n 高8位+低8位 | CRC16 |
高8+低8 |
意义如下:
- 设备地址与功能码:上同,0x16。
- 需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。
- 需下置的数据数量高8位,低8位:表明了需要下置的数据数量,这里为1。
- 下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为5。
设备响应:
如果成功把计算机返回的如下命令,否则不响应。
设备地址+功能码 | 需操作的寄存器地址高8位+低8位 | 需操作的寄存器数量高8位+低8位 | CRC16 |
---|---|---|---|
0x11+0x16 | 0x00+0x01 | 0x00+0x01 | 高8+低8 |
Modbus
https://www.oikiou.top/2020/7d358aa2/