施耐德 M580 PLC 实时时钟的使用
本文讨论了施耐德M580系列PLC的时钟相关内容涵以下关键内容:M580编程平台的时间相关变量类型、使用NTP协议通过CPU网口或NOC网卡的网口进行时钟同步、使用内置功能块读写CPU时钟、对时间日期数据的计算操作、将时间日期格式与分开的年月日时分秒数组进行相互转换等操作。为工业自动化场景提供完整解决方案。
20251129更新:官方解析视频
官方视频介绍了RRTC_DT、WRTC_DT功能块的用法、DT 转换为分散时间数值的方法
视频网址:【M580系统时钟应用】-术高莫用_哔哩哔哩_bilibili
M580 平台使用的时间相关的变量
- 十进制类型的时间:
Time时间段
- BCD格式的时间:
D、TOD、DT|
D,日期 date,只有日期没有时间,格式D#YYYY-MM-DD
TOD,时间 time of day,一天内的时间,只有时间没有日期(范围 24 小时),格式TOD#hh:mm:ss
DT,日期时间,相当于D+TOD,格式DT#YYYY-MM-DD-hh:mm:ss
使用 NTP 协议通过网络对时
施耐德 M580 系列 PLC,支持基于以太网的 NTP 对时协议
使用 NTP 协议进行对时,只需要进行组态配置,不需要编写程序,简单便捷,效果可靠
M580 CPU 网口使用 NTP 对时
M580 CPU 模块的网口支持使用 NTP 对时,只需要进行组态配置,不需要编写程序
- 双击左侧组态界面中的CPU网口(EIO),进入右侧网口配置
- 在右侧配置,双击【通道0】,然后点击【NTP】选项卡 ,进入 NTP 对时配置

具体设置内容
- 修改配置后,点击上方的 【√】符号保存设置。
4. 保存设置后,需要重新编译并下载程序
NOC0301 网卡模块使用 NTP 对时
注意:
- NOC 模块只有高硬件版本才支持将对时时间同步到 CPU,低版本没有这个选项
- 且组态时需要选定高版本的固件版本
(施耐德的 NOC 模块一旦组态后无法更改型号,要改型号只能删掉重新配置,需要特别注意)
M580 CPU 模块的网口支持使用 NTP 对时(需要注意组态和固件版本),只需要进行组态配置,不需要编写程序
NOC 网卡对时配置
- 检查组态的 NOC 模块的硬件版本(只能选择 .4 以上的版本,要求模块的固件版本应 >=2.05)

- 打开 DTM 配置界面:点击最上方【工具】–>【DTM 浏览器】,在左侧弹出窗口中双击要配置的模块,右侧会弹出此模块的 DTM 配置界面

- 开启时钟服务:在模块的DTM配置界面,点击【服务】–>网络时间服务下拉框,改成“已启用”–> 点击右下角“应用”–> 应用配置后,左侧会出现【网络时间服务】的选项。应用配置后需要重新编译并下载程序
- 点击“应用”相当于修改了模块的组态配置,会提示要求进入离线状态,不能在线修改。在修改完成后需要重新下载程序到CPU中
- 配置 NTP 客户端:点击左侧【网络时间服务】选项,进入NTP配置界面。相关选项类似CPU的配置,配置完成后,点击“应用”即可保存配置。修改配置后需要重新编译并下载程序
注意最下面有个选项(CPU时间更新),把这个勾上,就能通过这个模块更新CPU的系统时间
(这个选项是翻译的,跟文档中的选项名称对不上,但是意思是文档中的这个意思)
- 点击“应用”相当于修改了模块的组态配置,会提示要求进入离线状态,不能在线修改。在修改完成后需要重新下载程序到CPU中
- 如果没有这个选项,请按照第 1 步,检查网卡模块 NOC 在组态界面中的版本是否正确
M580 PLC 的时钟使用
时钟通常都能读写,同时还要将时间格式进行转换 或 进行时间上的加减计算,供其他程序使用
通过系统字读取
通过系统字可以直接读取 CPU 时钟的时间(格式为: UTC 时间,BCD 格式)
参考 M580 手册:

注意:这里读取到的系统时间是 UTC 时间,且为 BCD 格式,即 BCD 格式的 INT 数组。需要进行处理和转换才能作为本地时间使用(如将 UTC 时间转换为北京时间需要 + 8 小时等)
存储到 INT 数组中,可按照最后 2 章的内容进行日期格式的转换的换算
RRTC_DT 指令:本地时间
时钟时间和本地时间
- 时钟时间:即上一章节通过系统字直接读取的时间,统一为 UTC 时区格式
- 本地时间,当前项目文件中配置的时区对应的时间,可根据需要配置时区、夏令时等选项
读取本地时间
注意:本地时间无法通过 PLC 中的指令进行修改,只能在组态项目(下面步骤)中进行设置
- 在 PLC 的项目配置中,选择正确的时间选项(时区、夏令时等)
工具 --> 项目设置 --> 时间 --> 时区,设置正确的时区 --> 点击【确定】保存修改
修改后需要重新编译项目
- 在程序段中调用
RRTC_DT程序块
- 程序块输出的数据类型为 DT 类型(日期时间格式)
- 输出的时间即为项目中设定的“本地时间”
RRTC_DT_MS 指令:精确的 UTC 时钟时间
上面的RRTC_DT最高精度只有秒级,如果需要更精确的时间,应使用RRRC_DT_MS指令。
(这里的翻译翻的稀烂,不要被“网络”这个字眼所迷惑,实际上这个指令就是更精确的PLC系统时钟,只是网络对时指令也使用相关的数据类型罢了)


其中:
- “显示格式 (OUT1)” :以人性化的角度展示当前 PLC 的实时时钟(UTC 时间)
数据类型Display_NTPC结构体,包含:- 当前时间(时钟时间,UTC 时区,DT类型)
- 额外毫秒时间(INT类型,精度整10ms)
- 计算格式 (OUT2):以时间戳角度展示当前 PLC 的实时时钟(UTC 时间)
数据类型Calc_NTPC结构体,包含:- 当前时间戳(UDINT类型,包含日期+秒级时间,但起始时间是从 1980 年开始算,且是 UTC 时区)
- 额外毫秒时间(INT类型,精度整10ms)
RRTC_DT_MS 指令输出换算 Unix 时间戳
标准 Unix 时间戳定义:自 1970-01-01 00:00:00 至今经历的秒数,UTC时间
注意:Unix 时间戳不包含时区信息,实际本地时间需要手动换算时区
标准 Unix 时间戳 = RRTC_DC_MS 获取的 Calc.seconds 值 + 基点偏移
其中:
- 基点偏移 = 从 1970-01-01 00:00 到 1980-01-01 00:00:00 的时间 = 10年 = 315504000 秒
- 时区偏移 = 北京时间为 UTC+8,即 UTC 时间基础上 +8 小时 = 28800 秒
可知:
- 标准 Unix 时间戳 = RRTC_DC_MS 获取的 Calc.seconds 值 + 315504000
- 本地时间戳 = RRTC_DC_MS 获取的 Calc.seconds 值 + 315504000 + 28800
例程:RRTC_DT_MS 使用及时间戳换算
根据要求定义一个DDT数据类型TEST_NTP_DATE,使用仿真器测试调用此程序(仿真器无法仿真UTC时间):
定义一个TEST_NTP_DATE类型的变量TEST_NTP_DATE1
调用RRTC_DT_MS功能块,将功能块输出到这个变量
查看变量的值:可看到 DT_TIME 中显示的是 DT 时间 + 毫秒数,STATMP_TIME 中显示的是秒时间戳+毫秒数
(仿真器无法仿真 UTC 时间,所以看到的是北京时间,实际 PLC 中返回的是从 1980 年开始算的 UTC 时间)
Calc.seconds值转换为 Unix 标准时间戳,与实际时间相差了 10 年:
加上 10 年(315504000 秒)后的时间戳与实际时间一致:
1432139456 + 315504000 = 1747643456
总结:两种时钟指令的异同
RRTC_DT_MS指令与RRTC_DT的连续与区别,总结如下:
| 指令 | 功能 | 输出1 | 输出2 | 时区 |
|---|---|---|---|---|
| RRTC_DT | 本地时间时钟 | DT格式,本地时间 | X | 本地时间,由项目设定而定 |
| RRTC_DT_MS | UTC时间ms时钟 | Display_NTPC - DT类型,UTC时间 - INT类型,额外毫秒时间 |
Calc_NTPC - UDINT类型,1980 年起的秒级时间戳 - INT类型,额外毫秒时间 |
UTC时间 |
注意事项:
- RRTC_DT 返回的 DT 时间为本地时间,不需要进行时区换算
- RRTC_DT_MS 返回的 DT 时间(输出1)为 UTC 时间,需要进行时区换算
- RRTC_DT_MS 返回的 时间戳(输出2)为 1980 年起的 UTC 时间,需要进行计时基点划算、时区换算
实际使用两种指令的建议
实际使用中,可通过两者组合实现精确的本地时间获取
场景1:获取分寄存器的时间:
- 使用
RRTC_DT获取本地时间(年、月、日、时、分、秒,本地时区) - 使用
RRTC_DT_MS获取时间毫秒值(读取输出1或输出2中的额外毫秒时间)
场景2:获取时间戳时间:
- 使用
RRTC_DT_MS直接获取 UTC 时间戳、毫秒时间 - 手动计算标准 Unix 时间(使用加减法更正起始时间、时区)
WRTC_DT 指令:手动设置 CPU 时钟
如果无法通过 NTP 进行对时,也可通过WRTC_DT功能块,通过编程设置 CPU 的时钟
注意:
- 需要传入一个 DT 类型(时间日期类型)的值,包含完整的年、月、日、时、分、秒
- 这里要是“时钟时间”:应传入一个 UTC 时区的时间值(与系统字 %SW49~%SW53 中的定义相同)
- 这里设置的时间是系统的【时钟时间】,而不是的【本地时间】(记录了时区信息的时间)
【本地时间】无法通过 M580 中的指令进行修改(指令无法对系统时区进行修改),只能在组态软件的项目中中进行修改(见前面章节的配置)
时间格式的基本使用
对 DT 时间格式进行增减
建议将时间先转换为 DT 格式(参考最后一章),然后再调用时间相关的函数对时间进行操作,保证时间计算的准确性(如进位、退位等计算问题)
相关函数:基本上常用的时间都能计算
(***:根据变量类型不同,***处填写不同的值,文档里这种写函数名也是够抽象的。。。)

具体内容
| 时间函数 | 文档介绍 |
|---|---|
| 时间相加 (ADD_TIME) |
![]() |
| 时间相减 (SUB_TIME) |
![]() |
| 计算两时间差 (SUB_) |
![]() |
这里以 减去时间 举例
从实时时钟读取本地时间(北京时间,UTC+8)后,使用SUB_DT_TIME计算 UTC 时间
计算公式:UTC时间 = 北京时间 - 8小时

运行结果

例程:将 DT 时间格式转换为 INT 类型数组
整体思路:调用转换函数转换为 INT 类型数组,将数组中的数据拆分,最后转换为 BCD 码
简单程序

以上程序的输出结果
- 输入(接入 DT_TO_ARINT 函数):待转换的 DT 类型日期时间值
- 结果1:BCD码时间
| 数组 | 高8位 | 低8位 |
|---|---|---|
| RES_DT_BCD[0] | BCD格式的秒(ss) | 无用 |
| RES_DT_BCD[1] | BCD格式的时(hh,24小时制) | BCD格式的分(mm) |
| RES_DT_BCD[2] | BCD格式的月(MM) | BCD格式的日(DD) |
| RES_DT_BCD[3] | BCD格式的年(YYYY,占整个寄存器) | YYYY |
- 结果2:INT类型时间 YYYY-MM-DD hh:mm:ss
| 数组 | 整个寄存器 |
|---|---|
| RES_DT_INT[0] | 十进制的秒(ss) |
| RES_DT_INT[1] | 十进制的分(mm) |
| RES_DT_INT[2] | 十进制的时(hh,24小时制) |
| RES_DT_INT[3] | 十进制的日(DD) |
| RES_DT_INT[4] | 十进制的月(MM) |
| RES_DT_INT[5] | 十进制的年(YYYY) |
执行结果

例程:将 INT 类型的时分秒数组转换为 DT 时间格式
整体思路:将 INT 类型的时分秒,按照 DT 格式的要求组装、转换、最后调用转换函数转换为 DT 类型
- INT 数组转换为 BCD 格式的 INT 数组:调用
INT_TO_BCD函数
- 组装为 DT 格式要求的数组
- 调用
ARINT_TO_DT函数

简单程序

- 输入:十进制时间数组 RES_DT_INT[]
| 数组 | 整个寄存器 |
|---|---|
| RES_DT_INT[0] | 十进制的秒(ss) |
| RES_DT_INT[1] | 十进制的分(mm) |
| RES_DT_INT[2] | 十进制的时(hh,24小时制) |
| RES_DT_INT[3] | 十进制的日(DD) |
| RES_DT_INT[4] | 十进制的月(MM) |
| RES_DT_INT[5] | 十进制的年(YYYY) |
- 中间变量(数组转换组合结果):BCD格式的数组 RECONV_INT_DT[]
| 数组 | 高8位 | 低8位 |
|---|---|---|
| RECONV_INT_DT[0] | BCD格式的秒(ss) | 无用 |
| RECONV_INT_DT[1] | BCD格式的时(hh,24小时制) | BCD格式的分(mm) |
| RECONV_INT_DT[2] | BCD格式的月(MM) | BCD格式的日(DD) |
| RECONV_INT_DT[3] | BCD格式的年(YYYY,占整个寄存器) | YYYY |
- 输出:DT 格式日期时间 RECONV_DT
执行结果

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐






所有评论(0)