Modbus RTU通信概述

通信网络

650人已加入

描述

Modbus RTU 通信

RTU

Modbus RTU (Remote Terminal Unit) 是用于网络中通信的标准协议,使用 RS232 或 RS422/485 连接在网络中的 Modbus 设备之间进行串行数据传输。

Modbus RTU 使用主/从站网络,其中整个通信仅由一个主站设备触发,而从站只能响应主站的请求。 主站将请求发送到一个从站地址,并且只有该地址上的从站做出响应。

例外: Modbus 从站地址为 0 时会向所有从站发送广播帧(从站均不响应)。

Modbus 功能代码

作为 Modbus RTU 主站运行的 CPU 能够在 Modbus RTU 从站中通过通信连接读取和写入数据和 I/O 状态。

作为 Modbus RTU 从站运行的 CPU 允许利用通信连接进行连接的 Modbus RTU 主站在其自身的 CPU 中读取并写入数据和 I/O 状态。

用于读取数据的功能: 读取分布式 I/O 和程序数据

Modbus 功能代码 用于读取从站(服务器)数据的功能 - 标准寻址
01 读取输出位: 每个请求 1 至2000/19921) 位
02 读取输入位: 每个请求 1 至 2000/19921) 位
03 读取保持寄存器: 每个请求 1 至 125/1241) 字
04 读取输入字: 每个请求 1 至 125/1241) 字
1) 用于扩展寻址

用于写入数据的功能: 更改分布式 I/O 和程序数据

Modbus 功能代码 用于向从站(服务器)写入数据的功能 - 标准寻址
05 写入一个输出位: 每个请求 1 位
06 写入一个保持寄存器: 每个请求 1 个字
15 写入一个或多个输出位:每个请求 1 至 1960 位
16 写入一个或多个保持寄存器:每个请求 1 至 122 个字

Modbus 功能代码 08 和 11 提供从站设备的通信诊断选项。

Modbus 从站地址为 0 时会将广播帧发送给所有从站(无从站响应;针对功能代码 5、6、15、16)。

Modbus 网络中的站地址

地址
RTU 站 标准站地址 1 到 247 , 0 用于广播
扩展站地址 1 到 65535,0 用于广播

Modbus 存储器地址

可用的 Modbus 存储器地址(输入/输出地址)的实际数量取决于 CPU 版本和可用的工作存储器。

程序中的 Modbus RTU 指令

Modbus_Comm_Load:需要运行 Modbus_Comm_Load 来设置 PtP 参数,例如数据传输速率、奇偶校验和数据流控制。 为 Modbus RTU 协议组态完通信模块后,它只能由 Modbus_Master 指令或 Modbus_Slave 指令使用。

Modbus_Master:利用 Modbus 主站指令,CPU 可用作 Modbus RTU 主站设备,与一个或更多的 Modbus 从站设备进行通信。

Modbus_Slave:利用 Modbus 从站指令,CPU 可用作 Modbus RTU 从站设备,与一个 Modbus 主站设备进行通信。

Modbus_Comm_Load: 对 Modbus 的通信模块进行组态

说明

Modbus_Comm_Load 指令通过 Modbus RTU 协议对用于通信的通信模块进行组态。当在程序中添加 Modbus_Comm_Load 指令时,将自动分配背景数据块。

Modbus_Comm_Load 的组态更改将保存在 CM 中,而不是 CPU 中。恢复电压和插拔时,将使用保存在设备配置中的数据组态 CM。必须在这些情况下调用 Modbus_Comm_Load 指令。

参数

参数 声明 数据类型 标准 说明
S7-
1200/1500
S7-
300/400/
WinAC
REQ IN Bool FALSE 当此输入出现上升沿时,启动该指令。
PORT IN Port Laddr 0 指定用于以下通信的通信模块:
对于 S7-1500/S7-1200:设备组态中的“硬件标识符”。
符号端口名称在 PLC 变量表的“系统常数”(System constants) 选项卡中指定并可应用于此处。
对于 S7-300/S7-400:设备组态中的“输入地址”。
在 S7-300/400/WinAC 系统中,在 HWCN 中分配的输入地址中分配端口参数。
BAUD IN UDInt DWord 9600 选择数据传输速率
有效值为:300、600、1200、2400、4800、9600、19200、38400、57600、76800、115200 bit/s。
PARITY IN UInt Word 0 选择奇偶校验:
0 – 无
1 – 奇校验
2 – 偶校验
FLOW_CTRL IN UInt Word 0 选择流控制:
0 – (默认)无流控制
1 – 硬件流控制,RTS 始终开启(不适用于 RS422/485 CM)
2 – 硬件流控制,RTS 切换(不适用于 RS422/485 CM)
RTS_ON_DLY IN UInt Word 0 RTS 接通延迟选择:
0 – 从“RTS 激活”直到发送帧的第一个字符之前无延迟。
1 到 65535 - 从“RTS 激活”一直到发送帧的第一个字符之前的延迟(以毫秒表示)(不适用于 RS422/485 CM)。不论选择 FLOW_CTRL 为何,都会使用 RTS 延迟。
RTS_OFF_DLY IN UInt Word 0 RTS 关断延迟选择:
0 - 从传送上一个字符一直到“RTS 未激活”之前无延迟
1 到 65535 - 从传送上一个字符直到“RTS 未激活”之前的延迟(以毫秒表示)(不适用于 RS422/485 端口)。不论选择 FLOW_CTRL 为何,都会使用 RTS 延迟。
RESP_TO IN UInt Word 1000 响应超时:
5 ms 到 65535 ms - Modbus_Master 等待从站响应的时间(以毫秒为单位)。如果从站在此时间段内未响应,Modbus_Master 将重复请求,或者在指定数量的重试请求后取消请求并提示错误(请参见下文,RETRIES 参数)。
MB_DB IN/OUT MB_BASE 对 Modbus_Master 或 Modbus_Slave 指令的背景数据块的引用。
MB_DB 参数必须与 Modbus_Master 或 Modbus_Slave 指令的(静态,因此在指令中不可见)MB_DB 参数相连。
COM_RST IN/OUT --- Bool FALSE Modbus_Comm_Load 指令的初始化
将使用 TRUE 对指令进行初始化。随后会将 COM_RST 复位为 FALSE。
注:
该参数仅适用于 S7-300/400 指令。
DONE OUT Bool FALSE 如果上一个请求完成并且没有错误,DONE 位将变为 TRUE 并保持一个周期。
ERROR OUT Bool FALSE 如果上一个请求完成出错,则 ERROR 位将变为 TRUE 并保持一个周期。STATUS 参数中的错误代码仅在 ERROR = TRUE 的周期内有效。
STATUS OUT Word 16#7000 错误代码(请参见错误消息)

执行 Modbus_Comm_Load 以对 Modbus RTU 协议的端口进行组态。为 Modbus RTU 协议组态完端口后,它只能由 Modbus_Master 指令或 Modbus_Slave 指令使用。

必须运行 Modbus_Comm_Load 来完成将用于 Modbus 通信的每个通信端口的组态。必须为使用的每个端口分配唯一的 Modbus_Comm_Load 背景数据块。如果需要更改数据传输速率或奇偶校验等通信参数,或者网络已经恢复,只需再次运行 Modbus_Comm_Load。

例如,当在程序中添加 Modbus_Master 或 Modbus_Slave 指令时,将自动为指令分配背景数据块。需要将 Modbus_Comm_Load 指令的 MB_DB 参数连接到 Modbus_Master 或 Modbus_Slave 指令的 MB_DB 参数。

Modbus_Comm_Load 数据块变量

下表显示了可在程序中使用的 Modbus_Comm_Load 背景数据块中的公共静态变量。

背景数据块中的静态变量

变量 数据类型 标准 说明
S7-
1200/1500
S7-
300/400/
WinAC
     
ICHAR_GAP Word 0 字符间的最长字符延迟时间。此参数以毫秒为单位指定,并且增加了所接收字符之间的预期周期。将此参数的相应位时间数添加到 Modbus 默认值 35 位时间(3.5 字符时间)。
RETRIES Word 2 返回“无响应”错误代码 0x80C8 之前主站执行的重复尝试次数。
EN_SUPPLY_VOLT Bool 0 启用对电源电压 L+ 缺失的诊断
MODE USInt 字节 0 工作模式
有效的工作模式包括:
0 = 全双工 (RS232)
1 = 全双工 (RS422) 四线制模式(点对点)
2 = 全双工 (RS 422) 四线制模式(多点主站,CM PtP (ET 200SP))
3 = 全双工 (RS 422) 四线制模式(多点从站,CM PtP (ET 200SP))
4 = 半双工 (RS485) 二线制模式 1)
LINE_PRE USInt 字节 0 接收线路初始状态
有效的初始状态是:
0 =“无”初始状态 1)
1 = 信号 R(A)=5 V,信号 R(B)=0 V(断路检测):
在此初始状态下,可进行断路检测。
仅可以选择以下项:“全双工 (RS422) 四线制模式(点对点连接)”和“全双工 (RS422) 四线制模式(多点从站)”。
2 = 信号 R(A)=0 V,信号 R(B)=5 V:
此默认设置对应于空闲状态(无激活的发送操作)。在此初始状态下,无法进行断路检测。
BRK_DET USInt 字节 0 断路检测
以下内容有效:
0 = 断路检测已禁用
1 = 断路检测已激活
EN_DIAG_ALARM Bool 0 激活诊断中断:
0 - 未激活
1 - 已激活
STOP_BITS USINT 字节 1 停止位个数;
1 = 1 个停止位,
2 = 2 个停止位,
0、3 到 255 = 保留
1) 使用 PROFIBUS 电缆连接 CM 1241 的 RS485 时所需的设置

Modbus_Master: 作为 Modbus 主站进行通信

Modbus_Master 指令可通过由 Modbus_Comm_Load 指令组态的端口作为 Modbus 主站进行通信。当在程序中添加 Modbus_Master 指令时,将自动分配背景数据块。Modbus_Comm_Load 指令的 MB_DB参数必须连接到 Modbus_Master 指令的(静态)MB_DB参数。

参数  

参数 声明 数据类型 标准 说明
S7-
1200/1500
S7-
300/400/
WinAC
REQ IN Bool FALSE FALSE = 无请求
TRUE = 请求向 Modbus 从站发送数据
MB_ADDR IN UInt Word Modbus RTU 站地址:
标准地址范围(1 到 247 以及 0用于 Broadcast)
扩展地址范围(1 到 65535以及 0 ,用于 Broadcast)
值 0 为将帧广播到所有 Modbus 从站预留。广播仅支持 Modbus 功能代码 05、06、15 和 16。
MODE IN USInt Byte 0 模式选择:指定请求类型(读取、写入或诊断)。下面的 Modbus 功能表中提供了其它信息。
DATA_ADDR IN UDInt DWord 0 从站中的起始地址:指定在 Modbus 从站中访问的数据的起始地址。下面的 Modbus 功能表中列出了有效地址。
DATA_LEN IN UInt Word 0 数据长度:指定此指令将访问的位或字的个数。下面的 Modbus 功能表中列出了有效长度。
COM_RST IN/OUT --- Bool FALSE Modbus_Master 指令的初始化
将使用 TRUE 对指令进行初始化。随后会将 COM_RST 复位为 FALSE。
注:
该参数仅适用于 S7-300/400 指令。
DATA_PTR IN/OUT Variant Any 数据指针:指向要进行数据写入或数据读取的标记或数据块地址。
自指令版本 V3.0 起:
该参数可指向优化存储区。在优化存储区中,允许使用以下数据类型的单个元素或数组:Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar。所有其它数据类型都会导致出现错误消息 16#818C。
DONE OUT Bool FALSE 如果上一个请求完成并且没有错误,DONE 位将变为 TRUE 并保持一个周期。
BUSY OUT Bool FALSE – Modbus_Master 无激活命令
TRUE – Modbus_Master 命令执行中
ERROR OUT Bool FALSE 如果上一个请求完成出错,则 ERROR 位将变为 TRUE 并保持一个周期。STATUS 参数中的错误代码仅在 ERROR = TRUE 的周期内有效。
STATUS OUT Word 0 错误代码(请参见错误消息)

Modbus 主站数据块中的变量

下表显示了可在程序中使用的 Modbus_Master 背景数据块中的公共静态变量。

背景数据块中的静态变量

变量 数据类型 标准 说明
Blocked_Proc_Timeout Real 3.0 在“激活”状态移除此实例前,等待受阻的 Modbus 主站实例的持续时间(以秒为单位)。例如,如果输出主站请求,随后在其完全结束请求之前,程序停止并调用主站功能,则可能发生这种情况。时间值必须大于 0 秒而小于 55 秒,以避免发生错误。
另请参见“Modbus-Master 通信规则”和“使用不同的参数设置调用 Modbus_Master 指令”。
Extended_Addressing Bool FALSE 将从站地址组态为单字节或双字节。
FALSE = 1 字节地址;0 到 247
TRUE = 2 字节地址(对应于扩展地址);
0 到 65535
Compatibility_Mode 1) Bool FALSE 对于 Modbus,使用 Modbus RTU 驱动程序 的 CP 341、CP 441-2 和 ET 200SP 1SI,以及 ET 200SP 1SI 的兼容模式
默认值为 0。
FALSE = 根据 Modbus 规范,不兼容
TRUE = 兼容
对于 FC1 和 FC2:从帧中读取的数据逐字写入访问的 CPU 存储器内,并逐字节替换。
如果要传输的位数不是 16 的倍数,那么不相关的位将在最后一个字中设置为空值。
对于 FC15:要传输的字从访问的存储器中逐字读取并逐字节写入发送帧。
如果要传输的位数不是 8 的倍数,那么最后一个字节中不相关的位将从访问的存储器中读取,并输入到发送帧中。
MB_DB MB_BASE - Modbus_Comm_Load 指令的 MB_DB 参数必须连接到 Modbus_Master 指令的此 MB_DB 参数。
1) 点对点通信模块会根据 Modbus 规范中的定义进行响应。对于 Modbus,要保留与 CP 341, CP 441‑2 和 ET 200SP 1SI一样的响应,使用“Compatibility_Mode”参数。

程序可以向 Blocked_Proc_Timeout 和 Extended_Addressing 变量中写入值来控制 Modbus 主站的操作。

Modbus-Master 通信规则

必须运行 Modbus_Comm_Load 来组态端口,以便 Modbus_Master 指令可以使用该端口进行通信。

要用来作为 Modbus 主站的端口不可作为 Modbus_Slave 使用。对于该端口,可以使用一个或多个 Modbus_Master1) 的实例。但是,所有版本的 Modbus_Master 都必须为该端口使用相同的背景数据块。

Modbus 指令不会使用通信报警事件来控制通信过程。程序必须查询 Modbus_Master 指令来获得完整的命令(DONE、ERROR)。

我们建议为来自程序周期 OB 的特定端口调用 Modbus_Master 的所有执行。Modbus 主站指令只能在一个程序周期或一个周期/时间控制的处理级别中执行。它们无法在不同的处理级别中进行处理。由具有较高优先级的处理级别中的 Modbus 主站指令引起的 Modbus 主站指令的优先级中断将导致操作不正确。Modbus 主站指令无法在启动、诊断或时间错误级别中处理。

1) 此处的“Modbus 主站的实例”意味着,调用具有与 Modbus_Comm_Load 指令相同的互联,并具有与 MB_ADDR、MODE、DATA_ADDR和 DATA_LEN参数相同的设置的 Modbus_Master 指令。

示例

MODE = 0 且 DATA_ADDR = 10 时会调用 Modbus_Master

此作业将一直处于激活状态,直到通过参数 DONE=1 或 ERROR=1 完成,或者 Blocked_Proc_Timeout 参数中组态的监视时间到期。如果在看门狗时间用完且之前的命令还未完成时启动了新命令,那么之前的命令将会中止而不会有错误消息。

如果在此命令正在运行期间使用相同的实例数据以不同的 MODE和 DATA_ADDR参数设置再次调用,则第二次的调用将以 ERROR = 1 和 STATUS = 8200 终止。

使用不同的参数设置调用 Modbus_Master 指令

如果程序中含有使用不同 MB_ADDR、MODE、DATA_ADDR或 DATA_LEN设置的多个 Modbus_Master 指令调用,必须确保在任意给定时间,只有一个调用处于激活状态。否则,将输出错误消息 16#8200(接口正忙于处理当前请求)。

如果无法完整地完成调用,那么看门狗会由 Blocked_Proc_Timeout 参数激活,并终止当前命令。

REQ 参数

FALSE = 无请求;TRUE = 请求向 Modbus 从站发送数据

启用请求的传输。这会将缓冲区中的内容传送到点对点通信接口。

可以使用 DATA_ADDR 和 MODE 参数来选择 Modbus 功能代码。

DATA_ADDR(从站中的 Modbus 起始地址):指定在 Modbus 从站中访问的数据的起始地址。

Modbus_Master 指令使用 MODE 输入,不使用功能代码输入。MODE 和 DATA_ADDR 结合使用可指定在实际 Modbus 帧中使用的功能代码。下表显示了 MODE 参数、Modbus 功能代码和DATA_ADDR 中 Modbus 地址范围之间的关系。

Modbus 功能

MODE DATA_ADDR(Modbus 地址) DATA_LEN
(数据长度)
Modbus 功能代码 运行和数据
0   每个请求的位数 01 读取输出位:
1 9999 1 2000/1992 1 0 9998
0   每个请求的位数 02 读取输入位:
10001 19999 1 2000/1992 1 0 9998
0   每个请求的字数 03 读取保持寄存器:
40001 49999 1 125/124 1 0 9998
400001 465535 1 125/124 1 0 65534
0   每个请求的字数 04 读取输入字:
30001 39999 1 125/124 1 0 9998
1   每个请求的位数 05 写入一个输出位:
1 9999 1     0 9998
1   每个请求 1 个字 06 写入一个保持寄存器:
40001 49999 1     0 9998
400001 465535 1     0 65524
1   每个请求的位数 15 写入多个输出位:
1 9999 2 1968/1960 1 0 9998
1   每个请求的字数 16 写入多个保持寄存器:
40001 49999 2 123/122 0 9998
400001 465534 2 123/122 1 0 65534
2 2   每个请求的位数 15 写入一个或多个输出位:
1 9999 1 1968/1960 1 0 9998
2 2   每个请求的字数 16 写入一个或多个保持寄存器:
40001 49999 1 123 0 9998
400001 465535 1 122 1 0 65534
11 此功能将忽略 Modbus_Master 的 DATA_ADDR 和 DATA_LEN 操作数。 11 读取从站通信的状态字和事件计数器。状态字表示“忙”(0 - 不忙,0xFFFF - 忙)。事件计数器随着帧的每次成功处理而递增。
80   每个请求 1 个字 08 使用数据诊断代码 0x0000 检查从站状态(回送测试 - 从站返回请求的回应)
-     1     -    
81   每个请求 1 个字 08 利用数据诊断代码 0x000A 重新设置从站事件计数器
-     1     -    
104   每个请求的字数 04 读取输入字
0 65535 1 125/124 1 0 65535
3 到 10,
12 到 79,
82 到 103,105 到 255
-     -       保留
1 在扩展寻址中(请参见 Extended_Adressing 参数),最大数据长度根据功能的数据类型而缩减 1 字节或 1 个字。
2 MODE 2 允许使用 Modbus 功能 15 和 16 写入 1 个或多个输出位和 1 个或多个保持寄存器。
MODE 1 使用 Modbus 功能 5 和 6 写入 1 个输出位和 1 个保持寄存器,使用 Modbus 功能 15 和 16 写入多个输出位和多个保持寄存器。

DATA_PTR 参数

DATA_PTR 参数指向在其中执行读取或写入的数据块或位存储器地址。如果使用数据块,则必须创建全局数据块,以便为 Modbus 从站上的读取或写入过程提供数据存储器。

说明
S7-1200/1500 - 使用 DATA_PTR 的访问的数据块必须支持直接寻址
数据块必须允许直接(绝对)寻址和符号寻址。
说明
使用功能代码 5
功能代码 5 用于设置或删除各个位。
设置位时,必须在通过 DATA_PTR 寻址到的 DB 或位存储区的首个字中指定值“16#FF00”。
对于 S7-1200,也可以指定值“16#0100”以设置位。
为复位某个位,必须在通过 DATA_PTR 寻址到 DB 或位存储区的首个字中指定值“16#0000”。
所有其它值通过 ERROR = TRUE 和 STATUS = 16#8384 拒绝。

DATA_PTR 参数的数据块结构

这些数据类型对读取 Modbus 地址范围 (DATA_PTR) 30001 到 39999、40001 到 49999 和 400001 到 465535 中的字有效,以及对写入 Modbus 地址范围(DATA_PTR 参数)40001 到 49999 和 400001 到 465535 中的字有效。

数据类型 WORD、UINT 或 INT 的标准数组

WORD、UINT 或 INT 类型的指定结构,其中每个元素都有唯一的名称和一个 16 位的数据类型。

指定的复杂结构,其中每个元素都有唯一的名称和一个 16 位或 32 位的数据类型。

用于读/写 Modbus 地址范围(DATA_PTR 参数)00001到 09999 中的位和用于读取 10001 到 19999 中的位。

布尔数据类型的标准字段。

来自明确指定的布尔变量的指定布尔结构。

给每个 Modbus_Master 指令分配各自的独立存储区并不是必须进行的操作,但我们建议进行此操作。原因是,如果多个 Modbus 指令都在同一个存储区读取和写入,那么数据损坏的可能性将大大增高。

DATA_PTR的数据区不必位于相同的全局数据块中。可以为 Modbus 读取过程创建具有多个区域的数据块,为 Modbus 写入过程创建数据块或为每个从站创建数据块。

Modbus_Slave:作为 Modbus 从站进行通信

说明

程序可利用 CM(RS422/485 或 RS232)端口,使用 Modbus_Slave 指令来作为 Modbus 从站进行通信。添加指令时,STEP 7 将自动创建背景数据块。Modbus_Comm_Load 指令的 MB_DB 参数必须连接到 Modbus_Slave 指令的(静态)MB_DB 参数。

参数

参数 声明 数据类型 标准 说明
S7-
1200/1500
S7-
300/400/
WinAC
MB_ADDR IN UInt Word Modbus 从站的标准寻址:
标准寻址范围(1 到 247)
扩展寻址范围(0 到 65535)
注:0 是广播地址
COM_RST IN/OUT --- Bool FALSE Modbus_Slave 指令的初始化
将使用 TRUE 对指令进行初始化。随后会将 COM_RST 复位为 FALSE。
注:
该参数仅适用于 S7-300/400 指令。
MB_HOLD_REG IN/OUT Variant Any Modbus 保持寄存器 DB 的指针:Modbus 保持寄存器可能为标志的存储区或者数据块。
自指令版本 V4.0 起:
该参数必须指向长度为 16 位以上的存储区,否则会导致出现错误消息 16#8187。这一要求对于单个元素、数组、STRUCT 和 UDT 均适用。例如,如果 Single Bool 或数组中包含的布尔元素个数小于 16,则会导致出现错误消息。
如果长度不是 16 位的倍数,则存储区末端的剩余位无法通过Modbus_Slave 指令读取或写入。
该参数可指向优化存储区。在优化存储区中,允许使用以下数据类型的单个元素或数组:Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar。所有其它数据类型都会导致出现错误消息 16#818C。
NDR OUT Bool FALSE 可用的新数据:
FALSE - 无新数据
TRUE – 表示新数据已由 Modbus 主站写入
如果上一个请求完成并且没有错误,NDR 位将变为 TRUE 并保持一个周期。
DR OUT Bool FALSE 读取数据:
FALSE - 未读取数据
TRUE - 表示该指令已将 Modbus 主站接收到的数据存储在目标区域中。
如果上一个请求完成并且没有错误,DR 位将变为 TRUE 并保持一个周期。
ERROR OUT Bool FALSE 如果上一个请求完成出错,则 ERROR 位将变为 TRUE 并保持一个周期。如果执行因错误而终止,则 STATUS 参数中的错误代码仅在 ERROR = TRUE 的周期内有效。
STATUS OUT Word 0 错误代码(请参见错误消息)

Modbus 通信的功能代码(1、2、4、5 和 15)可直接在 CPU 的过程映像输入和过程映像输出中读取或写入位和字。对于这些功能代码,必须将 MB_HOLD_REG 参数定义为大于一个字节的数据类型。下表显示了将 Modbus 地址分配给 CPU 中过程映像的示例。

将 Modbus 地址分配给过程映像

Modbus 功能 S7-1200
代码 功能 数据区 地址区 数据区 CPU 地址
01 读取位 输出 0 8191 过程映像输出 O0.0 O1023.7
02 读取位 输入 0 8191 过程映像输入 I0.0 I1023.7
04 读取字 输入 0 511 过程映像输入 IW0 IW1022
05 写入位 输出 0 8191 过程映像输出 O0.0 O1023.7
15 写入位 输出 0 8191 过程映像输出 O0.0 O1023.7

将 Modbus 地址分配给过程映像

Modbus 功能 S7-1500/S7-300/S7-400
功能代码 功能 数据区 地址区 数据区 CPU 地址
01 读取位 输出 0 9998 过程映像输出 O0.0 A1249.6
02 读取位 输入 0 9998 过程映像输入 I0.0 I1249.6
04 读取字 输入 0 9998 过程映像输入 IW0 IW19996
05 写入位 输出 0 9998 过程映像输出 O0.0 A1249.6
15 写入位 输出 0 9998 过程映像输出 O0.0 A1249.6
说明
可用的地址区可能更小,具体取决于 CPU 的存储器组态。

Modbus 通信的功能代码(3、6 和 16)使用 Modbus 保持寄存器,此寄存器是标志的存储区或者数据块中的一个地址区。保持寄存器的类型由 Modbus_Slave 指令的 MB_HOLD_REG 参数指定。

说明
S7-1200/1500 - MB_HOLD_REG 数据块的类型
具有 Modbus 保持存器的数据块必须允许直接(绝对)寻址和符号寻址。

诊断功能

S7-1200 Modbus_Slave 的 Modbus 诊断功能
功能代码 子功能 说明
08 0000H 输出回应测试的请求数据:Modbus_Slave 指令会将所接收数据字的回应返回到 Modbus 主站。
08 000AH 清除通信事件计数器:Modbus_Slave 指令将清除用于 Modbus 功能 11 的通信事件计数器。
11   调用通信事件计数器:Modbus_Slave 指令使用内部通信事件计数器来检测将发送到 Modbus 从站的成功的 Modbus 读取和 Modbus 写入数量。该计数器不随功能 8、功能 11 和广播请求而递增。它也不会随导致通信错误(例如,奇偶校验或 CRC 错误)的请求而递增。

Modbus_Slave 指令支持来自 Modbus 主站的广播写入请求,只要该请求包括到有效地址的访问即可。针对广播功能不支持的功能代码,Modbus_Slave 指令将生成错误代码 16#8188。

指令版本 V3.0 中 Modbus 从站的变量

下表显示了可在程序中使用的 Modbus_Slave 背景数据块中的公共静态变量。

Modbus 从站的变量

变量 数据类型 标准 说明
HR_Start_Offset Word 0 为 Modbus 保持寄存器指定起始地址(默认 = 0)
QB_Start Word 0 输出的有效可写入寻址范围起始地址(字节 0 到 65535)
注:
该变量不适用于 S7-300、S7-400 和 WinAC。
QB_Count Word 0xFFFF 可由 Modbus 主站写入的输出字节数。
注:
该变量不适用于 S7-300、S7-400 和 WinAC。
Extended_Addressing Bool FALSE 扩展寻址,将从站寻址组态为单字节或双字节。
(FALSE = 单字节地址,TRUE = 双字节地址)
Request_Count Word 0 该从站接收的所有请求的数量
Slave_Message_Count Word 0 该特定从站接收的所有请求的数量
Bad_CRC_Count Word 0 存在 CRC 错误的已接收请求的数量
Broadcast_Count Word 0 已接收的广播请求的数量
Exception_Count Word 0 使用主站的例外进行确认的 Modbus 特定错误
Success_Count Word 0 该特定从站接收的无协议错误的请求数量
MB_DB MB_BASE - Modbus_Comm_Load 指令的 MB_DB 参数必须连接到 Modbus_Master 指令的此 MB_DB 参数。

程序可以向 HR_Start_Offset 和 Extended_Addressing 变量中写入值来控制 Modbus 从站的操作。可以读取其它变量来监视 Modbus 状态。

RTU

RTU

RTU

RTU

RTU

 





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分