技术论坛

 最近这段时间都是在搞滤波

返回主题列表
作者 主题
芳季
至圣

经验值:66528
发帖数:14736
精华帖:100
楼主    2020-08-20 09:38:55
主题:最近这段时间都是在搞滤波 精华帖 

这个压缩文件解压后得到一个smart的程序。程序是一个前级递推平均,后级一阶滞后可变系数的组合滤波。

前级主要起到对信号的噪声过滤,后级变系数主要作用在输出和前级输出之间差值决定系数的选取。当信号主体变化快的时候选择更快的输出,信号变化较慢的时候选择较慢的输出,信号接近静止的时候选择最平缓的输出。

ORGANIZATION_BLOCK MAIN:OB1

TITLE=

BEGIN

Network 1 

LD     SM0.0

CALL   SBR13, 5, VD0, M0.1

Network 2 

LD     SM0.0

O      M0.1

CALL   SBR14, AIW16, 10, &VB40, VW10

END_ORGANIZATION_BLOCK

SUBROUTINE_BLOCK 一阶滞后R:SBR0

TITLE=y(n) = q*x(n) + (1-q)*y(n-1)

VAR_INPUT

滤波输入:REAL;

滤波系数:REAL;

END_VAR

VAR_IN_OUT

滤波输出:REAL;

END_VAR

VAR

临R1:REAL;

临R2:REAL;

END_VAR

BEGIN

Network 1 

LD     SM0.0

LPS

MOVR   LD4, AC1

*R     LD0, AC1

MOVR   1.0, AC2

AENO

-R     LD4, AC2

AENO

*R     LD8, AC2

LPP

MOVR   AC1, LD8

+R     AC2, LD8





END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK S_ITR:SBR3

TITLE=LIBARY: Scale V1.2 (bipolar scaling)

// =============================

// 

// LIABILITY

// Siemens AG does not accept liability of any kind for damages arising from the use of this application, except where it is obliged to by law, in cases such as damage to items used for personal purposes, personal injury, willful damage or gross negligence.

// 

// WARRANTY

// The program examples given are specific solutions to complex tasks which were worked on by Customer Support. We must also point out that it is not possible in the current state of the technology to exclude all errors in software programs under all conditions of use. The program examples were prepared according to the best of our knowledge. However, we cannot accept any liability beyond the standard guarantee for Class C software in accordance with our General Terms of Sale for Software Products for Automation and Drive Technology". The program examples can be purchased on the Internet as single licenses. They may not be transferred to a third party.

// 

// PASSWORD

// The password of the library is "1234"

// 

// S_ITR

// Scale Integer to Real

// 

//  The formula is as follows:

//  Ov = [(OSH - OSL) * (Iv - ISL) / (ISH - ISL)] + OSL

//  with ISL <= Iv <= ISH 

//  and OSL <= Ov <= OSH

// 

//  Ov = output value (REAL)

//  Iv = input value (INT)

//  OSH = high limit of the scale for the output value (REAL)

//  OSL = low limit of the scale for the output value (REAL)

//  ISH = high limit of the scale for the input value (INT)

//  ISL = low limit of the scale for the input value (INT) 

// 

// MICRO PRM

// 

// 

// 

// 

VAR_INPUT

Input:INT;

ISH:INT;

ISL:INT;

OSH:REAL;

OSL:REAL;

END_VAR

VAR_OUTPUT

Output:REAL;

END_VAR

VAR

Input_DI:DINT;

ISL_DI:DINT;

ISH_DI:DINT;

delta_R:REAL;

delta_max:REAL;

END_VAR

BEGIN

Network 1 // 此 POU 针对编辑和查看设置了密码保护.


END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK 递推平均:SBR11

TITLE=子程序注释

//  程序目的:

//  用递推平均值计算法。当前样品平均值作软件滤波值。

//  工作区指针是计算过程使用占用的v存储区,连续占用(样本数+5)个字。

//  第一个字节是指示当前最新样本放置的次序,并非表长。

//  第二个双字是当前采样后的样本总和。

//  以后的n个字是样本的数据。无先后顺序,循环地对样本进行更新。

//  VBn+0 放置次序

//  VBn+1

//  VBn+2 总和

//  VBn+3 (总和)

//  VBn+4 (总和)

//  VBn+5 (总和)

//  VBn+6 数据1

//  VBn+7

// VBn+8 数据2

//  ......

//  VBn+5+样本数×2 数据x(最后一个占用字节)

// 

//  适用范围:

//  不适用于中断执行。数据位长仅适合用于16位。正负数均可混合。

//  参数类型:

//  清除 点位 清除全部工作区,重新开始计算。

//  模拟输入  字型  AIW0;AIW2;VW10等。

//  样本数      字节 常数;VW0;MW2等。一旦确定请不要变更。取值只能为自然数。

//  工作区指针  双字 只接受全局变量V的指针。&VB100;&VB1200等。该区域请在使用前用清除端口置0。

//  滤波输出  字型 有符号整数。

//  执行过程:

//  每执行一次将当前输入值更新到缓工作。更新表头指针对象值。计算更新当前n个样本的平均值。

VAR_INPUT

清除:BOOL;

模拟输入:WORD; //  需要滤波的模拟量。直接填写地址。

样本数:WORD; //  需要记录的样本个数。

工作区指针:DWORD; //  计算过程需要的缓冲区头。(指针值)

END_VAR

VAR_OUTPUT

滤波输出:WORD;

END_VAR

VAR

当前位置:DWORD; //  当前采样应该填入的位置。(指针值)

过渡值:WORD;

样本总和:DWORD;

滤波值32位:DWORD;

循环值:WORD;

终止值:WORD;

清的目标:DWORD;

END_VAR

BEGIN

Network 1 

//  工作区指针所指的地方是表头。下一个双字是和。再下一个字才是真正第一个数据。

LD     SM0.0

MOVD   LD5, LD17

+D     +2, LD17

MOVD   LD5, LD11

+D     +6, LD11

Network 2 

//  计算确定当前位置的指针。指针偏移+表头偏移+次序偏移

//  因为样本按字记录,所以 顺序数×2。转化为字。

//  加到工作区指针值的低16位。这是指针所指的偏移。

//  再加上5。这是垮过表头5个字节开始的偏移。

LDN    L0.0

MOVW   *LD5, LW15

SLW    LW15, 1

MOVW   LW15, LW13

AENO

+I     LW7, LW13

AENO

+I     6, LW13




Network 3 

//  总和前值减最旧值。当前周期的新值替换最旧值。后面接续还有相关计算内容。

LDN    L0.0

ITD    *LD11, AC1

AENO

-D     AC1, *LD17

Network 4 

//  登记模拟量到指针所指的对象。对最新值进行累加。即成为递推和。

LDN    L0.0

MOVW   LW1, *LD11

ITD    *LD11, AC1

AENO

+D     AC1, *LD17

Network 5 

//  求总和的平均值。当前记录表头数加 1。

LDN    L0.0

ITD    LW3, AC1

MOVD   *LD17, LD21

/D     AC1, LD21

DTI    LD21, LW9

INCW   *LD5













Network 6 

//  表头指示,到了最后的位置时从最早的一个开始刷新。

LDN    L0.0

AW>=   *LD5, LW3

MOVW   0, *LD5

Network 7 

//  执行清除时,上面大部分程序都不执行。

//  不执行清除时,这里退出子程序,忽略后面清除相关的所有程序。

LDN    L0.0

CRET

Network 8 

//  计算清除的终止地址。

//  获得清除的开始地址。

LD     SM0.0

MOVW   LW3, LW27

+I     LW3, LW27

+I     6, LW27

MOVD   LD5, LD29

MOVW   0, LW9

Network 9 

//  用循环做清除。

//  从1开始循环直至到达终止值。

LD     SM0.0

FOR    LW25, 1, LW27

Network 10 

//  逐一字节进行清除,方便计算。

//  清除的目标指针增加一,指向下一个字节。

LD     SM0.0

MOVB   0, *LD29

INCD   LD29

Network 11 

NEXT

Network 12 


END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK 周期脉冲:SBR13

TITLE=程序目的:

// 在主程序执行中,用扫描方式获得一个近似的间隔脉冲。脉冲宽度为一个扫描周期。

// 

// 适用范围:

// 推荐在主程序中无条件执行。如果有条件执行,则扫描到就刷新脉冲信号,不扫描即冻结脉冲状态。

// 

// 程序接口:

// 时基间隔 反映脉冲的出现周期。单位:毫秒。

// 临时D 安排一个双字的空间为程序运行使用。

// 时基脉冲 程序的输出量。安排一个点位作为输出。

// 

// 占用内存量及工作表结构:

// 程序只需要一个双字的空间。

// 

// 执行过程:

// 程序必须在第一个扫描周期执行一次。随后将在执行时刷新脉冲输出口。大于时基间隔的扫描间隔,将使程序不能正常运行。

// 

// 补充说明:

// 程序运行需要执行BGN_ITIME指令。

// 

// 使用变化:

//

// 

// 本程序免费使用。也许不会适用于你的程序。当由于任何原因不适用时,程序作者不负有责任。请用户仔细复核程序内容,再继续使用。

// 

// 程序密码:

// 

// 作者:芳季2019年10月8日

VAR_INPUT

时基间隔:DWORD;

END_VAR

VAR_IN_OUT

临时D:DWORD;

END_VAR

VAR_OUTPUT

时基脉冲:BOOL;

END_VAR

VAR

临:DWORD;

临1:DWORD;

END_VAR

BEGIN

Network 1 // 此 POU 针对编辑和查看设置了密码保护.


END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK 递推+一阶:SBR14

TITLE=递推 + 变系数一阶滞后滤波

// 系数是递推结果值与一阶滤波值之差控制。

// 调用时需要用SM0.1并联时基脉冲一起驱动。

VAR_INPUT

模拟量:WORD;

递推数:WORD;

工作指针:DWORD;

END_VAR

VAR_IN_OUT

输出:WORD;

END_VAR

VAR

递推输出:DWORD;

END_VAR

BEGIN

Network 1 

LD     SM0.0

MOVW   LW2, AC0

*I     +2, AC0

ITD    AC0, AC0

+D     +6, AC0

MOVD   LD4, LD10

+D     AC0, LD10

Network 2 

LD     SM0.0

=      L60.0

LD     SM0.1

=      L63.7

LD     L60.0

CALL   SBR11, L63.7, LW0, LW2, LD4, *LD10

Network 3 

// 一阶滞后的参数可能需要按实际调。

LD     SM0.0

LPS

MOVW   *LD10, AC0

-I     LW8, AC0

AW<    AC0, 0

INVW   AC0

INCW   AC0

+I     0, AC0

LPP

CALL   SBR3, AC0, 100, 1, 0.2, 0.001, AC1

Network 4 

LD     SM0.0

ITD    *LD10, AC0

DTR    AC0, AC0

CALL   SBR0, AC0, AC1, AC2

ROUND  AC2, AC1

DTI    AC1, LW8

END_SUBROUTINE_BLOCK

=====================================

奇了个怪了。上传不了rar?上传窗口不显示RAR文件。

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