这个压缩文件解压后得到一个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文件。