我按照《上_下位机数据高速通讯方法及其在大型锻压机中的应用》这篇期刊论文里的思路做一个高速数据采集系统,前面的各个部分在学习查资料及各位大佬的问答帮助下顺利完成,但到了使用wincc function trend control显示趋势曲线时,论文里是通过编写c脚本来显示趋势曲线的(论文没给出具体的程序,只是告诉用那几个函数可以达到效果)。我编写了程序,在各位大佬的帮助下终于将脚本错误修改完了,也能显示趋势曲线了(虽然曲线有点怪但这个问题我会解决的,图片如下),但是我还是想向论文显示的曲线靠近(论文中信号源周期T=1s时的趋势曲线如下图)。我想不明白,论文中同样是每次从plc300中传送采集的100个数据到wincc的原始数据类型变量中(plc中ob35周期为10ms,采集周期为1s的正弦波,100个数据正好组成一个周期的正弦波),再通过编写全局脚本对原始数据类型变量进行解包,将数据储存在对应的100个内部变量中。
只有那100个数据作为y轴数据,x轴数据还要自己定义,论文是怎么编写的c脚本能做到连续显示多个周期的曲线呢?它的x轴又是怎么设置的呢?我的程序如下图,我这个程序只能显示出一个周期的曲线,怎么做才能达到论文效果呢?不知道大佬们能理解我的意思吗,请求大佬们回答一下,非常感谢。
问题补充:
非常感谢RENHQ大佬,又是您来回答,非常感谢。但是可能我表达的不好,您没有理解我的问题(可以的话大佬再仔细看一看问题)。首先我必须要用DB_VAR1至DB_VAR100这100个内部变量(这是要求),我的采集数据在里面,将内部变量按顺序插入就可以得到曲线,我的程序不就可以达到这个效果吗,虽然不知道什么原因显示图形有些怪,但大不了我再模仿您给的程序用变体类型VARIANT来显示,我也会修改。
因为plc300中ob35周期为10ms,采集的正弦波周期为1s,所以要显示一个周期的曲线要100个数据,正好100个内部变量能装满,正好显示一个周期的曲线,对于周期小于1s的正弦波信号显示一个以上的周期的曲线也没问题。但我还要采集一个周期为2s和周期为4s的正弦波,那我的程序就无法一次显示整个周期的曲线。因此我才想像论文一样能一次显示出5个周期为1s的曲线(如我发的论文显示曲线图效果),但怎么做呢,我的程序和大佬您给的程程序都无法做的(一次没有那么多数据),求大佬帮帮我,非常非常感谢。
图片说明:
最佳答案
我的天呐,你还没搞定啊
我没事做了一个用这个显示正玄波的曲线,全部脚本:
#define TRENDNAME "TREND_OLDXY" //曲线控件名称
double Y_Values[90] ; // Y轴数据
VARIANT vtDataX, vtDataY;
int i;
SetOperation(lpszPictureName,lpszObjectName,FALSE); //本按钮不允许操作
for(i=0;i<90;i++) //生产正玄波曲线,采用90个点
{
Y_Values[i]=50.0+50.0*sin(3.1815926/180.0*i*4);
}
//初始化variant.变量
VariantInit( &vtDataX );
VariantInit( &vtDataY );
// 设置曲线索引,并清除曲线数据
SetPropBOOL( lpszPictureName, TRENDNAME, "Index", 0);
SetPropBOOL(lpszPictureName,TRENDNAME,"DeleteData",TRUE);
// X坐标属性设置
SetPropBOOL(lpszPictureName,TRENDNAME,"AutorangeX",FALSE);
SetPropDouble(lpszPictureName,TRENDNAME,"BeginX",0);
SetPropDouble(lpszPictureName,TRENDNAME,"EndX",360);
// Y坐标属性设置
SetPropBOOL(lpszPictureName,TRENDNAME,"AutorangeY",FALSE);
SetPropDouble(lpszPictureName,TRENDNAME,"BeginY",0);
SetPropDouble(lpszPictureName,TRENDNAME,"EndY",100);
//开始插入输入
for( i =0; i < 90; i++ )
{
// 填充X轴和Y轴的数据
vtDataX.vt = VT_R8;
vtDataX.u.dblVal = i*4.0; // X-value
vtDataY.vt = VT_R8;
vtDataY.u.dblVal = Y_Values[i]; // Y-value
// 设置X轴数据属性
PDLRTSetPropEx( PDLRT_AM_DEFAULT, lpszPictureName, TRENDNAME, "DataX", VT_VARIANT, (void*)&vtDataX, NULL, NULL, 0, NULL, NULL );
// 设置Y轴数据属性
PDLRTSetPropEx( PDLRT_AM_DEFAULT, lpszPictureName, TRENDNAME, "DataY", VT_VARIANT, (void*)&vtDataY, NULL, NULL, 0, NULL, NULL );
// 插入X/Y轴数据
SetPropBOOL( lpszPictureName, TRENDNAME, "InsertData", TRUE );
//清空内容
VariantClear( &vtDataX );
VariantClear( &vtDataY );
}
// 设置本按钮可操作
SetOperation(lpszPictureName,lpszObjectName,TRUE);
运行结果看附图
参考的是:
自定义 XY 轴的多功能曲线的实现方法
https://support.industry.siemens.com/cs/cn/zh/view/77467629
补充:
你参考一下这个文档:
WinCC 高速数据采集的实现
https://support.industry.siemens.com/cs/cn/zh/view/79544473
提问者对于答案的评价:
感谢大佬了,只可惜我这个必须用plc300做,plc300没有sfb37(AR_Send)系统功能块,这些我在前期查资料时就知道了,不过还是感谢大佬的热心回答,我自己再摸索下吧。
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc354695.html