自定义 XY 轴的多功能曲线的实现方法

n

1概述
WinCC 的函数趋势控件提供给用户自定义XY轴曲线的功能,可以灵活方便地满足客户的某些需求。在本文所提到的示例中,函数趋势控件的数据连接方式的提供者均选择“无”,这意味着绘制曲线所需的数据不是直接来自在线变量、归档变量或用户归档,而是在这些数据的基础上进行统计计算或从数据库读取得来的。本文只介绍如何根据这些得到的数据,在函数趋势控件上绘制自定义XY轴的曲线,关于如何获取数据或进行统计计算等,可以使用连通性软件包等方法并利用脚本实现。本文针对不同的需求,介绍了相应的实现方法。n

2自定义 XY 轴的多功能曲线的实现方法

2.1 如何利用由统计计算得到的XY数据绘制曲线
假如某材料在反应容器中进行化学反应的过程中,每隔1秒钟记录反应容器中的温度和压力,然后针对1小时内的数据进行统计分析。假设其温度变化的范围为T1至T2,压力范围为P1至P2,将温度T1至T2分为10段温度,分别计算每段温度范围内的平均温度和平均压力,这样就得到10组平均温度和平均压力对应的XY数据,然后将这些数据绘制在函数趋势控件上。
假设这些成对的XY值已经存储在两个数组中,下面介绍如何将这些数据插入并显示在函数趋势控件上,实现步骤如下:
1. 首先,从“对象选项板 “中的“控件”页中,将“WinCC Function Trend Control”托拽到画面上,将控件名称设置为“TrendYX1”。n

2. 在画面上放置一个按钮,在按钮事件的鼠标动作(OnClick)中添加脚本,下面分别使用C脚本和VBS脚本实现。n

3. 使用C脚本实现的方法简单介绍如下:
1)设置函数趋势控件的属性。例如,设置XY坐标轴的显示范围等。
2)删除函数趋势控件上已有的曲线。
3)然后使用For循环,依次将两个数组的值分别赋给函数趋势控件的“DataX”和“DataY”属性,并将控件的“InsertData”方法设置为“TRUE”即可。n

使用C脚本的实现代码如下所示(注意,以下代码在WinCC 6.2 SP2版本上测试):
short X_Values[11] = {0,1,2,3,4,5,6,7,8,9,10};
short Y_Values[11] = {0,1,4,9,16,25,36,49,64,81,100};
VARIANT vtDataX, vtDataY;
int i;n

// Initialize the variant.
VariantInit( &vtDataX );
VariantInit( &vtDataY );n

// Disable operator control
SetOperation(lpszPictureName,lpszObjectName,FALSE);n

// Set index for trend 1 and delete data
SetPropBOOL( lpszPictureName, "TrendYX1", "Index", 0);
SetPropBOOL(lpszPictureName,"TrendYX1","DeleteData",TRUE);n

// X-axis property setting
SetPropBOOL(lpszPictureName,"TrendYX1","AutorangeX",FALSE);
SetPropDouble(lpszPictureName,"TrendYX1","BeginX",0);
SetPropDouble(lpszPictureName,"TrendYX1","EndX",10);n

// Y-axis property setting
SetPropBOOL(lpszPictureName,"TrendYX1","AutorangeY",FALSE);
SetPropDouble(lpszPictureName,"TrendYX1","BeginY",0);
SetPropDouble(lpszPictureName,"TrendYX1","EndY",100);n

for( i =0; i <= 10; i++ )
{
// Fill data pair with data from X and Y value list
vtDataX.vt = VT_I2;
vtDataX.u.iVal = X_Values[i]; // X-value
vtDataY.vt = VT_I2;
vtDataY.u.iVal = Y_Values[i]; // Y-valuen

// Set “DataX” property of X-axis
PDLRTSetPropEx( PDLRT_AM_DEFAULT, lpszPictureName, "TrendYX1", "DataX", VT_VARIANT, (void*)&vtDataX, NULL, NULL, 0, NULL, NULL );n

// Set “DataY” property of Y-axis
PDLRTSetPropEx( PDLRT_AM_DEFAULT, lpszPictureName, "TrendYX1", "DataY", VT_VARIANT, (void*)&vtDataY, NULL, NULL, 0, NULL, NULL );n

// Insert X/Y values
SetPropBOOL( lpszPictureName, "TrendYX1", "InsertData", TRUE );n

VariantClear( &vtDataX );
VariantClear( &vtDataY );
}
// Enable operator control
SetOperation(lpszPictureName,lpszObjectName,TRUE);n

编译并保存画面后,运行WinCC,点击按钮所得的结果如下图所示:n

自定义 XY 轴的多功能曲线的实现方法
图1 函数趋势控件上绘制的曲线n

4. 使用VBS脚本实现的代码如下,注意将按钮的名称改为“VBS_Key”:n

Dim Key, FctTrdCtrl, i
Dim X_Values, Y_Valuesn

' "VBS_Key" is the name of the clicked button
' Disable operator control and force grafic output
Set Key = ScreenItems("VBS_Key")
Key.Operation = vbFalse
refreshn

X_Values = Array(0,1,2,3,4,5,6,7,8,9,10)
Y_Values = Array(0,1,4,9,16,25,36,49,64,81,100)n

Set FctTrdCtrl = ScreenItems("TrendYX1")n

' Set index for trend 1 and delete data
FctTrdCtrl.Index = 0
FctTrdCtrl.DeleteData = vbTruen

' X-axis property setting
FctTrdCtrl.AutorangeX = vbFalse
FctTrdCtrl.BeginX = 0
FctTrdCtrl.EndX = 10n

' Y-axis property setting
FctTrdCtrl.AutorangeY = vbFalse
FctTrdCtrl.BeginY = 0
FctTrdCtrl.EndY = 100n

' Insert X/Y values
For i = 0 To 10
FctTrdCtrl.DataX = X_Values(i)
FctTrdCtrl.DataY = Y_Values(i)
FctTrdCtrl.InsertData = vbTrue
Nextn

'enable operator control
Key.Operation = vbTruen

2.2 如何绘制将某一变量显示为另一变量的函数的曲线
函数趋势控件还可以提供将某一变量显示为另一变量的函数的选项。下面的例子实现了将X轴数组的各值进行平方运算后,计算出Y轴数组的各值,然后根据计算出的XY值绘制趋势曲线。基于2.1示例中的C脚本代码,只需要稍作改动,由X轴数值计算出Y轴数值即可,改动的代码如下所示:n

short X_Values[11] = {0,1,2,3,4,5,6,7,8,9,10};
……
vtDataY.vt = VT_I2;
vtDataY.u.iVal = pow( X_Values[i],2);n

此外,C脚本中提供了丰富的数学计算函数,可以绘制出各种复杂的函数曲线。n

2.3 如何绘制横坐标为一系列时间戳的数值曲线
在某些情况下,要求曲线的横坐标为时间(时间间隔可以不等),纵坐标为对应不同时间的数值(例如某物体的快速运行轨迹曲线)。例如,当使用WinCC和S7-400 PLC进行高速数据采集时,会将高速采集的数据存储到WinCC的变量归档中,同时包含了PLC采集数据时的时间戳。这些数据的时间间隔非常短,一般只是毫秒级。用户可以利用函数趋势控件把这些时间及其对应的数值显示在函数趋势控件上。
如果已经得到了这些数据和时间戳,如何将这些数据显示在趋势曲线上呢?在西门子的官方网站上可以下载到WinCC的演示项目“Demo V6”,其中包含了关于函数趋势控件的功能演示。演示项目中的画面“PA5_bld07.pdl”可以实现以上的需求。关于演示项目,请到西门子下载中心下载:http://www.ad.siemens.com.cn/download/

在下载中心的搜索中输入“WinCC V6 使用技巧”,搜索并下载即可。注意,如果WinCC软件版本高于6.0 SP3,需要做项目升级。由于实现的代码比较多,这里只针对重点的部分进行介绍如下:

1. 首先,将获得的一组时间戳分别赋值给 SYSTEMTIME 类型的结构体数组。
2. 设置函数趋势控件的属性。使用SafeArrayCreate 创建安全数组,并设置数组元素的类型。
3. 将对应于日期时间类型(对应于X轴)和实数类型(对应于Y轴)的数据赋值给安全数组的元素,上述两种类型分别对应于变体的VT_DATE和VT_R8类型。其中有一个重要的全局项目函数CcDateFromSt,用于检验结构体数组各成员的有效性,以及将时间日期由SYSTEMTIME 类型的结构体数组转化为变体类型VT_DATE所需的double类型。上述对应的代码如下所示:

SafeArrayAccessData( vtPair.u.parray, &pvtPair );
if( pvtPair )
{
// X-value
vtDataX.vt = VT_DATE;

// Calculate time value via global function CcDateFromSt
CcDateFromSt(&st[i], &dZeitwert);
vtDataX.u.dblVal = dZeitwert;

// Y-value
vtDataY.vt = VT_R8;
vtDataY.u.dblVal = dValue[i];

// Write values into 'value pair SAFEARRAY'
VariantCopy( &pvtPair[0], &vtDataX );
VariantCopy( &pvtPair[1], &vtDataY );

// Release 'value pair SAFEARRAY'
SafeArrayUnaccessData( vtPair.u.parray );
pvtPair = NULL;

// Copy value pair into "DataXY" - SAFEARRAY
VariantCopy( &pvtDataXY[i], &vtPair );
}

4. 然后给趋势控件的“DataXY”属性赋值,并将数据插入到函数趋势控件中,实现的代码如下:

// Set array with value pairs
PDLRTSetPropEx( PDLRT_AM_DEFAULT, lpszPictureName, "TrendYX1", "DataXY",VT_VARIANT, (void*)&vtDataXY, NULL, NULL, 0, NULL, NULL );

// Insert value pairs
SetPropBOOL( lpszPictureName, "TrendYX1", "InsertData", TRUE );

3使用函数趋势控件需要注意的问题
1. 在 WinCC 函数趋势控件中,可以显示任意数目的趋势。 然而,建议所组态的趋势不要超过 8 个。
2. 每个趋势最大可显示 10000 个数值对。
3. 如果使用的WinCC版本是WinCC 7.0 SP1及以上版本,也可以在“SIMATIC WinCC V7 from SP1 的演示项目”中找到一些关于函数趋势控件的例子,可以从以下网址下载示例项目:35102867

在WinCC V7中,仍旧支持V7版本之前使用的控件“WinCC Function Trend Control (Classic)”,本文所述的示例代码可以使用。对于WinCC V7版本之后的新控件,插入数据到函数趋势控件的方法有所不同。对于C脚本,在WinCC V7版本之前使用的“InsertData”和“DataXY”等方法已经不再支持;对于VBS脚本,可以参考WinCC V7的帮助文档,搜索关键字“VBS300”或“VBS301”即可。

声明:
本文所述的方法为WinCC的高级用法,提供的代码程序仅供用户参考,西门子公司不提供任何保证和热线支持。

关键词
趋势曲线、函数趋势控件、XY轴、C脚本、VBS脚本

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc329006.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 下午12:03
下一篇 2021年4月12日 上午12:00

相关推荐

发表回复

登录后才能评论