发那科机床联网,官方路径只有一条:FOCAS 库(Fwlib32)。网上例子能跑通"连接 + 读一个程序号",但真到车间里,8 台机床同时连、要读主轴负载和件数、夜班还要不断线,坑全在例子之外。南京这家模具加工厂 8 台机床(6 台 0i-MF、2 台 31i-B),我们从拉网线到看板上线用了三周,这篇把项目档案、采集点表和四个实打实的坑都记下来。
项目档案:先摸清每台机床的"家底"
FOCAS 不是插上网线就能用。开干之前必须逐台确认三样东西:系统版本、以太网板卡、开放权限。这项目进场第一天我们就是拿着表逐台登记:
有个前提容易被忽略:FOCAS 功能需要机床参数打开。0i-MF 上要让厂家或机修确认以太网嵌入板参数已设(IP、端口、FOCAS 有效),部分老机床这个选项是收费功能,没开通的话你 ping 得通、8193 端口就是连不上。我们项目里有一台二手机床,最后是发那科服务人员上门刷了参数才放开。
连接怎么建:一个句柄一台机,用完必须还
FOCAS 的调用模型很"C 语言":先 cnc_allclibhndl3 拿一个句柄(handle),之后所有读写都带这个句柄,程序退出前必须 cnc_freelibhndl 释放,否则句柄泄漏,机床侧连接数被占满,谁都连不上。C# 侧用官方 fwlib32.cs 的 P/Invoke 封装(或 Fwlib32.dll 自己 DllImport):
[DllImport("Fwlib32.dll", CallingConvention = CallingConvention.Cdecl)]
static extern short cnc_allclibhndl3(string ip, ushort port, int timeout, out ushort handle);
[DllImport("Fwlib32.dll", CallingConvention = CallingConvention.Cdecl)]
static extern short cnc_freelibhndl(ushort handle);
ushort h;
short ret = cnc_allclibhndl3("192.168.20.11", 8193, 3, out h);
if (ret != 0) // EW_OK = 0 才算成功,非0全是错误码
throw new Exception($"FOCAS连接失败, 错误码 {ret}");
try {
// ……所有 cnc_xxx(h, ...) 读写都在这个生命周期里
}
finally { cnc_freelibhndl(h); } // 必须释放,别等GC
▲ 8 台机床就是 8 个句柄,建议每台机床封装成一个 MachineSession,内部管自己的连接、轮询和重连。
到底能采到什么:四类数据各有各的读法
FOCAS 没有一个"读所有数据"的万能函数,你要的每类数据都有对应 API,而且同一种数据在不同系统版本上读法可能不一样。这是这个项目实际用的采集点表:
| 采集内容 | FOCAS API | 数据位置 | 说明 |
|---|---|---|---|
| 系统/版本信息 | cnc_sysinfo | ODBSYS 结构 | 开机时读一次,确认机型和版本 |
| 主轴实际转速 | cnc_acts | ODBACT | 实际 S 值,加工监控主用 |
| 主轴负载/伺服负载 | cnc_rdspdlname / cnc_modal | 窗口数据 | 刀具磨损、断刀判断靠它,不同版本路径有差异,需现场对信号表 |
| 当前主程序号 | cnc_rdprgnum | ODBPRO | 正在跑的 O 号,对应工单/零件号 |
| 加工件数 | cnc_rdpmacro | 宏变量 #3901 / #500系 | 件数在不同机床上宏号不同,常见 #3901(要求件数)和厂家自定义保持宏变量 |
| 运行/报警/进给保持状态 | cnc_statinfo | ODBST | aut/rst/run 等位,自动判定"运行/待机/报警"三态 |
| 报警号与报警文本 | cnc_alarm2 / cnc_rdalmmsg | ODBALMMSG | 报警代码+中文文本,直接进看板报警栏 |
| PMC 内部信号 | cnc_pmc_rdm | G/F/X/Y 地址 | F 地址是 CNC→PMC(机床输出给逻辑的状态),读润滑、气压、刀库信号走这里 |
#520=#520+1 自己计数,另外几台件数在系统的部件数计数器里。我们最后是每台机床让操机师傅调出计数器界面,对着宏变量表逐个试读确认宏号,再写进配置。这种活文档里查不到,必须到现场。四个坑,个个都耽误过工期
上线节奏:三周是怎么排的
- 第 1 周:通电联网布网线、逐台设 IP、确认 FOCAS 参数开通,8 台全部 8193 端口可连——比预想久,二手机床参数那台耗了两天。
- 第 2 周:点表对齐逐 API 试读,重点是宏变量件数和 PMC 负载信号,每台机床出一张确认的点表,机修师傅签字。
- 第 3 周:采集服务 + 看板8 个 MachineSession 常驻轮询、断连重建、数据入库,车间看板显示三态(运行/待机/报警)+ 当日件数 + 当前程序号。
上线后效果最直接的是稼动率:以前靠操作工填纸票统计,8 台机床一天实际切削时间没人说得清;现在状态位自动记录,一周数据出来,两台机床待机时间占了 40%,老板当场就排了排产整改。
给准备做发那科联网的两点建议
第一,进场前先远程确认机床系统版本和 FOCAS 授权,把 FOCAS 手册版本和 CNC 版本对上,别等网线拉完才发现端口没开;第二,件数、负载这类"活点"预留现场调试时间,它们不在标准 API 的舒适区,宏号和 PMC 地址一台一个样。先把"连接 + 状态三态 + 程序号"这条最稳的链路跑通给客户看到东西,再啃件数和负载,项目节奏会顺很多。
