Fanuc FOCAS (CNC) 驱动
概述
FOCAS = Fanuc Open CNC API Specification。它是从 Fanuc CNC(Computer Numerical Control)控制器读取 主轴负载 / 轴位置 / 加工程序 / 报警 / OEE 指标的事实标准 API。 Mazak、DMG MORI、Doosan 等机床 OEM 只要采用 Fanuc 作为控制器,同样会暴露该接口。
| 项目 | 值 |
|---|---|
opc_type | FOCAS |
| 实现类 | plantpulse.driver.protocol.focas.FOCASDriver |
| 库 | (无 — stub) |
| 目标控制器 | Fanuc 0i / 30i / 31i / 32i / 35i、Power Mate、FS18i 等 |
| 通信介质 | Ethernet(TCP,默认端口 8193)— HSSB 光纤卡另行处理 |
| read | stub(返回 "") |
| write | stub |
FOCAS 仅存在 stub 实现。若需与实际 Fanuc 控制器通信,请使用下方
替代运行方案 中的任一桥接模式。
PlantPulse 本代码库并不计划在单一 jar 中嵌入 native FwLib。
native 实现为何困难
FOCAS 的 wire 协议是非公开的。Fanuc 不公开 wire 规范, 而是向许可会员分发名为 FwLib (Focas Library) 的 C 库。 也就是说,若要在 Java 侧直接使用 FOCAS,需要具备以下条件之一。
| 依赖要素 | 说明 | 对部署的影响 |
|---|---|---|
Fwlib32.dll (Windows) | 32-bit DLL — 必须持有 Fanuc 许可 | 需要 x86 JVM 或 IPC 分离 |
libfwlib32.so (Linux) | x86-64 / ARM 构建 — 按许可分别提供 | 需匹配 OS / glibc 版本 |
| HSSB 卡驱动 | 光通信用 PCI 卡 — 与控制器 1:1 | 需要 Linux 内核模块 |
| 许可密钥 | 注册为可使用 FwLib 的会员单位 | 不可再分发 |
| JNI 绑定 | Java <-> C 内存模型 / thread | 调用失败时可能导致 JVM 崩溃 |
与 ROS 2 / DALI / IO-Link 相同,按照追求单一 jar 部署 + 支持多种 OS / ARCH 的 PlantPulse Edge 策略,嵌入 native 库属于 cost > benefit。 此外,受许可政策限制,FwLib 也不是 PlantPulse 可以自由再分发的组件。
替代运行方案
所幸 Fanuc 官方 / 第三方已提供标准桥接方案。PlantPulse 只需接收桥接端的 输出接口(HTTP / OPC UA)即可。
方案 1. MTConnect Adapter / Agent(推荐)
大多数现代机床 / Fanuc CNC 采用 MTConnect(ANSI/MTC1.4)作为首选集成路径。 Fanuc 免费提供自家的 FOCAS-MTConnect Adapter,OEM(Okuma、DMG MORI、Mazak SmartBox) 也遵循同一标准。
| 使用的 PlantPulse 驱动 | 页面 |
|---|---|
HTTP(REST 轮询,XML 解析在计算公式 / 接收管道中处理) | HTTP |
方案 2. OPC UA(Fanuc CNC OPC UA 选件或 KEPServer)
Fanuc 新型控制器可通过附加选件暴露 OPC UA Server。 旧型控制器则使用 Kepware KEPServerEX Fanuc Suite 或 Matrikon FOCAS OPC Server 等商用网关进行转换。
| 使用的 PlantPulse 驱动 | 页面 |
|---|---|
OPCUA | OPC-UA |
方案 3. Direct FwLib JNI(边车)
持有 FwLib 许可的用户,可将自研 JNI 模块以独立 jar(motorsensor.jar 模式)或
边车进程(例如 focas-grpc-server)的形式运行,由 PlantPulse 轮询其输出。
此时 PlantPulse 本体 jar 保持不变,FOCAS 驱动也可继续保留为 stub。
应如何选择方案
| 场景 | 推荐 |
|---|---|
| OEM(Mazak SmartBox / DMG MORI Celos / Okuma)已在运行 MTConnect Agent | MTConnect → HTTP |
| Fanuc 30i 新型,可加装 OPC UA 选件 | Fanuc OPC UA → OPCUA |
| Fanuc 0i 旧型,SI 持有许可 | KEPServerEX Fanuc Suite → OPCUA |
| 自有 FwLib 许可 / 需要定制数据 | focas-grpc 边车 → HTTP |
| 仅需简单的开动率(0/1)指标 | 控制器数字输出 → Modbus/Ethernet IO 模块 |
日后进行 native 实现时的考虑事项
| 方案 | 依赖 | 难度 |
|---|---|---|
| 直接嵌入 FwLib JNI | 需要 x86 / x64 / ARM 全部构建,以及许可 | 极高 |
独立 plantpulse-edge-driver-focas.jar(motorsensor.jar 模式) | 通过 reflection 加载库 | 高 |
| 边车 + gRPC | FwLib 仅在边车侧,PlantPulse 作为 HTTP/gRPC 客户端 | 中 |
| 逆向得到的 wire 协议(第三方) | 有违反 Fanuc 许可的风险 | 不推荐 |
PlantPulse Edge 推荐的官方集成路径是 MTConnect(HTTP 驱动)。 OEM 已提供 MTConnect Adapter,可同时规避许可 / 部署 / OS 兼容性问题。 若具备 Fanuc OPC UA 选件,则通过 OPCUA 驱动 直接连接是最为简洁的路径。
stub 注册(仅供测试)
curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_FOCAS_STUB",
"opc_type": "FOCAS",
"opc_name": "FANUC FOCAS stub",
"opc_agent_ip": "192.168.0.0",
"opc_agent_port": "8193",
"site_id": "SITE_00001",
"auto_collect": false,
"timecycle": 5000,
"tag_list": []
}'