『7x24小时有问必答』

▎西门子博途 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
引脚类型方向说明
valueDWordIN要统计位数的值
numberOfBitsUSIntIN有效位数(Byte=8, Word=16, DWord=32)
Ret_ValVoidOUT无返回值
countBitsFalseUSIntOUT值为 0 的 bit 数量
countBitsTrueUSIntOUT值为 1 的 bit 数量
#### LGF_CountArrayElements
引脚类型方向说明
arrayVariantIN要统计的数组
Ret_ValDIntOUT元素个数;-1=非数组,-2=Bool 数组不支持
#### LGF_CountBooleanEdges
引脚类型方向默认值说明
triggerBoolINFALSE待监测的信号(上升沿计数)
monitorTimeTimeINT#1s监测时间窗口
singleBoolOUT监测期内恰好 1 个边沿
doubleBoolOUT监测期内恰好 2 个边沿
longBoolOUT监测期内仅 1 个边沿(持续为高)
severalEdgesBoolOUT监测期内多于 2 个边沿
noOfEdgesUSIntOUT边沿总数
#### LGF_CountFalInDWord / LGF_CountRisInDWord
引脚类型方向默认值说明
valueDWordIN16#00000000待检测的 DWord 值
numberOfEdgesIntOUT下降沿/上升沿次数
#### LGF_GetBitStates
引脚类型方向默认值说明
valueDWordIN16#00000000待检测的值
hasChangedBoolOUT相比上一周期有变化
hasRisingEdgesBoolOUT存在上升沿
risingBitsDWordOUT上升沿位图(变化的位=1)
noOfRisingBitsUSIntOUT上升沿数量
hasFallingEdgesBoolOUT存在下降沿
fallingBitsDWordOUT下降沿位图
noOfFallingBitsUSIntOUT下降沿数量

三、实战案例

#### 案例 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 个块帮你解决浮点数 "等于" 的老大难问题。
如果这篇文章对你有帮助,欢迎点赞、在看、转发

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码