西门子博途HMI监控1200或1500的IO状态时做成一页,IO监控画面做在一页显示,通过下拉菜单选择,方便快捷,不用一个一个去摆放了,是HMI及PLC源程序(SCL编写)
先说PLC端的核心逻辑。用SCL搞个循环把IO状态打包成数组,注意这里要用符号寻址才够灵活:
// 设备选择枚举类型
TYPE E_Device : (Device1 := 1, Device2 := 2, Device3 := 3);
END_TYPE
VAR_GLOBAL
// IO状态存储数组 [1..设备数量, 1..IO点数]
aIO_Status : ARRAY[1..3, 1..32] OF Bool;
nSelectedDevice : INT := 1; // HMI传来的设备编号
END_VAR
// 动态刷新IO状态
FOR #i := 1 TO 32 DO
aIO_Status[nSelectedDevice, #i] := "带符号名的IO点"[#i];
END_FOR;
这段代码的妙处在于用二维数组的第二维存设备号,HMI那边切换设备时只需要改nSelectedDevice的值,对应的IO数组自动更新。记得IO点必须用符号名访问,绝对地址会出人命!
HMI端操作更简单:
- 拉个下拉框,条目文本填"Device1;Device2;Device3",值对应1/2/3
- 绑定变量到PLC的nSelectedDevice
- 画个IO状态显示区,用符号IO绑定到aIO_Status[nSelectedDevice, *]
重点来了!用画面窗口+变量前缀玩动态绑定:
<画面窗口>
<连接>
<变量前缀>"aIO_Status["+nSelectedDevice.ToString()+","</变量前缀>
</连接>
</画面窗口>
这样所有IO显示控件自动关联当前设备的IO数组,不用每个点单独绑定。当设备切换时,前缀自动变成类似"aIO_Status[2,"的效果,直接带出第二台设备的IO状态。
实测时发现个坑——数组索引必须从1开始!因为HMI的下拉框值从1开始计数,跟SCL数组的索引完美对应。曾经有兄弟从0开始索引,结果设备号总是错位一位,排查到怀疑人生...
最后奉劝各位:别在HMI里直接操作绝对地址,用符号变量+结构体才是王道。哪天PLC硬件改了,只需要在全局常量里改符号映射,HMI这边连重新编译都不用!这套方案在口罩机项目上实测,200+IO点的设备切换响应时间<200ms,比传统方式省了80%画面制作时间。
源码打包时注意把符号表导出成XML,不然别人打开工程会看到一堆红色报警。SCL程序建议封装成函数块,方便移植到新项目。记住,好的架构是偷懒偷出来的!

2740

被折叠的 条评论
为什么被折叠?



