Modbus从站通信的规则 • 必须运行 Modbus_Comm_Load 以组态端口,以便 Modbus_Slave 指令可以通过该端口进行通信。 • 如果端口作为从站响应 Modbus 主站,则不能使用 Modbus_Master 指令对该端口进行 编程。 • 只有Modbus_Slave 的一个实例可与特定端口一起使用;否则可能遇到意外行为。 • Modbus指令不会使用通信报警事件来控制通信过程。为实现完整的发送和接收过程,程 序必须通过查询 Modbus_Slave 指令来控制通信过程。• 必须以允许及时响应 Modbus 主站进入请求的频率,定期执行 Modbus_Slave 指令。建 议在每个来自程序周期 OB的周期内执行 Modbus_Slave 。Modbus_Slave 可在周期性中 断 OB中执行,但不建议这样做,因为中断程序中过长的时间延迟会临时地阻碍其它中断 程序的执行。
Modbus信号的时间控制 必须定期执行 Modbus_Slave 来接收 Modbus 主站的每个请求并进行相应响应。执行Modbus_Slave 的频率取决于由 Modbus 主站指定的响应超时值。下图中显示了这点。(RESP_TO) 响应的超时周期为Modbus 主站等待 Modbus 从站开始回答的持续时间。此周期 不是由 Modbus 协议定义,而是由Modbus_Comm_Load 指令的参数定义。由于发送和接收 帧都需要多次调用 Modbus_Slave指令(至少三次),应在超时周期内为 Modbus 主站 的响应执行至少十二次 Modbus_Slave 指令,以便 Modbus从站能按超时周期的规定执行两 次接收和发送数据操作。 HR_Start_Offset Modbus 保持寄存器的地址从 40001 或400001 开始。这些地址与目标系统存储器中保持寄 存器的起始地址相对应。但可以组态 HR_Start_Offset 变量来为Modbus 保持寄存器组态不 同于 40001 或 400001 的起始地址。 接收帧中的地址 0与目标系统存储器中保持寄存器的起始地址相对应。使用HR_Start_Offset 变量为 Modbus 保持寄存器组态 0之外的起始地址。 例如,可以组态从 MW100 开始、长度为 100 字的保持寄存器。如果 HR_Start_Offset = 20,接收帧中的地址 20 与目标存储器 (MW100) 中保持寄存器的起始地址相对应。接收帧中低于 20 和高于 119的各个地址将导致寻址错误。HR_Start_Offset 为字的值,用于指定 Modbus 保持寄存器的起始地址,保存在Modbus_Slave 背景数据块中。向程序中添加 Modbus_Slave 指令后,即可通过参数下拉列表选择公共静态变量。例如,如果已经向 LAD 程序段中添加 Modbus_Slave 指令,则可以使用移动命令转至先前的程序段并分配值 HR_Start_Offset。必须在执行 Modbus_Slave 之前分配该值。 使用标准 DB 名称输入Modbus 从站变量: 1. 将光标置于 OUT1 参数字段中并输入字符 m。 2. 从下拉列表中选择 Modbus_Slave指令所需的背景数据块。 3. 将光标置于 DB 名称右侧(引号后面),并输入一个点。 4.在下拉列表中选择“Modbus_Slave_DB.HR_Start_Offset”。 指令版本 版本 4.0 的功能与版本 3.0完全相同,本次版本升级仅仅体现在内部措施方面。 帧结构 (S7-300, S7-400) Extended_Addressing按照关于 HR_Start_Offset 参考的说明访问 Extended_Addressing 变量,Extended_Addressing 变量为布尔值时除外。 如果 Extended_Adressing =FALSE,可组态单字节(Modbus 标准)或两个字节 (Extended_Adressing = TRUE)来寻址 Modbus从站。扩展寻址用于在单个网络中寻址超过 247 个设备。如果 Extended_Adressing = TRUE,Zui多可寻址65535 个地址。以下示例显示 了 Modbus 帧。帧说明主站和从站/从站和主站之间的数据通信从从站地址开始,是功能代码。随后传输数据。数据字段的结构取决于使用的功能代码。帧的Zui后传送的是校验和 (CRC)。 有性能优化时的功能代码激活性能优化选项后,所传输数据的组态限值存在限制。有关限制的更多信息,请参见“功 能代码”部分。 功能代码 1 -此功能允许读取各个输出位该模块不支持此奇偶校验设置。 在 PARITY 参数上为“奇偶校验”(Parity) 选择合 适的值。以下内容有效: • 无 (1) • 偶校验 (2) • 奇校验 (3) • 标记校验 (4) • 间隔校验 (5) • 任意 (6)16#8183 该模块不支持此数据流控制类型。 在 FLOW_CTRL 参数上为该模块选择有效的数据 流控制。 16#8184“响应超时”(Response timeout) 值无效。 在 RESP_TO 参数上为“响应超时”(Responsetimeout) 选择合适的值。 数值的有效范围:1 到 65535 (ms) 16#8280 读取模块时进行否定确认 检查 PORT参数中的输入。 在 Send_Config.RDREC.STATUS 或 Receive_Config.RDREC.STATUS静态参数、 RDREC.STATUS 和 SFB RDREC 的说明中会找到有 关错误原因的更多详细信息。 16#8281写入模块时进行否定确认 检查 PORT 参数中的输入。 在 Send_Config.WRREC.STATUS 或Receive_Config.WRREC.STATUS 静态参数、 WRREC.STATUS 和 SFB WRREC 的说明中会找到有关错误原因的更多详细信息。 16#8282 模块不可用 检查 PORT 参数中的输入并确保模块可以访问。 组态错误 -Modbus_Slave 16#8186 从站地址无效 在 MB_ADDR 参数上选择合适的从站地址。 以下内容有效:标准地址区上的1-247; 扩展地址区上的 1-65535 (为广播保留 0) 16#8187 MB_HOLD_REG 参数上的值无效 在MB_HOLD_REG 参数上为保持寄存器选择合 适的值。 16#8188 无效操作模式或广播 (MB_ADDR = 0) 和MODE 参数模式 ≠ 1 在广播模式下为 MODE 选择值 1 或选择不同的操作模式。指向 MB_HOLD_REG区的指针必须是数据块或位 存储器地址区。 为指向 MB_HOLD_REG 区的指针选择合适的 值。 16#8280读取模块时进行否定确认 检查 PORT 参数中的输入。 在 Send_P2P.RDREC.STATUS 或Receive_P2P.RDREC.STATUS 静态参数和 SFB RDREC 的说明中可找到有关错误原因的更多详 细信息。16#8281 写入模块时进行否定确认 检查 PORT 参数中的输入。 在 Send_P2P.WRREC.STATUS 或Receive_P2P.WRREC.STATUS 静态参数和 SFB WRREC 的说明中会找到有关错误原因的更多详 细信息。16#8389 数据区定义无效: • data_type 值非法 • 数据块编号不被允许或不可用: – 数据块的值无效 –数据块编号不存在 – 数据块编号已被另一个数据区占用 – 优化了访问权限的数据块 – 数据块不在工作存储器中 • length 值非法• 属于同一种 MODBUS 数据类型的多个 MODBUS 地址区域重叠 检查数据区的定义。 请参见“AUTOHOTSPOT”部分。16#8452 1) MB_HOLD_REG 不是指向数据块或位存储区的指 针 检查 MB_HOLD_REG 指针 16#84531) MB_HOLD_REG 并非 BOOL 或 WORD 类型的指针 检查 MB_HOLD_REG 指针 16#8454 1)MB_HOLD_REG 访问的区域长度大于数据块,或 者所访问的区域对于要读取或写入的数据字节来 说太小。 检查MB_HOLD_REG 指针 16#8455 1) MB_HOLD_REG 指向具有写保护的数据块 检查 MB_HOLD_REG 指针16#8456 1) 指令执行期间出错。错误原因显示在参数 STATUS 中。 确定 SFCSTATUS 参数的值。在参数 SFC51和 STATUS 的说明中检查其含义。