工程师的佛系自省,避开逻辑的陷阱
《请回答1988》第一集就让我这个三十多岁的肥腻中年男哭了个稀里哗啦,在普通而琐碎的日常生活里,母子之间、父女之间那种似淡却浓、连绵不绝的亲情总会在不经意间戳中为人父母/为人子女的泪点。这种感情的质地亘千年而不变,表达的形式则历万古而常新。古有孟母三迁的美谈,现有幼儿园门口的亲子大战。
上班路过幼儿园门口,经常看到娃娃和妈妈们相爱相杀的一幕。有的抱着妈妈的大腿,摊在地上撕心裂肺地哭喊,有的拽着妈妈的胳膊,上气不接下气地边哭边讲条件。妈妈们的表现倒出奇的一致,一副虽九死而尤未悔的慨然,怒目相向,横眉冷对。
大多数孩子体力不济,打不了持久战,于是乖乖就范,耷拉着小脑袋一步三回头,在妈妈们志得意满的目光中走向幼儿园。但是,在这种敌我双方力量悬殊的战局中,偶有那种意志坚定的小战士,始终满怀着敢叫日月换新天的豪情,虽千万人吾往矣地宣告着自己的价值主张-玩、在家玩。
这种战略相持的场面并不多见,每每目睹,不以为怪。直到有一次,我突然对坚持抵抗的小战士充满了深深的景仰之情:意志这么坚定,肯定是个干工程师的好苗子。
1
老衲之所以感慨万端,自然是因为工作上遇到了难以克服的挑战。在解决的过程中,屡屡感到自己意志不坚,想当逃兵离开这迷离的火线。
老衲开发的一款工控产品中有一个异常电压保护功能,当外部供电电压异常时需要关断所有输出,当供电电压回到正常范围时恢复所有输出。
这个功能乍看起来有些简单,有经验的工程师肯定已经在脑海里想好了解决方案:
设定供电电压的正常范围上下限,用ADC周期性地检测外部供电电压并周期性地判断。设置判断电压异常的周期计时次数N,当供电电压持续低于下限或者持续高于上限一定次数(N)的周期时,关断当前正在导通状态下的所有输出。当供电电压持续处于正常区间(N个ADC检测周期)时,根据产品的功能逻辑,控制输出的开通和关断。
悲催的老衲最初就是这么干的,但是很快,老衲就意识到这种方法蠢笨至极,根本实现不了异常电压保护。
原因无他,输出太多尔,控制逻辑太复杂尔!
这款工控产品的输出通道高达30多路,每路输出都需要单独控制,而且有的通道互有关联。输入信号则来自多路传感器、RS485总线、zigbee。控制输出时,主要是根据输入信号、产品内部状态,按照一定的逻辑开通或关断。
输入输出信号繁多,控制逻辑错综复杂,以至于那个“想当然”的解决方案根本实现不了。
拍一拍脑袋想想吧。假设供电电压异常时,有15路输出处于开通状态。经过N个检测周期发现电压始终异常,于是乎把这15路通通关断。
咔咔咔,犹如抽刀砍西瓜,一刀剖去,红瓤黑子分明俨然,那真叫一个不亦快哉!
可是且慢,“快哉”了之后呢?现在供电电压恢复正常了,您这15路通道怎么恢复之前的开通状态?
2
傻眼了吧?不管你们傻不傻,反正我当时就傻眼了!
关断总是容易,但是恢复太难。就好像把房子推倒容易,再建起来很难一样。
老衲得承认,刚开始尽管傻了眼,但是我并没有开窍。我傻傻地为这30多路输出定义了30多个状态变量,“不亦快哉”之前先统计处于导通状态的通道,“快哉”之后需要恢复时,再把处于导通状态的一一恢复。
可是,在导通状态的恢复程序中,仍然需要面对30多路输出。每一路输出都有自己的控制逻辑,在控制逻辑里既要看输入信号,还要看内部状态。而且有的输出还比较膈应人,它可以被好几个输入信号同时控制,最终处于什么状态要看这些输入信号之间的优先级。就是说,不仅要看信号的当前状态,还要看它的历史状态!
从理论上来讲,硬扛不是不可以。一共30多路,余生还长,鼓起勇气一路一路来呗。程序上电运行后,将各个输入信号的历史状态、先后次序都存储下来,并实时更新。在异常电压关断保护之后的恢复程序子分支中,再把每一路的控制逻辑都重写一遍。
从实践上来看,这种方案简直笨的离谱。老衲花了半天功夫,弄了一路输出之后,测试了一番,发现这一路也没有恢复对。
这路输出有四种控制逻辑,可以通过zigbee信号控制,输出形式是常开,通过RS485控制,则应该是闪烁,通过一个传感器控制,则应该是频率更低的闪烁,也可以通过一个本地开罐直接开通或者关断。这四种信号的优先级是最简单的那种:最后出现的信号说了算。这里没有恢复对,显然是因为我先前存储历史状态时,把这些信号的先后次序搞乱了,但是信号这么多,程序搞得这么乱,出错也是理所当然。
刚弄了一路还没弄对,关键是还有那么多路,我滴个乖乖,这岂止一个麻烦了得!
想通了这一点之后,老衲的意志在一刹那间崩溃了。
崩地那么猝不及防,以至于很长一段时间,我都深陷在椅子上,“关断”了自己的大脑输出,再也不想恢复。
3
鲁迅先生说,这世上本没有路,走的人多了,自然就有了路。
在被幼儿园的小战士重新鼓舞了斗志之后,老衲的“小我”在脑海里左冲右突,寻找晦暗的出路。
显然,必须让输出通道的恢复逻辑和平时的控制逻辑有所区隔,才能从那么繁复的控制网络中解放出来。
古龙说过:最高明的招数就是没有招数,以无招胜有招。金刚经曰:菩萨无我相,无人相,无众生相,无寿者相,方能成道。
那么,最高明的恢复逻辑就是没有任何逻辑,让这三十多路输出通道恢复时不遵从任何逻辑,不就是最为高妙的“逻辑”吗?
很快,我就顺着佛陀的开示思路开展了下去。
大路千万条,最妙的是老衲这一条。我只需要在MCU的输出控制端口上做文章,当电压异常时禁能MCU端口的输出功能,电压恢复正常时恢复MCU端口的输出功能,就整齐划一、简明有力地实现了异常电压下的输出保护、正常电压下的输出恢复。
管它电压异常时处于导通状态还是关断状态,管它的控制信号状态如何,诸信号间的优先级如何,通通不重要。关断保护前是导通状态,禁能了MCU的输出就自动起到了输出保护作用,恢复时也能自动恢复导通状态。关断保护前是关断状态,禁能MCU的输出后还是处于关断状态,相当于做了个“双保险”,恢复时还是自动恢复关断状态!
老衲再一次被自己的佛学素养惊呆了。只有不遵从任何产品功能上的逻辑,才是最为简洁的逻辑,更为关键的一点是,这种实现方案还能被应用在其它任何产品的异常电压保护上。
谁说工程师学佛没用来着?
4
以这种近乎离奇的方式实现了异常电压保护功能之后,一直善于内省的老衲又开始“向内寻求”,总结经验教训了。
在技术问题上,首先还是要克服畏难心理,把畏战怯战情绪尽量压制住。靠动脑袋解决的事儿,必须先鼓足了心劲,坚定意志,好好地把脑袋磨尖,才能在技术上深入地向下钻。
其次,人的思路总是有自己的局限性。就像老衲在这里把思路局限在产品的功能逻辑上一样,像是蒙了眼的驴一样,来回地兜圈子。殊不知,跳出这局限,还广有一番洞天。
说到底,还是破除“执着”。真正的高手,解决问题时从来不局限在兵器上,刀枪剑戟斧钺钩叉,哪个趁手用哪个。也不局限在一招一式上,纵横捭阖如行云流水。只靠三板斧的笨功夫,在工程师这条道路上只会越走越窄。
思路上尽量开阔,不要粘滞在一隅。在这上面,我们还是要取法自然,多看看荷塘里盛开的荷花和莲叶,多看看挂在天边的月亮。仔细体会体会这两句明言:犹如莲花不着水,亦如日月不住空!
水珠在莲叶上滚来滚去,丝毫也不粘滞。弯弯的月亮挂在天边,但是我们能明显地体会到它并没有“住”在虚空里。
这对我们工程师,不正是很好的启发吗?多说无益,望诸君善思之!
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码
相关文章
-
2019-08-12
-
2019-04-28
-
2018-08-27
-
-
2018-01-15
-
-
-