当前位置: 首页 > news >正文

西门子PLC精确计算设备运行时间程序(1200PLC与1500PLC通用)——改良版实时时间比较法

西门子PLC精确计算设备运行时间程序,1200PLC和1500PLC通用,两次读取PLC的实时时间做比较,这样就可以不算入PLC每次扫描时间,非常准确的记录设备运行时间。 虽然西门子官方有案例,但是不好用,我进行了改良,可以非常合适的应用到项目里。

搞工控的兄弟应该都遇到过这种需求——得精确统计设备运行时间。西门子PLC自带的时间记录功能用过的都知道,那玩意儿就跟闹着玩似的,扫描周期造成的误差能气死人。今天分享个野路子,直接读取两次PLC系统时间做对比,误差控制在毫秒级。

先上核心代码:

VAR FirstScanTime: DT; //第一次读取时间戳 LastScanTime: DT; //第二次读取时间戳 RunTimeAccumulator: TIME; //运行时间累加器 END_VAR IF "设备运行信号" THEN FirstScanTime := RD_SYS_T(); //首次抓取系统时间 //...中间可能有其他逻辑 LastScanTime := RD_SYS_T(); //再次抓取系统时间 RunTimeAccumulator := RunTimeAccumulator + (LastScanTime - FirstScanTime); END_IF;

这代码的精髓在于两次读取系统时间。PLC的扫描周期虽然不稳定,但两次读取动作发生在同一个扫描周期内,系统时间的差值刚好就是程序处理实际业务逻辑的时间。注意这里用DT数据类型(DATEANDTIME)直接相减会自动转成TIME类型,省去了类型转换的麻烦。

西门子PLC精确计算设备运行时间程序,1200PLC和1500PLC通用,两次读取PLC的实时时间做比较,这样就可以不算入PLC每次扫描时间,非常准确的记录设备运行时间。 虽然西门子官方有案例,但是不好用,我进行了改良,可以非常合适的应用到项目里。

实际项目里我习惯在OB1开头和结尾各放一个RDSYST:

//OB1开头 #StartTime := RD_SYS_T(); //...主程序逻辑 //OB1结尾 #EndTime := RD_SYS_T(); #RunTimeAccumulator += (#EndTime - #StartTime);

这种写法有个隐藏福利——就算PLC突然断电,累加器数值也不会清零。当然记得要在DB块里设置保持属性,不然重启后数据就飞了。

遇到过最坑爹的情况是跨午夜时间计算,这时候得处理日期变更:

IF DATE_TO_DINT(#EndTime.DATE) > DATE_TO_DINT(#StartTime.DATE) THEN //处理跨天的情况 #TempTime := DINT_TO_TIME(86400000) - #StartTime.TOD; //计算当天剩余时间 #RunTimeAccumulator := #RunTimeAccumulator + #TempTime + #EndTime.TOD; ELSE //正常时间差计算 #RunTimeAccumulator := #RunTimeAccumulator + (#EndTime - #StartTime); END_IF;

这段处理跨天的逻辑建议封装成FC块,调用起来方便。实测误差可以控制在PLC系统时钟精度范围内(约±2秒/天),比用计数器统计靠谱多了。

最后提醒下,别在中断OB里用这招,中断程序的执行时间会被算到主程序头上。要是项目对时间精度要求变态级,可以挂个硬件时钟模块,不过那又是另一个故事了...

http://www.jsqmd.com/news/473739/

相关文章:

  • C++学习日志——面向过程篇3.11
  • 架构2
  • ADRC双环自抗扰控制永磁同步电机矢量控制伺服系统Matlab仿真探索
  • IT系统全生命周期管理和运营方案(Word)
  • PYTHON学习笔记3
  • 代码随想录算法训练营第十天 | 用栈实现队列、 用队列实现栈、有效的括号、删除字符串中的所有相邻重复项
  • OFDM MQAM在衰落信道下误比特率性能仿真探索
  • python语法学习
  • Simulink双三相永磁同步电机控制仿真! 1.矢量控制,包括两种电机建模,VSD模型和双d...
  • STM32单片机开发的空气净化器:原理、设计与源码详解,适合开发人员
  • 探索多机器人协同编队避障算法:从人工势场到动态窗口
  • 从空白文档到合格初稿:Paperzz 毕业论文智能写作,让毕业生告别 “选题 - 文献 - 提纲” 三重焦虑
  • KPCA - ISSA - SVM分类预测:MATLAB实战与模型对比
  • Pyrene-PEG-NH2 氨基功能化芘荧光PEG活细胞成像与示踪探针
  • 产品推荐|40分区光控照明系统
  • 自动化测试中JSONPath 是解析复杂 JSON 响应的核心工具
  • binning模式下和normal模式下相同曝光参数相同场景加权亮度差异消除方案
  • LabVIEW图像处理框架核心结构示意图
  • 搞嵌入式开发的小伙伴应该都遇到过PID调参这个头疼的问题吧?今天咱们直接上干货,聊聊怎么在STM32上玩转PID自整定和温度控制。先扔个核心代码片段镇楼
  • HCSR04超声波测距仿真示例
  • 解决OpenWeatherMap API秘钥激活后仍无法使用
  • 基于STM32的电机控制器:Keil与Proteus的嵌入式之旅
  • 鸿蒙中 应用的权限(一)
  • 心理聊天App 5款产品实测对比,哪个更适合情绪内耗的你?
  • 内存涨价、供应不稳?嵌入式工程师必看:适合轻量级项目ARM选型与存储避坑指南
  • GESP C++一级认证完全指南:考点解析与备考策略
  • SpringBoot3实战集成mzt-biz-log,一行代码搞定业务日志记录
  • 电网电压扰动下相光伏并网逆变器控制的Simulink仿真探索
  • 技术人思维看渠道品牌管理:如何让“多渠道不走样”成为可执行的工程化规则?
  • 基于Matlab的螺丝轮廓识别:数字图像处理流程