附:《Modbus协议》 简要文档
<p>[TOC]</p>
<h1>Modbus 协议简要说明</h1>
<p>Modbus是总线模式工作,所有设备连在一个总线上,每个设备都能监听到总线上的信号;
1、主从工作方式,总线中只有一个主机;
2、主机通常采用一问一答的方式工作,从机设备通过地址标识来区分是否需要处理;
3、主机也可以使用广播地址要求每个设备处理,但广播方式从机不应答;</p>
<h2>1 报文字段</h2>
<p>以一个查询请求的报文举例(HEX):03 03 00 01 00 03 55 E9</p>
<table>
<thead>
<tr>
<th>地址</th>
<th>功能码</th>
<th>变量起始地址</th>
<th></th>
<th>变量个数</th>
<th></th>
<th>校验码</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td>高字节</td>
<td>低字节</td>
<td>高字节</td>
<td>低字节</td>
<td>高字节</td>
<td>低字节</td>
</tr>
<tr>
<td>03</td>
<td>03</td>
<td>00</td>
<td>01</td>
<td>00</td>
<td>03</td>
<td>55</td>
<td>E9</td>
</tr>
</tbody>
</table>
<p>1)地址(Address)域</p>
<p>由8位(0-64)组成,设备的地址必须是唯一的;
0号地址代表网关地址,主机可以通过0号地址获取网关信息。</p>
<p>2)功能(Functon)域</p>
<table>
<thead>
<tr>
<th>代码</th>
<th>意义</th>
<th>行为</th>
</tr>
</thead>
<tbody>
<tr>
<td>0x03</td>
<td>读寄存器</td>
<td>获得一个或多个寄存器的当前二进制值</td>
</tr>
<tr>
<td>0x06</td>
<td>写单个寄存器</td>
<td>放置一个特定的二进制值到一个单寄存器中</td>
</tr>
<tr>
<td>0x10</td>
<td>写多个寄存器</td>
<td>放置特定的二进制值到一系列多寄存器中</td>
</tr>
</tbody>
</table>
<p>3)数据域
数据域包含了终端执行特定功能所需要的下发给从机的数据,或者从机响应查询的数据。</p>
<p>4)错误校验域
为避免数据在传输中,电噪声等干扰引起传输错误,加入帧CRC校验码,使用16位循环冗余的方法。循环冗余校验(CRC)域占用两个字节。
[见:校验码算法](<a href="https://www.showdoc.com.cn/NDB5EGW/10962909844967028">https://www.showdoc.com.cn/NDB5EGW/10962909844967028</a> "校验码算法")</p>
<h2>2 交互报文</h2>
<h3> 2.1 读数据(功能码0x03)</h3>
<p>主站向从站发送读取多个变量数值的命令(即查询),从站在收到命令之后向主站发送所需的变量数值(即响应),报文的格式如下表2-2。</p>
<table>
<thead>
<tr>
<th>请求报文</th>
<th></th>
<th></th>
<th>正常响应报文</th>
<th></th>
<th></th>
<th>异常响应报文</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
</tr>
<tr>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
</tr>
<tr>
<td>2</td>
<td>功能码</td>
<td>0x03</td>
<td>2</td>
<td>功能码</td>
<td>0x03</td>
<td>2</td>
<td>差错码</td>
<td>0x83</td>
</tr>
<tr>
<td>3</td>
<td>变量起始地址高字节</td>
<td>xx</td>
<td>3</td>
<td>字节数</td>
<td>N*2</td>
<td>3</td>
<td>异常码</td>
<td>xx</td>
</tr>
<tr>
<td>4</td>
<td>变量起始地址低字节</td>
<td>xx</td>
<td>4</td>
<td>第一个变量数值高字节</td>
<td>xx</td>
<td>4</td>
<td>CRC校验低字节</td>
<td>xx</td>
</tr>
<tr>
<td>5</td>
<td>变量个数高字节</td>
<td>0</td>
<td>5</td>
<td>第一个变量数值低字节</td>
<td>xx</td>
<td>5</td>
<td>CRC校验高字节</td>
<td>xx</td>
</tr>
<tr>
<td>6</td>
<td>变量个数低字节</td>
<td>N</td>
<td>…</td>
<td>……</td>
<td>…</td>
</tr>
<tr>
<td>7</td>
<td>CRC校验低字节</td>
<td>xx</td>
<td>…</td>
<td>……</td>
<td>…</td>
</tr>
<tr>
<td>8</td>
<td>CRC校验高字节</td>
<td>xx</td>
<td>2N + 2</td>
<td>最后一个变量数值高字节</td>
<td>xx</td>
</tr>
<tr>
<td>2N + 3</td>
<td>最后一个变量数值低字节</td>
<td>xx</td>
</tr>
<tr>
<td>2N + 4</td>
<td>CRC校验低字节</td>
<td>xx</td>
</tr>
<tr>
<td>2N + 5</td>
<td>CRC校验高字节</td>
<td>xx</td>
</tr>
</tbody>
</table>
<p>注:1≤N≤125</p>
<h3> 2.2 写单寄存器(功能码0x06)</h3>
<table>
<thead>
<tr>
<th>请求报文</th>
<th></th>
<th></th>
<th>正常响应报文</th>
<th></th>
<th></th>
<th>异常响应报文</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
</tr>
<tr>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
</tr>
<tr>
<td>2</td>
<td>功能码</td>
<td>0x06</td>
<td>2</td>
<td>功能码</td>
<td>0x06</td>
<td>2</td>
<td>差错码</td>
<td>0x86</td>
</tr>
<tr>
<td>3</td>
<td>变量起始地址高字节</td>
<td>xx</td>
<td>3</td>
<td>变量起始地址高字节</td>
<td>xx</td>
<td>3</td>
<td>异常码</td>
<td>xx</td>
</tr>
<tr>
<td>4</td>
<td>变量起始地址低字节</td>
<td>xx</td>
<td>4</td>
<td>变量起始地址低字节</td>
<td>xx</td>
<td>4</td>
<td>CRC校验低字节</td>
<td>xx</td>
</tr>
<tr>
<td>5</td>
<td>变量数值高字节</td>
<td>xx</td>
<td>5</td>
<td>变量数值高字节</td>
<td>xx</td>
<td>5</td>
<td>CRC校验高字节</td>
<td>xx</td>
</tr>
<tr>
<td>6</td>
<td>变量数值低字节</td>
<td>xx</td>
<td>6</td>
<td>变量数值低字节</td>
<td>xx</td>
</tr>
<tr>
<td>7</td>
<td>CRC校验低字节</td>
<td>xx</td>
<td>7</td>
<td>CRC校验低字节</td>
<td>xx</td>
</tr>
<tr>
<td>8</td>
<td>CRC校验高字节</td>
<td>xx</td>
<td>8</td>
<td>CRC校验高字节</td>
<td>xx</td>
</tr>
</tbody>
</table>
<h3>2.3 写多个寄存器(功能码0x10)</h3>
<table>
<thead>
<tr>
<th>请求报文</th>
<th></th>
<th></th>
<th>正常响应报文</th>
<th></th>
<th></th>
<th>异常响应报文</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
<td>字节号</td>
<td>名称</td>
<td>数值</td>
</tr>
<tr>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
<td>1</td>
<td>从站地址</td>
<td>0-247</td>
</tr>
<tr>
<td>2</td>
<td>功能码</td>
<td>0x10</td>
<td>2</td>
<td>功能码</td>
<td>0x10</td>
<td>2</td>
<td>差错码</td>
<td>0x90</td>
</tr>
<tr>
<td>3</td>
<td>变量起始地址高字节</td>
<td>xx</td>
<td>3</td>
<td>变量起始地址高字节</td>
<td>xx</td>
<td>3</td>
<td>异常码</td>
<td>xx</td>
</tr>
<tr>
<td>4</td>
<td>变量起始地址低字节</td>
<td>xx</td>
<td>4</td>
<td>变量起始地址低字节</td>
<td>xx</td>
<td>4</td>
<td>CRC校验低字节</td>
<td>xx</td>
</tr>
<tr>
<td>5</td>
<td>变量个数高字节</td>
<td>0</td>
<td>5</td>
<td>变量个数高字节</td>
<td>0</td>
<td>5</td>
<td>CRC校验高字节</td>
<td>xx</td>
</tr>
<tr>
<td>6</td>
<td>变量个数低字节</td>
<td>N</td>
<td>6</td>
<td>变量个数低字节</td>
<td>N</td>
</tr>
<tr>
<td>7</td>
<td>字节数</td>
<td>N*2</td>
<td>7</td>
<td>CRC校验低字节</td>
<td>xx</td>
</tr>
<tr>
<td>8</td>
<td>第一个变量数值高字节</td>
<td>xx</td>
<td>8</td>
<td>CRC校验高字节</td>
<td>xx</td>
</tr>
<tr>
<td>9</td>
<td>第一个变量数值低字节</td>
<td>xx</td>
</tr>
<tr>
<td>…</td>
<td>……</td>
<td>…</td>
</tr>
<tr>
<td>…</td>
<td>……</td>
<td>…</td>
</tr>
<tr>
<td>2N + 6</td>
<td>最后一个变量数值高字节</td>
<td>xx</td>
</tr>
<tr>
<td>2N + 7</td>
<td>最后一个变量数值低字节</td>
<td>xx</td>
</tr>
<tr>
<td>2N + 8</td>
<td>CRC校验低字节</td>
<td>xx</td>
</tr>
<tr>
<td>2N + 9</td>
<td>CRC校验高字节</td>
<td>xx</td>
</tr>
</tbody>
</table>
<p>注:1≤N≤123</p>
<h2> 3 异常码</h2>
<table>
<thead>
<tr>
<th>序号</th>
<th>值</th>
<th>说明</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>1</td>
<td>无效功能码</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>无效地址</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>无效数据</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td>无权限</td>
<td>控制锁定/需超级密码</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
<td>从机无应答</td>
<td>无应答/不在线(未收到断路器应答)</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
<td>从站忙</td>
</tr>
</tbody>
</table>