Modbus RTU
概述
S7-1200 CPU V4.1 版本以及 STEP 7 V13 SP1 扩展了 Modbus RTU 的功能,可以使用PROFINET 或 PROFIBUS 分布式 I/O 机架与各类设备(RFID 阅读器、GPS
设备和其它)进行通信:
● PROFINET :可以将 S7-1200 CPU 的以太网接口连接至 PROFINET接口模块。可通过机架中 PtP 通信模块以接口模块实现与 PtP 设备的串行通信。
● PROFIBUS :在 S7-1200 CPU 机架左边插入 PROFIBUS 通信模块。将PROFIBUS 通信模块连接至 PROFIBUS 接口模块的机架。可通过机架中 PtP
通信模块以接口模块实现与 PtP 设备的串行通信。
出于这个原因,S7-1200 支持两组 PtP 指令:
● 早期 Modbus RTU 指令 :这些 Modbus RTU 指令存在于 S7-1200 的 V4.0版本之前,并且仅可通过 CM 1241 通信模块或 CB 1241 通信板进行串行通信。
● Modbus RTU 指令 :这些 Modbus RTU指令具备早期指令的所有功能,并且增添了连接 PROFINET 和 PROFIBUS 分布式I/O 的功能。借助 Modbus RTU 指令,
您可组态分布式 I/O 机架中 PtP 通信模块与PtP 设备的之间通信。要使用这些 Modbus RTU 指令,S7-1200 CM 1241模块的固件版本不得低于 V2.1。
说明
用于 S7-1200 的 V4.1
版本时,可以对所有类型的点对点通信使用点对点指令:串行通信、基于 PROFINET的串行通信和基于 PROFIBUS 的串行通信。STEP 7提供早期点对点指令的目的
仅是为了支持现有程序。无论对于 V4.1 CPU 或 V4.0还是更早版本的 CPU,早期指令仍然有效。无须对之前程序的指令进行转换。
选择 Modbus RTU 指令的版本
在 STEP 7 中可使用两个版本的 Modbus RTU 指令:
● 版本 1.1 较初在 STEP 7 Basic/Professional V13 中提供。
● 版本 2.1 在 STEP 7 Basic/Professional V13 SP1 中提供。
可以从兼容性和移植便利性方面考虑,选择将相应的指令版本插入用户程序中。
不能将两个版本的指令用于同一模块,但不同的模块可以使用不同版本的指令。
不要在同一 CPU 程序中同时使用 1.x 和 2.y 指令版本。 用户程序的 Modbus RTU
指令必须具有相同的主版本号(1 1.x、2 2.y 或 V V.z)。
主版本组内的各个指令可具有不同的次版本号 (1.x x)。
单击指令树任务卡上的图标可启用指令树的标题和列
要更改 Modbus RTU
指令的版本,请从下拉列表中选择相应版本。
可以选择一组指令或分别选择各个指令。
使用指令树将 Modbus RTU 指令放入程序时,将在项目树中创建新的 FB 实例。
在项目树的“PLC_x > 程序块 > 系统块 > 程序资源”(PLC_x > Program blocks > Systemblocks > Program resources) 下可看到新的 FB 实例。
要确认程序中 Modbus RTU
指令的版本,必须检查项目树的属性而不是程序编辑器中显示的框的属性。
选择项目树的 Modbus RTU FB
实例,单击右键,选择“属性”(Properties),然后选择“信息”(Information) 页查看 ModbusRTU 指令的版本号。
可执行 Modbus_Comm_Load 来组态端口以使用 Modbus RTU 协议。 为使用 ModbusRTU 协议组态端口后,该端口只能由 Modbus_Master 或 Modbus_Slave 指令使
用。
对用于 Modbus 通信的每个通信端口,都必须执行一次 Modbus_Comm_Load 来组态。
为要使用的每个端口分配一个一的 Modbus_Comm_Load 背景数据块。 较多可在 CPU中安装三个通信模块(RS232 或 RS485)和一个通信板 (RS485)。 从启动
OB 调用Modbus_Comm_Load 并执行它一次,或使用**个扫描系统标记发起调用以执行它一次。
只有在必须更改波特率或奇偶校验等通信参数时,才再次执行 Modbus_Comm_Load。
如果将 Modbus 库与分布式机架中的模块结合使用,则必须在一个循环中断例程中执行Modbus_Comm_Load 指令(例如,每秒或每隔 10 秒执行一次)。
如果分布式机架的电源中断或者卸下了模块,则在模块恢复运行时,仅向 PtP 模块发送HWConfig 参数组。 由 Modbus_Master 启动的所有请求都会**时,并且
Modbus_Slave转入静默状态(对任何消息均无响应)。 循环执行 Modbus_Comm_Load解决了这些问题。
将 Modbus_Master 或 Modbus_Slave 指令放入用户程序中时,将为其分配背景数据块。
* Modbus_Comm_Load 指令的 MB_DB 参数时将引用该背景数据块。
Modbus_Master 通信规则
● 必须先执行 MB_COMM_LOAD 组态端口,然后 Modbus_Master指令才能与该端口通信。
● 如果要将某个端口用于初始化 Modbus 主站请求,则 MB_SLAVE不应使用该端口。Modbus_Master执行的一个或多个实例可使用该端口,但是对于该端口,所有
Modbus_Master执行都必须使用同一个 Modbus_Master 背景数据块。
● Modbus 指令不使用通信中断事件来控制通信过程。用户程序必须轮询Modbus_Master 指令以了解传送和接收的完成情况。
● 建议对于给定的端口,从程序循环 OB 中调用所有 Modbus_Master执行。Modbus_Master指令只能在一个程序循环或循环/延时执行等级执行。它们不能同时在
两种执行**级中执行。如果一个 Modbus_Master 指令被另一个执行**级更高的 Modbus_Master取代,将导致不正确的操作。Modbus_Master
指令不能在启动、诊断或时间错误执行**级执行。
● Modbus_Master 指令启动传输后,必须连续执行已启用 EN输入的该实例,直到返回状态 DONE=1 或状态 ERROR=1为止。在这两个事件其中之一发生前,一个特
殊的 Modbus_Master实例被视为已激活。原始实例激活后,调用已启用 REQ输入的其它任何实例都将导致错误。如果原始实例的连续执行过程停止,则请求状态
保持激活一段时间,该时间由静态变量“Blocked_Proc_Timeout”*。一旦**出该时间段,则下一个使用激活的 REQ 输入调用的 Modbus_Master
指令成为激活实例。这可以防止单个 Modbus_Master指令独占或锁定对端口的访问。如果在由静态变量“Blocked_Proc_Timeout”*的时间段内没有启用原始激
活的实例,则下次执行此实例(未设置REQ)时将清除激活状态。如果设置了 REQ,则此次执行将启动新的Modbus_Master 请求,如同其它实例未曾激活一样。
REQ 参数
0 = 无请求;1 = 请求将数据传送到 Modbus 从站可使用电平或边沿触发的触点控制此输入。只要此输入启用,状态机便会启动,以确保在
当前请求完成前不允许使用同一背景数据块的任何其它 Modbus_Master发出请求。在当前请求执行期间,将捕获所有其它输入状态并内部保存,直到接收到响应
或检测到错误。
如果在当前请求完成前 REQ 输入 = 1,从而再次执行 Modbus_Master的同一实例,则不会进行任何后续传送。但是,如果当前请求已完成,因为 REQ 输入 =
1 而再次执行 Modbus_Master 时,便会发出新请求。
DATA_ADDR 和 MODE 参数用于选择 Modbus 功能类型
DATA_ADDR(从站中的 Modbus 起始地址):*要在 Modbus从站中访问的数据的起始地址。
Modbus_Master 指令使用 MODE 输入而非功能代码输入。MODE 和 Modbus地址一起确定实际 Modbus 消息中使用的功能代码。下表列出了 MODE 参数、Modbus
功能代码和 Modbus 地址范围之间的对应关系。
对于“扩展寻址”模式,根据功能所使用的数据类型,数据的较大长度将减小 1 个字节或 1 个字。
DATA_PTR 参数
DATA_PTR 参数指向要写入或读取的 DB 或 M地址。如果使用数据块,则必须创建一个全局数据块为读写 Modbus从站提供数据存储位置。
说明
DATA_PTR 数据块类型必须允许直接寻址该数据块必须允许直接(**)寻址和符号寻址。创建该数据块时,必须选择“标准”(Standard) 访问属性。
DATA_PTR 参数的数据块结构
● 这些数据类型对 Modbus 地址 30001 到 39999、40001 到 49999 和 400001 到465536 的 字读取有效,对 Modbus 地址 40001 到 49999 和 400001 到
465536的 字写入也有效。
– WORD、UINT 或 INT 数据类型的标准数组
– *的 WORD、UINT 或 INT 结构,其中每个元素都具有一的名称和 16
位数据类型。
– *的复杂结构,其中每个元素都具有一的名称以及 16 或 32 位数据类型。
● 用于 Modbus 地址 00001 到 09999 的 位读取和写入和 10001 到 19999 的位读取。
– 布尔数据类型的标准数组。
– 一命名的布尔变量的已命名布尔结构。
● 尽管不是必需的,但还是建议每个 Modbus_Master指令都具有各自的单独存储区。此建议的原因在于,如果多个 Modbus_Master指令读取和写入同一个存储
区,发生数据损坏的可能性会更大。
● 不要求 DATA_PTR
数据区位于同一个全局数据块中。可创建一个具有多个区域的数据块供 Modbus读取、一个数据块供 Modbus 写入或一个数据块用于各个从站。