本文为modbus通讯协议详解。ModBus网络是一种工业通信系统,由可编程控制器与智能终端和计算机通过公用线路或本地专线连接而成。其系统结构包括硬件和软件。可应用于各种数据采集和过程监控。
ModBus 网络只有一个主机,所有通信都来自该主机。网络最多可支持 247 个远程从控制器,但实际支持的从控制器数量取决于所使用的通信设备。使用该系统,每台 PC 都可以与中央主机交换信息,而不会影响每台 PC 执行自己的控制任务。
了解Modbus通讯协议是怎么回事,现场可以使用各种第三方小软件做通讯测试。
Modbus协议包括ASCII、RTU、TCP等,不指定物理层。该协议定义了控制器可以识别和使用的消息结构,无论它们通过何种网络进行通信。标准 Modicon 控制器使用 RS232C 实现串行 Modbus。 Modbus 的 ASCII 和 RTU 协议规定了消息、数据、命令和响应方法的结构。数据通讯采用Master/Slave方式。 Master发送数据请求消息,Slave收到正确的消息后可以向Master发送数据。响应请求; Master也可以直接发送消息修改Slave上的数据,实现双向读写。
Modbus 协议需要校验数据。串行协议中除了奇偶校验外,ASCII 模式采用 LRC 校验,RTU 模式采用 16 位 CRC 校验,但 TCP 模式不需要额外的校验,因为 TCP 协议是面向连接的可靠协议。另外,Modbus采用主从模式定期发送和接收数据。在实际使用中,如果从站断开(如故障或停机),主站可以进行诊断,当故障修复后,可以自动连接网络。因此,Modbus协议的可靠性更好。
对于Modb对于我们的ASCII、RTU和TCP协议,TCP和RTU协议非常相似。我们只需要把RTU协议的两字节校验码去掉,然后在RTU协议的开头加上5个0和一个6。它可以通过 TCP/IP 网络协议发送出去。
通讯传输方式:
通信传输分为独立的报头和编码数据发送。以下通信传输方式定义也兼容 ModBusRTU 通信协议:
初始结构 = ≥4 字节时间
地址码 = 1 个字节
功能码 = 1 个字节
\n数据区=N字节
错误检查 = 16 位 CRC 码
结束结构 = ≥4 字节时间
地址码:地址码是通讯传输的第一个字节。该字节表示具有用户设置的地址码的从机将接收到主机发送的信息。并且每个从机都有一个唯一的地址码,响应回显以各自的地址码开始。主机发送的地址码表示要发送到的从机地址,从机发送的地址码表示返回的从机地址。
功能码:通讯传输的第二个字节。 ModBus 通讯协议定义了从 1 到 127 的功能号。本仪器仅使用部分功能码。它作为主机请求发送,功能码告诉从机要执行什么动作。作为从机的响应,从机发送的功能码与主机发送的功能码相同,表示从机已经响应主机进行操作。如果从机发送的功能码最高位为1(例如功能码较大同时为127),则表示从机不响应操作或发送错误。
数据区:数据区根据功能码的不同而不同。数据字段可以是从主站发送到从站或从站到主站的实际值、设定点、地址。
CRC 码:两字节错误检测码。
2.modbus通讯协议详解通讯协议:
当向仪器发送通讯命令时,满足相应地址码的设备会收到通讯命令,去除地址码,读取信息,如果没有错误,执行相应的任务;然后将执行结果返回给发送者.返回的信息包括地址码、执行动作的功能码、执行动作后的结果数据、错误校验码。如果出现错误,则不会发送任何信息。
1.modbus通讯协议详解信息框架结构
地址码 功能码 数据区错误校验码
8 位 8 位 N × 8 位 16 位
地址码:地址码是信息帧的第一个字节(8位),从0到255。这个字节表示具有用户设置的地址的从机将接收到主机发送的信息。每个从机必须有唯一的地址码,只有匹配地址码的从机才能响应回显。当从机发回信息时,对应的地址码表示信息的来源。
功能码:主机发送的功能码告诉从机要执行什么任务。表 1-1 中列出的功能码具有特定的含义和操作。
数据区:数据区包含从机需要执行什么动作或从机收集的返回信息。该信息可以是数值、参考地址等。例如,如果功能码告诉从机读取寄存器的值,则数据区必须包含要读取的寄存器的起始地址和长度。对于不同的从机,地址和数据信息是不同的。
错误校验码:主机或从机可以使用校验码来判断接收到的信息是否错误。有时,由于电子噪声或其他一些干扰,信息在传输过程中会发生细微的变化,错误校验码确保主机或从机不会对传输过程中出错的信息进行处理。这提高了系统的安全性和效率。错误校验采用CRC-16校验方式。
注:信息帧的格式基本相同:地址码、功能码、数据区和错误校验码。
2.错误检查
冗余循环码 (CRC) 由 2 个字节组成,即 16 位二进制。 CRC 码由发送设备计算并放置在发送消息的末尾。接收到信息的设备重新计算接收到的信息的CRC码,并比较计算出的CRC码是否与接收到的相匹配。如果两者不匹配,则表示错误。
Modbus支持的功能码
modbus通讯协议详解功能码指令:
这些功能码中使用的较长的是1和2、3、4、5、6功能码,可以用来读写下位机的数字量和模拟量。
1号指令01,读写数字寄存器(线圈状态):
电脑发送命令:【设备地址】【命令号01】【起始寄存器地址高8位】【低8位】【读寄存器个数高8位】【低8位】【CRC校验低8位】 【CRC校验高8位】
示例:[11][01][00][13][00][25][CRC 低][CRC 高]
modbus通讯协议详解含义如下:
<1>设备地址:在一个485总线上可以连接多个设备,这里的设备地址表示你想和哪个设备通信。在示例中,我想与数字 17 通信(十进制的 17 是十六进制的 11)。
<2>指令号01:读取数字量的指令号固定为01。
<3>起始地址的高8位和低8位:表示要读取的开关的起始地址(起始地址为0)。例如,示例中的起始地址为 19。
<4>寄存器号的高8位和低8位:表示从起始地址读取了多少个开关。在示例中,有 37 个开关。
<5>CRC校验:从头到尾校验。
设备响应:[设备地址] [命令号 01] [返回的字节数] [数据 1] [数据 2]...[数据 n] [CRC 校验的高 8 位] [CRC 校验和的低 8 位]
.modbus通讯协议详解示例:[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校验同上。
2号和05号指令,写入数字量(线圈状态):
电脑发送命令:【设备地址】【命令号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 和 03,读写模拟寄存器(保持寄存器):
电脑发送命令:【设备地址】【命令号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 低]
modbus通讯协议详解含义如下:
<1>设备地址和命令号同上。
<2>返回字节数:表示数据的字节数,即数据1、2...n中n的值。示例中返回了 3 个模拟量的数据,因为 1 个模拟量需要 2 个字节,所以总共有 6 个字节。
<3>Data 1...n:[Data 1][Data 2]分别是第一个模拟量的高8位和低8位,[Data 3][Data 4]是第二个高8位位和模拟量的低 8 位,依此类推。示例中返回的值分别为 555、0 和 100。
<4>CRC校验同上。
4号和06号命令,写入单个模拟寄存器(保持寄存器):
电脑发送命令:【设备地址】【命令号06】【要放置的寄存器地址高8位】【低8位】【数据低8位】【低8位】【CRC校验高8位】【 CRC校验的低8位]
modbus通讯协议详解示例:[11][06][00][01][00][03] [CRC 高] [CRC 低]
含义如下:
<1>设备地址同上。
<2>指令号:写入模拟量的指令号固定为06。
<3>要设置的寄存器地址的高8位和低8位:表示需要设置的模拟量寄存器的地址。
<4>低位数据的高8位和低8位:表示需要低位的模拟数据。例如,在示例中,寄存器 1 的值设置为 3。
<5>注意该指令只能设置一个模拟量的状态。
设备响应:如果计算机发送的命令按原样返回,否则不响应。
命令 5 和 16,写入多个模拟寄存器(保持寄存器):
电脑发送指令:【设备地址】【指令号16】【要放置的寄存器地址高8位】【低8位】【数据号高8位】【数据号低8位】【低位数据高8位】 [低 8 位] […][…] [CRC 校验高 8 位] [CRC 校验和的低 8 位]
示例:[11][16][00][01][00][01][00][05] [CRC 高] [CRC 低]
modbus通讯协议详解含义如下:
<1>设备地址同上。
<2>命令号:写入模拟量的命令号固定为16。
<3>要放置的寄存器地址的高8位和低8位:表示需要放置的模拟寄存器的地址。
<4>要向下设置的数据个数的高8位和低8位:表示要向下设置的数据量,这里为1。
<5>低位数据的高8位和低8位:表示需要低位的模拟数据。例如,在示例中,寄存器 1 的值设置为 5。
设备响应:如果计算机成功返回以下命令,否则不响应。
设备响应:【设备地址】【命令号16】【要放置的寄存器地址高8位】【低8位】【数据高8位】【数据低8位】【CRC校验高8位】 [CRC校验的低8位],如上例返回:
[11][16][00][01][00][01] [CRC 高] [CRC 低]