b***i 发帖数: 3043 | 1 我们给客户开发一个嵌入式硬件PLC,这个硬件里面有微处理器,可以用一个我们开发
的软件通过TCP/IP来配置,然后客户自己用Modbus来配置和读取信息。客户发现一个问
题,他们通过Modbus直接配置时间后,通过我们的软件读取,时间不一致。通过我们软
件设置后,Modbus里面显示的小时不对。
配置嵌入式的时间有两种,一种是软件启动后,自动先把嵌入式的这个UTC时间读入,
显示成本地时间。当在软件界面点击Sync,现在软件就把系统的时间(UTC)传给嵌入式。
第二种是用户提出的,在Modbus寄存器里面增加两组,一组来显示年/月/日/时/分/秒
,一种来设置年/月/日/时/分/秒,然后用一个寄存器作为出发,把设置的时间写入嵌
入式系统。这里,用户会把当地时间输入。
经过我分析发现,这个嵌入式系统没有考虑时区。软件通过Windows读时间后,向硬件
发送的是UTC的时间。客户在Modbus看到的也是UTC的时间转换成年/月/日/时/分/秒(
每个一个Modbus寄存器),和当地时间有差别。但是,用户需要的显示当地时间。
我们内部讨论,我的观点是,嵌入式需要加入时区,和夏令时因素,PC软件和嵌入式通
过传送UTC时间是正确的。有人认为,问题在PC软件,要软件做修改。大家怎么看? |
a9 发帖数: 21638 | 2 跟是不是嵌入式没关系
你只要知道 本地时间与utc不是一一对应的关系,所以存、传时间如果使用utc,就必
须带时区一起传 就行了
式。
【在 b***i 的大作中提到】 : 我们给客户开发一个嵌入式硬件PLC,这个硬件里面有微处理器,可以用一个我们开发 : 的软件通过TCP/IP来配置,然后客户自己用Modbus来配置和读取信息。客户发现一个问 : 题,他们通过Modbus直接配置时间后,通过我们的软件读取,时间不一致。通过我们软 : 件设置后,Modbus里面显示的小时不对。 : 配置嵌入式的时间有两种,一种是软件启动后,自动先把嵌入式的这个UTC时间读入, : 显示成本地时间。当在软件界面点击Sync,现在软件就把系统的时间(UTC)传给嵌入式。 : 第二种是用户提出的,在Modbus寄存器里面增加两组,一组来显示年/月/日/时/分/秒 : ,一种来设置年/月/日/时/分/秒,然后用一个寄存器作为出发,把设置的时间写入嵌 : 入式系统。这里,用户会把当地时间输入。 : 经过我分析发现,这个嵌入式系统没有考虑时区。软件通过Windows读时间后,向硬件
|
o****p 发帖数: 9785 | 3 每个host上存timezone,和daylghtsaving time 信息,这是本地信息,传的时候当然
传utc足够了。
[在 a9 (嗯) 的大作中提到:]
:跟是不是嵌入式没关系
:你只要知道 本地时间与utc不是一一对应的关系,所以存、传时间如果使用utc,就必
:须带时区一起传 就行了
:式。 |
a*******9 发帖数: 239 | 4 很多人认为时间问题很简单,其实不然,因为我看到的大部分系统这个问题都设计得不
好,根本不critical。建议一个便宜的解决方案,服务器数据库里的时间数据统统存为
utc格式,然后到网上找个免费的包,应用中把utc转换为当地时间,再将当地时间传给
远方的PLC。仅供参考。
式。
【在 b***i 的大作中提到】 : 我们给客户开发一个嵌入式硬件PLC,这个硬件里面有微处理器,可以用一个我们开发 : 的软件通过TCP/IP来配置,然后客户自己用Modbus来配置和读取信息。客户发现一个问 : 题,他们通过Modbus直接配置时间后,通过我们的软件读取,时间不一致。通过我们软 : 件设置后,Modbus里面显示的小时不对。 : 配置嵌入式的时间有两种,一种是软件启动后,自动先把嵌入式的这个UTC时间读入, : 显示成本地时间。当在软件界面点击Sync,现在软件就把系统的时间(UTC)传给嵌入式。 : 第二种是用户提出的,在Modbus寄存器里面增加两组,一组来显示年/月/日/时/分/秒 : ,一种来设置年/月/日/时/分/秒,然后用一个寄存器作为出发,把设置的时间写入嵌 : 入式系统。这里,用户会把当地时间输入。 : 经过我分析发现,这个嵌入式系统没有考虑时区。软件通过Windows读时间后,向硬件
|
a9 发帖数: 21638 | 5 跟你说了utc跟本地时间不是一一对应的了。只存utc肯定不行。
开发
个问
们软
入,
/秒
入嵌
硬件
【在 a*******9 的大作中提到】 : 很多人认为时间问题很简单,其实不然,因为我看到的大部分系统这个问题都设计得不 : 好,根本不critical。建议一个便宜的解决方案,服务器数据库里的时间数据统统存为 : utc格式,然后到网上找个免费的包,应用中把utc转换为当地时间,再将当地时间传给 : 远方的PLC。仅供参考。 : : 式。
|
a9 发帖数: 21638 | 6 如果只是每个host上存的还是这个host上用没问题,要是一个host上时间拿到另一个
host上
用的话就不行了。
但楼主这个能保证吗?
【在 o****p 的大作中提到】 : 每个host上存timezone,和daylghtsaving time 信息,这是本地信息,传的时候当然 : 传utc足够了。 : [在 a9 (嗯) 的大作中提到:] : :跟是不是嵌入式没关系 : :你只要知道 本地时间与utc不是一一对应的关系,所以存、传时间如果使用utc,就必 : :须带时区一起传 就行了 : :式。
|
a*******9 发帖数: 239 | 7 你没看懂我说的东西
【在 a9 的大作中提到】 : 跟你说了utc跟本地时间不是一一对应的了。只存utc肯定不行。 : : 开发 : 个问 : 们软 : 入, : /秒 : 入嵌 : 硬件
|
a9 发帖数: 21638 | 8 你不是说数据库里存utc然后应用里用包转成本地时间吗?
【在 a*******9 的大作中提到】 : 你没看懂我说的东西
|
a*******9 发帖数: 239 | 9 这个问题的关键是
为了准确地获取当地时间,无论在plc 本地转换还是服务器端转换,没有历史的
daytime saving数据,时间一长,定会出错。那些免费的包有这些数据,可以相对便宜
地把问题解决了。
【在 a9 的大作中提到】 : 你不是说数据库里存utc然后应用里用包转成本地时间吗?
|
a9 发帖数: 21638 | 10 解决不了的,一个gmt时间可能既对应一个dst时间,同时对应一个非dst时间,如果没
有存时区,那就没法转换回去。
【在 a*******9 的大作中提到】 : 这个问题的关键是 : 为了准确地获取当地时间,无论在plc 本地转换还是服务器端转换,没有历史的 : daytime saving数据,时间一长,定会出错。那些免费的包有这些数据,可以相对便宜 : 地把问题解决了。
|
a*******9 发帖数: 239 | 11 建议你把我说的再仔细想想,然后再查查资料
【在 a9 的大作中提到】 : 解决不了的,一个gmt时间可能既对应一个dst时间,同时对应一个非dst时间,如果没 : 有存时区,那就没法转换回去。
|
t********u 发帖数: 695 | 12 PC端比较好解决。PLC做太多了会影响到你想象不到的地方,比如同步。 |
o****p 发帖数: 9785 | 13 funny。我觉得现在的小孩说起来做的都是最fancy的东西基本的概念都没有,摇头了。
utc存在的意义是啥?就是一个基本的reference time,然后其它所有时区按照utc调整
。连ntp里头都是用utc做timestamp,为什么?不用utc做那你sync一次要传多少个
timestamp?最简单不过的事情,你下面embedded time source走ntp或者随便什么时钟
去同步获得尽可能精确的时钟,然后你和pc端的bus上送的就是你下面获得的utc时间戳
,然后pc端你放几个专业点的计算本地时间的包不就完了? |
b***i 发帖数: 3043 | 14 PLC没有磁盘,只有内存来供客户端提取数据,包括压强,温度的数据,同时,客户可
能也读取时间戳。PLC有一个RTC,关机也会运行。不过,这个PLC在当地安装后不会移
动。
从客户的角度来考虑,似乎他们只需要当地时间。有的客户所在地有夏令时,有的没有
。配置的时候,基本上是当地人配置,就是距离很近,不会需要从其他国家配置。如果
从其他国家配置,这个时区的问题就麻烦大了。
现在看来,我们这个领域的客户还没有意识到时区在时间戳里的作用,所以在设计
Modbus寄存器表的时候没有时区这个信息,他们只按排了年月日时分秒这些参数。那么
,似乎我们改动软件只配置这些就可行。
但是,如果客户有夏令时,他们的客户端PC可能会改时间, 时间不对怎么办?这个我
们以前的嵌入式系统就是没考虑这个事情,时间随时让客户改。就是说,如果夏令时到
了,他们就把小时改一下即可。那样,从Modbus读的小时就和PC又对上了。
【在 a9 的大作中提到】 : 如果只是每个host上存的还是这个host上用没问题,要是一个host上时间拿到另一个 : host上 : 用的话就不行了。 : 但楼主这个能保证吗?
|