技术论坛

 像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

两个脚本不同之处在于第一个脚本是把所有曲线删除,重新添加曲线,第二个脚本是将曲线重新名称,没有删除曲线(初始状态下有一条曲线)

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