无Codesys经验:如何提取传感器触发时间戳并导出为CSV?
无IIoT Library SL情况下的CODESYS数据采集与CSV存储方案
一、完善事件时间戳、间隔及总时长记录
你现有的代码只能记录单次事件的开始时间和实时耗时,要实现事件间隔(上一次结束到本次开始的时间)和总运行时长累计,得补充变量和触发逻辑:
新增变量定义
VAR tStarted, tElapsed : TIME; tLastEnd : TIME; // 存储上一次事件结束的时间戳 tEventInterval : TIME; // 事件间隔(上一次结束→本次开始) tTotalRuntime : TIME; // 累计总运行时长 xEventActive : BOOL; // 标记当前事件是否在运行 fbR_TRIG_Start : R_TRIG; // 启动信号上升沿触发 fbF_TRIG_End : F_TRIG; // 结束信号下降沿触发(xEnd是你实际的事件完成传感器信号) END_VAR
核心逻辑实现
// 事件启动触发(xStart是你的启动传感器信号) fbR_TRIG_Start(CLK := xStart); IF fbR_TRIG_Start.Q THEN tStarted := TIME(); // 非首次启动时计算事件间隔 IF tLastEnd > T#0MS THEN tEventInterval := tStarted - tLastEnd; END_IF; xEventActive := TRUE; END_IF; // 事件结束触发(xEnd是事件完成的传感器信号,比如步骤结束的布尔值) fbF_TRIG_End(CLK := xEnd); IF fbF_TRIG_End.Q THEN tElapsed := TIME() - tStarted; tTotalRuntime := tTotalRuntime + tElapsed; // 累计总时长 tLastEnd := TIME(); // 更新上一次结束时间 xEventActive := FALSE; // 这里触发CSV写入逻辑 END_IF; // 事件运行中实时更新当前耗时 IF xEventActive THEN tElapsed := TIME() - tStarted; END_IF;
二、免费CSV文件存储方案(不用付费库)
CODESYS自带标准文件操作函数块,直接用FileOpen/FileWrite/FileClose就能实现CSV写入,完全不需要付费库:
1. 文件操作相关变量
VAR hFile : FILE_HANDLE; // 文件句柄 sCSVLine : STRING(255); // 单条CSV记录字符串 bFileOpened : BOOL; // 文件是否已打开标记 iWriteResult : INT; // 写入结果(0=成功,非0=错误) sCSVHeader : STRING := "事件序号,开始时间戳(ms),结束时间戳(ms),单次耗时(ms),事件间隔(ms),总运行时长(ms)"; nEventCount : INT := 0; // 事件计数 END_VAR
2. 写入CSV的逻辑(放在事件结束触发里)
IF fbF_TRIG_End.Q THEN nEventCount := nEventCount + 1; // 把TIME转成毫秒数(CODESYS的TIME本质是毫秒整数,用TO_DWORD直接转) sCSVLine := CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT( INT_TO_STRING(nEventCount), ","), DWORD_TO_STRING(TO_DWORD(tStarted))), ","), DWORD_TO_STRING(TO_DWORD(tLastEnd))), ","), DWORD_TO_STRING(TO_DWORD(tElapsed))), ","), DWORD_TO_STRING(TO_DWORD(tEventInterval))), ","), DWORD_TO_STRING(TO_DWORD(tTotalRuntime)); // 第一次打开文件时写入表头 IF NOT bFileOpened THEN // 路径根据你的系统改:Windows用C:\xxx,PLC嵌入式系统用/var/xxx这类路径 hFile := FileOpen(sFileName := "C:\sensor_data\event_records.csv", nMode := FILE_MODE_APPEND OR FILE_MODE_CREATE); IF hFile <> 0 THEN FileWrite(hFile, sCSVHeader); FileWrite(hFile, '\n'); // 换行 bFileOpened := TRUE; END_IF; END_IF; // 写入当前事件数据 IF bFileOpened THEN iWriteResult := FileWrite(hFile, sCSVLine); FileWrite(hFile, '\n'); END_IF; END_IF;
3. 注意事项
- 路径要确认可访问:Windows系统直接用绝对路径;PLC要选文件系统有权限的目录,比如
/opt/codesys/data/ - TIME转毫秒:后续AI训练时,把毫秒数转成时间格式即可,比存字符串方便处理
- 错误处理:可以把
iWriteResult的值映射到HMI指示灯,方便排查文件写入失败的问题(比如路径不存在、权限不够)
三、简化数据导出(不用手动复制)
如果你的PLC支持WebVisu或者HMI,直接把tStarted/tElapsed/tEventInterval这些变量放到可视化页面,实时查看;也可以用CODESYS自带的变量导出功能:
- 在线模式下,右键变量列表→
Export→CSV,可以批量导出当前变量值;也可以在项目中配置定时任务,自动导出到指定路径
内容的提问来源于stack exchange,提问作者andrej alabama
相关产品推荐
相关产品推荐

