十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FOCAS全解析:FANUC机床数据采集从原理到代码实战

FOCAS全解析:FANUC机床数据采集从原理到代码实战 简介Fanuc Focas 机床数据采集资料与演示代码合集面向使用 C# 或通过 OPC UA 对接 FANUC 数控系统的开发人员、自动化工程师及工厂信息化项目团队。压缩包共 3768 个文件整体 28.34MB涵盖 C# 示例代码cs、动态链接库dll、C 头文件h、可执行程序exe、基础开发模块bas以及 XML/HTML/PDF/DOC 等多种格式的接口说明与帮助文档可支持在 Windows 和 Linux 双平台下快速搭建 Focas 通信调试环境。已有 4159 人学习/下载。内含 Fwlib32 相关 .bas 源文件与 lib 链接库配合示例程序和配置文档能够帮助理解 Focas 函数调用、数据读取、报警处理、跨平台编译等关键环节通过 demo 还可以掌握 CNC 状态读取、生产数据采集、远程监控等核心思路。资料按函数库、文档、示例、配置文件等目录组织分类清晰适合从入门到进阶的开发者按需查阅。 搞机床数据采集这些年我接触最多的就是FANUC系统。不管你是要接MES、做OEE统计还是给设备装一个远程监控大屏只要机床是FANUC的基本都绕不开FOCAS这套接口。我当初刚接触这个领域的时候最头疼的不是写采集程序而是东拼西凑找资料官网文档全是英文且厚得像砖头社区里能搜到的中文分享又零零散散。后来我自己攒了一套完整的东西从开发包、编程手册到可运行的demo都整理齐了而且实测下来Windows和Linux两个平台都能跑通。这篇就把它彻底摊开讲清楚从原理到代码再到避坑一次性说透。FOCAS其实是Fanuc Open CNC API Specifications的缩写简单理解就是FANUC官方提供给外部系统的数据访问接口。只要机床带有以太网功能你就能通过FOCAS实时读取坐标、程序号、运行状态、报警信息、主轴负载、宏变量等等数据甚至还能往PMC地址里写信号。相比早年靠RS232串口一个个字节去解析FOCAS走网络、吞吐量大、稳定性好是现在FANUC机床采集的主流方案。这篇内容适合工厂信息化工程师、设备维护人员、做机床联网项目的开发者也适合刚入门想搞懂FOCAS是什么的人。1. FOCAS是什么以及为什么机床采集都绕不开它1.1 FOCAS不是协议是一套官方API库很多人一听FOCAS下意识以为它是一种通信协议。实际上它更像是一个封装好的开发工具包官方把它发布成动态库Windows下面叫fwlib32.dll/fwlib64.dllLinux下面对应libfwlib32.so/libfwlib64.so。你的上位机程序调用里面的C语言函数通过这些函数去跟CNC交互数据。底层通信细节、握手逻辑、报文封装这些库里面已经处理好了你不需要关心网络包长什么样。这套库设计得很有年代感但非常稳定。函数命名有规律cnc_开头的是CNC相关功能pmc_开头的是PMC读写ncl_是轮廓补偿相关exe_是程序执行操作nts_是网络传输服务。按前缀找功能基本不会迷路。我个人体会是这API跟Win32 API风格很像哪怕你对机床内部结构不太懂对着头文件里注释就能写起来。1.2 FOCAS解决了传统采集方式的什么痛苦早年采集FANUC机床数据很多人用RS232串口有的用宏输出功能让梯形图编程人员把坐标、倍率这些数据拼成字符串往外发。这种方式不是不行但痛点很明显串口线距离短抗干扰差而且只能一对一连速度也慢。车间里几十台机床总不可能每台都拉一根串口线到服务器布线都布到怀疑人生。FOCAS走以太网之后情况完全不一样了。一条网线进机床网卡上位机通过交换机就能同时连几十台机床采集周期可以做到几百毫秒甚至更低。而且能读的数据范围大了很多除了标准坐标和程序名PMC信号、系统参数、刀具数据、主轴负载都能通过同一个接口拿回来这才让真正的设备数据采集成为可能。1.3 FOCAS能采集哪些数据一张表看全我列一个常用的采集项和对应函数这对刚上手的人特别有用你不用翻几十页英文文档去判断“这个数据能不能读”。需要采集的数据对应API函数说明绝对坐标、相对坐标、机械坐标cnc_rdposition返回当前各轴坐标值数组按轴顺序排列程序号、顺序号cnc_rdprgnum得到当前运行的程序号也能读当前行号运行状态运行/暂停/停止cnc_rdprogstate状态码对应自动运行、进给保持、复位等主轴转速与切削速度cnc_rdspindle主轴实际转速、倍率等参数都有定义宏变量如#500、#600等cnc_rdmacro很多机床厂把刀具寿命、工件计数存在宏变量里靠它读报警信息cnc_rdalm获取当前报警号和报警文本做故障统计很方便操作信息倍率、进给轴方向等cnc_rdopmsg包含操作面板上的各种状态PMC地址读写pmc_rdpmcrng、pmc_rdpmcval按地址范围和数据类型读PMC寄存器比如D地址、R地址实际上FOCAS能做的事情比我表里列的多得多光是函数就上百个但平时做采集监控上面这几类覆盖了90%以上的需求。剩下那些高级功能等你真正需要了再去啃对应的章节就行。2. 开发前的准备拿到FOCAS开发包后这么搞才对路2.1 一份合理的“FOCAS资料包”应该包含什么我说的“看这个资料就够了”不是夸张前提是资料结构要完整。一套够用的FOCAS开发包应该包含这么几块动态库和头文件、编程手册API参考、demo示例代码以及网络配置说明。有的还会附带NCGuide模拟器用于离线开发测试。开发包里最关键的是两个目录h目录放头文件lib目录放库文件。Windows下打开看一般有fwlib32.h和fwlib32.lib、fwlib32.dll32位和64位分得清清楚楚。Linux下则是libfwlib32.so和对应32位的头文件。这里有个细节容易被忽略头文件里定义了各种结构体比如ODBST、ODBACT这些它们对应不同功能函数的数据返回格式。写代码前最好把要用的结构体定义看一遍因为不同版本的CNC系统对有些字段的填充情况不完全一样尤其是老一点的系统某些新字段并不会写入数据。2.2 Windows环境下的库文件加载与工程配置在Windows上写FOCAS程序我一般用Visual Studio的C控制台工程。步骤不复杂把解压出来的fwlib32.h、fwlib32.lib、fwlib32.dll放到一个你找得到的公共目录比如D:\focas。在VS工程里配置附加包含目录为D:\focas附加库目录同为D:\focas。在代码里加#include fwlib32.h并在“链接器-输入-附加依赖项”里填fwlib32.lib。编译生成exe之后把fwlib32.dll复制到exe同目录否则运行时会提示找不到DLL。这里有个最常见的坑就是32位和64位错配。如果你的程序编译成32位就必须挂32位的fwlib32.dll编译64位就必须用64位的库。混用会直接崩溃或者加载失败。另外很多老资料里的工程都是32位配置如果你拿过来直接编译会出现“无法解析的外部符号”这类链接错误原因往往就是lib文件和编译目标位数不一致。2.3 Linux环境下的编译链接与动态库路径Linux下的做法和Windows类似但有一个地方特别容易踩坑就是动态库路径。头文件可以放在/usr/local/include下库文件放到/usr/local/lib下编译时这样来做gcc -o focas_demo focas_demo.c -lfwlib32 -lm如果系统找不到libfwlib32.so你就得先执行export LD_LIBRARY_PATH/usr/local/lib:$LD_LIBRARY_PATH或者把库路径写进/etc/ld.so.conf.d/focas.conf然后运行ldconfig。我建议用ldconfig这种方式因为如果你把程序部署成systemd服务LD_LIBRARY_PATH不一定会被正确加载而ldconfig只要配一次后面就都正常了。还有一种情况是.so文件链接名带版本号比如libfwlib32.so.1这时需要确认libfwlib32.so这个软链是否存在不存在就手动加一下。写代码时Linux和Windows的API使用方式几乎完全一致唯一区别主要在库文件的加载路径和链接方式上这个后面demo里我能体现得更清楚。3. 网络配置与FOCAS连接建立3.1 CNC端要做的几件事写代码之前得先保证机床那边的以太网功能是通的。FANUC的系统上一般按SYSTEM键进入系统参数界面里面有以太网设置菜单。要设的主要是这几项IP地址给你的CNC分配一个固定IP比如192.168.0.10子网掩码和上位机保持一致最常见的就是255.255.255.0端口号FOCAS默认走8193端口特殊情况会改以太网功能开关有的系统还需要单独开启FOCAS通信许可这里有个容易忽略的点FOCAS连接端口和FANUC的FTP/数据服务器功能端口不是同一个。数据服务器一般是用FTP协议跟FOCAS是两条路。你如果做机床采集改完IP之后最好在电脑上先ping一下CNC的IP能ping通不代表FOCAS一定能连接因为可能只是ICMP通了但服务没起来但是ping不通一定连不上排查顺序要记好。3.2 连接代码怎么写cnc_allclibhndl3的正确用法FOCAS建立连接的核心函数是cnc_allclibhndl3它有四个参数。#include fwlib32.h ODBHND handle; short ret; ret cnc_allclibhndl3(192.168.0.10, 8193, 5000, handle); if (ret EW_OK) { printf(连接成功\n); } else { printf(连接失败错误码: %d\n, ret); }第一个参数是CNC的IP第二个是端口第三个是超时时间单位毫秒第四个是返回的连接句柄。连接成功之后所有其他函数都要用到这个handle作为第一个参数。用完记得释放连接cnc_freelibhndl(handle);超时时间建议不要设得太短我第一次测试时设了1000毫秒结果现场稍微有点网络波动就连不上后来改成3000到5000毫秒就稳定多了。但也不要无限大因为如果你批量连接几十台机床某台机床关机了你设置超时10秒那这一轮扫描就要白白等上10秒。工程上建议用一个较长的超时做首次连接之后采集中用短超时做重连判断这样效果最好。3.3 离线开发神器NCGuide模拟器平时开发采集程序时最尴尬的事情就是不能一直占着车间的真机调试。FANUC官方有一个NCGuide可以理解为CNC模拟器它能在普通电脑上模拟0i-F等系统而且完整支持FOCAS通信。很多人把NCGuide装在VMware虚拟机里配好网络后把模拟系统的IP设成固定的你的采集程序直接对着这个虚拟机开发调试就行。这个方案我用了很久非常香。你可以程序改代码、断点调试、反复重连完全不用担心影响车间生产。而且NCGuide模拟出来的数据和真机结构基本一致等程序调通了再拿到现场部署几乎不会出什么兼容问题。唯一注意的就是NCGuide的授权和安装包要找对版本有些版本在Windows 10以上系统需要以兼容模式运行。4. 双平台采集Demo读取坐标、程序状态和宏变量4.1 Demo想要达到的效果我自己的这个demo当时写得很简单但五脏俱全完成了一个最小可用的采集链路建立连接、循环读取数据、打印结果、断开连接。读取的数据我选了四个代表性的点绝对坐标验证位置数据能不能读程序号验证程序管理数据能不能读运行状态验证状态类数据能不能读宏变量#500验证自定义变量能不能读为什么选这四个因为这四个字段基本代表了车间里最常见的采集诉求坐标用于定位监控程序号用于生产统计运行状态用于报工和OEE计算宏变量则往往藏着刀具寿命或者工件计数。把这四个学会了其他数据照着函数名去找就行。4.2 一段能同时跑在Windows和Linux的C代码下面这段代码我在Windows和Linux上都编译运行过关键地方我都加了注释。先把头文件和结构体准备好#include stdio.h #include string.h #include fwlib32.h int main(int argc, char *argv[]) { ODBHND handle; short ret; char *ip 192.168.0.10; long timeout 5000; ret cnc_allclibhndl3(ip, 8193, timeout, handle); if (ret ! EW_OK) { printf(连接失败错误码: %d\n, ret); return -1; } printf(连接成功\n); /* 1. 读取绝对坐标 */ ODBPOS pos; memset(pos, 0, sizeof(pos)); ret cnc_rdposition(handle, -1, pos); if (ret EW_OK) { printf(绝对坐标: ); for (int i 0; i pos.type; i) { if (i 3) { printf(%.3f , pos.abs.data[i]); } } printf(\n); } else { printf(读取坐标失败错误码: %d\n, ret); } /* 2. 读取当前程序号 */ ODBPRG prg; memset(prg, 0, sizeof(prg)); ret cnc_rdprgnum(handle, prg); if (ret EW_OK) { printf(程序号: %d\n, prg.mdata); } else { printf(读取程序号失败错误码: %d\n, ret); } /* 3. 读取运行状态 */ ODBPRO pro; memset(pro, 0, sizeof(pro)); ret cnc_rdprogstate(handle, pro); if (ret EW_OK) { printf(运行状态代码: %d\n, pro.prog_state); } else { printf(读取运行状态失败错误码: %d\n, ret); } /* 4. 读取宏变量#500 */ ODBM acro; memset(acro, 0, sizeof(acro)); ret cnc_rdmacro(handle, 500, 0, acro); if (ret EW_OK) { printf(宏变量#500: %d\n, acro.cdata); } else { printf(读取宏变量失败错误码: %d\n, ret); } cnc_freelibhndl(handle); return 0; }注意ODBPOS结构体里有一个type字段表示轴数循环输出坐标时要以它为准不要写死三轴。cnc_rdprgnum读出来的程序号在有的系统上如果你没选程序会返回0这是正常的。运行状态代码的语义后面会列一张对照表。4.3 编译运行与结果解读在Windows下用VS环境时把这段代码放进新建的控制台工程就行。如果命令行编译可以用cl命令但需要提前把fwlib32.lib、头文件和dll路径配置好。推荐还是用VS工程管理省心。在Linux下假设代码文件叫focas_demo.c库和头文件都放到标准路径后gcc -o focas_demo focas_demo.c -lfwlib32 -lm如果编译时报找不到头文件或库先确认头文件路径和库路径是否在/usr/include、/usr/local/lib下。运行起来后的输出长这样连接成功 绝对坐标: 123.456 234.567 -89.012 程序号: 1234 运行状态代码: 3 宏变量#500: 18这里有个体验细节要提醒坐标值的单位是毫米但如果你机床用了公制英制切换数值会跟着变上位机最好加一个公制标识位来区分。程序号如果显示为0可以先在机床面板上手动加载一个程序再测试。运行状态代码里面常见的是0停止、1运行、3进给保持这些具体对应关系可以查FOCAS头文件里的宏定义。5. 实操期间最常踩的坑与排查技巧5.1 连接层的问题用一张速查表解决开发FOCAS采集最让人抓狂的不是代码写错而是连接建立不起来。我在这个坑里爬过很多次现在把典型的现象和对策整理成一张表你遇到同样问题可以直接照着查。现象可能原因解决办法ping不通CNC的IP网线没通、IP网段不一致、CNC网口是坏的先查物理链路再核对IP和掩码ping通但cnc_allclibhndl3失败CNC以太网FOCAS功能未开启、端口被改检查系统参数里是否有“以太网功能有效”选项连接初始化报错为负值端口号错误、CNC上装了防火墙策略确认默认8193端口联系现场电气查是否有安全软件连接后偶发性断开超时时间太短、交换机端口有STP隔离等把超时加到3000ms以上检查交换机端口模式Windows下运行提示找不到DLLDLL没放对路径、位数不匹配把fwlib32.dll放到exe同目录按程序位数重新检查5.2 读取函数返回错误码的排查思路FOCAS的每个读取函数都会返回一个short类型的错误码EW_OK代表0表示成功。如果返回非0不要急着改代码先把错误码查一下。头文件里有详细的宏定义常见的有EW_LENGTH表示数据长度错误EW_PROT表示协议错误EW_BUSY表示CNC忙。产品环境里最常见的就是EW_BUSY因为机床本身在做实时控制你采样频率如果设得太高比如50毫秒一次请求CNC可能来不及响应。通常把采样周期放到200毫秒以上就很少遇到这个错误码了。如果读取的对象是宏变量还要注意宏变量编号是否真的被机床厂启用了像#500这种属于空变量时读出来可能就是0要对照机床PMC逻辑去确认才行。5.3 Linux部署时的几个独有坑Linux上的部署坑比Windows多一些最常见的是.so库的软链接缺失。有的FANUC库发出来的时候文件名带版本号比如libfwlib32.so.1但编译时就缺一个libfwlib32.so软链。LD_LIBRARY_PATH没生效。如果你用systemd做开机自启环境变量必须写进Environment或者用ldconfig配置生效。32位库在64位系统上运行。如果你拿到的库是32位的你的编译器和系统就得配置多架构支持否则加载.so文件时直接失败。这个坑我在ARM工控机上踩过当时折腾了一上午最后才发现要装lib32gcc之类的兼容库。还有一种很特殊的情况就是用了dlopen延迟加载的方式。有的采集程序为了热插拔不直接-lfwlib32链接而是在运行时动态加载这时必须自己管理句柄和函数指针处理起来要复杂一些。如果你不是特别需要热更新建议用常规链接别折腾。5.4 一个经常被忽略的经验不同系统版本的差异最后说一个我在现场踩了多次才领悟到的经验。FANUC不同时期出的系统比如0i-C、0i-D、0i-F它们对FOCAS的API兼容性其实相当不错大部分程序在真机上拿过去就能编译运行。但有一个地方不一样各个机床厂家对宏变量和PMC地址的定义完全不自带你需要跟电气工程师拿“PMC地址分配表”对照表才能把#500到底对应什么含义搞明白。同型号的机床只要来自两个不同厂家逻辑几乎必然不同。有一次我在两台上看起来一样的机床上采集刀具寿命数据结果一个藏在#501一个藏在#531完全对不上。所以做FOCAS采集不要一上来就写代码先做两件事确认机床FANUC系统版本拿到该型号的宏变量和PMC地址规划表。这两样东西拿到手你后面写采集程序的时间能省掉一大半。连不上、读不到、数据异常大多数情况不是API不会用而是现场信息没收集全。我个人实际做下来的体会是FOCAS这套东西本身是稳定的它就是一层很薄的API封装真正决定项目成功率的是你对现场机床的了解程度和部署时的细心程度。写一个Hello World Demo半小时就能跑通但做到几十台机床稳定运行关键在于每一台机床的网络、系统版本、参数配置都要有专门的记录。做采集前先把现场每一台机床的信息表建好再动手写代码这比我一开始那种“先跑通Demo再说”的做法靠谱太多了。希望这份整理能帮你少走几步弯路如果后面遇到具体问题再照着函数手册和它的返回值去定位FOCAS没那么神秘。本文还有配套的精品资源点击获取
返回列表