PLC论坛-全力打造可编程控制器专业技术论坛

 找回密码
 注册哦

QQ登录

只需一步,快速开始

微信扫码登录

查看: 68783|回复: 0

[西门子] 西门子博途:Modbus RTU 通信概述

[复制链接]
发表于 2024-4-14 23:48:43 | 显示全部楼层 |阅读模式
Modbus 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 状态。











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册哦

本版积分规则

QQ|小黑屋|手机版|Archiver|PLC技术网-PLC论坛 ( 粤ICP备17165530号 )|网站地图

GMT+8, 2024-4-30 23:13 , Processed in 0.055491 second(s), 28 queries .

快速回复 返回顶部 返回列表