技术论坛

 像DCS一样为输出IO域带上曲线

返回主题列表
作者 主题
龟仙人
奇侠

经验值: 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域带上曲线


这是运行的效果,由于是演示所以做了一些输出的多余的脚本,如HMIRuntime.Trace 语句可以注释掉。

CPU进程变量我查看了也没有毛病,但是就是没有变化,也不知道是我的问题还是西门子的问题。

龟仙人
奇侠

经验值: 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域带上曲线

厉害10年前的项目都还有

那一剑的温柔
侠圣

经验值: 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域带上曲线

曲线的时间范围可以查询吗?能同时出多个曲线窗口吗,窗口不重叠

有你帮助有我成长
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。