20251129更新:官方解析视频

官方视频介绍了RRTC_DTWRTC_DT功能块的用法、DT 转换为分散时间数值的方法
视频网址:【M580系统时钟应用】-术高莫用_哔哩哔哩_bilibili

M580 平台使用的时间相关的变量

  1. 十进制类型的时间:Time时间段
  2. BCD格式的时间:DTODDT|
    1. D,日期 date,只有日期没有时间,格式D#YYYY-MM-DD
    2. TOD,时间 time of day,一天内的时间,只有时间没有日期(范围 24 小时),格式TOD#hh:mm:ss
    3. DT,日期时间,相当于 D + TOD,格式DT#YYYY-MM-DD-hh:mm:ss

使用 NTP 协议通过网络对时

施耐德 M580 系列 PLC,支持基于以太网的 NTP 对时协议
使用 NTP 协议进行对时,只需要进行组态配置,不需要编写程序,简单便捷,效果可靠

M580 CPU 网口使用 NTP 对时

M580 CPU 模块的网口支持使用 NTP 对时,只需要进行组态配置,不需要编写程序

  1. 双击左侧组态界面中的CPU网口(EIO),进入右侧网口配置
  2. 在右侧配置,双击【通道0】,然后点击【NTP】选项卡 ,进入 NTP 对时配置

    具体设置内容
  3. 修改配置后,点击上方的 【√】符号保存设置。
    4. 保存设置后,需要重新编译并下载程序

NOC0301 网卡模块使用 NTP 对时

注意:

  1. NOC 模块只有高硬件版本才支持将对时时间同步到 CPU,低版本没有这个选项
  2. 且组态时需要选定高版本的固件版本
    (施耐德的 NOC 模块一旦组态后无法更改型号,要改型号只能删掉重新配置,需要特别注意)

M580 CPU 模块的网口支持使用 NTP 对时(需要注意组态和固件版本),只需要进行组态配置,不需要编写程序

NOC 网卡对时配置

  1. 检查组态的 NOC 模块的硬件版本(只能选择 .4 以上的版本,要求模块的固件版本应 >=2.05)
  2. 打开 DTM 配置界面:点击最上方【工具】–>【DTM 浏览器】,在左侧弹出窗口中双击要配置的模块,右侧会弹出此模块的 DTM 配置界面
  3. 开启时钟服务:在模块的DTM配置界面,点击【服务】–>网络时间服务下拉框,改成“已启用”–> 点击右下角“应用”–> 应用配置后,左侧会出现【网络时间服务】的选项。应用配置后需要重新编译并下载程序
    1. 点击“应用”相当于修改了模块的组态配置,会提示要求进入离线状态,不能在线修改。在修改完成后需要重新下载程序到CPU中
  4. 配置 NTP 客户端:点击左侧【网络时间服务】选项,进入NTP配置界面。相关选项类似CPU的配置,配置完成后,点击“应用”即可保存配置。修改配置后需要重新编译并下载程序 注意最下面有个选项(CPU时间更新),把这个勾上,就能通过这个模块更新CPU的系统时间
    (这个选项是翻译的,跟文档中的选项名称对不上,但是意思是文档中的这个意思)
    1. 点击“应用”相当于修改了模块的组态配置,会提示要求进入离线状态,不能在线修改。在修改完成后需要重新下载程序到CPU中
    2. 如果没有这个选项,请按照第 1 步,检查网卡模块 NOC 在组态界面中的版本是否正确

M580 PLC 的时钟使用

时钟通常都能读写,同时还要将时间格式进行转换 或 进行时间上的加减计算,供其他程序使用

通过系统字读取

通过系统字可以直接读取 CPU 时钟的时间(格式为: UTC 时间,BCD 格式)
参考 M580 手册:

注意:这里读取到的系统时间是 UTC 时间,且为 BCD 格式,即 BCD 格式的 INT 数组。需要进行处理和转换才能作为本地时间使用(如将 UTC 时间转换为北京时间需要 + 8 小时等)

存储到 INT 数组中,可按照最后 2 章的内容进行日期格式的转换的换算

RRTC_DT 指令:本地时间

时钟时间和本地时间

  • 时钟时间:即上一章节通过系统字直接读取的时间,统一为 UTC 时区格式
  • 本地时间,当前项目文件中配置的时区对应的时间,可根据需要配置时区、夏令时等选项

读取本地时间
注意:本地时间无法通过 PLC 中的指令进行修改,只能在组态项目(下面步骤)中进行设置

  1. 在 PLC 的项目配置中,选择正确的时间选项(时区、夏令时等)
    工具 --> 项目设置 --> 时间 --> 时区,设置正确的时区 --> 点击【确定】保存修改
    修改后需要重新编译项目
  2. 在程序段中调用RRTC_DT程序块
    1. 程序块输出的数据类型为 DT 类型(日期时间格式)
    2. 输出的时间即为项目中设定的“本地时间”

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时间

注意事项:

  1. RRTC_DT 返回的 DT 时间为本地时间,不需要进行时区换算
  2. RRTC_DT_MS 返回的 DT 时间(输出1)为 UTC 时间,需要进行时区换算
  3. RRTC_DT_MS 返回的 时间戳(输出2)为 1980 年起的 UTC 时间,需要进行计时基点划算、时区换算

实际使用两种指令的建议

实际使用中,可通过两者组合实现精确的本地时间获取

场景1:获取分寄存器的时间:

  1. 使用RRTC_DT获取本地时间(年、月、日、时、分、秒,本地时区)
  2. 使用RRTC_DT_MS获取时间毫秒值(读取输出1或输出2中的额外毫秒时间)

场景2:获取时间戳时间:

  1. 使用RRTC_DT_MS直接获取 UTC 时间戳、毫秒时间
  2. 手动计算标准 Unix 时间(使用加减法更正起始时间、时区)

WRTC_DT 指令:手动设置 CPU 时钟

如果无法通过 NTP 进行对时,也可通过WRTC_DT功能块,通过编程设置 CPU 的时钟
在这里插入图片描述

注意:

  1. 需要传入一个 DT 类型(时间日期类型)的值,包含完整的年、月、日、时、分、秒
  2. 这里要是“时钟时间”:应传入一个 UTC 时区的时间值(与系统字 %SW49~%SW53 中的定义相同)
  3. 这里设置的时间是系统的【时钟时间】,而不是的【本地时间】(记录了时区信息的时间)
    【本地时间】无法通过 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 类型

  1. INT 数组转换为 BCD 格式的 INT 数组:调用INT_TO_BCD函数
  2. 组装为 DT 格式要求的数组
  3. 调用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

执行结果

Logo

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

更多推荐