CANopen时间戳报文格式:
函数如下:
[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;
}
实测完全没问题:
|