大家好,欢迎来到IT知识分享网。
在学习滑动平均滤波算法的时候,例子中用到了这个LGF库函数,顺便学习一下。里面有很多的库函数,在实际使用的时候可以借鉴使用。
官方给出的下载地址为:https://support.industry.siemens.com/cs/cn/en/view/。这个下载地址里面只有v16,v17的库可英文版的使用说明。我使用的是V15.1的,是从别人网盘下载的,地址如下:
链接:https://pan.baidu.com/s/1O_fFd5aodGZBOUkyRSb0lA
提取码:p24o
LGF(通用函数库)是Step7(TIA Portal)的附加函数库,适用于S&1200/1500PLC。包含了FIFO,搜索功能,矩阵功能,天文计数器等功能。有需要的可以查询参考使用。
LGF_SinusCI (FB / V3.0.1)是产生一个正弦波形信号,一般是在OB30中使用,定时调用能产生均衡数值。
实际的使用,在OB30中进行调用和设置相关的参数。
amplitude是幅值;
periode是周期时间,单位是ms;
即在周期时间内变换正幅值和负幅值之间的线性变换。
value是输出值,整个输出值是符合正弦波形。
callOB即调用中断OB。开始也没理解什么意思,后来发现在OB30中调用这个功能块,可以出现这个OB_Cyclic interrupt 变量,即调用的中断是OB30。
在Trace中组态,进行图形观测:
1)组态信号
2)组态采样
3)组态触发
4)检测波形
这个是配合滑动平均滤波算法来使用的,好像这个算法的程序没成功。还没学到家,再查查程序,看看问题出在哪里。
附滑动平均滤波算法程序:
在OB中调用此滤波算法FB
运行结果:
//错误初始化
REGION initialiazation process
#Error := 0;
#Status := #No_Error;
END_REGION
//复位程序处理
REGION reset process
IF #reset THEN
#statValueSum := 0;
#statHeadIndex := #Buffer_initialized;//常量,值为-1
#statTailIndex := 0;
#statBufferFull := false;
#statWindowSizeOld := #windowSize;
RETURN; //if reset ,end this cycle FB ,and restart in the next cycle.
END_IF;
END_REGION
//窗口值处理,即多少个数取均值。
REGION window value process
IF #windowSize <> #statWindowSizeOld THEN //窗口值大小修改后,初始化程序
#statValueSum := 0;
#statHeadIndex := #Buffer_initialized; //常量,数值-1;
#statTailIndex := 0;
#statBufferFull := false;
#statWindowSizeOld := #windowSize;
RETURN;
END_IF;
#statWindowSizeOld := #windowSize;//把新窗口值进行存储,用于后续判断是否更改窗口大小。
IF #windowSize < 3 OR #windowSize > #max_windowsize THEN //窗口设定值非法报警
#Error := 1;
#Status := #windowSizeIllegal;
RETURN;
END_IF;
END_REGION
//使用环形队列写入
REGION write date to buffer ring process
//1.写入新值,并将尾指针加1,尾指针从0开始,当到达窗口值时候,求余正好为0;
#statbuffer[#statTailIndex] := #value;
//计算下一个尾指针索引,求余数保证尾指针在0-1之间
#statTailIndex := #statTailIndex + 1;
#statTailIndex := #statTailIndex MOD #windowSize; //小于除数的余数就是被除数本身,从0-9需考虑;
//当被除数和除数相等,则余数是0,则是回到了尾指针的初始值;
//2.判断缓冲区是否已满,
//头指针是在第一个数据处理后从-1变为0,当尾指针也为0 ,当头指针和尾指针相等,则说明缓冲区已满;
IF #statHeadIndex = #statTailIndex THEN
#statBufferFull := true;
ELSE
#statBufferFull := FALSE;
END_IF;
//头指针初始化及处理
IF #statHeadIndex = #Buffer_initialized THEN //初始值-1;
#statHeadIndex := 0;
END_IF;
//判断缓冲区是否已满
//IF #statBufferFull THEN
//#statHeadIndex := #statHeadIndex + 1;
//#statHeadIndex := #statHeadIndex MOD #windowSize;
//END_IF;
END_REGION
//平均值滤波算法
REGION Mean value algorithm
IF #statBufferFull THEN
#tempmin := #statbuffer[0];
#tempmax := #statbuffer[0];
#temptotal := #statbuffer[0];
FOR #temploopcount := 1 TO #windowSize – 1 DO
IF #tempmin > #statbuffer[#temploopcount] THEN
#tempmin := #statbuffer[#temploopcount];
END_IF;
IF #tempmax < #statbuffer[#temploopcount] THEN
#tempmax := #statbuffer[#temploopcount];
END_IF;
#temptotal := #temptotal + #statbuffer[#temploopcount];
END_FOR;
#average := (#temptotal – #tempmin – #tempmax) / (#windowSize – 2);
ELSE
#average := 0;
END_IF;
END_REGION
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/85193.html