如果想在WINCC界面里实现10个模拟量轮流显示,同时在该模拟量显示时与之相关的该模拟量编码一起显示,也就是1号模拟量=**,2号模拟量=**,3号模拟量**,等等轮流在一个位置显示,可以一秒或更短时间变换一次,也可以一个循环周期后休息几十秒,如何用VBS或C实现呢?
上面的结果可能存在更新周期有误差,造成显示有点区别,我用文本有改了一个:
文本的字体用vbs脚本做:
Function Text_Trigger(ByVal Item)
Dim tag(10)
Dim group1
Set group1=HMIRuntime.Tags.CreateTagSet
group1.add"data"'整数判断应该显示哪个数值
group1.add"data_1"
group1.add"data_2"
group1.add"data_3"
group1.add"data_4"
group1.add"data_5"
group1.add"data_6"
group1.add"data_7"
group1.add"data_8"
group1.add"data_9"
group1.add"data_10"
group1.read
tag(0)=group1("data").value
tag(1)=group1("data_1").value
tag(2)=group1("data_2").value
tag(3)=group1("data_3").value
tag(4)=group1("data_4").value
tag(5)=group1("data_5").value
tag(6)=group1("data_6").value
tag(7)=group1("data_7").value
tag(8)=group1("data_8").value
tag(9)=group1("data_9").value
tag(10)=group1("data_10").value
Select Case tag(0)
Case 1 Text_Trigger="1号模拟量="&tag(1)
Case 2 Text_Trigger="2号模拟量="&tag(2)
Case 3 Text_Trigger="3号模拟量="&tag(3)
Case 4 Text_Trigger="4号模拟量="&tag(4)
Case 5 Text_Trigger="5号模拟量="&tag(5)
Case 6 Text_Trigger="6号模拟量="&tag(6)
Case 7 Text_Trigger="7号模拟量="&tag(7)
Case 8 Text_Trigger="8号模拟量="&tag(8)
Case 9 Text_Trigger="9号模拟量="&tag(9)
Case 10 Text_Trigger="10号模拟量="&tag(10)
End select
End Function
效果图
按照我说的,画面加一个静态文本,然后在文本属性中增加脚本就可以了:
Function Text_Trigger(Byval Item)
'
'Dim TagName(10)
'TagName(1)=HMIRuntime.Tags("A_1").Name
'TagName(2)=HMIRuntime.Tags("A_2").Name
'TagName(3)=HMIRuntime.Tags("A_3").Name
'TagName(4)=HMIRuntime.Tags("A_4").Name
'TagName(5)=HMIRuntime.Tags("A_5").Name
'TagName(6)=HMIRuntime.Tags("A_6").Name
'TagName(7)=HMIRuntime.Tags("A_7").Name
'TagName(8)=HMIRuntime.Tags("A_8").Name
'TagName(9)=HMIRuntime.Tags("A_9").Name
'TagName(10)=HMIRuntime.Tags("A_10").Name
'变量列表
Dim list
list="0,A_1,A_2,A_3,A_4,A_5,A_6,A_7,A_8,A_9,A_10"
Dim TagName
TagName=Split(list,",")
Dim S
'由当前的秒值得到循环数1-10
S=(Second(Now)/3 Mod UBound(TagName)) +1
Dim text
text=TagName(S) & " : " & HMIRuntime.Tags(TagName(S)).Read
text=text& "--" & Second(Now)
Text_Trigger=text
End Function
然后运行的结果如图:
下部的10个IO域仅仅用于显示和修改变量的值。
因为画面的运行周期是2S,所以如果设置2S跳数的话,就会有漏数的情况,所以程序中还是设置为3S。
另:程序中前段被注释掉的部分是为了便于移植儿预留的,如果需要移植到多个显示,那么变量名字需要修改时,只需要复制以后,通过变量替换功能即可快速实现,而不需要打开脚本进行修改。
也有人建议还是用结构变量,这样的效率是*高的!假设显示的变量分别为tag1、tag2、tag3……tag100。下面程序可1S执行一次,没有测试,但是应该不成问题的!下面的程序是显示100个变量的数值。
Char st_text[64];
static Int id;
if(id>100)
id=0;
esle
id=id+1;
sprintf(st_text,"tag%d",id);
return GetTagFloat(st_text);