发那科FOCAS 1/2文档与核心库文件详解:从机床数据采集到MDC/SCADA实战

发布时间:2026/9/17 2:14:46
发那科FOCAS 1/2文档与核心库文件详解:从机床数据采集到MDC/SCADA实战 说句实在话第一次拿到发那科FOCAS 1/2文档时我对着满屏的英文PDF和一堆动态库发了好一阵呆。做过机床数据采集项目的朋友都知道发那科这套FOCASFANUC Open CNC API Specifications是设备联网绕不开的入口而FOCAS 1/2文档里附带的核心库文件才是真正能让你把机床里的坐标、程序、报警、宏变量读出来的钥匙。这篇文章我就从自己做MDC机床数据采集和SCADA项目时积累的经验出发把FOCAS 1/2文档和核心库文件讲透它到底是什么、FOCAS1和FOCAS2怎么选、开发环境怎么搭、常用API怎么调、现场容易踩哪些坑。适合正在做机床联网、MES对接、设备状态监控的开发工程师也适合想搞懂FOCAS库文件关系的车间信息化维护人员。1. 先搞清楚FOCAS 1/2文档里的“核心库文件”到底指什么1.1 FOCAS文档的真实结构很多刚接触发那科系统的人会有一个误区以为FOCAS是一套软件装完就能用。其实FOCAS更准确地说是一套通信协议和API接口规范官方发布的“FOCAS 1/2文档”通常是光盘或网上打包好的资料包里面包含几个层面的东西协议说明书PDF介绍FOCAS库的体系结构、连接方式、函数调用规则这部分是理解整个通信逻辑的基础。头文件比如FOCAS1库里的fwlib32.h、FOCAS2库里的focas.h定义了所有函数声明、数据结构体、错误码、常量宏。动态链接库和导入库这是真正的“核心库文件”。FOCAS1对应fwlib32.dllFOCAS2对应focas32.dll或focas64.dll。示例工程官方给的C/C例子包括连接、点位读取、程序上传下载等基本覆盖了最常见的开发场景。我建议你拿到文档后别急着看手册先把这些文件按上面四类分好。实际操作中真正写程序时频繁要用的是头文件里的结构体定义和函数原型而不是那几百页的英文说明。把示例工程跑通一个比读十遍手册都管用。1.2 FOCAS1和FOCAS2的区别与选型FOCAS1是早期推出的接口库最开始是配合HSSB高速串行总线板卡使用后来也支持以太网连接。FOCAS2则是后来针对以太网通信主推的一套库也是目前大多数发那科新系统比如0i-F、31i-B、30i-B系列使用的主流方式。这两套库文件名不同函数也要稍微注意一下FOCAS1用fwlib32.dll连接函数通常是cnc_allclibhndl或cnc_allclibhndl2FOCAS2用focas32.dll或focas64.dll连接函数是cnc_allclibhndl3。它们在很多底层数据结构上大同小异但毕竟一个是老接口一个是新接口项目选型时最好直接确认机床控制系统支持哪种。选型时我给一个很实际的建议新项目统一走FOCAS2以太网连接不要再碰HSSB的板卡方案。除非现场还有老设备比如早期的16i/18i/21i且没有以太网口只能通过HSSB通信那才需要单独保留一套FOCAS1环境。之前做过一个项目现场既有0i-TF新系统又有十几年前的16i老系统最后是上位机同时加载FOCAS1和FOCAS2两套库用不同的接口函数分组管理才能把所有设备统一接入。提前把新旧系统分开规划能省很多事。2. 开发环境搭建从库文件加载到跑通第一个连接2.1 机床侧和上位机侧要准备什么FOCAS开发不是光在电脑上装个库就能连上机床的两端都要做功课。机床侧需要确认以下几点系统是否开通了以太网功能有些机床虽然带网口但功能选项里没有开放需要联系机床厂商或发那科授权服务商处理。机床IP地址要固定不能使用DHCP避免重启后IP漂移导致上位机连不上。CNC侧的以太网相关参数需要正确设置比如端口号、TCP/IP传输设置等。不同系列系统参数号不完全一样具体要查对应系统的连接说明书这里不硬背参数号现场打开系统诊断页面核对就行。上位机侧要注意的地方更多。首先是库文件位数32位程序必须用32位的focas32.dll64位程序用focas64.dll最好。之前就遇到过项目组图省事在64位系统上编译了64位程序却因为拷贝错了DLL运行时一直报“无法加载DLL”排查半天才发现是拿成了32位的文件。其次是防火墙Windows默认会拦截入站连接需要放行你程序使用的端口发那科FOCAS以太网默认端口是8193这个必须记住。提示FOCAS2默认通信端口是8193在连接函数里作为参数传入。如果现场改过端口要和机床侧确认一致否则永远连接超时。2.2 C#调用FOCAS库的最小示例下面给出一个我自己项目里常用的C#封装模板用DllImport直接引入FOCAS2核心库文件实现连接和读取坐标using System; using System.Runtime.InteropServices; public class FanucFocasHelper { // 引入FOCAS2核心库文件 [DllImport(focas32.dll, EntryPoint cnc_allclibhndl3)] public static extern short cnc_allclibhndl3( string ipaddr, ushort port, int timeout, out ushort flibh); [DllImport(focas32.dll, EntryPoint cnc_rdposition)] public static extern short cnc_rdposition( ushort flibh, short axis, out ODBPOS position); [StructLayout(LayoutKind.Sequential)] public struct ODBPOS { public short dummy; public short type; public short mask; [MarshalAs(UnmanagedType.ByValArray, SizeConst 15)] public short[] data; } public static ushort Connect(string ip, int timeout 5000) { ushort handle; short ret cnc_allclibhndl3(ip, 8193, timeout, out handle); if (ret 0) return handle; return 0; } public static string ReadMachinePosition(ushort handle) { ODBPOS pos; // -1 表示读取所有轴 short ret cnc_rdposition(handle, -1, out pos); if (ret ! 0) return 读取失败错误码: ret; // 机械坐标数据存储在 data 数组的前几个元素中 // 实际机床3轴或5轴时依次取 data[0]、data[1]、data[2] string result ; for (int i 0; i 3; i) { result pos.data[i] / 1000.0 ,; } return result.TrimEnd(,); } }这个示例虽然简单但已经把FOCAS开发的基本套路走通了一遍连接拿句柄、用句柄调API读数据、返回错误码判断处理。注意结构体ODBPOS里的data数组长度是15实际坐标值按机床轴数取前几项并且要做单位换算通常返回的是千分之一毫米这些细节官方文档里不会写得特别显眼都是现场试出来的。连接成功后别忘了在程序退出前调用cnc_freelibhndl释放句柄。很多新手连上以后忘记断连导致测试时反复连接失败就是句柄没有释放干净。虽然系统超时会自动释放但作为正规的采集程序每个连接都必须有对应的释放逻辑。2.3 连接过程中的参数细节cnc_allclibhndl3的几个参数值得单独说说ipaddr字符串类型的IP地址填机床侧设置的固定IP比如“192.168.0.100”。port端口号默认8193用ushort类型传。timeout超时时间单位毫秒。局域网内一般给3到5秒就够了别给太长否则一台机床网络异常时你的采集程序会卡住不动。flibh返回的连接句柄out类型后续每次API调用都要带着它。返回值为0表示连接成功非0则是错误码常见的有连接超时、端口不可达、机床未开启以太网功能等。这里的排查逻辑我后面在问题速查表里统一写。实操心得FOCAS库的连接句柄机制有点像数据库连接池只不过它是单连接的。一个句柄在同一时刻只适合一个线程调用项目里如果有多个工位要并行读数据最好每个线程或任务单独建立一个连接而不是共用同一个全局句柄。3. 核心API和数据结构拆解真正的数据采集主力3.1 连接类API与应用场景除了cnc_allclibhndl3连接相关的API还有cnc_allclibhndl、cnc_allclibhndl2FOCAS1用以及cnc_freelibhndl断开连接。项目经验是老设备用HSSB时FOCAS1的cnc_allclibhndl还可以在连接时传入板卡号或设备号调试时要对着fwlib32.h里的宏定义看。连接类API虽然简单但它是整套采集链路的地基。现场发生过一个很有意思的问题上位机是公司内网地址192.168.1.x机床是车间隔离网段192.168.0.x两段网络默认不通FOCAS连接自然一直超时。后来加了路由或双网卡才把这个问题解决。所以调试连接先要在上位机上用ping命令确认能通再谈FOCAS层面的问题。3.2 数据采集类API组合拳FOCAS的精髓在于用一组功能函数把CNC内部的数据“拉”出来。生产中我常用到的几个核心API如下函数名功能返回的主要数据cnc_rdposition读取坐标机械坐标、绝对坐标、相对坐标cnc_rdmacro读取宏变量用户自定义变量#500后多为PMC/NCI数据cnc_rdalm读取报警当前报警号和报警文本cnc_rdparam读取CNC参数参数号对应的数值、位数、数据类型cnc_rdopn读取当前程序当前正在运行的程序号和程序名cnc_rdstat读取系统状态自动/手动/编辑等操作模式cnc_rdtimer读取时间运行时间、切削时间、循环时间等cnc_upload/cnc_download程序上传/下载NC程序内容举一个宏变量读取的例子。很多机床会把当前刀具号、主轴负载、工件计数等写入宏变量上位机只要通过cnc_rdmacro读对应宏变量号就能实时拿到工艺数据。之前做OEE统计时车间的老机床没有开放刀具寿命数据接口我们就是靠现场操作工把刀具计数写到#510宏变量里然后上位机轮询读取效果非常好。要注意的是宏变量读取返回的结构体ODBMD包含mcr_val联合体不同数据类型字节、字、双字、实数在不同系统上占用的字节大小不一样。用C或C开发时需要根据data_type字段判断类型再取值搞错了会读出莫名其妙的数据。用C#开发时联调前先和系统手册核对mcr_val的Marshal声明别想当然地按整数读。3.3 报警读取和程序上传下载的坑cnc_rdalm是设备报警监控的关键API它返回的ODBALM结构体里有报警号alm_no、轴号、报警类型如程序错误、伺服报警、过热报警。这里有个重要的坑报警号必须结合报警文本翻译才能让操作工看懂FOCAS本身返回的往往是编号和类型不直接给完整的中文描述。项目里要维护一张“报警号-文本”映射表或者从发那科报警手册里导出否则上位机界面上只能显示一串数字对现场运维没有意义。程序上传下载这块cnc_upload和cnc_download的尺寸参数特别容易写错。上传时要用一个足够大的缓冲区接收数据长度按字节算下载时则要确保NC程序内容完整最后以%结尾。遇到过最典型的现场问题是上位机上传加工程序时因文件编码不一致导致CNC中文注释显示乱码。发那科系统对NC程序编码有特定要求上传前最好统一转为ASCII或系统支持的编码格式。上传下载程序后另一个热门需求就是G代码解析。做程序工时统计、路径优化时需要把采集到的G代码按行解析提取移动指令、主轴转速、进给速度。这个方向可以单独写一篇但底层的数据来源就是FOCAS从系统里下载下来的NC程序文本。先把“读程序”这一步打通后续解析才有发挥空间。4. 现场实测采集流程的完整闭环和常见故障处理4.1 一条完整的采集流程长什么样我做一个单台机床状态采集任务时基本按照下面的流程走开机后初始化FOCAS库调用cnc_allclibhndl3建立与机床的连接。用cnc_rdstat读取系统当前状态自动运行、暂停、报警等作为状态机的主状态。按固定周期一般是500毫秒到1秒轮询cnc_rdposition读取坐标cnc_rdmacro读取宏变量cnc_rdalm读取报警。数据统一封装成结构体写入内存队列再由另一个线程批量刷新到数据库或推送至SCADA/MES。每次采集间隔内检查连接是否断开若断开则自动重连并记录断线日志。这套流程看起来简单但实际生产环境最怕的是“只读数据、不管连接”。比如机床偶尔网络抖动导致连接断开如果程序没有重连机制数据链路上就会出现大段空白最后做出来的稼动率报表根本没参考价值。所以我的建议是每次轮询之前先判断句柄是否仍然有效连续3次采集返回连接类错误时自动重连重连间隔从5秒开始指数退避避免在机床离线时疯狂打日志。4.2 多台机床并发采集的调度思路单台连接跑通后真正考验人的是车间几十台设备同时采集。这时候如果每条线程维护一个连接5台设备还好50台设备就会遇到线程数爆炸、内存占用过高的问题。我现在的做法是用一个连接池或独立采集服务每个连接对应一个后台任务任务循环里面做以下事情发送当前采集命令比如读取坐标、宏变量、报警。等待响应设置一个合理的命令超时时间比如2秒。超时或错误码返回后将该连接标记为“待重连”不阻塞其他任务。重连失败时记录错误和最近一次有效数据时间方便后续追溯。实际验证下来百台以内的设备量用.NET的Task或C的线程池都可以稳定扛住。机床数量更多时可以考虑给车间划分采集分组每组一台前置机前置机之间再向上汇总避免单点压力过大。4.3 常见问题速查与避坑清单下面这张表是我项目答疑时经常用到的基本覆盖了FOCAS开发90%的常见问题现象可能原因解决思路连接超时IP不通、端口错误、防火墙拦截先ping机床IP确认端口8193放行防火墙连接返回错误码-17等机床侧以太网功能未开启或参数不对检查系统参数和以太网设置咨询机床服务商程序运行中报“无法加载DLL”库文件位数与编译目标不匹配换成一致位数的focas32/focas64/fwlib32读出的坐标数值放大1000倍或缩小忘记单位换算FOCAS返回的轴数据是千分之一毫米注意换算宏变量读出乱码或类型不对结构体类型声明错误核对ODBMD中mcr_val的数据类型定义报警文本空白报警号未映射到文本建立报警号-中文描述对照表长时间运行后读取变慢连接老化或未释放句柄加入心跳检测和定时重连机制程序上传后中文注释乱码编码格式不匹配统一转成系统支持的编码再上传再补充几个独家避坑经验多线程调用同一个连接句柄时一定要加锁。FOCAS底层并不是线程安全的之前并发读同一个句柄偶尔会读出全0的数据加上锁之后问题消失。机床时间与上位机时间的同步很重要。采集到的报警记录、运行记录如果时间基准不一致后续做故障分析、工时统计时会非常痛苦。最好是上位机在每天凌晨自动校时一次或者从机床读取系统时间作为数据时间戳。PLC与FOCAS要配合使用。发那科机器人和CNC联动的项目里PLC主要管逻辑互锁、信号交互FOCAS则负责从CNC侧拿数据。两者不是替代关系而是并行关系。之前做过一个项目操作工刷卡启动设备刷卡信号进PLCPLC触发上位机通过FOCAS把当前加工程序下载到CNC再反馈启动结果这套流程要两边配合才能闭环。5. 从FOCAS进一步看发那科整体联网方案5.1 机器人、示教器与FOCAS的关联发那科机器人也有类似FOCAS的通信接口机器人控制器通过网络和上位机通信的逻辑与CNC很相似。很多人问“发那科机器人示教器能不能直接采集数据”答案是可以的但示教器更偏向于人机交互后台通信通常走专门的开放协议或网络共享方式。做机器人状态采集时系统的报警信息、位置信息、程序状态也能通过类似FOCAS的库读取。比如机器人报警SYST212这类问题在现场排查时可以一边看示教器报警画面一边从上位机日志确认报警发生的时间点和程序段两边对照来定位原因效率会高很多。这个思路放在CNC项目里也是一样的FOCAS采集的数据不是替代现场人员而是帮现场人员更快地找到问题。5.2 外围设备通信的衔接车间里除了发那科机床还有小原伺服焊枪、西门子PLC、机器人等设备。比如发那科和小原的SIV32焊机走Profinet通信时经常需要把机床或机器人的状态信号映射到PLC里参与联锁控制。这种场景下FOCAS不是主角但FOCAS采集到的CNC状态可以作为前置条件通过上位机或网关转成Profinet信号给焊机或机器人。项目里做这类集成时建议把FOCAS采集层和信号转换层分开设计。采集层专心负责机床数据信号转换层负责协议转换中间通过消息队列或共享内存衔接。这样即使某一台机床采集断了PLC联锁逻辑不会受影响不至于整个产线都停下来。5.3 开发工具和上手路径最后聊一下很多人关心的“发那科编程和仿真的软件下载地址”。发那科官方有仿真软件可以模拟CNC操作但FOCAS开发更实用的路径是先拿一台真实的机床做联调用官方示例工程把“连接-读坐标-断连”跑通再逐步扩展报警、宏变量、程序传输等功能。如果没有实体机床也可以用发那科的仿真环境配合FOCAS库做协议层面的验证但要注意仿真环境和真实系统的接口行为还是有一些差异最终一定要到现场跑。我个人在某些项目里还会准备一个“FOCAS函数调用速查表”把每个常用API的入口参数、返回结构体、典型错误码整理成Excel随时翻。这个习惯帮我省了大量翻阅英文文档的时间尤其是项目做了一半被别人接手时这份速查表比代码注释还有用。做FOCAS开发这几年最大的体会是技术难点不在读手册而在现场对设备状态的敏感度。FOCAS库文件只是个工具真正值钱的是你懂得怎么把机床的数据变成管理者看得懂的指标把故障告警变成及时响应的信号。建议第一次接触FOCAS的朋友不要一上来就想把所有功能做完先老老实实把一台设备的坐标和状态读上来后面自然就通了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询