摘要 自动化各个厂家在工业控制通信方面都有各自的通信协议及方式。西门子控制产品中通信的主要方式有 MPI,Profbus,Ethernet。在现场应用中,往往需要两个厂家的控制器进行通信交换数据。Modbus 通信是常用的一种。本文就以 CP341 都作为 Modbus 主站,S7-
200 作为 Modbus 从站的通信实验作介绍。关键词 CP341 S7-200 Modbus
Key Words CP341 S7-200 Modbus
1.系统简介及软硬件需求
Modbus 是公开通信协议,其具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。通信双方必须同时支持上述模式中的一种,通常支持 Modbus 通信的设备大都支持 RTU 格式。Modbus 通信标准协议可以通过各种传输方式传播,如
RS232C、RS485、光纤、无线电等。 在 S7-200 CPU 通信口上实现的是 RS485 半双工通信,使用的是 S7-200 的自由口功能。
Modbus 是一种单主站的主/从通信模式。Modbus 网络上只能有一个主站存在,主站在
Modbus 网络上没有地址,从站的地址范围为 0 - 247,其中 0 为广播地址,从站的实际地址范围为 1 - 247。
在实现 Modbus 通信方面,西门子 AS 产品中往往会用到 CP341 和 S7-200。其二者之间的不同是 CP341 的接口类型多,包含 RS 232C (V.24) 20 mA (TTY), RS 422/RS 485
(X.27)。由于其实现 Modbus 通信需要购买 Modbus Dongle,在实现功能成本方面比较高。但是由于 CP341 可安装在 ET200M 站上通过 Profibus 的方式与主站相通,此种方案很适合比较大型系统进行的 Modbus 通信设计和改造。S7-200 系列产品是西门子 AS 产品中低端的产品。但是其小而精湛集成了很多通信功能。虽然 S7-200 在实现 Modbus 通信时使用的是S7-200 的自由口功能,接口采用 RS485,或是通过适配器转换成 RS 232 接口类型不如
CP341 的型号丰富,但是其在实现 Modbus 功能上无需组态和额外购买组件,所以实现起来既简单而且成本低廉,在比较低端的场合是个不错的选择。
在现场应用中 CP341 往往都作为 Modbus 主站来读取第三方设备的数据,而 S7-200 常作为 Modbus 从站与其他设备进行 Modbus 通信。本文就以 CP341 都作为 Modbus 主站, S7-200 作为 Modbus 从站,来实现其二者的 Modbus 通信,阐述其二者在实现通信方面的设置和注意事项。需要说明的是 S7-300 与 S7-200 的通讯方式有很多种包括 MPI、
Profibus、Ethernet、Modbus 等。本文旨在说明其二者在 Modbus 通信方面的具体安装和编程步骤。
软件环境
STEP7 V5.4 SP3
用于编写 S7-300/400 等 PLC 程序,此软件需要购买,本文档中所有的程序代码均使用
Step7 V5.4 SP3 编写。
CP PtP Param V5.1 SP8
串行通信模板的驱动程序,安装此驱动后才能配置 PtP 模板,并在 Step7 中集成通信编程需要使用的功能块。
CP PTP Modbus Master V3.1.4
CP341 或CP441-2 用于Modbus 主站时,需要安装此驱动协议,但安装此驱动之前必须先安装PtP driver,此驱动可以在购买Modbus Dongle时选择购买,
STEP 7 MicroWIN V4.0 SP6
此软件是用于 S7-200 编程和组态的软件。此软件可以免费下载到。
Toolbox_V32-STEP 7-Micro WIN 32 Instruction Library
S7-200 实现 Modbus 功能,需要使用 Modbus 的指令库,其实质是自由口通信。
STEP 7-Micro/WIN V4.0 以上版内部已经带有新的指令库,支持 Modbus 通过 Port0、
Port1 进行通信,但在未安装西门子 Instruction Library 软件包的情况下,不能显示出来使用。
要使用西门子的标准指令库,必须先安装西门子的指令库软件包 Instruction
Library。安装了 Instruction Library 之后,只要安装的 STEP 7-Micro/WIN 版本是新的,就能获得相应版本的新指令库。安装 Micro/WIN 的升级包(Service Pack)也会更新指令库的版本。
硬件列表
S7-300 站:
CPU315-2DP 6ES7 315-2AG10-0AB0 CP343-1 6ES7 341-1EX30-0XE0 CP341 RS422/485 6ES7 341-1CH01-0AE0
Dongle 6ES7 870-1AA01-0YA0 (MODBUS master)
S7-200 站:
224XP 6ES7 214-2BD23-0XB8 (选用双口CPU便于调试)
硬件安装
物理接口方面S7-200的通信口为RS485物理接口, CP341选用的也是RS 422/485接口类型的模块。二者之间可采用6ES7 902-3AB00-0AA0 RS 422/485 5m连接电缆。在本系统中
采用的电缆为DP 红B 绿A 两线电缆。
在接线之前首先要仔细阅读CP341及S7-200通信接口的手册,查看通信接口针脚的定义。如图1所示。
图 1 S7-200 CPU 通信口引脚定义
图 2 CP341 RS 422/485 通信口引脚定义
图 3 CP341 通过 RS485 与通信对象的连接方式
在接线时,S7-200端由于是9针 RS485口,故用标准的DP连接器。而CP341上的接口为
15针口,其4、11对应RS485接线方式的连根线。从S7-200端口3引出的是红色B线,其连接CP341 15针口的11端口。从S7-200端口8引出的是绿色A线,其连接CP341 15针口的4端口。如图4所示。
图 4 S7-200 与 CP341 RS 422/485 接口通过 DP 电缆的接线图
CP341 作 Modbus 主站的设置与编程
CP341 作 Modbus 主站的硬件组态
硬件组态 CPU 及 CP341
图 5 将 CP341 逻辑地址为 272
设置 Modbus 总线传输速率和帧字符结构
双击CP341->Parameters->Protocol中选择Modbus Master;
双击信封Protocol,选择Modbus Master设置总线传输速率和帧字符结构。
如图 6,本例传输速率为9.6Kbit/s,帧字符选用8位数据位,1位停止位,无校验。此设置可根据实际情况调整,原则是通信双方选择一致。
图 6 通信帧字符结构
设置电气接口
选择半双工 RS 485,默认设置是 R(A)为- ,R(B)为+。此设置主要是与 RS485
A、B 两线正负定义有关,在 CP341 接线与通信对象 A、B 两线正负定义相反时,可无需修改硬件接线,可直接修改此处颠倒接线正负。如图 7 所示。
图 7 CP341 接线与通信对象 A、B 两线定义
Modbus 配置的下载
当配置好 Modbus 通信的参数后,在向 CPU 下载硬件组态前,要向 CP341 的 Dongle 中下载 Modbus Master 的驱动,一旦下载完成后此后无需再次下载。对于通信参数的调整只需要进行 HW 对 CPU 的硬件下载即可。
要注意的是,在下载 Dongle 时,一定要 CPU 停机下载。如图 8 所示
图 8 下载 Dongle 时,一定要 CPU 停机下载
2.2 CP341 作 Modbus 主站的编程
实现 CP341 作 Modbus 主站的通信程序是“P_SND_RK”FB8 负责发送控制字。编程如下:
FB8 参数说明表格 1。
图 9 “P_SND_RK”FB8
表 1
其中创建发送数据块 DB1 结构如图 10 所示:
图 10 发送 DB 块源区域结构
创建的发送数据块 DB1,至少要有 6 个字节的长度,后面根据功能码的不同,所需长度不同,建议发送数据块创建的长度长一些。以上图为例 6 个字节 Address 为所通讯对象的
Modbus 地址为 1,code 为功能码 FC03,所读对象寄存器的起始地址为 0,所读寄存器的数量为 4,其中一个寄存器为两个字节。
此处有几个注意事项:
1) R_TYP 必须为大写的‘X’,
为小写"x"时,CP341 作为 Modbus master 时,调用 FB8 的状态字显示为 "0E4F" 错误。注意 R_TYP 必须为大写。且对于 R_TYP 可以写的值如下:
’D’ DB 区
’X’ DX 区,extended data block ’E’ I 区
’A’ Q 区
’M’ M 区
’T’ T 区
’C’ C 区
LEN 的长度要根据通信所需功能码来针对填写, 如下表所示
表 2
LEN 的长度与功能码的对应。
“P_RCV_RK”FB7 用于接收通信数据。编程如图 11 所示:
图 11 “P_RCV_RK”FB7
FB7 参数说明表格 3
表 1
3.S7-200 作 Modbus 从站的设置
S7-200 作 Modbus 通信要用到自由口通信下的 Modbus Slave 库,对于此库的应用要注意的是
Modbus Slave 库仅支持 Modbus RTU 通信模式,不支持 ASCII 通信模式。
目前的 Modbus Slave 库仅支持通信口 Port0。
使用 Modbus Slave 库时一定要注意对库分配内存区空间。否则编译后出现很多错
误。
如图 12 所示:
图 12 调用的库要分配系统内存地址区
编程时使用 SM0.1 调用子程序 MBUS_INIT 进行初始化,使用 SM0.0 调用
MBUS_SLAVE,并指定相应参数。关于参数的详细说明,可在子程序的局部变量表中找到。
图 13 为 S7-200 实现 Modbus 从站的程序。
图 13 调用 Modbus RTU 通信指令库图中参数意义如下:
模式选择:启动/停止 Modbus,1=启动;0=停止
从 站 地 址 :Modbus 从 站 地 址 , 取 值 1~247 c. 波特率:可选 1200,2400,4800,9600,19200,38400,57600,115200
奇偶校验:0=无校验;1=奇校验;2=偶校验
延时:附加字符间延时,缺省值为 0
大 I/Q 位:参与通信的大 I/O 点数,S7-200 的 I/O 映像区为 128/128,缺省值为 128
大 AI 字数:参与通信的大 AI 通道数,可为 16 或 32
大保持寄存器区:参与通信的 V 存储区字(VW)
保持寄存器区起始地址:以&VBx 指定(间接寻址方式)
初始化完成标志:成功初始化后置 1
初始化错误代码
Modbus 执行:通信中时置 1,无 Modbus 通信活动时为 0
错误代码:0=无错误
从程序截图中可见,S7-200 作为 Modbus 从站,从站地址为 10,接收存储区为 VB0 开
始。
4. 通信测试
至此,CP341 和 S7-200 双方的程序及物理连线已经做好。在调试 S7-300 时可通过CP343-1 以太网模块,以便可以用以太网通信调试速度快且方便。S7-200 站选用 224XP, 其中 Port0 作为 Modbus 通信口,Port1 用于与笔记本的 CP5512 通信。
在进行通信测试前还要明确 Modbus 通信的功能码。
下表为 Micro 'n Power 中 S7-200 作为 Modbus RTU 从站通信功能码。
表 4 S7-200 作为 Modbus RTU 从站通信功能码以下测试为现场应用中经常用到的功能码 FC01、02、03、06、16
FC01 主站读取从站多个 DO 点状态
FC01 功能下,“P_SND_RK”FB8 的 LEN 为 6,DB1 的头两个字节分别是所要读取从站的地址 10 号站(16#A),和功能码 01,如表 5 所示。图 14 为 S7-200 的 QB0 的 4 个位被传送到 DB2 的接收区。其中 Reg_num 位数为 1-2040。
表 5 FC01 的 SEND 源区域结构
图 14 FC01 的数据交换
FC02 主站读取从站多个 DI 点状态
FC02 功能下,“P_SND_RK”FB8 的 LEN 为 6,DB1 的头两个字节分别是所要读取从站的地址 10 号站(16#A),和功能码 02,如表 6 所示。图 15 为 S7-200 的 I0.0-I0.3 的四个位被传送到 DB2 的接收区。其中 Reg_num 位数为 1-2040。
表 6 FC02 的 SEND 源区域结构
图 15 FC02 的数据交换
FC03 主站读取从站多个内部寄存器状态
FC03 功能下,“P_SND_RK”FB8 的 LEN 为 6,DB1 的头两个字节分别是所要读取从站的地址 10 号站(16#A),和功能码 03,如表 7 所示。图 16 为 S7-200 的 V 区 3 个寄存器传送到 DB2 的接收区。注意在一次请求中可以读取多 127 个寄存器(每个寄存器 2 个字节)的数据。
表 7 FC03 的 SEND 源区域结构
图 16 FC03 的数据交换
FC06 主站写单字到从站内部寄存器
FC06 功能下,“P_SND_RK”FB8 的 LEN 为 6,DB1 的头两个字节分别是所要读取从站的地址 10 号站(16#A),和功能码 06,如表 8 所示。图 17 为 DB1.DBW4 传送到从站
VW0 的接收区。
表 8 FC06 的 SEND 源区域结构
图 17 FC06 的数据交换
FC16 主站写多字到从站内部寄存器
FC16 功能下,“P_SND_RK”FB8 的 LEN 不为 6,而是发送命令及数据的总长度本例中设为 20。DB1 的头两个字节分别是所要读取从站的地址 10 号站(16#A),和功能码 16
(16#10)。功能码 FC16 时,所要发送的数据从 DB1.DBW6 开始(从第 7 个字节开始)如表 9 所示。图 18 为 DB1.DBW6 开始的多字发送到 VW0 开始的接收区。Reg_num 为写寄存器的总数目。注意在一次请求中可以写多 127 个寄存器(每个寄存器 2 个字节)的数据。
表 9 FC16 的 SEND 源区域结构
图 18 FC 16 的数据交换
注 1:如果有多个 RTU 从站需要 Modbus 主站轮询读取通信,那么可以参考《CP341 Modbus RTU 多站点轮询》一文,非常受益。
注 2:CP341 做从站,S7-200 做主站的通讯介绍也会随后完成。