▎西门子博途 LGF 库详解 · 03:计数器操作——从 BitCount 到边沿捕获
继续 LGF 详解系列。上一篇讲了日期与计时器,这篇聚焦一个更基础的需求:计数。PLC 里到处是计数需求——这个 DWord 里有几个 1?数组有多少个元素?信号上升了几次?LGF 的计数器组给了 6 个标准化答案。
文末有 GetBitStates 的一个特殊用法——它可以替代 32 个独立的边沿检测块,建议看到最后。
一、6 个块一览
计数器操作组(4.3 Counter operations)
| 块名 | 类型 | 版本 | 一句话功能 |
|------|------|------|-----------|
| LGF_BitCount | FC | V3.0.2 | 统计 DWord 中 1 和 0 的个数 |
| LGF_CountArrayElements | FC | V1.0.0 | 统计 Variant 数组的元素数量 |
| LGF_CountBooleanEdges | FB | V1.0.0 | 在监测时间内统计脉冲边沿数 |
| LGF_CountFalInDWord | FB | V3.0.1 | 统计 DWord 中 1→0 的下降沿次数 |
| LGF_CountRisInDWord | FB | V3.0.1 | 统计 DWord 中 0→1 的上升沿次数 |
| LGF_GetBitStates | FB | V1.0.0 | 全面检测输入变化:变化位/上升位/下降位 |
二、引脚详解
#### LGF_BitCount
| 引脚 | 类型 | 方向 | 说明 |
| value | DWord | IN | 要统计位数的值 |
| numberOfBits | USInt | IN | 有效位数(Byte=8, Word=16, DWord=32) |
| Ret_Val | Void | OUT | 无返回值 |
| countBitsFalse | USInt | OUT | 值为 0 的 bit 数量 |
| countBitsTrue | USInt | OUT | 值为 1 的 bit 数量 |
#### LGF_CountArrayElements
| 引脚 | 类型 | 方向 | 说明 |
| array | Variant | IN | 要统计的数组 |
| Ret_Val | DInt | OUT | 元素个数;-1=非数组,-2=Bool 数组不支持 |
#### LGF_CountBooleanEdges
| 引脚 | 类型 | 方向 | 默认值 | 说明 |
| trigger | Bool | IN | FALSE | 待监测的信号(上升沿计数) |
| monitorTime | Time | IN | T#1s | 监测时间窗口 |
| single | Bool | OUT | — | 监测期内恰好 1 个边沿 |
| double | Bool | OUT | — | 监测期内恰好 2 个边沿 |
| long | Bool | OUT | — | 监测期内仅 1 个边沿(持续为高) |
| severalEdges | Bool | OUT | — | 监测期内多于 2 个边沿 |
| noOfEdges | USInt | OUT | — | 边沿总数 |
#### LGF_CountFalInDWord / LGF_CountRisInDWord
| 引脚 | 类型 | 方向 | 默认值 | 说明 |
| value | DWord | IN | 16#00000000 | 待检测的 DWord 值 |
| numberOfEdges | Int | OUT | — | 下降沿/上升沿次数 |
#### LGF_GetBitStates
| 引脚 | 类型 | 方向 | 默认值 | 说明 |
| value | DWord | IN | 16#00000000 | 待检测的值 |
| hasChanged | Bool | OUT | — | 相比上一周期有变化 |
| hasRisingEdges | Bool | OUT | — | 存在上升沿 |
| risingBits | DWord | OUT | — | 上升沿位图(变化的位=1) |
| noOfRisingBits | USInt | OUT | — | 上升沿数量 |
| hasFallingEdges | Bool | OUT | — | 存在下降沿 |
| fallingBits | DWord | OUT | — | 下降沿位图 |
| noOfFallingBits | USInt | OUT | — | 下降沿数量 |
三、实战案例
#### 案例 1:GetBitStates 替代 32 个独立边沿检测
你有一个 32 位的状态字,需要监控每一位是否发生了变化。传统做法:写 32 个 R_TRIG,配 32 个背景 DB。用 GetBitStates:
GetBitStates 集中边沿检测
调用一个块检测所有 32 位的边沿变化:
LGF_GetBitStates(value := statusWord,
risingBits => risingMap,
noOfRisingBits => risingCount,
fallingBits => fallingMap,
hasChanged => anyChange);
一个块,一个背景 DB,覆盖 32 位的全部边沿。risingBits 的每一位对应 statusWord 中发生 0→1 变化的位置——比如 bit 3 = 1,说明第 3 位发生了上升沿。
#### 案例 2:CountBooleanEdges 做抖动过滤
传感器信号有抖动,需要区分"真实触发"和"噪声"。设定 monitorTime = 200ms:如果 200ms 内只检测到 1-2 个边沿(single 或 double 为 TRUE),是正常触发;如果 severalEdges 为 TRUE(超过 2 个边沿),说明信号在抖动。
四、总结与下载
下载信息
| 项目 | 内容 |
|------|------|
| 库名称 | Library of General Functions (LGF) |
| SIOS-ID | 109479728 |
| 下载地址 | 中文站:www.ad.siemens.com.cn/download/documentdetail_12471.html |
| 当前版本 | V5.1.1(中文站最新;全球站另有 V5.2.1) |
| 费用 | 完全免费 |
> 本文数据以 V5.1.1 官方文档为准。全球站:support.industry.siemens.com/cs/document/109479728
下篇预告:04——比较操作。从二进制掩码比较到 LReal 精度比较,5 个块帮你解决浮点数 "等于" 的老大难问题。
如果这篇文章对你有帮助,欢迎点赞、在看、转发。