如何用Codesys为Weintek PLC编写梯形图实时累加批次计数器秒数?
实时累加批次计数器秒数的梯形图方案(Weintek PLC + Codesys)
核心思路是逐扫描周期捕捉批次计数器的增量,仅累加正增量,无需等待批次结束即可实时更新总累加值。以下是具体实现步骤:
1. 定义变量
在Codesys变量表中创建以下变量(可放在全局变量区或自定义功能块内):
g_iBatchCounter:INT,映射Weintek PLC的批次计数器实时值(只读)g_iPrevBatchCounter:INT,存储上一扫描周期的批次计数器值g_iTotalAccumulator:DINT,总累加秒数(用双整数避免长时间运行溢出)g_bBatchStartFlag:BOOL,标记新批次启动状态
2. 梯形图梯级逻辑
梯级1:批次切换检测
- 输入逻辑:
g_iBatchCounter<g_iPrevBatchCounterANDg_iBatchCounter<= 10(阈值可根据实际计数器波动调整) - 输出动作:置位
g_bBatchStartFlag(触发新批次标记)
梯级2:实时增量累加
- 输入逻辑:
NOT g_bBatchStartFlagAND (g_iBatchCounter-g_iPrevBatchCounter) > 0 - 执行动作:
g_iTotalAccumulator := g_iTotalAccumulator + (g_iBatchCounter - g_iPrevBatchCounter)仅累加正增量,避免批次切换时的反向扣减
梯级3:更新状态与复位标志
- 无条件执行:
g_iPrevBatchCounter := g_iBatchCounter(保存当前周期计数器值,供下一周期对比)g_bBatchStartFlag := FALSE(复位批次启动标志)
3. 优化注意事项
- 溢出防护:若系统长期运行,建议将
g_iTotalAccumulator改为LINT(长整数)类型,彻底避免溢出。 - 扫描周期适配:如果PLC扫描周期大于1秒,可能遗漏计数器变化,可改用1秒定时中断程序执行累加逻辑,保证每秒捕捉一次计数器值。
- 阈值校准:批次切换的阈值(如示例中的<=10)需根据现场计数器的初始波动调整,避免误触发批次标记。
内容的提问来源于stack exchange,提问作者Modicon
相关产品推荐
相关产品推荐

