搬家第42天-citect2018使用cicode定制过程分析器趋势笔链接变量
前几天在一个wincc技术讨论群上,有人问过这样一个问题,在一个页面上有一个listbox控件和一个趋势控件,listbox上是一些趋势变量,要求实现运行时鼠标点击哪一个变量,趋势控件中就显示那个变量的曲线。我的电脑上没有安装wincc,我也在想如果同样的需求出现在citect软件上,如何实现点击listbox控件,在过程分析器中显示相应的趋势曲线。经过两天的摸索和尝试,实现了这样的功能,把实现过程和代码记录下来。
1. 在citect中新建5个内部变量,因为没有连接实际的PLC变量,需要用代码模拟数据变化。
2.新建一个cicode函数,模拟现场数据变化
FUNCTION SetValue()
flow1=TimeSec(TimeCurrent())
flow2=TimeSec(TimeCurrent())+10
flow3=TimeSec(TimeCurrent())+20
flow4=TimeSec(TimeCurrent())+30
flow5=TimeSec(TimeCurrent())+40
END
3. 新建5个趋势变量,关联前面的5个内部变量
4. 设置事件,定义数据赋值的周期
4.新建一个画面main,上面放置listbox控件和过程分析控件,listbox控件的编号是AN4,过程分析控件编号是AN5。
5. 新建一个cicode函数,用于刚才新建的listbox控件和过程分析控件的初始化。
FUNCTION ctrlIni()//控件初始化
//listbox填入选项
OBJECT objlistbox
objlistbox=ObjectByName("AN4")
_OBJECTcallmethod(objlistbox,"clear")//先清空列表
_OBJECTcallmethod(objlistbox,"additem","流量1的趋势")
_OBJECTcallmethod(objlistbox,"additem","流量2的趋势")
_OBJECTcallmethod(objlistbox,"additem","流量3的趋势")
_OBJECTcallmethod(objlistbox,"additem","流量4的趋势")
_OBJECTcallmethod(objlistbox,"additem","流量5的趋势")
//设置listbox控件默认的选项
_OBJECTsetproperty(objlistbox,"text","流量3的趋势")
//设置趋势控件(过程分析控件)
OBJECT objPA
OBJECT hPanes
OBJECT hPane
OBJECT hPens
OBJECT hPen
INT panescount,penscount
objPA=ObjectByName("AN5")
hPanes=_OBJECTGetproperty(objPA,"panes")//得到面板集
panescount=_OBJECTGetproperty(hPanes,"count")//得到板数量
penscount=_OBJECTGetproperty(hPens,"count")//得到板1下面趋势笔数量
IF panescount>1 THEN
//删除除1#之外其他面板
WHILE panescount>1 DO
hpane=_OBJECTCallMethod(hPanes,"get_item",2)//得到面板2
_ObjectCallMethod(hPane, "Delete")//删除2#面板
panescount=_OBJECTGetproperty(hPanes,"count")//得到板数量
END
END
hPane=_OBJECTCallMethod(hPanes,"get_item",1)//得到面板1
hPens=_OBJECTgetproperty(hPane,"pens")//得到面板1下面的所有趋势笔
penscount=_OBJECTGetproperty(hPens,"count")//得到板1下面趋势笔数量
//删除面板1下除趋势笔1之外所有趋势笔
IF penscount>1 THEN
WHILE penscount>1 DO
hPen=_OBJECTCallMethod(hPens,"get_item",2)//得到面板1下面的趋势笔1
_ObjectCallMethod(hPen, "Delete")//删除2#趋势笔
penscount=_OBJECTGetproperty(hPens,"count")//得到板1下面趋势笔数量
END
END
//給面板1下趋势笔1起一个名字
hPen=_OBJECTCallMethod(hPens,"get_item",1)
_ObjectSetProperty(hPen, "Name", "流量3")
//给面板1下面的趋势笔1重新定义纵坐标量程范围
_ObjectCallMethod(hPen, "PutVerticalAxisSpan", 0, 80);
//给面板1下面的趋势笔1重新定义横坐标范围
_ObjectCallMethod(hPen, "SetDefaultSpan", 0, 0, 0, 30, 0, 0)//设置面板1下面趋势笔1的缺省跨度为0周,0天,0小时,30分钟,0秒,0毫秒
_ObjectCallMethod(hPen, "ResetToDefaultSpan");//设置面板1下面趋势笔1为缺省跨度设置
//设置面板1下面趋势笔1为trdflow5
_ObjectSetProperty(hPen, "DataPoint", "trdflow3")
//显示数据点
_ObjectSetProperty(hPen, "PointsVisible", -1)
//时间跳转到当前
_ObjectCallMethod(hPen, "GoToNow")
END
6.在main页面的打开事件中调用ctrlIni()函数
7. 新建一个cicode函数,用于鼠标点击listbox控件更改选项时,修改过程分析控件的趋势笔连接变量。
FUNCTION PATrendPenConfig()//根据listbox选项定制过程分析器趋势笔连接的趋势变量
OBJECT objlistbox
OBJECT objPA
OBJECT hPanes
OBJECT hPane
OBJECT hPens
OBJECT hPen
STRING SelectedText,SelectedTrendTagName,TrendPenname
objlistbox=ObjectByName("AN4")
selectedtext=_OBJECTGetproperty(objlistbox,"text")
//根据选择的不同,得到趋势笔的名字和趋势变量的名字
SELECT CASE selectedtext
CASE "流量1的趋势"
SelectedTrendTagName="trdflow1"
TrendPenname="流量1"
CASE "流量2的趋势"
SelectedTrendTagName="trdflow2"
TrendPenname="流量2"
CASE "流量3的趋势"
SelectedTrendTagName="trdflow3"
TrendPenname="流量3"
CASE "流量4的趋势"
SelectedTrendTagName="trdflow4"
TrendPenname="流量4"
CASE "流量5的趋势"
SelectedTrendTagName="trdflow5"
TrendPenname="流量5"
END SELECT
objPA=ObjectByName("AN5")
hPanes=_OBJECTGetproperty(objPA,"panes")//得到面板集
hPane=_OBJECTCallMethod(hPanes,"get_item",1)//得到面板1
hPens=_OBJECTgetproperty(hPane,"pens")//得到面板1下面的所有趋势笔
hPen=_OBJECTCallMethod(hPens,"get_item",1)//得到板1下面的趋势笔1
//給面板1下趋势笔1起一个名字
hPen=_OBJECTCallMethod(hPens,"get_item",1)
_ObjectSetProperty(hPen, "Name", TrendPenname)
//给面板1下面的趋势笔1重新定义纵坐标量程范围
_ObjectCallMethod(hPen, "PutVerticalAxisSpan", 0, 80);
//给面板1下面的趋势笔1重新定义横坐标范围
_ObjectCallMethod(hPen, "SetDefaultSpan", 0, 0, 0, 30, 0, 0)//设置面板1下面趋势笔1的缺省跨度为0周,0天,0小时,30分钟,0秒,0毫秒
_ObjectCallMethod(hPen, "ResetToDefaultSpan");//设置面板1下面趋势笔1为缺省跨度设置
//设置面板1下面趋势笔1为trdflow5
_ObjectSetProperty(hPen, "DataPoint", SelectedTrendTagName)
//显示数据点
_ObjectSetProperty(hPen, "PointsVisible", -1)
//时间跳转到当前
_ObjectCallMethod(hPen, "GoToNow")
END
新建一个citectVBA函数,用于listbox事件中调用这个前面的cicode函数。我藏试过直接在cicode定义listbox控件的鼠标点击事件,始终无效,可能是方法不当吧
Sub main_AN4_click()
cicodecallopen("PATrendPenConfig")
End Sub
8.保存编译,没有出错。设置计算机向导,定义启动画面是main,运行项目程序时启动定义的事件setValue
9. 设置计算机向导,定义启动画面是main,运行项目程序时启动定义的事件setValue
10.运行项目程序,和设想的功能一样。
总结一下,对过程分析控件各个属性的定义一开始没有找到方向,不知道那些属性、方法的语法描述到底是什么,折腾了一番终于找到了相关的资料。看来“绝知此事要躬行”不是一句空话,现场需求多种多样,闲一点的时候多学习一点多练习一点总归不是坏事,遇到事儿来了,自己拿不下来,那才是要命的。
上面的代码没有对趋势笔的颜色等进行定义,也暂时不知道如何定义,会继续关注这个的,这个练习主要针对过程趋势控件做了以下功能:
1.删除板、笔
2. 定义趋势笔纵坐标范围
3. 定义一屏时间跨度
4. 定义趋势笔链接的趋势变量
5. 定义在过程分析控件上显示数据点
6. 定义趋势笔的名称。
这个练习的编号是citect2018prj17,已经上传到我的百度网盘,有需要的可以下载参考
链接:https://pan.baidu.com/s/1TwSlyxvgSHBYtJl9fMM9sw
提取码:qhfm