FANUC数控机床数据采集实战:基于FOCAS2的CNC状态监控与看板开发
简介FANUC CNC Screen Display Function 与 FOCAS2 以太网通信的配套资料面向数控设备维护工程师、自动化集成人员和制造信息化技术人员聚焦如何通过 FOCAS2 远程访问和监控 FANUC 数控系统屏幕显示。压缩包共 104 个文件、约 9.69MB主要包含 GIF 操作演示、CAB 数据包、DLL/LIB 库文件、配置 ini/reg、C/C 头文件及示例程序兼顾界面展示、运行库支持与个性配置。已有 1111 人学习下载资源围绕实时监控、远程编程、数据收集、故障诊断和远程维护等典型场景展开并结合文件中的设置步骤、接口说明和常见排错思路可帮助读者快速上手 FOCAS2 的集成开发与产线部署。整体资料结构清晰既适合入门者理解 FANUC 屏幕功能的交互逻辑也能为已有基础的工程师提供可参考的接口调用实例与部署细节。 事情是这样的车间里几台FANUC加工中心每天最烦的就是跑过去看状态。操作员要确认当前跑哪个程序、主轴转速多少、有没有报警只能站在机床屏幕前一个个翻页。后来要做车间数字化看板第一个需求就是把CNC的屏幕信息——准确说是程序号、主轴负载、坐标、报警这些关键状态——实时同步到办公室的大屏上。这就绕不开FOCAS2。FANUC的CNC基本都支持FOCAS2/Ethernet它本质就是FANUC提供的一套开放式API通过以太网TCP/IP读机床内部数据。只要机床有网口、开了这个功能写个上位机就能把屏幕显示的那点事搬出来。这篇文章把整个过程从原理到踩坑都给你捋清楚搞车间MES数据采集、做设备状态监控的朋友可以直接抄作业。1. 项目整体思路与选型考量1.1 屏幕显示功能到底要做什么很多人一听“Screen Display Function”以为是抓取CNC的屏幕画面做成远程桌面那种。不是。FOCAS2/Ethernet的屏幕显示相关开发做的是把屏幕上显示的“数据项”用API读出来再在自研界面上按自己的布局重新呈现。常见要读的数据无非这几类当前运行的程序号O0001这种主轴转速、进给倍率、实际位置坐标报警号和报警文本宏变量自定义的工件计数、加工时间等PMC信号状态门锁、夹具到位等我们项目的第一步就是把“程序号、主轴转速、当前坐标、报警信息”这四个核心字段实时呈现到看板上。后续才逐步加宏变量和倍率信号。你不能小看这一步。机床联网采集最忌讳贪多嚼不烂一上来想把整个系统变量表全读了一是开发量大二是对机床实时性有影响。先跑通最核心的几个字段让车间看到效果后面再加功能项目推进阻力小很多。1.2 为什么优先选FOCAS2/Ethernet而不是串口或HSSBFANUC的数据采集有好几条路老式的串口RS-232、FOCAS1/2的HSSB高速串行总线、FOCAS2/Ethernet还有PMC窗口。它们各有适用场景。方案通信方式速度/实时性布线成本推荐场景RS-232串口点对点串口慢几十KB/s距离短老设备、DNC传输程序HSSB专用光纤/电缆快但需专用板卡近距主机直连早期FOCAS1配套FOCAS2/Ethernet标准以太网TCP/IP满足车间监控需求已有网络即可绝大多数新项目首选PMC窗口/FOCAS窗口共享内存快需开发PMC梯形图要快速交换大块数据我们选FOCAS2/Ethernet的原因很直接车间本来就有工业交换机布线机床出厂大多预装了以太网接口只需要向厂家开通FOCAS2功能通常是一个选项功能号成本最低并且支持多个上位机同时连接。一台机床的数据可以被看板系统和MES系统同时读互不干扰。HSSB虽然快但那个是给专用主机直连用的车间环境根本用不上。值得说的是FOCAS2并不是一个“协议文档”那么简单它按不同的语言封装成了C库Windows上是focas2.dllLinux上有libfwlib32.so。无论你用C#、C、Python还是LabVIEW本质上都是调用这套库。FOCAS2这个名字全称是FANUC Open CNC API Specifications 2端口固定走TCP 8193。记住这个端口号后面排查问题有大用。2. 基础准备与开发环境搭建2.1 真机和模拟器两种环境的准备开发这类项目最好先有NC Guide模拟器就是FANUC官方的PC模拟软件。它能在电脑上完整模拟一台0i系列CNC包括FOCAS2接口。好处是可以一边开发一边改代码不用占着车间机床。但要注意模拟器里有些系统变量和选项功能是阉割的最典型的就是部分PMC信号和某些刀具管理功能读出来要么报错要么全零。所以模拟器跑通逻辑后还是得去真机上全面验证。真机这边需要确认三件事机床系统版本支持FOCAS2/Ethernet。目前市面主流的0i-F、30i-B基本都是标配或可选。CNC侧把IP地址配好。操作路径一般是系统界面 → 外部设备设置 → 以太网设置填IP、子网掩码、默认网关。注意发那科设置IP后需要重启系统或重新上电才会真正生效这是现场最常见的坑。上位机与CNC要能互相ping通。建议先用一根网线直连测试排除交换机配置干扰。另外强烈建议在真机测试前和机修师傅打好招呼有些参数修改要权限。虽然我们读数据一般不涉及写操作但如果需要读取某些受保护的系统变量可能需要开启对应的“数据服务器”或“FOCAS2许可”选项这部分一般由机床上家或FANUC代理开通。2.2 开发语言选型与库的引入方式FOCAS2官方提供的是C接口头文件里全是这样风格的函数FWLIBAPI short WINAPI cnc_allclibhndl(const char *ipaddr, unsigned short port, long timeout, FWLIBHANDLE *libh); FWLIBAPI short WINAPI cnc_freelibhndl(FWLIBHANDLE libh); FWLIBAPI short WINAPI cnc_rdprogram(FWLIBHANDLE libh, ODBPRO *program);C#工程里用DllImport直接P/Invoke就可以。我习惯把FOCAS2相关调用封装成一个Focas2Client类对外暴露Connect、Disconnect、ReadProgram、ReadSpindleSpeed这些方法内部把short返回值翻译成友好错误信息。这样业务层写起来很干净。Python方案也很常见用ctypes加载focas2.dll或者Linux下的libfwlib32.so效果一样。对快速搭建原型来说更顺手但要是做正式的看板服务我建议还是C#或者Go——Python的GIL和多线程轮询在高并发读多台机床时会有点力不从心。有一点要注意不管用什么语言连接句柄是long类型在64位系统上要小心。C#里定义为longPython里推荐用ctypes.c_void_p避免32位/64位指针截断造成莫名其妙的内存错误。这个坑我见过不止一次。2.3 连接、断开和超时的约定FOCAS2/Ethernet的连接函数是cnc_allclibhndl四个参数CNC的IP地址字符串、端口号8193、超时时间毫秒、输出句柄。超时时间别设太长也别设太短。我一般设3000毫秒。太短了机床断电重启后第一次连接可能握手来不及完成直接超时报错太长了如果网线断了上位机界面会一直卡在“连接中”。FOCAS的连接其实是握手式的机床侧会在8193端口监听连接建立后每个请求是请求-响应模式和HTTP有点像但没有HTTP那么重。断开用cnc_freelibhndl。关键心得程序退出时一定要释放句柄否则机床侧会一直保留这个连接资源。现场我碰到过几次某台上位机非正常关闭后机床一直报“以太网连接数已满”后来的上位机连不上就是连接没释放导致的。FANUC侧对同一台CNC的并发连接数有限制虽然具体数值因系统版本而不同但养成“用完即释放”的习惯肯定没错。3. 核心实现屏幕显示的数据读取与界面组织3.1 最常用的几个FOCAS2函数和业务对应关系FOCAS2的API非常多但做屏幕显示功能初期只需要吃透这几个业务需求FOCAS2函数返回的关键字段当前运行程序号cnc_rdprogramODBPRO.mdata程序号数组主轴实际转速/倍率cnc_rdspdlODBSPDL.actspdl、tractspdl当前轴坐标cnc_rdactODBACT.axis绝对/相对/机械坐标数组报警信息cnc_rdalmODBALM.alm_no、alm_msg宏变量cnc_rdmacroODBM.u.cdata / ldata / ddata操作模式cnc_rdopmodeODBOPM.mode自动/手动/MDI等这些函数命名很有规律cnc_rd开头就是“read”后面跟对象。理解了这一点后面自己对照API手册扩展功能会很快。报警读取这块提醒一下FOCAS2取报警文本时返回的是Shift-JIS编码的字节数组不是UTF-8。如果你直接用Encoding.Default转字符串在中文Windows上大概率是乱码。正确做法是明确指定Shift-JIS编码代码页932转换。这在CNC多语言系统上尤其重要日系的机器默认语言是日文报警文本会出现片假名。3.2 一个可运行的读取程序示例下面给一个简化的C#核心读取逻辑演示连接、读主轴转速、读程序号、断开全流程。大家把IP改成自己机床的就行。public class FocasClient { [DllImport(focas2.dll)] private static extern short cnc_allclibhndl(string ipaddr, ushort port, long timeout, out long libh); [DllImport(focas2.dll)] private static extern short cnc_freelibhndl(long libh); [DllImport(focas2.dll)] private static extern short cnc_rdspdl(long libh, out ODBSPDL spdl); [StructLayout(LayoutKind.Sequential)] private struct ODBSPDL { public short type; public short alarm; public short actspdl_data; public short tspdldata; // 实际结构体比这个长正式开发按头文件补全 } public long Handle { get; private set; } public bool Connect(string ip) { short ret cnc_allclibhndl(ip, 8193, 3000, out long handle); if (ret 0) { Handle handle; return true; } return false; } }实际项目中结构体长度必须和FANUC头文件严格一致不然读出来的数据全是错的。这也是FOCAS2开发最烦的地方——结构体不能随意简化。建议直接用官方头文件里的原始定义或者把官方示例里的结构体原样复制过来别手打。Python版更简洁适合快速验证。ctypes加载dll后定义句柄类型然后调用C接口import ctypes fwlib ctypes.CDLL(focas2.dll) handle ctypes.c_void_p() ret fwlib.cnc_allclibhndl( b192.168.1.10, # IP地址要字节串 8193, 3000, ctypes.byref(handle) ) if ret 0: print(f连接成功: {handle.value:#x})有一点特别容易踩cnc_allclibhndl的第一个参数是const char*在Python里必须传bytes不能直接传str。传str进去底层的C函数读到的就是乱码连接大概率报超时。这个坑在论坛上翻帖子能看到一堆人问。3.3 屏幕显示方案怎么落地数据读出来了显示端就好办了。我们用的是车间现有的47寸电视当作看板上位机是一台Windows工控机C# WinForm程序画了几个大卡片程序号、转速、坐标、报警状态。界面不用花哨关键字号要大站在机床旁边十来米能看清。刷新频率设计上我建议轮询间隔设在500ms到1s之间。别学网上某些例子用100ms的疯狂轮询没必要而且真机和模拟器不一样真机高频轮询会让CNC的通信任务占用升高极端情况影响加工插补。我这边实际验证过1秒刷新对看板场景完全够用肉眼已经很流畅。一个重要的架构思路后台用独立线程轮询FOCAS2拿数据主界面只做展示。轮询线程把最新数据写到一个共享的DataModel对象里界面用定时器每秒从DataModel里取一次刷新。好处是即使FOCAS通信卡了一下界面不会跟着卡成白屏顶多数据停顿一秒。还有个进阶技巧特别适合要对接PMC信号的场景宏变量当中间层。比如要让看板显示当前工件的“计划数量”和“完成数量”这两个数如果存在PMC的D寄存器里用FOCAS2直接读D寄存器比较麻烦。更省事的做法是在梯形图里把数量写到宏变量#500~#999上位机用cnc_rdmacro读宏变量就够了。这种做法让PLC程序员和上位机程序员解耦各干各的活联调用半天就能完事。4. 常见问题与排查技巧实录4.1 连接不上或超时的排查顺序FOCAS2开发里90%的问题都发生在“连不上”这个阶段。排查顺序按概率从高到低CNC侧IP有没有配对。很多机床的系统界面看起来填了IP但没断电重启没生效。上位机和CNC的IP是否在同一个网段。一个192.168.1.10一个192.168.0.10肯定不通。网线直连时部分网卡需要手动设置自适应速率或者干脆强制百兆别让他自动协商和机床的百兆口协商成百兆半双工。防火墙。Windows默认防火墙会拦截外部连接测试时可以先关掉确认通了再把FOCAS相关端口加白名单。8193端口是否被占用或屏蔽。可以在上位机上用telnet ip 8193验证能通说明网络层没问题。机床侧是否真的开通了FOCAS2选项功能。有些二手机床选项没开即使网络通了cnc_allclibhndl也会返回错误码。这个顺序别跳。很多人一上来先怀疑机床坏了最后发现就是网段没配对白忙活半天。4.2 数据不更新或乱码的处理连上了数据读出来不对或者不刷新常见诱因有这么几类现象原因处理读出程序号全零机床在复位状态或没有程序被选中先确认机床处于自动模式且有程序调用主轴转速读出来是0机床还没运行或者读的是指令转速而非实际转速看清楚ODBSPDL里actspdl和ispdldata的字段差异报警文本乱码编码没指定Shift-JIS指定代码页932转换坐标读出来数值超大结构体长度定义错误严格按官方头文件定义结构体轮询一段时间后卡死句柄失效或网络抖动给轮询线程加重试机制掉线后自动重连数据不刷新还有个隐蔽原因FOCAS2的连接是带状态的。如果机床侧断电重启上位机的句柄虽然还握着但底层连接已经断了。此时如果代码里没有检测错误码并重新连接的逻辑程序就会一直读出一堆旧值“假活”着。我习惯的做法是每次读取返回错误码非0时先尝试重连一次重连失败再告警避免看板显示出一堆过期数据误导车间。4.3 从几个现场坑里沉淀下来的经验这个项目做完我最大的感受是FOCAS2/Ethernet本身不难难的是把边界情况处理干净。第一所有网络故障优先看交换机端口。有次车间在DNC传输时偶尔会掉线查了一圈最后发现是交换机和CNC网口之间的网线水晶头压得不好接触不良。这个问题在调试初期看不出来跑一天才掉几次排查起来特别费劲。后来我统一换了成品网线问题绝迹。第二模拟器和真机差异千万别忽视。NC Guide上跑得好好的程序到了真机上读取PMC信号就可能不支持或者某些报警文本字段在模拟器里返回的是空字符串。任何功能不能只靠模拟器验证必须在真机上跑一遍完整场景。第三日志一定要从第一天就写好。每次读取请求的返回码、耗时、连接状态全都记到本地文件。你永远猜不到什么时候需要回溯这些信息。我就靠日志抓住过一次某台机床总是每隔两小时掉线一次查日志发现是上位机的连接超时设置和机床侧的心跳机制对不上调整超时时间后就稳定了。最后再分享一个小技巧给每台CNC做配置表的时候把IP、系统版本、FOCAS选项、宏变量定义这些信息都记下来。项目初期只有两三台设备感觉无所谓到了扩充到十几台的时候有这张配置表能省很多事。我现在接新项目第一件事就是先建设备清单把能查到的参数全登记上后面开发和排障都方便。本文还有配套的精品资源点击获取