您好,欢迎访问一九零五行业门户网

S7-300 CP341作主S7-200作从的Modbus通信

摘要 自动化各个厂家在工业控制通信方面都有各自的通信协议及方式。西门子控制产品中通信的主要方式有 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
sf
‘s’为发送,此处必须为大写的‘s’
laddr
硬件组态中的起始逻辑地址,本例中为 272
req
发送数据触发位,上升沿触发,本例中为 m0.5,以 1s 为周期的脉冲信号
db_no
发送数据块号,本例中为 1
dbb_no
发送数据的起始地址,本例中为 0
len
发送数据的长度,本例中暂时为 6
r_typ
‘x’为扩展的数据块,此处必须为大写的‘x’
r
取消通信,本例始终为初始值 false
done
发送完成位,无故障发送完成后为 true,m100.0
error
错误位,为true 说明有错误,m100.1
status
状态字,标识错误代码,查看 modbus master 和 cp341 手册
其它参数
查看在线帮助
表 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
laddr
硬件组态中的起始逻辑地址,本例中为 272
db_no
接收数据块号,本例中为db2
dbb_no
接收数据的起始地址,本例中默认为 0
len
接收数据的长度反馈
en_r
使能接收位,本例中始终为 ture
r
取消通信,本例始终为初始值 false
ndr
接收完成位,无故障接收完成后为 true
error
错误位,为true 说明有错误
status
状态字,标识错误代码,查看 modbus master 和 cp341 手册
其它参数
查看在线帮助
表 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。
地址
名称
类型

注释
0.0
slave_address
byte
b#16#0a
从站地址
1.0
function_code
byte
b#16#01
功能代码
2.0
reg_startadr
word
w#16#0
位起始地址
4.0
reg_num
word
w#16#4
位数
表 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。
地址
名称
类型

注释
0.0
slave_address
byte
b#16#0a
从站地址
1.0
function_code
byte
b#16#02
功能代码
2.0
reg_startadr
word
w#16#0
位起始地址
4.0
reg_num
word
w#16#4
位数
表 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 个字节)的数据。
地址
名称
类型

注释
0.0
slave_address
byte
b#16#0a
从站地址
1.0
function_code
byte
b#16#03
功能代码
2.0
reg_startadr
word
w#16#0
寄存器起始地址
4.0
reg_num
word
w#16#3
寄存器数
表 7 fc03 的 send 源区域结构
图 16 fc03 的数据交换
fc06 主站写单字到从站内部寄存器
fc06 功能下,“p_snd_rk”fb8 的 len 为 6,db1 的头两个字节分别是所要读取从站的地址 10 号站(16#a),和功能码 06,如表 8 所示。图 17 为 db1.dbw4 传送到从站
vw0 的接收区。
地址
名称
类型

注释
0.0
slave_address
byte
b#16#0a
从站地址
1.0
function_code
byte
b#16#06
功能代码
2.0
reg_startadr
word
w#16#0
寄存器地址
4.0
reg_num
word
w#16#1234
寄存器值
表 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 个字节)的数据。
地址
名称
类型

注释
0.0
slave_address
byte
b#16#0a
从站地址
1.0
function_code
byte
b#16#03
功能代码
2.0
reg_startadr
word
w#16#0
寄存器起始地址
4.0
reg_num
word
w#16#3
寄存器数目
6.0
data1
word
w#16#0
寄存器值
8.0
data2
word
w#16#0
寄存器值
10.0
data3
word
w#16#0
寄存器值
表 9 fc16 的 send 源区域结构
图 18 fc 16 的数据交换
注 1:如果有多个 rtu 从站需要 modbus 主站轮询读取通信,那么可以参考《cp341 modbus rtu 多站点轮询》一文,非常受益。
注 2:cp341 做从站,s7-200 做主站的通讯介绍也会随后完成。
其它类似信息

推荐信息