作者 | 主题 |
---|---|
龟仙人 奇侠 经验值: 8539 发帖数: 939 精华帖: 15 |
楼主 2022-03-28 10:31:03
主题:像DCS一样为输出IO域带上曲线 如果在操作画面时想查看某个变量的变化趋势,如果去趋势画面查看要进行翻页,还要选择相应的曲线查询,如果在画面中直接点击输入输出域就能弹出曲线控件是不是就操作更方便了,我看到某个厂家的DCS就可以配置这项功能,于是我就琢磨一下,还真给实现了。 主要思路就是在画面中放一个趋势曲线控件,默认不显示,鼠标点击趋势曲线时,趋势曲线控件移动到鼠标附件,并加载对应的归档变量以及标题等信息,程序中做了判断如果当前IO域对应趋势曲线处于显示状态,再次点击时关闭显示。 下图为编辑模式: 运行模式: 输入输出域脚本如下: #include "apdefap.h" void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y) { #pragma option(mbcs) // WINCC:TAGNAME_SECTION_START // syntax: #define TagNameInAction "DMTagName" // next TagID : 1 // WINCC:TAGNAME_SECTION_END // WINCC:PICNAME_SECTION_START // syntax: #define PicNameInAction "PictureName" // next PicID : 1 // WINCC:PICNAME_SECTION_END int cmpvalue; cmpvalue=strcmp(GetPropChar(lpszPictureName,"Trend","TagName"),"Archive\1TE201A_RT");//判断趋势曲线是否时当前输出域的曲线 if((cmpvalue==0)&&(GetVisible(lpszPictureName,"Trend")==1))//如果趋势曲线是当前曲线,且趋势曲线显示状态为真 SetVisible(lpszPictureName,"Trend",FALSE);//隐藏趋势曲线控件 else { SetVisible(lpszPictureName,"Trend",FALSE);//隐藏趋势曲线控件 SetPropChar(lpszPictureName,"Trend","Name","窑顶温度1TE201A");//设定曲线名称 SetPropChar(lpszPictureName,"Trend","TagName","Archive\1TE201A_RT");//设定归档变量 SetPropChar(lpszPictureName,"Trend","Caption","窑顶温度1TE201A");//设定趋势控件标题 SetPropChar(lpszPictureName,"Trend","Label","1TE201A");//设定曲线标签 SetLeft(lpszPictureName,"Trend",x-GetWidth(lpszPictureName,"Trend")/2);//设定趋势控件x方向显示位置 SetTop(lpszPictureName,"Trend",y+40);//设定趋势控件y方向显示位置 SetVisible(lpszPictureName,"Trend",TRUE);//显示趋势曲线控件 } } |
龟仙人 奇侠 经验值: 8539 发帖数: 939 精华帖: 15 |
1楼 2022-03-28 10:55:28
主题:回复:像DCS一样为输出IO域带上曲线 上面是十年前做的项目了,很多时候客户只要不要求就懒得做了,做的多了客户也不会多给钱,客户总是要加这个功能,哪个功能,但是总不提钱的事,我们做上位机开发的劳动成果总是被贱卖。 这个是我用VBS新写了一个弹出窗口的测试项目,首先变量管理对话框中添加System Info驱动程序,然后新建Sys连接,建立四个变量,AVAILABLE_MEMORY(剩余内存)CPU_IDEL_TIME(CPU空闲时间)CPU_PROCESS(CPU进程)CPU_TOAL_LOAD(CPU负载率),并添加到用户归档中。 新建画面,并在画面中添加趋势曲线控件和输入输出IO域控件,并放置诊断窗口,然后给输入输出域添加VBS脚本: CPU负载率和空闲时间脚本 Sub OnLButtonDown(Byval Item, Byval Flags, Byval x, Byval y) Dim objTrend,dblParentWidth,dblParentHeight,dblTrendWidth,dblTrendHeight Const ARCPREFIX = "ComputerArchive\" Const LEFTOFFSET = 20 Const TOPOFFSET =20 On Error Resume Next '如果有错误继续执行 Set objTrend = ScreenItems("TrendControl") '把趋势趋势曲线控件赋给对象变量 dblTrendWidth = objTrend.Width '获取趋势控件宽度 dblTrendHeight = objTrend.Height '获取趋势控件高度
dblParentWidth = objTrend.Parent.Width '获取父级窗口宽度 dblParentHeight = objTrend.Parent.Height '获取父级窗口高度
Rem VBS诊断窗口输出 HMIRuntime.Trace "父级窗体宽度为:" & dblParentWidth & vbCrlf HMIRuntime.Trace "父级窗体高度为:" & dblParentHeight & vbCrlf
'Msgbox dblParentWidth & "," & dblParentHeight With objTrend .Visible= vbFalse '隐藏就控件 '删除所有曲线 While .TrendCount > 0 .TrendIndex = .TrendCount -1 .TrendRemove = .TrendName Wend .TrendAdd = "CPU空闲时间" '添加曲线 .Caption = "CPU空闲时间曲线(单位:%)" '趋势曲线标题 .TrendVisible = 0 '曲线不显示 .TrendTagName = ARCPREFIX & "CPU_IDEL_TIME" '分配归档变量
Rem 下面两条语句在没有使用标尺的情况下可以不用 .ValueAxisAutoPrecisions = 0 '不自动显示小数点 .ValueAxisPrecisions = 1 '分配小数点位数
.TrendTrendWindow = "趋势窗口 1" '分配趋势窗口 .TrendTimeAxis = "时间轴 1" '分配时间轴 .TrendColor = RGB(0,0,0) '分配趋势曲线颜色 .TrendValueAxis = "数值轴 1" '分配数值轴 .TrendVisible = 1 '显示曲线 '趋势控件显示位置随着鼠标移动,如果超出窗口显示范围则在窗口边缘显示 '控件显示在IO域正上方,控件LEFT= x-控件宽度/2 If (x+dblTrendWidth/2)>= dblParentWidth Or (x - dblTrendWidth/2)<= 0 Then If (x+dblTrendWidth/2)>= dblParentWidth Then .Left = dblParentWidth-dblTrendWidth - LEFTOFFSET HMIRuntime.Trace "控件超出窗口右边缘" & vbCrlf Else .Left = LEFTOFFSET HMIRuntime.Trace "控件超出窗口左边缘" & vbCrlf End If Else .Left = x-dblTrendWidth/2 End If '控件显示高度= 鼠标位置 - 控件高度 -偏移量 If (y -dblTrendHeight -TOPOFFSET)<0 Then .Top = TOPOFFSET HMIRuntime.Trace "控件超出窗口上缘" & vbCrlf Else .Top = y -dblTrendHeight -TOPOFFSET End If .Visible= vbTrue End With '如果有错误,显示错误信息 If Err.Number<> 0 Then HMIRuntime.Trace "error: " & Err.Des cription Msgbox "error: " & Err.Des cription End If End Sub CPU进程和剩余内存脚本: Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y) Dim objTrend,dblParentWidth,dblParentHeight,dblTrendWidth,dblTrendHeight Const ARCPREFIX = "ComputerArchive\" Const LEFTOFFSET = 20 Const TOPOFFSET =20 On Error Resume Next '如果有错误继续执行 Set objTrend = ScreenItems("TrendControl") '把趋势趋势曲线控件赋给对象变量 dblTrendWidth = objTrend.Width '获取趋势控件宽度 dblTrendHeight = objTrend.Height '获取趋势控件高度
dblParentWidth = objTrend.Parent.Width '获取父级窗口宽度 dblParentHeight = objTrend.Parent.Height '获取父级窗口高度
Rem VBS诊断窗口输出 HMIRuntime.Trace "父级窗体宽度为:" & dblParentWidth & vbCrlf HMIRuntime.Trace "父级窗体高度为:" & dblParentHeight & vbCrlf
'Msgbox dblParentWidth & "," & dblParentHeight With objTrend .Visible= vbFalse '隐藏就控件 .TrendRename = "CPU进程" '添加曲线 .Caption = "CPU进程趋势曲线(单位:%)" '趋势曲线标题 .TrendVisible = 0 '曲线不显示 .TrendTagName = ARCPREFIX & "CPU_PROCESS" '分配归档变量
Rem 下面两条语句在没有使用标尺的情况下可以不用 .ValueAxisAutoPrecisions = 0 '不自动显示小数点 .ValueAxisPrecisions = 1 '分配小数点位数
.TrendTrendWindow = "趋势窗口 1" '分配趋势窗口 .TrendTimeAxis = "时间轴 1" '分配时间轴 .TrendValueAxis = "数值轴 1" '分配数值轴 .TrendVisible = 1 '显示曲线 .TrendColor = RGB(255,0,0) '分配趋势曲线颜色 '趋势控件显示位置随着鼠标移动,如果超出窗口显示范围则在窗口边缘显示 '控件显示在IO域正上方,控件LEFT= x-控件宽度/2 If (x+dblTrendWidth/2)>= dblParentWidth Or (x - dblTrendWidth/2)<= 0 Then If (x+dblTrendWidth/2)>= dblParentWidth Then .Left = dblParentWidth-dblTrendWidth - LEFTOFFSET HMIRuntime.Trace "控件超出窗口右边缘" & vbCrlf Else .Left = LEFTOFFSET HMIRuntime.Trace "控件超出窗口左边缘" & vbCrlf End If Else .Left = x-dblTrendWidth/2 End If '控件显示高度= 鼠标位置 - 控件高度 -偏移量 If (y -dblTrendHeight -TOPOFFSET)<0 Then .Top = TOPOFFSET HMIRuntime.Trace "控件超出窗口上缘" & vbCrlf Else .Top = y -dblTrendHeight -TOPOFFSET End If .Visible= vbTrue End With '如果有错误,显示错误信息 If Err.Number<> 0 Then HMIRuntime.Trace "error: " & Err.Des cription Msgbox "error: " & Err.Des cription End If End Sub 两个脚本不同之处在于第一个脚本是把所有曲线删除,重新添加曲线,第二个脚本是将曲线重新名称,没有删除曲线(初始状态下有一条曲线) |
龟仙人 奇侠 经验值: 8539 发帖数: 939 精华帖: 15 |
2楼 2022-03-28 11:03:18
主题:回复:像DCS一样为输出IO域带上曲线 |
龟仙人 奇侠 经验值: 8539 发帖数: 939 精华帖: 15 |
3楼 2022-03-28 11:14:50
主题:回复:像DCS一样为输出IO域带上曲线 无论是用C脚本还是VBS脚本做这个弹出曲线还是比较麻烦的,如果用VBA完成建立变量,添加用户归档,添加到输入输出域控件中,那样效率就高多了。昨天学了一天的VBA感觉很快就能实现我的想法。VBA还是蛮好用的,尤其是高版本的Wincc帮助把VBA讲的很详细,之前比较苦恼的一些问题可能会实现。 比如我原来的老项目要倒到新项目中来,结果导进来之后按钮字体是简体中文的,静态字体全是繁体中文的,如果用VBA在开发环境中将开发语言设为繁体中文,然后读取静态问题的Item、文本、字体、大小、粗体、下划线属性,存入数组中,再通过VBA脚本将开发环境语言设为简体中文,然后在将数组中的值对应输入到静态文本中,一下子就完成了一个画面所有静态文本的替换。 |
BBdell 侠圣 经验值: 2300 发帖数: 442 精华帖: 1 |
4楼 2022-03-28 11:14:57
主题:回复:像DCS一样为输出IO域带上曲线 工控是不断学习,不断完善的过程,方便自己使用,方便客户操作,,,同样鼠标点击,点2下就是比点1下麻烦了,小细节反映
co771@qq.com,好难
|
贤贤易色 奇侠 经验值: 8093 发帖数: 1308 精华帖: 6 |
5楼 2022-03-28 12:09:51
主题:回复:像DCS一样为输出IO域带上曲线 这CPU使用率,,没看出怎么读取的呢?
养活一团春意思,撑起两根穷骨头
|
ABBCCC 至圣 经验值: 24344 发帖数: 4846 精华帖: 6 |
6楼 2022-03-28 12:26:16
主题:回复:像DCS一样为输出IO域带上曲线
谨慎低调
|
XBin 侠圣 经验值: 4163 发帖数: 72 精华帖: 0 |
7楼 2022-03-29 08:16:10
主题:回复:像DCS一样为输出IO域带上曲线 |
天芯 至圣 经验值: 18857 发帖数: 2106 精华帖: 0 |
8楼 2022-03-29 10:45:30
主题:回复:像DCS一样为输出IO域带上曲线 |
那一剑的温柔 侠圣 经验值: 2240 发帖数: 378 精华帖: 4 |
9楼 2022-03-29 10:49:28
主题:回复:像DCS一样为输出IO域带上曲线 |
新兴电工 至圣 经验值: 12783 发帖数: 1212 精华帖: 2 |
10楼 2022-03-29 11:10:31
主题:回复:像DCS一样为输出IO域带上曲线
革命尚未成功,同志仍需努力.
|
zhcwos 侠圣 经验值: 3103 发帖数: 440 精华帖: 0 |
11楼 2022-03-29 11:28:30
主题:回复:像DCS一样为输出IO域带上曲线
云淡风轻
|
黑猫警长W 至圣 经验值: 18392 发帖数: 2409 精华帖: 1 |
12楼 2022-03-29 12:02:24
主题:回复:像DCS一样为输出IO域带上曲线 |
ZD_JY 至圣 经验值: 13062 发帖数: 1080 精华帖: 8 |
13楼 2022-03-29 13:21:37
主题:回复:像DCS一样为输出IO域带上曲线
做最好的自己!活出自我!
|
f1968 侠圣 经验值: 3716 发帖数: 148 精华帖: 0 |
14楼 2022-03-29 21:50:11
主题:回复:像DCS一样为输出IO域带上曲线 学习了,感谢分享! |
SIEMENS-XP 侠士 经验值: 1747 发帖数: 258 精华帖: 3 |
15楼 2022-03-30 00:03:59
主题:回复:像DCS一样为输出IO域带上曲线 看需求吧 近期用了横河DCS 感觉窗口调用这块很好,变量做进去有PV块了直接就能调用,趋势要右击点下
相互学习 共同进步
|
ligp99 侠圣 经验值: 4025 发帖数: 832 精华帖: 0 |
18楼 2022-04-10 14:26:36
主题:回复:像DCS一样为输出IO域带上曲线 曲线的时间范围可以查询吗?能同时出多个曲线窗口吗,窗口不重叠
有你帮助有我成长
|