94年元旦,冬日的夜来得早。
还没到六点,顺义的天空就被铅灰色的云层压得严严实实。
只有三号车间巨大的玻璃幕墙向外透着通透的白光,像是一座孤立于旷野中的灯塔。
韩栋站在二层连廊的栏杆旁,透过厚重的玻璃俯瞰着整个车间。
脚下的钢格栅地板传来轻微的震动,那是远处数控机床精加工时的频率。
楼下的开放式办公区已经清空了无关人员,只剩下核心技术骨干。
没有喧哗,没有口号,只有键盘敲击声汇成的细密雨点。
“哥,我要这个房间的绝对控制权。”韩蕊的声音从身后传来。
韩栋回头。
韩蕊已经换上了一身灰白色的防静电工装,长发在脑后随意挽了个髻,手里抱着那个写满了笔记的黑本子。
她的眼神很冷静,像是即将走上手术台的主刀医生。
“这里的一切都是你的,这七天都听你调遣。”
韩蕊笑了笑,满意的点了点头,没有多余的废话,转身推开了调试间的门。
韩栋看着韩蕊的背影,知道自己的妹妹已经成长起来,足够独当一面。
陆佳杰紧随其后,怀里抱着一摞半米高的系统架构图纸。
调试间的门关上,将外界的嘈杂隔绝在外。
只有三块显示屏发出的冷光照亮了狭小的空间。
空气净化器嗡嗡作响,努力过滤着并不存在的灰尘。
“先解决最难的。”
韩蕊把黑本子摊开在桌面上,手指点在第三条记录上:
【制动系统冗余逻辑死锁】。
韩蕊拉开椅子坐下,调整了一下键盘的位置,动作熟练得像是回到了二院的控制大厅。
“如果动力系统坏了,车只是趴窝。如果制动系统死了,那就是一颗以两百公里时速撞向站台的动能炸弹。”
陆佳杰没说话,转身把一张A0幅面的逻辑电路图吸在磁性白板上。
图纸密密麻麻,无数条黑线像血管一样交织。
“这是制动逻辑图,在此基础上已经做了修改。”陆佳杰指着图纸中央的两个方框。
“双余度设计。主控制器A负责日常制动,备用控制器B负责监控。一旦A出现故障,B会在20毫秒内接管。”
“理论上很完美。”韩蕊盯着那张图。
“但实际上是个逻辑陷阱。”
她站起身,拿起红色的马克笔,在两个方框之间画了一个双向箭头。
“A和B用的故障判断代码是不是同一套?”
“是。”陆佳杰点头。
“为了保证一致性,直接复制了核心代码。”
“这就是问题所在。”韩蕊在那个双向箭头上打了一个叉。
“这叫共模故障,如果传感器传来一个特殊的错误数据,比如轮速信号出现特定频率的噪点,A会判断自己失效,请求切换。
而B在同一毫秒读到这个噪点,也会判断自己失效,拒绝接管。”
她在白板上写下两个单词:死锁。
“两个控制器都认为自己病了,都想把控制权交出去。
结果就是谁也不管,制动指令悬在半空,液压系统收不到信号,刹车片贴不上制动盘。”
陆佳杰盯着那个红色的叉,后背渗出一层冷汗。
他太熟悉这种感觉了。
在之前的模拟测试中,确实出现过一次莫名其妙的制动延迟,当时他们以为是总线丢包,重启系统后故障消失,就没再深究。
现在看来,那是死神在敲门。
“需要一个仲裁者。”陆佳杰反应很快。
“加一个看门狗芯片,或者独立的仲裁电路。当A和B都报错时,由仲裁者强制指定其中一个工作。”
这是工业界的标准做法。
简单,粗暴,有效。
“来不及。”
韩蕊冷冷地吐出三个字,否定了这个方案。
“加芯片意味着改硬件电路板。
重新布线、打板、焊接、调试,最快也要两周。
我们只有七天。”
“而且现在的供应链,你能保证在三天内买到军工级的抗干扰仲裁芯片吗?”
陆佳杰张了张嘴,没声音。
确实不能。
西门子和德州仪器还在封锁,高端芯片的采购渠道基本断绝。
“那怎么办?靠软件?”陆佳杰皱眉。
“软件本身就是死锁的源头。”
“不是靠软件,是靠逻辑差异化。”
韩蕊转身回到电脑前,调出了源代码编辑界面。
那是黑底绿字的DOS环境,光标在屏幕左上角有节奏地闪烁。
“既然A和B是因为想法一样才死锁,那就让它们想法不一样。”
韩蕊的手指悬在键盘上方,像是钢琴家在寻找第一个音符。
“五院做姿态控制时有个原则,异构冗余。
主控制器用一种算法计算结果,备用控制器必须用完全不同的另一种算法计算结果。
只有两条路殊途同归,指令才会被执行。”
她敲下第一行代码。
“陆工,你负责写主控制器。继续用现有的卡尔曼滤波算法处理传感器数据。”
“那你呢?”陆佳杰问。
“我写备用控制器。”韩蕊头也不回,键盘开始发出密集的敲击声。
“我用递推最小二乘法。这两套算法对噪声的敏感区间完全错开。
能骗过A的噪点,骗不过B。”
陆佳杰愣住了。
在一个系统里跑两套完全不同的核心算法?
这对代码的兼容性和同步性要求极高。
稍有不慎,两个控制器就会因为计算结果的微小偏差而打架。
“别愣着。”韩蕊的声音夹杂在键盘声中,清脆而稳定。
“这里没有现成的路,我们得自己趟过去,开始吧。”
陆佳杰深吸了一口气。
他看了一眼旁边那杯已经凉透的咖啡,抓起来一口灌下去。
苦涩的味道刺激着神经,让他混沌的大脑清醒了几分。
他拉过键盘,在另一台终端上开始输入。
时间在这一刻失去了意义。
调试间里没有钟表,只有屏幕右下角跳动的数字。
晚上十点。
凌晨一点。
凌晨三点。
房间里除了键盘声,偶尔夹杂着几句简短的对话。
“A控数据溢出了,浮点转定点时丢了精度。”
“加个钳位保护,把范围锁在正负3g以内。”
“B控的收敛速度比A控慢了4毫秒,同步失败。”
“调整B控的迭代步长,牺牲一点精度换速度。”
他们像是在走钢丝。
左边是计算精度的深渊,右边是响应速度的悬崖。
韩蕊和陆佳杰必须在这两者之间找到那条唯一的细线。
刘卫东推门进来过一次。
他过来送夜宵,将那两碗热腾腾的馄饨放在桌角,直到汤汁凝固也没人动。
凌晨四点,韩栋站在门口看了一会儿,把一件军大衣轻轻披在韩蕊身上,然后默默退了出去,顺手带上了门。
他知道,这时候任何关心都是打扰。
真正的工程师在解决问题时不需要慰问,只需要安静。
“好了。”
凌晨五点二十分,韩蕊的手指重重地敲下回车键。
屏幕上的光标终于停止了跳动,显示出一行绿色的提示:
编译成功。
陆佳杰瘫坐在椅子上,感觉手指都不是自己的了。
他看着屏幕上那几千行重新构筑的代码,那不仅是字符,是两条逻辑迥异但目标一致的思维河流,在终点完美汇合。
“上仿真。”
韩蕊的声音依然冷静,这是绝对专业的表现。
她没有休息,直接将编译好的固件刷入模拟器。
三块显示屏同时亮起红色的警告框,模拟系统开始注入高强度的干扰信号。
“模拟工况:时速230公里,轮轨湿滑,左侧轮速传感器故障,注入白噪声干扰。”
陆佳杰读出测试条件,手心全是汗。
屏幕上的曲线开始剧烈波动。
主控制器A的输出信号瞬间归零。
它“死”了,就像之前那样被噪点骗过了。
所有人的目光都集中在备用控制器B的数据线上。
那一瞬间,一条蓝色的曲线稳稳地升起,接管了原本属于A的控制权。
没有抖动,没有延迟,制动压力平滑上升。
“接住了!”
陆佳杰挥了一下拳头,兴奋的说道。
“最小二乘法滤掉了噪点,B控判定A控失效,强制接管!”
然而,韩蕊没有笑。
她盯着右下角的那个时间参数。
“不行。”她冷冷地说。
陆佳杰一愣,笑容僵在脸上。
“怎么不行?死锁解开了啊。”
“你看响应时间。”
韩蕊指着屏幕上的一个数字: