硬汉嵌入式论坛

 找回密码
 立即注册
查看: 367|回复: 0
收起左侧

[CAN助手] CANopen时间戳报文的C生成和LUA解析实现

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2023-10-5 08:35:01 | 显示全部楼层 |阅读模式

CANopen时间戳报文格式:




C实现:
[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*        函 数 名: CANopen_WriteClock
*        功能说明: 设置Canopen时间戳
*        形    参:无
*        返 回 值: 1表示成功 0表示错误
*********************************************************************************************************
*/
extern CO_t* CO;
uint8_t CANopen_WriteClock(uint16_t _year, uint8_t _mon, uint8_t _day, uint8_t _hour, uint8_t _min, uint8_t _sec, uint32_t _ms, uint32_t _Interval_ms)
{
        uint16_t t;
        uint32_t seccount=0;
        uint32_t days;
 
        if (_year < 2000 || _year > 2099)
        {
                return 0;        /* _year范围1970-2099,此处设置范围为2000-2099 */  
        } 
    
        for (t = 1984; t < _year; t++)         /* 把所有年份的秒钟相加 */
        {
                if (Is_Leap_Year(t))                /* 判断是否为闰年 */
                {
                        seccount += 31622400;        /* 闰年的秒钟数 */
                }
                else
                {
                        seccount += 31536000;         /* 平年的秒钟数 */
                }
        }
 
        _mon -= 1;
 
        for (t = 0; t < _mon; t++)         /* 把前面月份的秒钟数相加 */
        {
                seccount += (uint32_t)mon_table[t] * 86400;        /* 月份秒钟数相加 */
 
                if (Is_Leap_Year(_year) && t == 1)
                {
                        seccount += 86400;        /* 闰年2月份增加一天的秒钟数 */
                }                        
        }
 
        seccount += (uint32_t)(_day - 1) * 86400;        /* 把前面日期的秒钟数相加 */
 
        seccount += (uint32_t)_hour * 3600;                /* 小时秒钟数 */
 
        seccount += (uint32_t)_min * 60;        /* 分钟秒钟数 */
 
        seccount += _sec;        /* 最后的秒钟加上去 */
             
        _ms = _ms + (seccount%(60*60*24))*1000;
        days = seccount/(60*60*24);
         
        CO_TIME_set(CO->TIME,  _ms,  days,  _Interval_ms);
         
        return 1;      
}



LUA解析:

[Lua] 纯文本查看 复制代码
                g_id = id & 0x007F
                s0 = string.format("时间戳: ")
                ms = (bin[4] << 24) + (bin[3] << 16)+ (bin[2] << 8)  + bin[1]


                days = bin[6] *256 + bin[5]
                
                s1 = os.date("%Y:%m:%d %H:%M:%S", ms//1000+days*3600*24 + 441763200 - 8*3600)

                s1 = s1..string.format(":%03d", ms%1000)



实测效果:





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 20:53 , Processed in 0.244524 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表