2024年4月17日发(作者:)

MBUS_MSG指令

输入/输出

首次

从站

读写

地址

计数

DataPtr

完成

错误

操作数

布尔

字节

字节

双字

整型

双字

布尔

字节

数据类型

I, Q, M, S, SM, T, C, V, L (以上升沿检测元素为条件的功率流)

VB, IB, QB, MB, SB, SMB, LB, AC, Constant, *VD, *AC, *LD

VB, IB, QB, MB, SB, SMB, LB, AC, Constant, *VD, *AC, *LD

VD, ID, QD, MD, SD, SMD, LD, AC, Constant, *VD, *AC, *LD

VW, IW, QW, MW, SW, SMW, LW, AC, Constant, *VD, *AC, *LD

&VB

I, Q, M, S, SM, T, C, V, L

VB, IB, QB, MB, SB, SMB, LB, AC, *VD, *AC, *LD

MBUS_MSG指令(或用于端口1的MBUS_MSG_P1)用于启动对Modbus从站的请

求并处理应答。

当EN输入和"首次"输入打开时,BUS_MSG指令启动对Modbus从站的请求。发

送请求、等待应答、并处理应答通常需要多次扫描。EN输入必须打开以启用请

求的发送,并应该保持打开直到"完成"位被置位。

注释:一次只能激活一条MBUS_MSG指令。如果启用了多条MBUS_MSG指

令,则将处理所执行的第一条MBUS_MSG指令,之后的所有

MBUS_MSG指令将中止并产生错误代码6。

"首次"参数应该在有新请求要发送时才打开以进行一次扫描。"首次"输入应当通

过一个边沿检测元素(例如上升沿)打开,这将导致请求被传送一次。参见实例程

序。

"从站"参数是Modbus从站的地址。允许的范围是0到247。地址0是广播地址,

只能用于写请求。不存在对地址0的广播请求的应答。并非所有的从站会支持广

播地址。S7-200 Modbus从站协议库不支持广播地址。

"读写"参出指定是否要读取或写入该消息。"读写"参数允许使用下列两个值。

0 ٛ 读

1 ٛ 写

离散输出(线圈)和保持寄存器支持读取和写入请求。离散输入(触点)和输入寄存器仅支持读取请求。"

地址"参数是起始的

Modbus地址。允许使用下列取值范围:00001至09999是离散输出(线圈)

10001至19999是离散输入(触点)

30001至39999是输入寄存器

40001至49999是保持寄存器

"地址"的指定取值范围基于Modbus从站支持的地址。

"计数"参数指定在该请求中读取或写入的数据元素的数目。"计数"值是位数(对于位数据类型)和字数(对于字数据类型)。

地址0xxxx ٛ "计数"是要读取或写入的位数。

地址1xxxx ٛ "计数"是要读取的位数。

地址3xxxx ٛ "计数"是要读取的输入寄存器的字数。

地址4xxxx ٛ "计数"是要读取或写入的保持寄存器的字数。

MBUS_MSG指令将读取或写入最大120个字或1920个位(240字节的数据)。"计数"的实际限值将取决于Modbus从站中的限制。

"DataPtr"参数是指向S7-200 CPU的V存储器中与读取或写入请求相关的数据的间接地址指针。对于读取请求,DataPtr应

该指向用于存储从Modbus从站读取的数据的第一个CPU存储器位置。对于写入请求,DataPtr应该指向要发送到Modbus从

站的数据的第一个CPU存储器位置。

DataPtr值作为间接地址指针传递到MBUS_MSG。例如,如果要写入Modbus从站的数据从S7-200 CPU中的地址VW200开

始,则DataPtr的数值将会是&VB200 (VB200的地址)。指针必须始终是VB类型,即使它们指向字数据。

(4xxxx)(3xxxx)(216)S7-200 CPUModbus

保持寄存器(地址4xxxx)和输入寄存器(地址3xxxx)的值是字(2个字节或16位)。S7-200 CPU字的格式与Modbus寄存器相同。

低位编号的V存储器地址是寄存器的最高有效字节。高位编号的V存储器地址是寄存器的最低有效字节。下表显示了S7-200

字节和字寻址如何与Modbus寄存器格式相对应。

S7-200 CPU存储器

字节地址

地址

VB200

VB201

VB202

VB203

VB204

VB205

十六进制

数据

12

34

56

78

9A

BC

VW2049A BC40039A BC

VW20256 78400256 78

S7-200 CPU存储器

字地址

地址

VW200

十六进制

数据

12 34

Modbus

保持寄存器地址

地址

4001

十六进制数

12 34

位数据(地址0xxxx和1xxxx)区域作为压缩字节被读取和写入,也就是说,每个数据字节内压缩8位。第一个数据字节的最低

有效位是寻址的位号(参数"地址")。如果仅写入单个的位,则该位必须处于指向DataPtr的字节的最低有效位字节。

压缩字节的格式(显示离散输入地址)

对于未在偶数字节边界上开始的位数据地址,与起始地址相关的位必须处于字节的最低有效位。参见如下在Modbus地址

10004处开始的3位压缩字节格式实例。

压缩字节的格式(在地址10004处开始的离散输入)

当写入到离散输出数据类型(线圈)时,用户必须在数据通过DataPtr传递到MBUS_MSG指令之前,将压缩字节内的位放置到

正确的位位置中。

"完成"输出在发送请求和接收应答时关闭。"完成"输出在应答完成或MBUS_MSG指令因错误而中止时打开。

"错误"输出仅当"完成"输出打开时有效。请参阅Modbus

主设备MBUS_MSG执行错误通过MBUS_MSG指令返回。

低位编号的错误代码(1到8)是由MBUS_MSG指令检测到的错误。这些错误代码通常指示与MBUS_MSG指令的输入参数有

关的问题,或接收来自从站的应答时出现的问题。奇偶校验和CRC错误指示存在应答但是数据未正确接收。这通常是由电

气故障(例如连接有问题或者电噪声)引起的。

高位编号的错误代码(从101开始)是由Modbus从站返回的错误。这些错误指示从站不支持所请求的功能,或者所请求的地址(

或数据类型或地址范围)不被Modbus从站支持。

程序举例

该实例程序显示了在每次输入I0.0打开时,如何使用Modbus主设备指令将4个保持寄存器写入Modbus从站然后再从中读取。

S7-200 CPU将把自VW100开始的4个字写入Modbus从站。数据将写入从站中自地址40001开始的4个保持寄存器。

S7-200 CPU于是将从Modbus从站读取4个保持寄存器。数据将来自保持寄存器40010 ٛ 40013,并放置到S7-200 CPU的V

存储器中自VW200开始的地址。

实例程序数据传送

S7-200 CPU

存储器

Modbus从站

保持寄存器

如果从MBUS_MSG指令返回一个错误,则程序将打开输出Q0.1和Q0.2。

通过每次扫描时调用MBUS_CTRL来初始

化和监视Modbus主设备。

Modbus主设备设置为9600波特,无奇偶

校验。从站允许1000毫秒(1秒)的应答时

间。

在首次扫描时,重设用于两条MBUS_MSG

指令的启用标记(M2.0和M2.1)。

当I0.0从"关闭"切换到"打开"时,为第一条

MBUS_MSG指令(M2.0)设置启用标记。

当第一个启用标记(M2.0)打开时,调用

MBUS_MSG指令。"首次"参数必须仅为

启用指令时的首次扫描而设置。

该指令将4个保持寄存器写入(RW = 1)从

站2。要写入的数据取自CPU中的VB100ٛ

VB107 (4个字)并写入Modbus从站中的地

址40001 ٛ 40004。

当第一条MBUS_MSG指令完成后("完成"

从0变为1),清除对第一条MBUS_MSG指

令的启用,并为第二条MBUS_MSG指令

设定启用。

如果错误(MB1)不为零,则设置Q0.1以显

示错误。

当第二个启用标记(M2.1)打开时,调用第

二条MBUS_MSG指令。"首次"参数必须

仅为启用指令时的首次扫描而设置。

该指令从从站2读取(RW = 0) 4个保持寄

存器。数据从Modbus从站的地址40010 ٛ

40013读取并复制到CPU中的VB200 ٛ

VB207 (4字)。

当第二条MBUS_MSG指令完成("完成"从0

变为1)后,清除对第二条MBUS_MSG指

令的启用。

如果错误(MB1)不为零,则设置Q0.2以显

示错误。

另请参阅:

Modbus主设备寻址

MBUS_CTRL指令

Modbus主设备MBUS_MSG执行错误

Modbus主设备高级用户信息