自制工业控制系统:机床界面实战——从启动LOGO到锁定解锁的七块屏
起因
基础篇收官时,图形系统那篇留下的东西是"零件":渲染原语、点阵字库、控件、事件分发。但操作工坐在机床前面对的不是零件,是一块块整屏:开机看到什么、程序在哪儿编、怎么在屏幕里先走一遍、切割时盯什么、参数谁改、维护看哪儿、锁住了怎么办。这篇把应用层的界面定下来——七块屏:启动 LOGO、编程、仿真、运行、设置、维护、锁定/解锁。
基础篇收官时,图形系统那篇留下的东西是"零件":渲染原语、点阵字库、控件、事件分发。但操作工坐在机床前面对的不是零件,是一块块整屏:开机看到什么、程序在哪儿编、怎么在屏幕里先走一遍、切割时盯什么、参数谁改、维护看哪儿、锁住了怎么办。这篇把应用层的界面定下来——七块屏:启动 LOGO、编程、仿真、运行、设置、维护、锁定/解锁。
调度篇把话说出去了:硬实时层的确定性来自中断优先级和 ISR 的有界执行。话说出去要拿数据兑——客户验收、产线抽检、自己晚上睡得着,靠的都是一份测出来的延迟分布,不是"应该没问题"。测量这行的老家伙是示波器和逻辑分析仪——中断响应多少微秒,示波器一触发一目了然,就是费机器费人;软件自打点(TSC 加直方图)是嵌入式圈的长期实践,便宜、能长期挂着跑,代价是要自己证明打点本身不扰动系统。“平均值会说谎"这句话,服务器圈是 Google 2013 年那篇尾延迟论文点破的,工控圈不用论文点——废一个件就懂了。基础篇最后这篇就干这一件事:把"实时"两个字变成一页纸的数字。
机床这个行业,全款现货是理想情况。现实里大量机器是分期付款卖出去的,还有整批打包给二级经销商、经销商再租给终端客户的。机器在别人手里、钱还没收完,厂里和经销商手里就得有控制手段:GPS 知道机器在哪,授权码决定机器能干什么、能干到哪天,4G 通道把这两样送回来。这套手段没有一样是机床行业发明的:GPS 是 1973 年美国国防部立的军用项目,1995 年全面运行之后民用一发不可收拾,模块便宜到几十块钱一颗;远程锁机则是在挖掘机按揭市场先成熟的——工程机械租赁干了十几年,GPS 锁机是标配,机床照搬的是一条被验证过的路。这也是当初坚持自研网络协议栈的原因之一——这些能力全踩在自己的 TCP/IP 上,不依赖任何第三方系统。
系统要卖到国外,第一屏就体现产品气质:操作工看到的是母语还是一门外语,决定他对这台机床的第一印象,也决定报警文本他能不能读懂——读不懂的报警等于没有报警。
十五年生命周期的机器,出厂那天固件就是旧的——升级是必然,升级变砖是事故。这篇讲两件让机器活得久的事:开机自检(POST,排障第一屏)与 A/B 双槽固件更新(升级不停产)。升级入口两条:U 盘(现场,操作员插盘点确认)和网络 OTA(含 4G 远程推送,合规篇里 4G 通道复用这条路);外加恢复出厂固件的兜底。
机床参数丢了意味着什么,干这行的都见过:丝筒参数不对飞车、坐标丢了对不了刀、一屋子机床挨个重新校。断电恢复是另一半:加工到一半停电,来电之后这台件是报废、续切还是回退,得是系统说了算,不是运气。日志系统解决"发生了什么",这篇解决"配置与现场丢没丢"。
到目前为止每篇文章的"跑通标志"都靠串口 printf 亲眼盯着——工程上这不可持续。工业系统要的是:出事后能还原现场。这篇把散落各篇的"记日志"统一成一个系统:分级、双通道(串口+盘)、ISR 可写、崩溃可救。这也是合规审计的地基——合规篇的授权解锁、所有权转移、参数修改,全都要在这里留痕。
立项清单里"读取 U 盘"是明确需求:现场拷加工程序、导出加工报表、固件升级的入口都是它。U 盘的命令集是借来的:SCSI 的前身 SASI 是 1979 年 Shugart 给磁盘驱动器定的接口,1986 年标准化成 SCSI,在企业存储里摸爬了十几年;USB 大容量存储类没有另起炉灶,把 SCSI 命令装进 CBW/CSW 信封走批量传输——所以驱动一个 U 盘,实际写的是一套打了折的 SCSI 主机。USB 协议详解把 CBW/CSW 的理论讲完了,EHCI 篇有了批量传输的队列机制,NVMe 篇立了 BlockDevice 抽象——这篇把三样东西拧起来:一个真的能挂 exFAT 的 U 盘驱动。
系列里"从内存映射里划一块"“DMA 池"“后备缓冲"这类说法出现过无数次,但那根负责"划"的手指——分配器本身——一直没有正面写过。这是基础篇里最大的一块地基:没有它,Vec/Box 用不了,网络包缓冲、字体资源、文件目录列表全都没有出处。这篇补上:从 UEFI 内存映射出发做一个物理页帧分配器,在其上搭内核堆,再划出 DMA 专用池,最后说清楚实时层为什么一分钱内存都不能现场要。这门手艺本身没有新东西可发明:位图、空闲链、伙伴系统全是六十年前就定型的方法,Knuth 的《计算机程序设计艺术》第一卷 1968 年就把这摊事讲透了;DMA 必须低地址连续内存的执念则来自 IBM PC 的 8237 控制器——24 位地址线顶到 16MB,“设备只认低地址"这个约束一路遗传到今天的 PCIe 设备。功夫全花在选哪门老手艺最配这台机器。
工控主板上插的是多核 CPU,我们的系统到现在只用了一颗核——固件唤醒的 BSP,第二颗核从开机起就在那儿睡觉。这篇干两件事:一是把 CPUID 用起来,CPU 什么型号、几个核、缓存多大、支持哪些指令,一条指令全问出来——自检页要显示的 CPU 信息、页帧分配器要的物理地址宽度,数据源都是它;二是把第二颗核叫醒干活,INIT-SIPI-SIPI 唤醒、每核自己的自举,然后给两颗核分好工——Core0 跑实时、Core1 跑服务,物理上的隔离比任何软件优先级方案都硬。