☰
PLC编码器测速:中心差分法与自适应滤波的SCL实现
2026/9/26 1:09:44 网站建设 项目流程

1. 项目概述:从脉冲到转速的工业级精确求解

在工业自动化现场,无论是监控传送带的线速度,还是控制伺服电机的转速,编码器都是我们获取旋转或直线位移信息的“眼睛”。但问题来了:PLC(可编程逻辑控制器)从编码器读到的,通常是一连串的脉冲信号。如何把这一串“哒哒哒”的脉冲,实时、准确、稳定地转换成我们需要的转速值,并且能应对现场各种干扰,这就是一个既基础又考验功底的活儿。

最近我在一个高精度卷绕设备项目里,就深度折腾了一把编码器测速。客户对速度控制的平稳性要求极高,传统的定时测频法在低速时精度惨不忍睹,而高速时对PLC扫描周期又过于敏感。更头疼的是,现场电机振动和电气噪声总会让脉冲计数偶尔“跳一下”,导致速度显示像心电图一样波动。为了解决这两个核心痛点——提升全速度范围内的测量精度和抑制随机干扰——我决定摒弃简单的“数脉冲”思路,采用一套组合拳:中心差分法进行速度计算,再配合自适应滤波算法对结果进行平滑处理。最终用SCL(结构化控制语言)在西门子1200/1500系列PLC中实现了这套逻辑,效果拔群。

这篇文章,我就把这套从理论到实践、从算法到代码的完整方案拆开揉碎了讲给你听。无论你是正在面临类似测速难题的工程师,还是希望深入理解PLC高级算法应用的学习者,这套经过实战检验的SCL源代码和设计思路,都能让你直接“抄作业”,或者从中获得解决其他信号处理问题的灵感。

2. 核心算法原理:为什么是中心差分法+自适应滤波?

在动手写代码之前,搞清楚“为什么用这个”比“怎么用”更重要。市面上测速方法很多,比如M法(定时测频)、T法(定数测周),各有各的局限。而中心差分法与自适应滤波的组合,恰恰是为了在精度、实时性和抗扰性之间取得一个优雅的平衡。

2.1 中心差分法测速:追求微分的本质

速度是位移对时间的导数。对于编码器,位移就是累积的脉冲数乘以每个脉冲对应的位移当量(比如0.1mm/脉冲)。最朴素的想法是用“后向差分”:用本次脉冲数减去上次脉冲数,再除以时间间隔。但这有个问题:它只用了前一个时间点的信息,对脉冲信号中的随机跳动非常敏感,相当于把噪声也一起放大了。

中心差分法的精妙之处在于,它试图逼近理论上的瞬时导数。其基本思想是:利用当前时刻前后两个时间点的位移信息,来计算当前时刻的速度。公式可以简化为:速度V(t) ≈ [P(t+Δt) - P(t-Δt)] / (2*Δt)其中,P是脉冲累积值,Δt是采样周期。

这么做的优势何在?

  1. 理论精度更高:从数值分析角度看,中心差分的截断误差阶数比前向或后向差分更高,更接近真实的导数值。尤其在速度变化不是特别剧烈的情况下,其计算出的速度曲线更平滑。
  2. 对脉冲计数跳变不敏感:假设在t时刻有一个脉冲计数因为干扰突然多计了一个(即P(t)有一个尖峰)。在后向差分法中,这个尖峰会直接影响V(t)和V(t+Δt)两个速度值。而在中心差分法中,计算V(t)用的是P(t+Δt)和P(t-Δt),那个孤立的尖峰P(t)并没有被直接用于计算,因此其影响被大大削弱了。这就天然具备了一定的滤波效果。

当然,中心差分法引入了一个Δt的“滞后”,因为它需要未来的信息P(t+Δt)。在实时控制中,这意味着我们计算出的t时刻速度,实际上要等到t+Δt时刻才能得到。对于大多数过程控制来说,一个PLC扫描周期(通常几毫秒到几十毫秒)的滞后是完全可接受的,换取的是精度和稳定性的巨大提升。

注意:这里的“未来信息”是指在同一个PLC扫描周期内,我们先读取当前的编码器值P(t),然后在下一个周期得到P(t+Δt),再用这两个值去计算上一个周期中间时刻的速度。这是一种在离散系统中实现“中心差分”的实用策略。

2.2 自适应滤波算法:让滤波器“聪明”起来

中心差分法虽然好,但面对持续或较强的随机干扰,仍显不足。这时就需要滤波。常规的固定参数低通滤波器(如一阶滞后滤波)有个矛盾:滤波系数设大了,平滑效果好,但响应迟钝,跟不上速度真实变化;系数设小了,响应快,但滤波效果差。

自适应滤波的核心思想,就是让滤波器的参数能够根据信号本身的特征动态调整。在这个测速场景中,我设计的自适应逻辑基于一个简单的判断:当前速度变化有多大可能是真实的工艺变化,有多大可能是噪声?

我采用的是一种变系数一阶滞后滤波,其公式为:V_filtered(k) = α * V_raw(k) + (1-α) * V_filtered(k-1)其中,α是动态变化的滤波系数(0 < α ≤ 1)。

自适应规则如下:

  1. 计算当前原始速度与上一次滤波后速度的差值绝对值ΔV = |V_raw(k) - V_filtered(k-1)|。
  2. 设定两个阈值:Threshold_Small(小变化阈值)和Threshold_Large(大变化阈值)。
  3. 如果 ΔV < Threshold_Small:认为当前速度变化很可能是噪声,此时应强滤波。将α设置为一个很小的值(如0.1),让输出结果更多地依赖历史值,抑制波动。
  4. 如果 ΔV > Threshold_Large:认为当前速度发生了真实的、大幅度的工艺变化(如急加速或急减速),此时应弱滤波,快速跟踪。将α设置为一个较大的值(如0.8或1.0),让输出结果迅速跟上真实速度。
  5. 如果 Threshold_Small ≤ ΔV ≤ Threshold_Large:处于模糊区,可以让α在最小值和最大值之间线性插值,实现平滑过渡。

这样一来,滤波器就像有了“智能”:在速度平稳时,它静如处子,有效滤除杂波;在速度剧变时,它动如脱兔,快速响应真实指令。这比固定的滤波器灵活得多,也实用得多。

3. PLC程序架构设计与关键数据结构

理解了算法,我们就要在PLC的舞台上实现它。PLC是典型的周期性扫描设备,所有逻辑都在一个接一个的扫描周期(OB1循环中断)中执行。我们的程序架构必须适应这种特点,同时保证计算的准确性和实时性。

3.1 整体程序流程与扫描周期配合

PLC程序不能像上位机软件那样随意开辟线程或进行复杂的中断嵌套。我们的测速功能块(FB)通常会在一个固定的周期中断组织块(如OB30,周期设置为10ms)中调用,以确保采样间隔Δt的严格恒定。这是高精度测速的前提。

主程序流程设计如下:

  1. 初始化(在第一个扫描周期执行一次):清零历史脉冲值、滤波速度值,设置初始参数。
  2. 周期性执行(在OB30中调用): a.读取当前编码器值:通过高速计数器(HSC)功能模块,获取当前时刻的累积脉冲数P_current。这里务必注意使用PLC提供的、能捕获高速脉冲的专门指令,直接读I点可能在高速下丢脉冲。 b.存储历史数据:将上一次的P_current存入P_previous,将上上次的P_previous存入P_old。这样就构成了计算中心差分所需的P(t+Δt)(即本次值)、P(t-Δt)(即上上次值)序列。 c.计算原始速度:应用中心差分公式:V_raw = (P_current - P_old) / (2 * T_cycle)。T_cycle就是OB30的调用周期,单位转换为秒(如10ms=0.01s)。再乘以脉冲当量(米/脉冲或转/脉冲),就得到工程单位的速度值。 d.自适应滤波:根据上一节描述的规则,计算当前ΔV,动态选择α系数,执行一阶滞后滤波计算,得到最终输出的滤波速度V_filtered。 e.数据更新与输出:更新内部状态变量,将V_filtered输出到功能块的管脚,供其他逻辑(如PID控制、HMI显示)使用。

3.2 功能块(FB)接口与内部变量定义

用SCL编写一个可重用的功能块是最佳实践。下面给出关键变量定义,这本身就是设计思路的体现:

FUNCTION_BLOCK “FB_EncoderSpeedCalc” VAR_INPUT // 输入参数 bEnable: BOOL; // 使能功能块 iEncoderRawValue: DINT; // 从HSC读取的原始脉冲计数值(注意可能溢出) fPulseToUnit: REAL := 0.001; // 脉冲当量,例如 0.001 米/脉冲 fCycleTime: TIME := T#10MS; // 采样周期,需与调用OB周期一致 // 自适应滤波参数 fThreshold_Small: REAL := 0.05; // 小变化阈值(单位同速度) fThreshold_Large: REAL := 0.5; // 大变化阈值 fAlpha_Min: REAL := 0.1; // 最小滤波系数(强滤波) fAlpha_Max: REAL := 0.8; // 最大滤波系数(弱滤波) bReset: BOOL; // 复位信号,清零所有历史数据 END_VAR VAR_OUTPUT // 输出参数 fSpeedRaw: REAL; // 原始计算速度(中心差分法结果) fSpeedFiltered: REAL; // 自适应滤波后的最终速度 bDataValid: BOOL; // 数据有效标志(通常历史数据积累足够后置位) END_VAR VAR // 静态变量(保持数据) pOld: DINT; // 上上次脉冲值 P(t-Δt) pPrevious: DINT; // 上次脉冲值 P(t) fSpeedFiltered_Pre: REAL; // 上一次的滤波速度,用于滤波计算 rCycleTimeSec: REAL; // 转换后的周期时间(秒) iSampleCount: INT; // 采样计数器,用于判断数据是否有效 END_VAR

关键设计解析:

  • iEncoderRawValue类型为DINT:编码器脉冲是累积的,可能很大,INT(32767)很容易溢出,必须使用DINT(双整数)或LREAL(双精度浮点)来存储。这是新手常踩的坑。
  • fPulseToUnit参数化:将脉冲当量作为输入参数,极大提高了功能块的通用性。同一个块可以用于测量线速度(米/秒)或转速(转/分),只需改变这个系数。
  • 时间处理:PLC中的TIME类型是毫秒为单位的DWORD。需要将其转换为以秒为单位的REAL型,用于速度计算。rCycleTimeSec := TIME_TO_REAL(fCycleTime) / 1000.0。
  • 数据有效标志bDataValid:中心差分法需要至少两个历史周期数据才能计算出第一个有效速度。通过iSampleCount计数,当采样数大于2时,才将bDataValid置为TRUE,防止初始阶段输出无意义的数据。

4. SCL源代码逐行详解与实现

有了清晰的架构和数据结构,现在我们可以深入核心的SCL代码了。我将把代码分成几个关键部分,并逐段解释其意图和注意事项。

4.1 初始化与复位逻辑

任何稳健的功能块都必须有可靠的初始化和复位机制。

// 第一部分:复位与初始化 IF bReset OR NOT bEnable THEN pOld := 0; pPrevious := 0; fSpeedFiltered_Pre := 0.0; fSpeedRaw := 0.0; fSpeedFiltered := 0.0; bDataValid := FALSE; iSampleCount := 0; // 注意:复位时不清除输入参数,只清状态 RETURN; // 复位期间直接返回,不执行后续计算 END_IF; // 使能状态下,计算周期时间(秒) rCycleTimeSec := TIME_TO_REAL(fCycleTime) / 1000.0;

实操心得:复位信号bReset最好与设备的“故障复位”或“初始化”按钮联动。NOT bEnable时也执行复位是一个好习惯,确保功能块禁用后内部状态是干净的,重新使能时从头开始。RETURN语句确保复位时后续计算逻辑被跳过,避免使用无效的历史数据。

4.2 脉冲值更新与溢出处理

编码器值通常来自高速计数器,可能是一个32位或64位的循环计数值。我们需要处理其溢出和周期变化。

// 第二部分:更新脉冲历史序列并处理溢出 // 假设iEncoderRawValue是HSC提供的连续计数值(可能溢出后从0开始) // 将当前值移入历史序列 pOld := pPrevious; // P(t-Δt) 变成更老的值 pPrevious := iEncoderRawValue; // 上次值更新为本次读取值 // 此时,pOld是上上次的值,pPrevious是上次的值,iEncoderRawValue是当前值。 // 处理DINT类型脉冲计数器的溢出:-2147483648 到 2147483647 // 计算差值时,考虑可能发生的溢出跳变 VAR deltaP: DINT; END_VAR // 计算从pOld到当前值的增量,考虑了一次溢出 deltaP := iEncoderRawValue - pOld; // 如果增量绝对值超过DINT正范围的一半(约10亿),则认为发生了溢出或反向跳变 // 这是一个简单的溢出补偿逻辑,适用于单向连续计数 IF deltaP > 2147483647 THEN // 正向溢出补偿 deltaP := deltaP - 4294967296; // 减去2^32 ELSIF deltaP < -2147483648 THEN // 负向溢出补偿(反向计数时) deltaP := deltaP + 4294967296; END_IF;

为什么需要溢出处理?PLC的高速计数器模块在达到数据类型的最大值后,会从最小值重新开始(对于无符号DINT是0,对于有符号DINT是-2147483648)。如果不处理,当值从最大值跳回最小值时,计算出的速度会是一个巨大的负值,导致速度显示瞬间“飙车”或“反转”。上述代码通过判断差值是否超过理论最大变化范围的一半,来检测并补偿一次溢出事件。对于双向计数或频繁溢出的场景,可能需要更复杂的周期累计逻辑。

4.3 核心速度计算(中心差分法)

这是算法的核心计算部分,代码简洁但内涵丰富。

// 第三部分:基于中心差分法计算原始速度 IF iSampleCount >= 2 THEN // 中心差分公式: V = (P_current - P_old) / (2 * T) // 此时,iEncoderRawValue 对应 P(t+Δt), pOld 对应 P(t-Δt) fSpeedRaw := (REAL(deltaP) / (2.0 * rCycleTimeSec)) * fPulseToUnit; bDataValid := TRUE; // 拥有足够历史数据,标志有效 ELSE fSpeedRaw := 0.0; bDataValid := FALSE; END_IF; // 增加采样计数,但限制其无限制增长 iSampleCount := iSampleCount + 1; IF iSampleCount > 10000 THEN iSampleCount := 3; // 保持一个大于2的值即可 END_IF;

关键点解析:

  1. iSampleCount >= 2:这是中心差分法能计算出第一个有效速度值的门槛。第一个周期,我们只有P(t);第二个周期,我们有了P(t+Δt)和P(t),但还缺P(t-Δt);直到第三个周期,我们才拥有计算第一个速度点(对应第二个周期中间时刻)所需的全部数据P(t+Δt),P(t),P(t-Δt)。因此条件设为>=2,实际上是从第三个采样点开始输出有效速度。bDataValid标志就是为了让下游逻辑知道何时可以信任这个速度值。
  2. 数据类型转换:deltaP是DINT,在与REAL型的时间、系数运算前,必须转换为REAL,否则会丢失小数精度。
  3. 脉冲当量fPulseToUnit的应用:这一步将“脉冲/秒”的单位转换为了工程单位(如“米/秒”)。例如,如果每个脉冲代表0.001米,周期是0.01秒,那么计算出的fSpeedRaw单位就是米/秒。

4.4 自适应滤波算法实现

这是让速度曲线从“毛刺丛生”变得“光滑如丝”的关键步骤。

// 第四部分:自适应滤波处理 VAR fDeltaV: REAL; fAlpha: REAL; END_VAR IF bDataValid THEN // 1. 计算本次原始速度与上次滤波速度的偏差绝对值 fDeltaV := ABS(fSpeedRaw - fSpeedFiltered_Pre); // 2. 根据偏差动态计算本次滤波系数 Alpha IF fDeltaV <= fThreshold_Small THEN // 小偏差,认为是噪声,强滤波 fAlpha := fAlpha_Min; ELSIF fDeltaV >= fThreshold_Large THEN // 大偏差,认为是真实变化,弱滤波,快速跟踪 fAlpha := fAlpha_Max; ELSE // 中等偏差,线性插值 fAlpha := fAlpha_Min + (fAlpha_Max - fAlpha_Min) * ((fDeltaV - fThreshold_Small) / (fThreshold_Large - fThreshold_Small)); END_IF; // 3. 应用一阶滞后滤波公式 fSpeedFiltered := fAlpha * fSpeedRaw + (1.0 - fAlpha) * fSpeedFiltered_Pre; // 4. 更新历史滤波速度值,用于下一次计算 fSpeedFiltered_Pre := fSpeedFiltered; ELSE // 数据无效时,保持滤波输出为0或上一次有效值(根据需求) fSpeedFiltered := 0.0; // 或 := fSpeedFiltered_Pre; END_IF;

参数整定经验:

  • fThreshold_Small(小阈值):这个值应略大于速度在绝对平稳状态下(如电机恒速运行)因噪声产生的最大波动幅值。可以通过观察fSpeedRaw在稳定时的曲线来估算。例如,如果波动范围在±0.02 m/s以内,可以设为0.05。
  • fThreshold_Large(大阈值):这个值应小于设备正常加减速时速度变化的典型斜率。例如,设备正常加速时,每秒速度变化可能达到0.5 m/s,那么可以设为0.3或0.4。它定义了“确信这是真实工艺变化”的门槛。
  • fAlpha_Min和fAlpha_Max:fAlpha_Min决定了对噪声的抑制强度,值越小越平滑,但延迟越大,通常0.05~0.2。fAlpha_Max决定了跟踪真实变化的速度,值为1时就是无滤波直接输出,值为0.8时仍有轻微平滑。通常设置在0.6~1.0之间。

注意事项:线性插值区间(fThreshold_Small到fThreshold_Large)让滤波系数的变化是连续的,避免了在阈值边界上系数突变导致的速度曲线不平滑。这个区间的宽度需要根据实际速度变化的动态特性来调整。

5. 工程应用与调试实战指南

代码写好了,扔进PLC里不一定就能跑出完美曲线。工业现场千变万化,调试是必不可少的环节。这一章,我结合几个实际项目案例,分享如何将这套算法落地,并解决那些让人头疼的问题。

5.1 硬件配置与信号接入要点

算法再优秀,如果源头信号有问题,一切都是空谈。编码器信号接入PLC是第一步,也是最容易埋坑的一步。

1. 编码器类型与PLC模块选型:

  • 增量式编码器:最常用,输出A、B、Z三相脉冲。需要接入PLC的高速计数器(HSC)通道。务必确认PLC的HSC模块最高频率是否满足编码器最大转速下的输出频率。例如,1000线编码器,转速3000转/分,频率 = (1000 * 3000) / 60 = 50 kHz。你的HSC模块必须能稳定捕获50kHz的信号。
  • 绝对值编码器:输出并行格雷码或通过总线(如SSI, Profibus, EtherCAT)通信。对于总线型,速度值可能直接通过通信报文获取,无需脉冲计数。我们的算法更适用于脉冲计数场景。

2. 接线与抗干扰:

  • 使用差分信号(如RS422):对于长距离传输或噪声环境,绝对不要用单端信号。差分对(A+/A-, B+/B-)抗共模干扰能力极强。
  • 屏蔽与接地:编码器电缆必须采用屏蔽电缆,屏蔽层在PLC端单点接地。动力线(电机电缆)必须与信号线分开走线,最好间隔30cm以上,避免平行走线。
  • 电源隔离:为编码器提供干净、稳定的隔离电源,避免因电源耦合引入噪声。

3. PLC侧配置(以西门子S7-1200/1500为例):

  • 在TIA Portal中配置高速计数器(HSC),工作模式通常选择“频率测量”或“计数”。对于测速,我们更关心累积计数值,因此“计数”模式更直接。
  • 设置正确的计数类型(增计数、减计数、AB相正交计数)。AB相4倍频可以提高分辨率,但也要确保HSC频率上限够用。
  • 在程序中,使用HC(高速计数器)硬件标识符,并通过CTRL_HSC指令或直接读取%ID地址(如ID1000)来获取当前计数值。我们的FB块的iEncoderRawValue输入,就连接这个值。

5.2 参数整定与曲线观察调试法

功能块下载后,第一步不是看速度值对不对,而是看原始脉冲值iEncoderRawValue是否在平稳、单向地增加(或减少)。可以在HMI上做一个趋势图,监控这个值。

调试步骤:

  1. 验证脉冲采集:手动盘动电机,观察iEncoderRawValue变化是否连续、无跳变。如果出现大幅回跳,检查编码器电源、接线或HSC配置。
  2. 观察原始速度fSpeedRaw:让设备以一个较低且恒定的速度运行。在HMI上绘制fSpeedRaw的趋势曲线。你会看到一条均值稳定但带有“毛刺”的曲线。这些毛刺的幅值,就是你设定fThreshold_Small的重要依据。
  3. 初步设置滤波阈值:让设备静止(理论速度应为0),观察fSpeedRaw的波动范围。假设在±0.03之间跳动,那么fThreshold_Small可以设为0.05。然后让设备执行一个标准的加减速过程,观察速度变化率。假设从0加速到1 m/s用了2秒,平均加速度0.5 m/s²,那么速度在每个采样周期(0.01s)的变化约为0.005。一个明显的加速指令下,fSpeedRaw的变化会远大于此。fThreshold_Large可以设为这个“明显变化”的下限,比如0.2。
  4. 调整滤波系数:fAlpha_Min从0.1开始尝试。如果滤波后速度在稳态时仍有肉眼可见的高频抖动,可以适当减小(如0.05)。如果发现设备启动时,滤波速度跟踪真实速度太慢,有迟滞感,就适当增大fAlpha_Max(如0.9)。
  5. 验证动态响应:这是最关键的一步。给设备一个阶跃速度指令(如从0突然到额定速度),同时观察fSpeedRaw(黄色)和fSpeedFiltered(绿色)两条曲线。
    • 理想情况:绿色曲线应该紧紧跟随黄色曲线的趋势,但在黄色曲线因噪声抖动时保持平滑。在速度突变点,绿色曲线应能快速跟上,没有明显的过冲或延迟。
    • 如果滤波后曲线反应迟钝:说明fAlpha_Max太小,或fThreshold_Large设得太大,导致系统在真实变化时也用了强滤波。需要调大fAlpha_Max或调小fThreshold_Large。
    • 如果滤波后曲线在稳态仍波动大:说明fAlpha_Min太大,或fThreshold_Small设得太小,导致系统对噪声的抑制不够。需要调小fAlpha_Min或调大fThreshold_Small。

实操心得:善用HMI的在线趋势图功能。将关键变量(原始值、滤波值、滤波系数α)都拖到同一个趋势图里,设置一个合适的采样间隔(如100ms)。通过观察曲线间的互动关系,你能非常直观地理解自适应滤波是如何工作的,参数调整也更有依据。

5.3 应对极端与异常情况

现场永远不会像实验室那么理想。下面是一些常见异常及应对策略。

1. 编码器断线或信号丢失:此时,iEncoderRawValue可能保持不变或跳变到0。我们的算法计算出的fSpeedRaw会突然变为0或一个异常值。这会导致fDeltaV巨大,触发fAlpha_Max,使得fSpeedFiltered快速向这个异常值靠拢,这是不希望的。

  • 改进方案:在计算fDeltaV之前,增加一个“信号有效性判断”。例如,如果连续多个周期iEncoderRawValue完全没有变化(在设备运行中不可能),则判定为信号故障。此时,可以强制将fAlpha设为0,让fSpeedFiltered保持故障前的最后一个有效值,并输出一个故障报警。这比输出一个0或异常值对工艺的冲击更小。

2. 采样周期(Δt)波动:我们的算法假设Δt是绝对恒定的。如果调用FB的OB周期被更高优先级的任务打断,或者OB30的周期设置不准确,会导致实际Δt波动,引入计算误差。

  • 解决方案:不要使用固定的fCycleTime参数,而是在FB内部读取系统的实时时钟。在每次执行时,用本次的绝对时间减去上次的绝对时间,得到精确的实际 elapsed time,用它作为Δt。这可以补偿扫描周期的微小抖动。SCL中可以使用RD_SYS_T函数获取系统时间。

3. 低速测量精度问题:在极低速时,一个采样周期内可能只采集到几个甚至零个脉冲。中心差分法虽然比M法好,但依然会因脉冲计数的离散性产生“台阶式”的速度变化。

  • 应对策略:对于极低速应用,可以考虑采用“T法”(测量固定脉冲数所需的时间)或“M/T法”(混合法)。但M/T法实现更复杂。一个折中的办法是,在低速段(通过fSpeedFiltered判断)自动切换到更长的等效计算窗口。例如,不是用相邻两个周期,而是用相邻5个周期的脉冲差除以5倍周期时间,相当于做了个平滑,牺牲一点响应速度换取低速稳定性。这可以在FB内通过速度值判断来自动切换模式。

6. 性能优化与高级扩展思路

当基本功能稳定后,我们可以从工程优化和功能扩展角度,让这个测速模块变得更加强大和鲁棒。

6.1 运算效率与扫描周期优化

SCL代码虽然可读性好,但在超高速应用或资源紧张的PLC上,仍需关注效率。

  • 减少不必要的类型转换:将rCycleTimeSec和2.0 * rCycleTimeSec在初始化时计算好,存入静态变量,避免每个周期都进行除法和乘法运算。
  • 简化自适应滤波的插值计算:如果线性插值区间不是必须的,可以直接使用两段式判断(小阈值用α_min,大阈值用α_max),省去乘除法。
  • 使用LREAL还是REAL?对于大多数速度测量,REAL(32位浮点)的精度足够。但在速度值非常小或脉冲当量极精细的场合(如纳米定位平台),累积计算可能导致精度损失,可以考虑在内部关键计算中使用LREAL(64位浮点),但要注意LREAL运算更耗时。

6.2 功能扩展:增加速度方向判断与加速度计算

基于现有的数据流,我们可以轻松衍生出更多有用信息。

  • 方向判断:在中心差分计算中,deltaP(即P_current - P_old)的符号就代表了速度方向。正数为正转,负数为反转。可以在FB中增加一个iDirection输出(如1代表正,-1代表反,0代表静止)。
  • 加速度计算:同样采用中心差分法,对滤波后的速度fSpeedFiltered再进行一次差分,即可得到加速度a = (V_filtered(t) - V_filtered(t-2Δt)) / (2*Δt)。这可以用来做设备的急加速/急减速保护,或者前馈控制。注意,对速度进行差分会放大噪声,因此必须使用滤波后的速度进行计算,并且可能需要对加速度结果再进行一次轻度的固定参数滤波。

6.3 与控制系统集成:作为PID的速度反馈

这是我们做测速的终极目的之一。将fSpeedFiltered作为PID控制器的过程值(PV)。

  • 采样周期同步:PID控制器(通常也是一个FB)也应在同一个周期中断OB中调用,确保速度反馈值与控制运算在时间上对齐,避免引入额外的相位滞后。
  • 滤波延迟的补偿:自适应滤波会引入一个与α系数相关的可变延迟。在要求极高的闭环控制中,这个延迟可能影响稳定性。一种高级做法是,将当前使用的α系数也作为一个输出,并估算出平均的滤波时间常数τ = Δt * (1-α)/α。在有些模型预测或前馈补偿算法中,可以考虑这个延迟。但对于绝大多数通用PID应用,只要滤波参数设置合理(α在跟踪变化时足够大),这个延迟的影响微乎其微。

经过以上从理论到代码,从调试到扩展的完整梳理,这套基于中心差分法和自适应滤波的PLC编码器测速方案,已经从一个简单的想法,变成了一个经得起工业现场考验的可靠工具。它平衡了精度、响应速度和抗干扰性,其模块化的SCL实现也便于在不同的项目和PLC平台间移植和复用。记住,好的算法是基础,但深刻的现场理解和细致的调试才是让它真正发挥威力的关键。希望这份超详细的拆解,能帮你下次面对跳动不止的速度显示时,心中多一份淡定,手里多一个利器。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询