什么叫组态控制?
- 从应用场景上来看,如果现在集成了一个系统,它既包括了生产A要用的全部I/O系统,又包括可生产B和C等等要用的全部I/O系统。但是ABC的生产I/O不一样(硬件组态不尽相同)。
- 这个时候我就想用一套程序(包括硬件组态)就能适配全部的ABC生产。另外我在切换硬件组态的时候还要要求不能停机。
以上的案例就衍生出来了组态控制
。它实现了一种只需要一套程序和硬件组态,通过程序的方式(意味着可以通过HMI,WEB,上位机等更多方式)轻松的选择和设置相应的设备型号的方法。
如图:
如果想要现成的程序和实例,请直接访问sios,输入文档编号29430270获取详细资料。官网有详细的LCC库文件来实现用户的组态控制需求。本文是纯折腾用的,不想折腾就不用往下看了。
- 在1500中央机架上做组态控制
-
先来介绍一下硬件配置数据的记录格式(直接截图了,累了):
- 块长度计算:[4bytes+(slot数量*(bytes in per slot))],simtic1500系列每个slot占1个字节数量
- ID:DS196,它是组态控制专用DS
- 版本:用来区分产品类别(ET200MP,ET200SP或者SIMATIC S71500中央机架),中央机架我们就填4;另外subversion子版本1500填0。
- 组态slot0,值16#0表示正在使用,值16#FF表示此模块在实际安装系统中不存在
- slot1:表示CPU,因为CPU始终只能在插槽1里面,值16#1表示实际安装系统中正在使用
- slot2~n:表示对应模块在实际安装系统中的插槽号,16#FF表示不存在。(比如中央机架最大插槽数是31,那么结构可以到slot31去)
-
操作方法
1 .在硬件组态里面勾选允许通过用户程序重新组态设备
:右键PLC
>选择组态控制
>勾选
。
2. 建立DS196数据结构如下:
3. DS写入设备中,靠WRREC
指令
//用repeat..until直到完全写入程序再往下跑
REPEAT
#WRREC_Instance(REQ := "_RD_WR".WR.I.REQ,
ID := "_RD_WR".WR.I.ID,
INDEX := "_RD_WR".WR.I.INDEX,
LEN := "_RD_WR".WR.I.LEN, //LEN给byte0中的字节数。
DONE => "_RD_WR".WR.O.DONE,
BUSY => "_RD_WR".WR.O.BUSY,
ERROR => "_RD_WR".WR.O.ERROR,
STATUS => "_RD_WR".WR.O.STATUS,
RECORD := "_DS196");
//status memerary
IF "_RD_WR".WR.O.ERROR THEN
#memerary := "_RD_WR".WR.O.STATUS;
END_IF;
//configDown
IF 16#0070_0200 = "_RD_WR".WR.O.STATUS THEN
#ConfigDown := TRUE;
"_RD_WR".WR.I.REQ := FALSE;
END_IF;
UNTIL #ConfigDown END_REPEAT;
.实测过,配置组态控制之后
CPU启动速度
会变得极慢,但是最终还是要起起来的。
- 在I/O上做组态控制
- 在I/O上做组态控制的场景如图:
- 继续介绍IO系统的组态控制的数据格式
- 操作方法
- 在
网络视图
的IO通信
下面更改标签,使能可选IO设备
,如图:
- 如果还需要通过程序重新定义端口互连的话,则还需要去设置以太网口端口的
伙伴端口连接选项
改为伙伴由用户程序设置
,如图:
- 数据记录:
my_ctrlrec Struct False True True True False
Version Word 16#0 False True True True False 记录版本,高01,低00
num_of_opt_device Word 16#0 False True True True False 实际组态中的可选设备数
active_opt_device Array[0..2] of HW_DEVICE False True True True False 实际组态中的可选设备HW_IO
active_opt_device[0] HW_DEVICE 0 False True True True False 实际组态中的可选设备HW_IO
active_opt_device[1] HW_DEVICE 0 False True True True False 实际组态中的可选设备HW_IO
active_opt_device[2] HW_DEVICE 0 False True True True False 实际组态中的可选设备HW_IO
num_of_port_interface Word 16#0 False True True True False 实际组态中的端口互连数,不指定则输入0
port_interface Array[0..2] of "port_interface" False True True True False 实际组态中的可选端口HW_IO
port_interface[0] "port_interface" False True True True False 实际组态中的可选端口HW_IO
port_interface[1] "port_interface" False True True True False 实际组态中的可选端口HW_IO
port_interface[2] "port_interface" False True True True False 实际组态中的可选端口HW_IO
- 调用
ReconfigIOSystem
//IO的组态控制
#ReconfigIOSystem_Instance(REQ:="_RD_WR".WR.I.REQ,
MODE:=2,//本质调用D_ACT_DP,=1则禁用IO系统中的所有网络,=3启用IO系统中的所有网络,=2按照CTRCREC重新组态IO网络
LADDR:=64,//CPU的PN接口硬件标识符
CTRLREC:="resys_IO".my_ctrlrec);//上面建立的resys_IO的数据结构的内容
- 1200系统中的组态控制,如图: