
一个世界
整个设施是一个世界,每台机器都是一个设备。
一个世界就是一个普通文件 worlds/<id>/world.json,标记为物理或仿真。现场的每台机器、机器人、相机和计算机都是带通道的设备,作为单元放进这个世界:一路状态推送、一条 G-code 线路、一条舵机总线、一路视频流。
每个单元按其设备的 CAD 模型在 3D 中绘制(由 STEP 或网格转换为 glTF);还没有模型时,先画成一个方盒。只要某个通道上报了位置,世界视图就会把刀具或机械臂的骨架画在机器自己报告的位置上——可以是实时的,也可以是你拖回去的任意时刻。

图版 31 · 线框里的现场,标出了四个点
标注的是机器自己说的话。
在 3D 应用的 CAM 模式中打开一台机器的作业,孪生就会根据记录为它标注:当前行、进给、主轴、激光、挤出机和进度。报警显示为错误。与计划偏差超过 0.5 mm 时显示警告;链路中断同样是警告:状态未知,此时不画刀具。计划和上报是两个来源,各自标明,绝不混在一起。

数据流
每个通道都写下一条数据流。
设备的所作所为都作为数据流记录在一次运行中。机器每上报一次,records.jsonl 就多一行;相机按同一个时钟写入它唯一的视频文件。
不需要另外维护一套历史数据库并保持同步。运行文件夹就是历史:普通文件,可以复制、比对,用任何工具读取。
图版 32 · 夹在泵电机上的一台相机和一个传感器
分析,直接取自记录。
图表查看器直接读取运行的 records.jsonl,或你的 MES 导出的任意 CSV,提供六种视图:折线、磁贴、柱状、热力图、平行坐标和散点。工厂仪表板把 OEE 表放在孪生和相机旁边。
每个窗口只有一个时钟。拖动时间条,所有窗格一起跳到那一刻:3D 世界、图表、相机和记录。
03:41:02.115 state Run · line 4127 · F1200 S12000 03:41:02.367 state Run · line 4128 · F1200 S12000 03:41:02.402 event ALARM:1 hard limit 03:41:02.410 state Alarm 03:41:06.021 note agent:floor-watch: stop mill-2/gcode 03:41:06.388 state Alarm · job stopped at line 4128
权限
智能体实时行动,依据常设授权。
你一次性决定智能体可以碰什么:哪个世界、哪些单元、哪些通道、哪些动作、多长时间。在授权范围内,它通过 MCP 读取数据流、打开通道、上电待命、运行程序、发送命令——凌晨 3 点也不会弹出确认框。
每个动作连同发出它的主体,在调用驱动之前就写入运行记录。确认回复不等于状态,链路中断记录为未知。任何命令都不会被悄悄重试;如果智能体决定再试一次,那是一条新的、被记录的命令。边界由驱动强制执行;停止、暂停和急停类动作,对在该单元上持有任何授权的人始终开放。
commandagi grant add --principal agent:floor-watch \
--world plant --unit mill-2 --unit press-4 \
--verb open --verb run --verb send --for 12h --note "night watch"
仪表板
仪表板就是文件。
一个仪表板就是一个 JSON 文件 dashboards/<id>.dashboard.json,里面是窗格、布局和带类型的参数:一个世界、一个单元、一次运行、一条数据流、一个文件。从内置的模板开始,比如工厂现场、相机墙、安防墙、设备驾驶舱、运行回放、打印农场或仓库。然后修改它、提交它,复制到下一个厂区。
相机墙把所有录下的视频流放在一个屏幕上,与机器共用同一个时钟。
图版 33 · 夜里的控制室,椅子空着
实际清点,不是预测。
以仓库中的数字,说明产品今天已有的东西。
- 26
- 目录中的驱动
CNC、打印机、舵机总线、机械臂、相机、Shell 等,统一在一个会话接口之后。
- 6
- 图表视图
折线、磁贴、柱状、热力图、平行坐标和散点,都从记录中绘制。
- 0.5mm
- 触发标记的偏差
计划所说的位置与机器上报的位置之间的差距。
- 0
- 静默重试
物理命令只发送一次。重试是一个决定,并且会被记录。
验证
测试到什么程度,我们如实说明。
每个驱动都用一个词标明它经过何种验证:none、loopback、bench 或 hardware。目前 26 个驱动中有 23 个标注 loopback——针对每种协议的忠实软件替身进行测试;其余三个标注 none。还没有任何机器完成调试投用。
Modbus、OPC UA、MQTT 等现场总线驱动还不在目录中。如果你的现场用的是它们,请告诉我们。