2019年10月30日星期三

RS-485误码导致的问题

前段时间开发的一个项目,我负责其中一个模块。该模块有两路RS-485接口,另一个模块(下文称为上游模块)通过这两个接口给我发送命令,我解析命令后控制160个指示灯的亮灭。
当时的命令格式是我定的,用一个bit表示一个灯。bit为1时点亮,bit为0时熄灭。160个灯总共是20个字节,外加2个字节的CRC, CRC采用Modbus协议的格式。
刚开始时,要求两路RS-485上的数据一致,才认为是有效数据,我进行了与运算,也就是同一个灯,两路上的命令对应的bit都是1, 我才会点亮,否则就熄灭。后来调试中发现会出现所有指示灯瞬间全部熄灭的情况,领导非常恼火,要我们解决。当时觉得可能是两路数据不一致导致的,上游模块觉得两路数据同步太困难了,让我改成优先取一路的数据,另一路作为备份,只有当第一路没有有效数据的时候采用第二路的数据。这样改后,瞬间熄灭的问题就消失了。
后来上游模块修改了需求,这160个指示灯大部分时间是处于全部熄灭状态,只有紧急情况下才需要点亮。因此大部分时间里,上游模块持续给我发送全部指示灯熄灭的命令。
结果客户验收那天,在指示灯本应全部熄灭的状态下,出现了两次前16个灯瞬间点亮又熄灭的问题。客户和领导都很恼火。要知道这160个指示灯指示的是道岔状态,涉及列车行驶安全,任何问题都可能导致车毁人亡。
后来排查发现,出现故障时,报文前面多出来2个字节的0xFF, 0xFF.也就是说,正常情况下指示灯全部熄灭的报文是
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 1B
出现故障时,报文时
FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 1B
巧就巧在,增加了0xFF, 0xFF后,前20个字节的CRC恰好是0x00 0x00, 也就是和报文的第21、22字节一致,这样CRC校验也通过了。因此0xFF, 0xFF对应的16个指示灯就恰好点亮了。
经查,这两个字节的0xFF, 0xFF并不是上游模块发出的,应该是RS-485线路上的干扰。
这个问题给我的启示是:
1. RS-485等串行总线,我们平时在实验桌上调试的时候,基本上不会遇到误码,但在现场环境下,长时间运行肯定会遇到少量误码,设计时不应该大意。
2. 对于指示灯亮灭这两种状态,用计算机科学的理论来看,一个bit就足以表示了,但是在特殊场合下,当出现翻转会导致严重后果时,就需要更多的bit来表示。铁路行业的计算机控制,至少会用2个bit来表示,比如01表示熄灭,10表示点亮。
3. 前期那个指示灯瞬间熄灭的问题,也可能是这个原因导致的,只是当时对问题分析不深入,错过了发现问题的机会。
4. 前期对两路同步的设计不完善。其实当发现两路上的数据不一致时,没必要马上将指示灯全部熄灭。因为上游模块是源源不断发送指示灯状态命令的,一次比对不一致,可以将这包数据丢弃,指示灯暂时维持当前状态,继续比较下一包。只有当持续一段时间的比较均不一致时(比如超过3秒),再将指示灯熄灭即可。

2019年10月29日星期二

2019年读完的第9本书——The Dancing Lessons

现在国内儿童英语教育市场充斥着这种原版英文教材。我很好奇这些书是怎么来的。在我的印象中,原版图书价格都相当昂贵,而这类图书都很便宜,很多英语培训班都免费赠送。这类图书印刷相当精美,又不像是盗版的。它们还有一个特点是Printed in China. 我怀疑是不是印刷厂偷偷多印了一些在国内销售。当然也有可能它出现在国内市场完全合法,就是出版社故意让利,因为它们还有一个特点,那就是版本都比较老。

1 0-06  HarperCollins Publishers
1 7-04  高等教育出版社
1 7-115 人民邮电出版社
1 7-5072 中国中福会出版社

邮发代号
2-75 无线电
80-498 环球科学

2019年10月28日星期一

我用过的电池#27——Maxell 7号碳性电池

历史:
14.Eneloop    5 镍氢
13.劲量        5 碱
12.天球        7 碳
11.MIDI-MAX   7 碳
10.双鹿        7 碳
9. OK         5 碳

16.Maxell     7 碳
15.Maxell     5 碳
14.GP         2 碱

13.松下        CR1632
12.松下        5 碳 2
11.松下        5 碳
10.松下        7 碳
9. 索尼        2 碱
8. 索尼        5 镍氢

7. 金霸王      5 碱
6. 东芝        5 碳

5. 南孚        7 碱
4. 南孚        5 碱

3. New Leader 5 碱
2. 华太     5 碳
1. FullWin 5 碱

2019年10月26日星期六

我用过的电池#26——松下7号碳性电池

历史:
14.Eneloop    5 镍氢
13.劲量        5 碱
12.天球        7 碳
11.MIDI-MAX   7 碳
10.双鹿        7 碳
9. OK         5 碳
8. GP         2 碱

13.松下        CR1632
12.松下        5 碳 2
11.松下        5 碳
10.松下        7 碳
9. 索尼        2 碱
8. 索尼        5 镍氢

7. 金霸王      5 碱
6. 东芝        5 碳

5. 南孚        7 碱
4. 南孚        5 碱

3. New Leader 5 碱
2. 华太     5 碳
1. FullWin 5 碱

2019年10月23日星期三

卡11-中国工商银行大来信用卡

这张卡应该是大来组织在中国境内发行的首张信用卡。国人对大来组织可能知之甚少。这张卡除了卡号短两位,以及Diners Club的LOGO之外,也没有其他特色。
后来工行发行过白金级别的大来卡,且门槛较低,但我当时不知道消息,错失了办理的机会。


2019年10月22日星期二

2019年读完的第8本书——环球科学

希望更多的中国人喜欢这本书

1 7-04  高等教育出版社
1 7-115 人民邮电出版社
1 7-5072 中国中福会出版社

邮发代号
2-75 无线电
80-498 环球科学

2019年10月21日星期一

拔掉网线不重连问题

前段时间我接手了一个项目,是一块嵌入式板卡,运行Linux系统,用于在以太网和CAN总线之间相互传输数据。当软件收到CAN总线的数据后,将其按照指定的格式,通过TCP连接发送到Server端,TCP Server端是Windows XPE系统;如果收到TCP Server端下发的数据,则提取出需要的部分,发送到CAN总线上。
之前开发这个软件的同事告诉我有个已知BUG————拔掉网线后不会自动重连。刚开始,极少有人插拔网线,偶尔出现了问题,把我叫过去,我ssh登录到板卡上,看到进程在跑,具体为什么出问题,由于没有日志,也没有打印输出,我也看不出是什么原因,只是在软件中加上了KEEP_ALIVE参数、接收超时等参数。后来他们测试TCP Server端的主备倒换功能,通过拔掉网线来触发主备倒换,这个问题就很明显了。问题上升到比较高的领导那里,需要立即解决。
我在我的Windows笔记本电脑上打开"网络调试助手“软件作TCP Server端,把板卡接上来,第一次拔掉笔记本电脑这端的网线再插上,问题就复现了。我发现在这种情况下,send函数正常返回,因为数据送到了内核;recv函数阻塞在那里,也不会返回。因此无法触发重连机制,就一直停在那里了,要等几十分钟才会超时。给recv加上一个比较短的超时设置可以解决这个问题,但是TCP Server端不会发送心跳,可能很长一段时间都没有数据。这个板卡是用在地铁行业的,夜里停止运营后几个小时都没有数据,难道要反复断开重连吗?还是要求TCP Server端发心跳?
我在笔记本电脑上打开WireShark看了一下,发现重新插回网线后,首先Linux板卡先进行ARP解析,然后发送了一条TCP报文,然后就没有然后了。Windows端没有给任何回复,Linux端也没有重发。我不是TCP/IP协议的专家,无法判断这种情况是否符合协议。
接下来上网搜索,中文领域讲这方面的文章一般都是说设置KEEP_ALIVE参数,这个我早就设了,为什么不管用呢?直到看到这篇文章https://blog.csdn.net/nui111/article/details/41652255
作者也遇到了和我类似的问题,通过设置TCP_USER_TIMEOUT参数解决了问题,在文章中也给出了SO_KEEPALIVE不管用的原因。这里我就不赘述了。
我用这种方法也解决了问题,但是遗憾的是,重新插回网线后,最多需要10秒才能恢复连接,达不到自己设置的超时值那么短。好在这个时间大家已能接受,我由于有其他很多事情加之不熟悉网络编程和TCP/IP协议,也没再深入分析。

2019年10月19日星期六

北京公交刷卡机1

下面这张照片拍摄于2019年6月22日。当时北京公交刚有部分车辆将刷卡机更换为这种类型。这种刷卡机既可以刷卡,也可以扫二维码。当时还没有开放二维码功能,上面的扫码区用黑色材料覆盖上了,只有四盏LED灯的灯光透了出来。
我之所以发这张照片,是因为偶然在手机中看到了它。现在这种刷卡机的界面已经与此不同,放在这里算作是收藏吧。

2019年10月18日星期五

我的火车行程

20 2019年10月7日 K7716 唐山北➡北京,  行程151千米,用时2小时46分,票价 23.5元。累计4105千米,用时1天16小时39分,票款1494  元。
19 2019年9月30日 D6615 北京  ➡唐山,  行程177千米,用时1小时32分,票价 52  元。累计3954千米,用时1天13小时53分,票款1470.5元。
18 2019年9月15日 K7716 唐山北➡北京,  行程151千米,用时2小时46分,票价 77.5元。累计3777千米,用时1天12小时21分,票款1418.5元。
17 2019年9月12日 G8917 北京南➡唐山,  行程241千米,用时1小时35分,票价110.5元。累计3626千米,用时1天10小时46分,票款1341元。
16 2019年8月29日 K7716 唐山北➡北京,  行程151千米,用时2小时46分,票价77.5元。累计3385千米,用时33小时11分,票款1230.5元。
15 2019年8月28日 D7    北京  ➡唐山北,行程151千米,用时1小时 9分,票价44.5元。累计3234千米,用时30小时25分,票款1153元。
14 2019年8月11日 K5252 唐山北➡北京,  行程151千米,用时3小时42分,票价23.5元。累计3083千米,用时29小时16分,票款1108.5元。
13 2019年8月10日 D6635 北京  ➡唐山北,行程151千米,用时1小时25分,票价83元。累计2932千米,用时25小时34分,票款1085元。
12 2019年6月 9日 K7716 唐山北➡北京,行程151千米,用时1小时54分,票价 43.5元。累计2781千米,用时24小时 9分,票款1002元。
11 2019年6月 6日 D6615 北京  ➡唐山,行程177千米,用时1小时32分,票价 52    元。累计2630千米,用时22小时15分,票款958.5元。
10 2019年5月 4日 K7716 唐山北➡北京,行程151千米,用时2小时25分,票价 74.5元。累计2453千米,用时20小时43分,票款906.5元。
9 2019年 4月30日 G8917 北京南➡唐山,行程241千米,用时1小时35分,票价110.5元。累计2302千米,用时18小时18分,票款832元。
8 2019年 4月 7日 K5252 唐山北➡北京,行程151千米,用时4小时12分,票价23.5元。累计2061千米,用时16小时43分,票款721.5元。
7 2019年 4月 5日 G237  北京南➡唐山,行程234千米,用时1小时4分,票价107 元。累计1910千米,用时12小时31分,票款698  元。
6 2019年 3月17日 K7716 唐山北→北京,行程151千米,用时1小时59分,票价23.5元。累计1676千米,用时11小时27分,票款591 元。
5 2019年 3月15日 D17  北京→唐山北,行程151千米,用时1小时 9分,票价44.5元。累计1525千米,用时10小时28分,票款567.5元。
4 2018年12月22日 G186 淄博北京南,行程536千米,用时2小时47分,票价229元。累计1374千米,用时9小时19分,票价523元。
3 2018年12月20日 G181 北京南淄博,行程536千米,用时3小时1分,票价229元。累计838千米,用时6小时32分,票价294元。
2 2018年1月1日 K498 唐山北→北京,行程151千米,用时2小时22分,票价23.5元。累计302千米,用时3小时31分,票价68元。  
1 2017年12月30日 D25 北京→唐山北,行程151千米,用时1小时9分,票价23.5元。

2019年10月16日星期三

2019年读完的第7本书——你知道吗?

某一期乐智小天地的其中一本。

1 7-04  高等教育出版社
1 7-115 人民邮电出版社
1 7-5072 中国中福会出版社

邮发代号
2-75 无线电

2019年10月14日星期一

2019年读完的第6本书——《数据挖掘》

2004年当作畅销书买的,此后一直落灰。2015年前后拿出来开始阅读,由于过于枯燥无味,且英文阅读困难,直到今年才最终读完。
这本书我虽然没读太明白,但我一字一句都认真读了,从字里行间可以感受到作者确实认真写了,作者也是这方面的行家里手。
另外需要说明的是,这本书讲的是理论,不要指望通过这本书速成。就像学完了大学电路课程,也不会修理电视机一样。


1 7-04  高等教育出版社
1 7-115 人民邮电出版社

邮发代号
2-75 无线电

2019年10月10日星期四

我今年参加公司新员工拓展的2张照片

其余照片因操作不慎已经遗失

10月17日又找到一些照片。包括之前的两张在内,前四张拍摄于北京市昌平区瑶台山庄,其余照片拍摄于北京市昌平区新城滨河公园。






2019年10月7日星期一

My wife and daughter in 2019

2019年5月12日在三元桥附近做蛋糕,给女儿过生日。
2019年5月18日在恒泰广场吃将太无二。

2019年10月6日星期日

2019年读完的第5本书——《无线电》2011年合订本上

感觉《无线电》杂志离无线电越来越远了,掺杂了很多机器人、电子制作、音响方面的内容,我最喜欢的收音机、业余无线电方面的内容很少。

从本书开始统计出版社:
1 7-115 人民邮电出版社

邮发代号
2-75 无线电

2019年10月2日星期三

2019年读过的第4本书——SONY WAVE Handbook

这本书是购买SONY收音机附带的频率表,出版于1984年左右。内含当时美国的调频和中波频率,以及国际短波广播频率。里面还有东德、苏联等国家,具有鲜明的时代烙印。