简介这份FOCAS2 Library.zip 是发那科数控系统数据采集与控制的官方库资源包面向机床监控、远程运维和智能制造方向的开发人员。其核心价值在于通过API接口让开发者读取轴位置、速度、电机电流、报警信息并支持远程监控、程序上传下载与加工性能分析V4.9版本新增Linux支持可在树莓派等低成本硬件上快速部署。压缩包共2000个文件大小约19.94MB以XML和HTML格式的说明文档居多同时包含DLL动态库、H头文件、GIF图示、TXT说明、EXE工具及BAS脚本等覆盖文档、示例、库文件三类内容便于查阅、编译与二次开发。目前已有1497人浏览学习。通过包内API文档、示例代码与安装说明初学者可快速理解FOCAS2通信流程有经验的开发者也能直接基于头文件和动态库搭建专属数据采集系统。1. 项目概述1.1 FOCAS2 Library 到底是什么搞数控机床二次开发的朋友大概率都见过这个压缩包FOCAS2 Library.zip。它是发那科FANUC官方提供的 CNC 二次开发库全称是 FANUC Open CNC API Specification 2作用就是让你写的上位机程序能够直接和 FANUC 数控系统对话。你可以通过它读取机床坐标、刀具数据、宏变量、报警信息也可以往机床里传程序、传参数甚至读写 PMC 信号。工厂里常见的 MES 系统对接、车间数据采集MDC、刀具寿命管理、远程程序下发底层基本都是靠这帮 API 撑起来的。FOCAS2 库解决的痛点很明确以前想知道机床当前坐标、当前报警、当前主轴负载只能靠人跑到机床面前看屏幕或者买第三方的采集盒子。有了 FOCAS2你只需要一根网线连到机床的以太网口写个小程序就能把这些数据实时拉回来。对做制造信息化的人来说这是标准得不能再标准的接口方案。1.2 zip 格式背后的两个隐藏信息FOCAS2 Library.zip 这个文件名里除了“FOCAS2 Library”之外那个“.zip”其实也值得说两句。发那科官方在发给集成商的开发包时通常都会用 zip 打包里面一般包含 dll 库文件、头文件、示例源码和 PDF 文档。你别小看这个解压动作很多第一次接触的人就栽在这里。一个坑是解压后不知道该用哪个 dll。FOCAS2 库区分 32 位和 64 位还区分 Ethernet 版本和 HSSB 版本。如果你用 64 位的编译环境去加载 32 位的 fbocii.dll打开程序直接就是“不是有效的 Win32 应用程序”。另一个坑是解压出来没有注册 DLL 的概念它是免注册的 COM 组件FOCAS2 Library 里有个 Fwlib32.dll 是 C 接口也有个 FOCAS2 的 COM 组件但你需要把 dll 放到程序同级目录或者放到系统 PATH 里。有些人在服务器上跑采集服务dll 放的位置不对程序启动时就会报找不到模块排查半天才发现是路径问题。FOCAS2 库本身分三个大版本FOCAS1、FOCAS2 和 FOCAS2/Ethernet。FOCAS1 太老就不提了FOCAS2 通常指走 HSSB 高速串行总线的版本FOCAS2/Ethernet 是走网线的版本。现在新机床基本都是以太网接口所以 FOCAS2 Library.zip 里的核心库实际是 FOCAS2/Ethernet Library常用的 dll 叫 fwlib32.dll 或者 fwlib64.dll。你在设备管理器里看到机床网口有 IP用 FOCAS2/Ethernet 就能连。2. 整体设计与思路拆解为什么 FOCAS2 能成为事实标准2.1 发那科的封装思路FOCAS2 的 API 设计逻辑不复杂核心就是两类函数一类是建立会话和断开会话的握手函数另一类是操作数据的数据读写函数。它把所有数控系统内部的私有通信协议全部封装在 dll 里你不需要关心 TCP 报文怎么组、校验怎么算、FANUC 的 FOCAS2 协议字段怎么排列只需要按 API 文档传参数就行。这套设计理念和很多工业总线类 SDK 是一个路子典型的“对外简单对内复杂”。举个例子读主轴当前转速你只需要调用一个函数传入机床 IP、端口号、轴号返回的就是转速值。这里的核心处理流程是建立句柄相当于和机床建立一条长连接发起数据请求等机床返回数据释放句柄。整个过程中数据以结构体的形式在内存里倒腾。FOCAS2 库里的很多函数都带一个“句柄”参数这个句柄就是你在连上机床之后系统给你分配的会话标识。它保证了在同一时刻多个程序或同一个程序的多个线程可以分别和不同的机床通信互不干扰。我觉得 FOCAS2 能成为事实标准最大的原因是它的跨平台和跨语言支持足够好。C/C 那帮老工程师能用它C#、VB.NET、LabVIEW、Python 的人也能用。虽然官方文档主要讲 C 和 C# 的用法但社区里基于 fwlib32.dll 做的 Python 封装也不少。你在接入 FOCAS2 的时候思路可以有两种一种是从头到尾自己用 C# 写全套;另一种是用社区封装好的 Python 库快速验证功能再根据实际需求改造成正式服务。2.2 适用范围和应用场景预处理FOCAS2 能干什么不能干什么我建议你在动手前先拉个清单。它能干的事包括读取系统状态运行、暂停、报警、读取各轴坐标机械坐标、绝对坐标、相对坐标、剩余移动量、读取伺服负载和主轴负载、读写宏变量和刀具补偿量、读写 PMC 的定时器和计数器、上传下载加工程序、触发 CNC 程序启动和停止、读取报警历史和操作履历。它不能干的事则包括修改系统参数文件里受保护的项目、任意读写内部存储器这需要更高权限、跨系统版本访问比如 FOCAS2 版本太老连不上新系统或者反过来。从应用场景看最典型的三种用途车间设备数据采集MDC定时读取每台机床的开机状态、加工状态、主轴负载、进给速率汇总到数据库用于 OEE 计算。DNC 程序管理通过 FOCAS2 把加工程序推送到机床或者从机床拉回来备份解决程序版本混乱的问题。自动化产线集成用 FOCAS2 读取机床状态作为 PLC 联动的条件信号比如确认机床是否处于可上下料状态。如果是第一次搞我强烈建议你先把“读状态”这条路走通因为读操作没有风险写操作比如远程启动程序、改写宏变量一旦搞错会造成撞机或工件报废。我在实际项目中就见过有人远程修改工件坐标系偏移量改错了直接废掉一整批料。这个教训必须分享出来读数据怎么玩都行写操作一定要有权限控制和安全互锁逻辑。3. 解包与开发环境搭建实操3.1 解压 FOCAS2 Library.zip 后你会看到什么先来说标准的解包步骤。FOCAS2 Library.zip 解压出来通常会有这些目录和文件目录/文件说明Doc函数参考手册和入门指南PDF 格式英文为主IncludeC/C 头文件比如 fwlib.h、fwlib32.hLib库文件所在目录里面按 win32、win64 或 x86、x64 分开放SamplesC/C/C# 示例代码工程Readme.txt版本说明、系统支持说明、重要注意事项这里你需要做的第一件事不是写代码而是确认你的开发环境。比如你用 Visual Studio 2022 做 C# 开发平台目标选 x64那就去 Lib 目录下的 win64 找一个叫 fwlib64.dll 的库。如果你想在 32 位进程里跑就选 fwlib32.dll。C/C 开发的话链接对应的 .lib 导入库;C# 可以直接用 DllImport 方式手动声明 API 函数也可以把官方提供的 FOCAS2.cs 文件加进工程里。有一个细节很多人忽略FOCAS2 Library 的 lib 目录里通常还有一个叫 vc 的文件夹里面是 Visual C 运行库相关的支持文件。如果你的目标机器是干净裸机直接把 dll 拷过去程序可能因为缺少 VC 运行库而启动失败。我的经验是把 FOCAS2 的 dll 放到 exe 同级目录并在项目发布设置里勾选“包含 VC 运行库”或者在目标机器安装对应版本的 VC Redistributable这样最稳妥。3.2 第一次握手最小编程模型不管是 C 还是 C#FOCAS2 的最小编程模型都是三步走。第一步调用连接函数建立句柄第二步循环调用各数据读写函数第三步关闭连接释放句柄。拿官方示例里最常见的 cnc_allclibhndl2 来说它的作用是创建一个以太网连接句柄函数参数包括 IP 地址字符串、端口号、超时时间以及一个输出参数来接收句柄。C 语言的调用大概是这个样子#include fwlib32.h FWLIBHANDLE h 0; short ret cnc_allclibhndl2(192.168.1.10, 8193, 10, h); if (ret EW_OK) { // 连接成功可以读写数据 cnc_freeclibhndl(h); }这里注意三个参数的选择端口号默认是 8193是 FANUC 官方固定的超时时间一般给 10 秒如果机床繁忙或者网络闪断超时太短会话容易断开句柄类型是 FWLIBHANDLE本质是一个 32 位整数用完必须释放否则连接占着不放机床侧会有连接数上限一般是 8 个或 16 个视系统版本而定一旦连接数满再想连就报错。这个最小模型就是后续所有功能的地基。它能跑通就说明你的网络配置没问题、dll 加载没问题、协议版本匹配没问题。我在实际给一个汽车零部件厂做采集时就用这个模型在十分钟内判断出一台老机床能不能走 FOCAS2省掉了不少排查时间。如果你连这一步都过不去后面就别急着开发功能先把网络和 dll 环境搞定。4. 核心功能解析与 API 选型4.1 常用函数分类和参数要点FOCAS2 的 API 数量不少但日常开发高频使用的其实就那么二三十个。我把它们按功能类别整理了一下方便你按需取用功能类别常见函数用途连接管理cnc_allclibhndl2, cnc_allclibhndl3, cnc_freeclibhndl建立/断开以太网连接进给轴状态cnc_rdposition, cnc_rdaxisdata读取坐标、伺服数据主轴状态cnc_rdspindle, cnc_rdspnldata读取主轴转速、负载宏变量cnc_rdmacro, cnc_wrmacro读取/写入宏变量 #100-#999程序管理cnc_rdprogram, cnc_download, cnc_upload读取当前程序、上传下载报警信息cnc_rdalarm, cnc_rdoperalarm读取报警和操作信息PMC 操作pmc_rdpmcrng, pmc_wrpmcrng读取/写入 PMC 地址数据系统状态cnc_statinfo, cnc_rdparam读取系统状态和参数选函数的思路很简单你要读什么数据就去文档里找关键词比如读坐标就用 position读程序就用 program读 PMC 就用 PMC。但参数细节一定要仔细看。比如 cnc_rdposition 这个函数它读出来的坐标值是一个结构体数组里面的每个成员到底是“毫米”还是“脉冲数”取决于机床的设定通常你需要结合参数和文档示例做一次字节转换。如果直接拿原始整型数当毫米用数据可能差几千倍这个坑非常隐蔽。另外要特别注意很多 FOCAS2 函数返回的数据结构里含有中文、日文等非 ASCII 字符比如程序名和报警文本。FOCAS2 在 NC 内部用的是 Shift-JIS 编码所以你在 C# 里看到乱码不用慌要做一次编码转换把 bytes 转成 Shift-JIS 再转成 UTF-8。我在做刀具寿命管理时读刀具号就因为这个编码问题踩过一次坑程序名全是乱码后来统一做了一次编码处理才正常。4.2 读坐标和读宏变量的完整示例给你一个 C# 版的完整示例读取一台 FANUC 0i 系列机床的绝对坐标和宏变量。这里面包含了声明 API、建立连接、读取数据、关闭连接的完整流程。using System; using System.Runtime.InteropServices; using System.Text; class FanucReader { // FOCAS2 32位库 const string LIB fwlib32.dll; [DllImport(LIB, CharSet CharSet.Ansi)] static extern short cnc_allclibhndl2(string ip, ushort port, int timeout, out int handle); [DllImport(LIB)] static extern short cnc_freeclibhndl(int handle); [DllImport(LIB)] static extern short cnc_rdposition(int handle, int type, out ODBPOS pos); [StructLayout(LayoutKind.Sequential)] struct ODBPOS { public short dummy; public short type; [MarshalAs(UnmanagedType.ByValArray, SizeConst 8)] public int[] data; } [DllImport(LIB)] static extern short cnc_rdmacro(int handle, int number, int length, out ODBM data); [StructLayout(LayoutKind.Sequential)] struct ODBM { public short dummy; public short type; public double value; } static void Main() { int h 0; short ret cnc_allclibhndl2(192.168.1.10, 8193, 10, out h); if (ret ! 0) { Console.WriteLine(连接失败: ret); return; } ODBPOS pos; ret cnc_rdposition(h, 1, out pos); // 1代表绝对坐标 if (ret 0) { // 1024为计数单位需根据机床参数换算 Console.WriteLine(X轴绝对坐标: (pos.data[0] / 1024.0)); Console.WriteLine(Y轴绝对坐标: (pos.data[1] / 1024.0)); } ODBM macro; ret cnc_rdmacro(h, 100, 1, out macro); // 读取#100宏变量 if (ret 0) { Console.WriteLine(#100 macro.value); } cnc_freeclibhndl(h); } }这个代码里有两个关键点。第一个是 cnc_allclibhndl2 的第三个参数超时时间我一般设 10防止在取数时卡死。第二个是坐标值换算系数FOCAS2 返回的是经度或线性位置脉冲具体比例因子因系统而异。0i 系列常见是 1:1、1:1000 或 1:1024。你拿一台机床的屏幕显示值核对一下算出来是多少就在代码里写死多少。别偷懒用硬编码最好做成配置文件。读宏变量的核心场景是把 PLC 里计算的临时结果比如夹紧到位、计数器累计通过宏变量传递给上位机这样可以减少 PMC 单独扯线的负担。读宏变量时注意 number 的范围1到999 是公共宏变量1000到7999 是系统宏变量分别对应不同的用途和访问限制。FOCAS2 对超过系统允许范围的变量读写会直接返回一个错误码而且不同系统对宏变量访问权限的处理也略有不同实际用的时候先试试读公共宏变量基本都能通。5. 常见问题与排查技巧实录5.1 连不上机床的四大类原因FOCAS2 开发中被人问得最多的就是“明明网线都插上了为什么连接失败”。总结下来原因通常逃不出这四大类IP 配置问题、端口被挡、系统端 FOCAS2 功能未开启、dll 位数不匹配。IP 配置问题最常见。机床侧的以太网参数需要设置一个静态 IP比如 192.168.1.10上位机电脑需要设置同一网段的 IP比如 192.168.1.20。有人把两台设备设成了不同网段连不上很正常。很多人还会忽略一个细节FANUC 机床的以太网口默认是你设了 IP 之后要重启一下才生效改完 IP 没重启等于没改。端口被挡也很典型。FOCAS2/Ethernet 默认端口是 8193你要确保 Windows 防火墙没有拦截这个 TCP 端口。解决办法是在防火墙高级设置里添加入站规则放行 8193或者干脆在测试阶段把防火墙临时关掉等开发完成后再加白名单。生产环境里服务器上的杀毒软件也可能拦截这类问题排查起来比较隐蔽建议一开始就在网络连通性测试后马上测试端口连通性。可以用一个简单的命令先验证网络通不通再验证 FOCAS2 端口有没有通ping 192.168.1.10telnet 192.168.1.10 8193如果 ping 通但 telnet 失败说明防火墙或机床侧 Ethernet 功能有问题。如果 telnet 直接超时大概率是参数没设对或系统软件版本阉割了 FOCAS2 功能。第三种情况是机床系统侧的设置问题。有些机床的系统参数里需要把“FOCAS2 功能”相关的位打开比如设定“使用以太网功能”的位参数或者通过 0i 系统的“系统连接设定”界面把 FOCAS2 端口使能。这一步一般要联系机床厂家或系统厂商确认你有 FOCAS2 授权是前提。如果没买授权就算连通也会在被连接时被系统拒绝。5.2 解压和运行时的常见报错FOCAS2 Library.zip 解压和运行阶段最常遇到的几个报错我在下面整理了一张表现象可能原因解决思路程序启动报找不到 DLLdll 没放在 exe 同级目录或不在 PATH将 fwlib32.dll/fwlib64.dll 拷贝到 exe 目录报“不是有效的 Win32 应用程序”32 位程序用了 64 位 dll或反之统一程序平台目标和 dll 位数连接返回错误码 -17 或 -18超时、IP 不通或端口被防火墙挡检查 IP、端口、防火墙设置读出的坐标值明显不对坐标换算系数设置错误用机床屏幕显示值反推比例因子程序名乱码Shift-JIS 与 UTF-8 编码转换问题使用 Encoding.GetEncoding(shift_jis) 转换机床侧显示连接数已满连接占满未释放句柄确保每个程序退出前都调用 cnc_freeclibhndl报错码这块FOCAS2 的错误码在 fwlib.h 里都有定义常见的是 EW_OK0、EW_BUSY-8、EW_LENGTH-11、EW_IPADDR-16、EW_TIME_OUT-17、EW_HANDLE-24等。你最好习惯性地把错误码打出来并转成文字描述排查效率高很多。我遇到过最刁钻的一个问题是程序在生产电脑上跑得好好的换到另一台电脑就连不上报“连接超时”。后来查出来是这台电脑的网卡驱动开启了 VLAN 隔离导致机床网络和办公网络不能互通。这类问题属于网络环境层面的干扰遇到连接问题时不能光在 FOCAS2 层面找原因纯网络分析也要跟上。5.3 几个实用避坑心得从我做了多个 FOCAS2 项目的经验看下面这几条心得值得你记在项目文档里第一所有 FOCAS2 调用建议放在一个独立的线程或服务进程里不要直接放在 UI 线程。FCAS2 的某些函数在没有数据返回时会阻塞到超时UI 线程一卡整个软件看起来就“死机”了。数据采集服务最好做成 Windows 服务或控制台程序配合消息队列把数据推到前端展示。第二注意机床连接的并发限制。FANUC 0i 系列通常允许最多 4 到 8 个 FOCAS2 客户端连接同一台机床。如果有多个上位机同时连要考虑连接池的设计。我一般建议一个程序只维护一个长连接所有的数据请求都走这个连接而不是频繁开关连接。频繁重连既慢又容易触发机床侧连接限制。第三采集频率不要太高。FOCAS2 毕竟是走网口的不是你机床内部总线。精度要求高的数据比如伺服负载实时波形要么缩短到 500ms 以上采样要么用专用的高速数据采集方案。你设 100ms 甚至 10ms 的轮询一方面会占满机床侧网络资源影响机床操作面板响应另一方面也容易导致连接不稳定。车间采集场景1 秒一次已经足够绝大多数 MES 统计了。最后一点做写入操作前一定要做好参数备份。尤其是写宏变量、写刀补、写程序这类操作能出问题的地方太多了。我在线上环境跑的程序下发模块都是先查机床状态是否在运行是否锁定再执行下发下发完成后还要回读校验确认程序完整性和版本一致性。宁可多写几条判断也不能图快直接发数控机床这东西一出事故就是大事故。6. FOCAS2 Library 之外联动设计和后续扩展6.1 把采集数据做成可消费的数据源FOCAS2 接上之后程序能读到机床数据只是第一步真正有业务价值的是把这些数据形成稳定的数据源。我的建议是设计一个统一的数据采集层对外输出标准化格式。比如把坐标、主轴负载、程序名、报警信号、当前状态等聚合成一个 JSON 对象或者写入时序数据库这样上层的 MES、看板系统不用关心底层是哪家 CNC直接消费标准数据即可。一个简单方案是采集服务把 FOCAS2 返回的数据结构转换成统一模型每隔固定时间比如 1 秒把状态推送到 Redis 或者 MQTT Broker看板系统订阅这些主题实时刷新。车间里的中控大屏、手机 App 都可以通过相同接口获取数据。这样做的好处是新增一台机床只需要配置 IP 和轴数不需要改动上位机代码。6.2 多品牌机床协同的取舍如果你车间里不只有 FANUC还有三菱、西门子、兄弟等品牌那你对 FOCAS2 的依赖可能需要抽象成一个统一的设备适配层。每个品牌开发一个适配器对外暴露一致的接口。FOCAS2 只是其中一个适配器的内部实现。这个思路能让整个采集系统具备很强的横向扩展能力。做适配层的时候接口设计要考虑不同厂商的能力差异。比如在 FANUC 里读宏变量很顺手但在西门子里你读的是 DB 块数据结构差别很大。接口定义最好保守一点只暴露通用的机床状态、坐标、程序名、报警等基础信息特色功能单独做扩展接口。这样系统维护起来省心换机床也不至于导致上层应用大面积改代码。我在实际项目中就遇到过这样一个需求一个车间 30 多台设备16 台 FANUC、8 台三菱、6 台磨床。我只用 FOCAS2 把 FANUC 接了三菱那边用了另外一套 SDK磨床是模拟量传感器配合 PLC 采集。上层系统完全无感只看到统一的设备列表和状态图。这就是 FOCAS2 在集成项目里的定位它是非常关键的一块拼图但不是整个积木。6.3 安全性设计和权限控制用 FOCAS2 做远程控制时安全性怎么强调都不过分。我见过有人图方便把 FOCAS2 写操作接口直接暴露在办公网里结果某次误操作远程清空了所有宏变量直接导致产线停线半小时。这类事故完全可以靠软件设计避免。建议你至少做到这几点一是所有写操作接口都做权限校验区分浏览权限和操作权限二是写操作必须带操作日志记录是谁、在什么时间、执行了什么命令三是关键写操作比如远程运行程序、修改刀补必须二次确认最好通过独立的审批流四是在网络层面做隔离FOCAS2 通信的网段尽量和生产 IT 网段隔离禁止外部随意访问。哪怕只是一个小车间也要按这个标准做。机床设备不像普通 IT 系统出问题就是真金白银的损失。关于扩展FOCAS2 官方文档里还提到了一些高级功能比如 DNC 双通道、高速加工数据采样、Servo Guide 数据导入等这些功能不是每个系统版本都开放需要看具体的选型和授权。你在做设备选型时如果未来有计划做更深入的制造数据分析最好提前和机床厂确认系统版本是否支持这些高级读取功能避免选型结束才发现硬件不支持。7. 最后的经验分享如果你现在正准备用 FOCAS2 做项目我的个人建议是先拿一台机床做完整的概念验证把连接、读坐标、读报警、读程序这几个基础链路全部跑通确认这台机床的软件版本、连接数限制、数据精度都符合预期再考虑大规模推广。批量接入时每台机床的连接参数、坐标比例因子、支持的 API 集合都要做成独立配置不要假设所有机床都一样。还有一个小技巧FOCAS2 返回的错误码里藏着很多信息建议自定义一个错误码转文本的映射表集成到你自己的日志系统里。现场出问题的时候运维人员看日志能直接知道是网络问题、权限问题还是参数问题而不是对着一个数字发呆。这个小投入能省很多现场跑腿的时间。我把这个库用了两三年之后最大的体会就是FOCAS2 本身不难难的是把它稳定地嵌进整个生产系统里处理好网络、版本、编码、权限这些工程细节。开发前多花点时间在环境确认和异常处理上比急着写功能要有效得多。希望这篇分享能帮你少踩一些坑顺利把设备和数据联通起来。本文还有配套的精品资源点击获取