MODBUS通信协议提供了ASCII和RTU两种通信模式。
ASCII模式的主要优点是允许字符之间的时间间隔长达1S,也不会出现错误。
RTU模式的优点是在相同波特率下其传输的字符的密度高于ASCII模式,每个信息必须连续传输。
MODBUS 的 ASCLL通信方式:
起始位:1位
数据位:7位 低位先送
校验位:1位(有奇偶校验),0位(无校验);
停止位:1位(有奇偶校验),2位(无校验)。
波特率:可选
数据位是确定的,校验位,停止位,其通信格式可能的三种 :
(1)7,E,1 (2)7,0,1 (3)7,N,2
ASCII模式数据传送约定
起始码 | 地址码 | 功能码 | 数据码 | 校验码 | 停止码 | |
4位 | 8位 | 8位 | n*8位 | 8位 | 8位 | |
“:” | 01-0F | 功能码 | n个字符 | LRC | CR | LF |
信息编码:16进制字符0-9,A-F
CR:回车 LF:下一行
ASCII模式数据传送约定:控制器在MODBUS 网络上以ASCLL码方式通信,在数据格式中每4位即HEX数1位都转换成ASCLL码发送,也就是每个十六进制字符(0-9 、A-F)都转换成ASCLL码。该模式的主要优点在于字符发送的时间间隔可达1s,而不产生错误。
ASCII模式数据传送举例
起始码 | 地址码 | 功能码 | 数据码 | 校验码 | 停止码 | |
: | 01 | 03 | 21 02 00 02 | D7 | CR | LF |
将所有的字符转化为ASCII码,再发送给对方
3A | 30 31 | 30 33 | .. .. .. .. .. | 44 37 | 0D | 0A |
ASCII模式数据格式的校验码采用LRC算法所形成的校验码
LRC算法
参与校验数据:从地址码到数据区的所有数据
算法:相邻2个16进制符相加求和
校验码:取其和的低八位的补码(原码取反加1)为校验位
LRC算法举例
起始码 | 地址码 | 功能码 | 数据码 | 校验码 | 停止码 | |
: | 01 | 03 | 21 02 00 02 | LRC | CR | LF |
求和:H01+H03+H21+H02+H00+H02=H29
求:H29的补码:29=0010 1001(原码)=11010110(反码)=1101 0111(补码)=D7
LRC的校验码:HD7
MODBUS 的 RTU通信方式
RTU通信格式如下:
起始位:1位
数据位:8位,低位先送
校验位:1位(有奇偶校验),0位(无校验);
停止位:1位(有奇偶校验),2位(无校验)。
波特率:可选
同样,MODBUS的RTU方式通信格式只能是:8,E,1和8,0,1和8,N,2
RTU模式数据传送约定
起始码 | 地址码 | 功能码 | 数据码 | 校验码 | 停止码 |
3-5字符 停止时间 | 01-1F | 功能码 | n个字符 | CRC校验 | 3-5字符 停止时间 |
信息编码:16进制字符0-9,A-F
RTU模式数据传送约定:RTU模式数据传送按数据格式中16进制字符进行连续发送。如果在发送帧信息期间,出现大于1.5个字符的静止时间时,则信息出现错误。该模式的主要优点是在相同波特率下其传输效率高于ASCII模式。可以发现,RTU方式数据格式没有帧头和帧尾,那设备如何区别这一帧和下一帧呢。规定信息帧的发送至少要以3-5个字符时间间隔开始,校验码被传送后,又要以3-5个字符的停顿才标志发送结束。
RTU模式数据格式的校验码采用CRC算法所形成的校验码
CRC算法
……过程复杂。校验结果是一个16位数,有高8位和低8位。如校验码为20 1A(高位 低位),在传送的时候, CRC为1A20
RTU模式数据传送举例
起始码 | 地址码 | 功能码 | 数据码 | 校验码 | 停止码 |
3-5字符 停止时间 | 01 | 03 | 21 02 00 02 | CRC | 3-5字符 停止时间 |
传送时不需要将01 03…转换为ASCII码,直接传送01 03 21 02 00 02 1A 20
MODBUS的常用功能码名称和功能:
功能码 | 名称 | 功能 |
H 01 | 读线圈状态 | 取输出开关量状态 |
H 02 | 读输入状态 | 取输入开关量状态 |
H 03 | 读保持存储器 | 读一个或多个输出存储器值 |
H 04 | 读取存储器 | 读一个或多个输入存储器值 |
H 05 | 强置单线圈 | 强置一个输出开关量状态 |
H 06 | 写保持存储器 | 把字写入一个输出存储器 |
H 07 | 回送诊断校验 | 把诊断报告送从站 |
H 0F | 强制多线圈 | 强置一组连续输出开关量状态 |
H 10 | 预置多存储器 | 写入一组连续保持存储器值 |
ASCII码对照表:来源于C在线工具(http://tool.oschina.net/commons?type=4)
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
特殊字符解释:来源于C在线工具(http://tool.oschina.net/commons?type=4)
NUL空 | VT 垂直制表 | SYN 空转同步 |
---|---|---|
STX 正文开始 | CR 回车 | CAN 作废 |
ETX 正文结束 | SO 移位输出 | EM 纸尽 |
EOY 传输结束 | SI 移位输入 | SUB 换置 |
ENQ 询问字符 | DLE 空格 | ESC 换码 |
ACK 承认 | DC1 设备控制1 | FS 文字分隔符 |
BEL 报警 | DC2 设备控制2 | GS 组分隔符 |
BS 退一格 | DC3 设备控制3 | RS 记录分隔符 |
HT 横向列表 | DC4 设备控制4 | US 单元分隔符 |
LF 换行 | NAK 否定 | DEL 删除 |