学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)在学习滑动平均滤波算法的时候,例子中用到了这个LGF库函数,顺便学习一下。里面有很多的库函数,在实际使用的时候可以借鉴使用。官方给出的下载地址为:https://support.industry.siemens.com/cs/cn/en/v

大家好,欢迎来到IT知识分享网。

在学习滑动平均滤波算法的时候,例子中用到了这个LGF库函数,顺便学习一下。里面有很多的库函数,在实际使用的时候可以借鉴使用。

官方给出的下载地址为:https://support.industry.siemens.com/cs/cn/en/view/。这个下载地址里面只有v16,v17的库可英文版的使用说明。我使用的是V15.1的,是从别人网盘下载的,地址如下:

链接:https://pan.baidu.com/s/1O_fFd5aodGZBOUkyRSb0lA
提取码:p24o

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

西门子论坛作者截图

LGF(通用函数库)是Step7(TIA Portal)的附加函数库,适用于S&1200/1500PLC。包含了FIFO,搜索功能,矩阵功能,天文计数器等功能。有需要的可以查询参考使用。

LGF_SinusCI (FB / V3.0.1)是产生一个正弦波形信号,一般是在OB30中使用,定时调用能产生均衡数值。

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

实际的使用,在OB30中进行调用和设置相关的参数。

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

amplitude是幅值;

periode是周期时间,单位是ms;

即在周期时间内变换正幅值和负幅值之间的线性变换。

value是输出值,整个输出值是符合正弦波形。

callOB即调用中断OB。开始也没理解什么意思,后来发现在OB30中调用这个功能块,可以出现这个OB_Cyclic interrupt 变量,即调用的中断是OB30。

在Trace中组态,进行图形观测:

1)组态信号

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

2)组态采样

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

3)组态触发

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

4)检测波形

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

这个是配合滑动平均滤波算法来使用的,好像这个算法的程序没成功。还没学到家,再查查程序,看看问题出在哪里。

附滑动平均滤波算法程序:

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

在OB中调用此滤波算法FB

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

运行结果:

学习LGF库函数——LGF_SinusCI (FB / V3.0.1)

//错误初始化

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

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信