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

如何在CODESYS Control for Linux SL中获取纳秒级精度RTC时钟?

解决方案:获取纳秒级RTC时间的两种可行方式

针对你的场景(CODESYS Control for Linux SL 3.5.15.10 演示模式,Ubuntu 16.04),有两种免费且可行的方法来获取和C语言clock_gettime(CLOCK_REALTIME)等效的纳秒级RTC时间戳:

方法1:自行封装外部C代码(最直接可靠)

CODESYS支持调用外部C函数,你可以自己写一个极简的封装函数,直接调用Linux系统的clock_gettime接口,完全免费且演示模式可用。

步骤1:编写C封装代码

创建一个.c文件,内容如下:

#include <time.h>
#include <stdint.h>

// 封装CLOCK_REALTIME的纳秒时间戳获取
uint64_t GetNanoRTC_Timestamp(void) {
    struct timespec ts;
    // 调用系统的实时时钟接口
    clock_gettime(CLOCK_REALTIME, &ts);
    // 转换为纳秒级时间戳(秒*1e9 + 纳秒部分)
    return (uint64_t)ts.tv_sec * 1000000000ULL + ts.tv_nsec;
}

步骤2:在CODESYS中配置外部C代码

  1. 在你的CODESYS项目中,右键点击Application → 添加对象 → 选择External C Code。
  2. 将上面的C代码粘贴到外部C代码对象的编辑窗口中。
  3. 配置编译选项:在外部C代码对象的属性中,Compiler Options添加-lrt(Ubuntu 16.04中clock_gettime需要链接实时库,部分新版本系统可能不需要,但加上更保险)。

步骤3:在IEC程序中声明并调用函数

在CODESYS的ST程序中,声明外部函数(注意CODESYS的LWORD对应C的uint64_t):

FUNCTION GetNanoRTC_Timestamp : LWORD
VAR_EXTERNAL
END_VAR
END_FUNCTION

之后就可以在程序中直接调用这个函数,获取纳秒级的实时RTC时间戳:

PROGRAM Main
VAR
    ui64NanoTimestamp : LWORD;
END_VAR

ui64NanoTimestamp := GetNanoRTC_Timestamp();
// ui64NanoTimestamp就是和你提供的C代码逻辑完全一致的纳秒级RTC时间戳

方法2:检查CODESYS免费扩展库

虽然内置标准库没有,但你可以查看CODESYS Store中的免费Linux相关扩展,比如CODESYS Runtime Toolkit for Linux的基础功能部分,不过这个方法不如自行封装直接——因为很多免费扩展可能也只是封装了相同的系统调用,而且需要确认演示模式是否允许使用。

关键注意事项

  • 演示模式限制:CODESYS Control for Linux SL的演示模式通常只限制连续运行时间(比如1小时后重启),不会限制外部C代码调用这类基础功能,所以方法1完全可用。
  • 时钟类型:确保使用CLOCK_REALTIME而不是CLOCK_MONOTONIC,前者对应系统的实时RTC时间(和本地时间同步),后者是系统启动后的单调时间,和你提到的SysTimeGetNs功能一致。

内容的提问来源于stack exchange,提问作者Alexander Chumakov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:41:44