MCGS入门笔记3-与S7200(master)Modbus-Rtu通讯
本文介绍通过485串口连接MCGS与S7200进行Modbus-Rtu通讯,MCGS为从站,S7200为主站。
S7200这个老古董,就是活在口中的东西,要不是项目需要,真的想不到还会用到这个,
组态软件Micro/WIN也是年代久远,所以写了另一篇文章,S7200入门笔记。
Modbus通讯协议是工业全球流行的通讯的协议了,相比大家都熟悉,不熟悉的建议先了解下,有助于项目实现,如果我发布了我自己写的modbus的草稿,你能在博客页面找到这篇文章。
前面两篇文章链接:
MCGS入门笔记2-与S7300以太网通讯 – 夜owl – 博客园 (cnblogs.com)
组态MCGS
这一部分跟上篇文章方法类似,这里省略的地方可能在前面能找到
1.1组态通讯驱动
添加串口,主要设置端口号,这里的端口号跟MCGS的端口号一致对应
添加设备,从站要选择
modbus串口数据转发设备,
设置从站地址和添加通讯变量
分别添加I0.0-I0.7、Q0.0-Q0.7、WORD40001-WORD40008变量
(下图对应的是前篇文章S7300的图,仅供参考)
1.2画面组态
添加按钮,用于改变变量
按下图操作,图比较乱。
按钮设置数据对象为取反可能更容易调试。
添加矩形显示,用于显示变量变化,相当于LED
添加滑动块,用于改变多位整数,40001滑条设置0-65535对应的是16位无符号字变量。
40002设置为0-255对应低字节。
画面显示效果如图。
二、组态S7-200
2.1组态软件和硬件
S7200PLC组态软件是STEP7_MicroWin32。
组态软件因为年代久远,并不友好,所以不好上手,很多注意的地方,比如通讯下载不支持以太网,另外Modbus通讯需要安装指令库,这部分教程可以看另一篇文章,S7200入门笔记
硬件是
CPU 224XP CN REL 02.01
2.2测试程序编程
关于程序编程,西门子官方出了比较完整的教程,强烈推荐,里面还有例程
https://www.ad.siemens.com.cn/service/article/wap/S7-200/S7-200modbus/Default.aspx
Modbus RTU 主站功能编程
1. 调用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 调用 MBUS_CTRL 完成主站的初始化,并启动其功能控制:
2. 调用 Modbus RTU 主站读写子程序MBUS_MSG,发送一个Modbus 请求
我这里用的是v1.0的modbus旧版本库指令,与官方有一点不同,官方的v1.2如下图
v1.2指令官方说明比较清楚
a. |
EN |
使能: |
同一时刻只能有一个读写功能(即 MBUS_MSG)使能 |
|
注意:建议每一个读写功能(即 MBUS_MSG)都用上一个 MBUS_MSG 指令的 Done 完成位来激活,以保证所有读写指令循环进行(见例程)。 |
||
b. |
First |
读写请求位: |
每一个新的读写请求必须使用脉冲触发 |
c. |
Slave |
从站地址: |
可选择的范围 1 – 247 |
d. |
RW |
从站地址: |
0 =读, 1 =写 |
|
注意: |
||
1. 开关量输出和保持寄存器支持读和写功能 |
|||
2. 开关量输入和模拟量输入只支持读功能 |
|||
e. |
Addr |
读写从站的数据地址: |
|
|
选择读写的数据类型 |
||
|
00001 至 0xxxx – 开关量输出 |
||
|
10001 至 1xxxx – 开关量输入 |
||
30001 至 3xxxx – 模拟量输入 |
|||
40001 至 4xxxx – 保持寄存器 |
|||
f. |
Count |
数据个数 |
通讯的数据个数(位或字的个数) |
|
注意: Modbus主站可读/写的最大数据量为120个字(是指每一个 MBUS_MSG 指令) |
||
g. |
DataPtr |
数据指针: |
1. 如果是读指令,读回的数据放到这个数据区中 |
|
2. 如果是写指令,要写出的数据放到这个数据区中 |
||
h. |
Done |
完成位 |
读写功能完成位 |
i. |
Error |
错误代码 |
|
对比下v1.0版本指令库
解释下主要区别
v1.0的bFoucti~是功能码,不同Modbus的功能码对应不同,上图v1.0的15功能码就是写入多个输出,地址和功能码参考下表
表 1.功能
Modbus 地址 |
读/写 |
Modbus 从站须支持的功能 |
00001 – 09999 |
读 |
功能 1 |
写 |
功能 5:写单输出点 |
|
10001 – 19999 |
读 |
功能 2 |
写 |
- |
|
30001 – 39999 |
读 |
功能 4 |
写 |
- |
|
40001 – 49999 |
读 |
功能 3 |
写 |
功能 6:写单寄存器单元 |
以下参考博途帮助文件
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 个字 |
v1.2版本使用读写+地址+个数的方式代替功能码,比如 写入+地址为0+位数为1相当于功能吗05
3. 轮询各个指令可以访问不同的从站
在地址为1的从站请求发送完成后,置位M3.2,触发地址为2的从站发送请求。
上图的功能码是3,是读取地址为1从站的保持寄存器数值,地址为0,也就是起始地址为40001,读取40001-40008的8个字保存在Vw130-Vw146
读取40002的数值,取低字节,拷贝到VB100和QB0.
VB100用于再次写入MCGS的输出状态变量,也就是上面M3.1触发的请求
QB0会同步PLC的输出状态显示。
关于modbus地址和S7-200 存储区地址
三.硬件连接
MCGS串口引脚定义,这里选择的是COM2
西门子串口引脚定义,这里是CM1241的手册图,S7200的也适用
如上图所示引脚3接7,8接8
四.测试效果
下载MCGS组态到触摸屏
下载程序到PLC,并且监控变量表,
拖动40001,40002的滑条,VW130,VW132同步
拖动40003的滑条,VW134同步,并且,QB0取低字节VB135的数值,如上图所示,VB135=255时,输出位全亮,另外触摸屏上的输出状态也同步VB100。
五.常见问题
1.放置该指令需要创建一个或多个POU
如果需要添加V1.2的指令库,,添加指令会报错,因为库的名字重复了,需要删除原来旧版本的库
2. 此POU包含一个或多个对参数化子程序无效的调用
库删除了,程序块(POU)里面的指令没有删除会报错
3.库数据区问题-通讯变量个别字出现问题,通讯时间长,通讯功能错误,编译报错
检查库地址分配有没有重叠,这部分没有设置好,会很麻烦
参考西门子教程3.1
3.1分配库指令数据区
调用STEP 7 – Mciro/WIN32 V3.2 Instruction Library(指令库)需要分配库指令数据区(Library Memory)。库指令数据区是相应库的子程序和中断程序所要用到的变量存储空间。
如果在编程时不分配库指令数据区,编译时会产生许多相同的错误(错误18)。
操作步骤(以Modbus RTU库指令为例):
1,在指令树的Project(项目)中,以鼠标右键单击Program Block(程序块),在弹出的快捷菜单中选择Library Memory。如图1所示:
图1
2,在弹出的选项卡中设置库指令数据区,如图2所示:
图2.缺省情况下是从VB0开始,但因为与Modbus的保持寄存区冲突,所以手动改为VB2000。按“Suggest Address”按钮也可以自动分配。
可以使用Suggest Address(推荐地址)设置数据区,但要注意编程软件设置的数据区地址,只考虑到了其他一般寻址,而未考虑到诸如Modbus数据保持寄存器区等的设置。应当确保不与其他任何已使用的数据区重叠、冲突。不应重复按Suggest Address按钮,否则也会造成混乱。
在STEP 7-Micro/WIN32 V3.1中,有分配库指令数据区时有不同的操作方法,需要在Symbol Table(符号表)中设置一个首地址。我们强烈建议使用当时最新的编程版本。