You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:31:10