ARTICLE DETAIL

资讯详情

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

Linux下基于FOCAS2的FANUC数控机床数据采集实现指南

Linux下基于FOCAS2的FANUC数控机床数据采集实现指南 简介本资源是一套面向工业自动化开发者与智能制造工程师的Linux平台FANUC机床数据采集实践方案聚焦在Ubuntu环境下使用Python调用FOCAS协议实现数控设备远程监控。资源包共含多个核心文件以Python源码.py、FOCAS接口封装库及部署说明文档为主整体压缩后仅2.2MB轻量易部署适合嵌入式边缘采集或本地化数据中台建设场景。已有252人学习下载表明其在中小型制造企业数字化改造中具备较强实操参考价值。读者可直接获取完整的连接配置、认证流程、周期性数据拉取脚本、日志记录机制及常见通信异常处理思路尤其适用于需快速对接FANUC 0i/30i/31i等主流CNC系统的Python开发人员显著降低从零搭建采集链路的技术门槛。1. 为什么要在Linux上采集FANUC机床数据接手这个项目之前我一直在帮几家机加工厂做设备联网。说实话FANUC机床的数据采集在国内工厂里需求量极大不管是搞MES系统、设备OEE统计还是做刀具寿命预测、程序管理都离不开从数控系统里把实时数据抠出来。但很多方案长期被Windows平台绑着工控机装Windows再跑一个C#或VB写的采集服务一到车间环境就各种别扭系统更新导致蓝屏、杀毒软件把采集进程误杀、远程维护要远程桌面、动不动还要重启。所以这次我决定把整套采集程序迁到Linux上打包成一个能直接用的小工具。这个项目的核心就是解决一个问题在Linux环境下通过以太网从FANUC数控系统里稳定读取机床运行数据。包括当前坐标、主轴转速与负载、进给速度、刀具号、程序名、报警信息、系统状态以及用户宏变量等。采集到的数据可以落成CSV文件、写入MySQL也可以后续接InfluxDB做时序监控。整套代码基于FANUC官方开放的FOCAS2开发包用C语言实现编译后在普通Linux工控机上运行实测对接过0i、18i、31i三个系列的机床。适合谁来参考如果你想给自己的数控车间做一套设备数据采集系统或者你正在做嵌入式Linux相关的工业物联网项目再或者你只是想把工厂里那台Windows工控机替换成Linux系统这篇文章都可以给你一条走通的路径。我会把从环境准备、库编译、代码编写到现场排错的过程原原本本记录下来踩过的坑也会一并交代清楚。2. 采集方案怎么选协议、型号、平台2.1 FOCAS2 / OPC UA / 宏变量 / RS232 到底怎么选接触FANUC数据采集的人最先面对的就是方案选型。我见过不少项目在第一步就走偏了后面越做越难受。目前主流的采集方式大致有四种第一种是FOCAS2这是FANUC官方提供的以太网数据接口也是我这次项目采用的方式。它本质上是FANUC对外开放的C语言库fwlib32通过TCP/IP直接和数控系统通信能读取的数据项非常丰富包括坐标、主轴、进给、报警、程序、参数、PMC信号等而且支持写入操作比如从上位机写宏变量、切换程序、远程启动程序。这也是目前车间级数据采集最常用、最成熟的方式。第二种是OPC UA。FANUC在较新的系统上提供了OPC UA服务器功能选项比如PAMSProduction Activity Management System以及部分30i/31i系统上的OPC UA server。好处是互联互通性强能直接对接西门子、施耐德等工业软件但问题也明显需要额外购买软件选项老系统根本装不了。如果你面对的是多年旧的18i加工中心这条路基本走不通。第三种是读宏变量包括RS232串口或者以太网TCP裸报文方式。这种方案不依赖FOCAS2库直接和机床约定好用宏程序把坐标、主轴等数据写到指定的宏变量里上位机再通过串口或TCP去读。好处是不需要开FOCAS2功能选项缺点是实时性差、数据项有限、且要改机床上的梯形图或宏程序维护起来比较头疼。第四种是外接传感器比如在主轴电机上加电流互感器、在导轨上加振动传感器。这已经不是数控数据采集的范畴了更多用于状态监测和预测性维护成本高实施周期长一般作为补充方案。综合下来只要机床上能开FOCAS2功能选项我推荐无脑选FOCAS2。它支持的采集项最全实时性最好写代码的工作量相对可控。OPC UA适合新机床且预算充足的情况宏变量方案适合临时坑一个数据点或者机床无法购买选项的情况。2.2 FANUC型号差异对采集的影响很多人问0i、18i、30i/31i到底有什么不同采集代码是不是一套代码通吃我的答案是代码框架可以通用但细节必须针对型号做兼容。0i系列是FANUC的入门级产品常见于经济型加工中心、车床。它内存小系统反应速度相对慢FOCAS2的功能是选配件很多0i系统虽然带以太网口但数据接口功能没有激活甚至有些0i系统根本不带以太网口只能走串口。所以在用FOCAS2采集前第一件事就是确认机床参数、硬件的实际情况。18i和21i是FANUC的中高端经典产品大量数控车床、加工中心、磨床都用这个系列。这批机器出厂时间集中在2000年到2015年之间带以太网口和大容量存储的型号比较普遍FOCAS2功能也比较完整。我在项目里遇到最多的也是18i系统。需要注意18i的FOCAS2库读取某些数据项比如系统时间、轴名称时会和31i有差异这部分我后面专门展开。30i/31i/32i是新一代系统计算能力强支持更高速的以太网通信FOCAS2接口也做了很多扩展比如支持更高精度的坐标值、更快的报警查询、更详细的诊断信息。如果工厂里有新旧混用的机床建议把采集端的处理逻辑分成两层底层统一走FOCAS2公共接口上层根据系统型号做功能裁剪。还有一个容易忽略的地方FANUC系统版本和功能选项决定了FOCAS2库的版本。有些机床用的库是旧版上位机却用了新版fwlib32连接时报错。所以项目交付时我总是要求把库版本和系统型号一起写进验收文档。2.3 网络架构与硬件准备FANUC机床采集的网络结构其实很简单机床数控系统通过以太网接到交换机采集工控机也接在同一个局域网内。但实际部署时有几个细节要注意。第一机床网口和上位机网口的IP必须同网段。比如机床设置192.168.1.1上位机设置192.168.1.2子网掩码255.255.255.0。如果车间里有多台机床建议规划一个独立的设备网段比如192.168.10.0/24和办公网、管理网隔离开。一方面减少广播风暴另一方面避免有人误操作干扰生产网络。第二机床端的IP地址、端口号、功能选项要提前确认。FANUC系统的以太网端口默认是8193这是FOCAS2通信的默认端口。在机床的以太网设置菜单里能看到IP地址、子网掩码、端口号等参数。同时要确保系统已经开通了FOCAS2/Ethernet功能很多机床出厂时网口是能ping通的但8193端口没有监听就是因为功能选项没开通。第三采集工控机的硬件要求一点都不高普通的x86工控机或者迷你主机就够。我用过一台双核4GB内存的瘦客户机跑采集进程加MySQL完全无压力。如果采集点数特别多比如一个车间几十台机床建议内存加到8GB磁盘用SSD。第四网络不稳定会直接导致采集断线。车间里电磁环境复杂如果现场布线不方便很多人会选择WiFi。我强烈不建议用WiFi做实时采集哪怕用工业级AP也一样。2.4GHz频段受干扰太明显数控系统对通信实时性要求高一旦丢包重连采集数据就出现空洞。宁可拉一根超五类网线也别图省事用无线。3. 核心实现编译环境与工程结构3.1 准备FOCAS2开发包与Linux编译环境FOCAS2开发包通常由机床厂家或FANUC代理商提供就是随数控系统一起过来的二次开发资料里面包含了fwlib32.h头文件、libfwlib32.so动态库Windows下是fwlib32.dll以及一堆示例代码。拿到后别急着编译先看清楚库是32位还是64位。很多生产机床配套的FOCAS2库是32位的即使在64位Linux系统上也需要编译成32位程序来链接这个库。这就带来一个非常基础的坑64位Linux默认不带32位编译支持直接gcc编译会报找不到gnu/stubs-32.h之类的错误。解决办法是安装multilib支持在Ubuntu/Debian系统上执行sudo apt update sudo apt install gcc-multilib g-multilib libc6-dev-i386如果是CentOS/RHEL系的系统sudo yum install glibc-devel.i686 libstdc-devel.i686装好后再用-m32参数编译。这里我先给一个最基础的验证程序确认库能正常链接mkdir -p fanuc_collect/{include,lib,src,bin,data} cp fwlib32.h fanuc_collect/include/ cp libfwlib32.so fanuc_collect/lib/ cd fanuc_collect cat src/version.c EOF #include stdio.h #include fwlib32.h int main() { char version[64] {0}; short ret cnc_getversion(version); printf(ret%d version%s\n, ret, version); return 0; } EOF gcc -m32 -I./include -o bin/version src/version.c -L./lib -lfwlib32 LD_LIBRARY_PATH./lib ./bin/version如果能看到ret0或者EW_OK说明库能正常加载。如果报错找不到libfwlib32.so记得把./lib目录加到LD_LIBRARY_PATH环境变量或者把库文件安装到系统库目录后执行ldconfig。3.2 工程目录与构建脚本实际采集程序不能光有个链接验证需要一个规范的工程结构。我习惯把采集器分成几个模块主控制模块、FOCAS2通信模块、数据解析模块、存储模块、日志模块。目录结构如下fanuc_collect/ ├── bin/ # 编译产物 ├── include/ │ └── fwlib32.h ├── lib/ │ └── libfwlib32.so ├── src/ │ ├── main.c # 主程序参数解析、信号处理 │ ├── collect.c # 采集核心逻辑循环读取各类数据 │ ├── collect.h │ ├── db_writer.c # 数据存储CSV、MySQL │ ├── db_writer.h │ ├── log.c # 日志功能支持按天滚动 │ └── log.h ├── config.ini # 采集配置 ├── build.sh # 一键编译脚本 └── data/ # CSV输出目录构建脚本build.sh是Linux下老生常谈的东西了我用一个简单的脚本搞定#!/bin/bash set -e OUTbin/fanuc_collect mkdir -p bin gcc -m32 -O2 -Wall -I./include \ -o $OUT \ src/main.c src/collect.c src/db_writer.c src/log.c \ -L./lib -lfwlib32 -lpthread -lmysqlclient strip $OUT echo build ok: $OUT如果后续要接MySQL记得先在系统里安装libmysqlclient-dev。采集程序用C写好处是内存占用低、稳定性好、交叉编译方便以后要移植到ARM嵌入式Linux上也不费劲。3.3 连接机床与基础数据读取FOCAS2的连接函数是cnc_allclibhndl3它接受四个参数机床IP、端口号、超时时间秒、连接句柄指针。连接成功后会返回一个句柄后续所有数据读取都靠这个句柄。这里有一个关键点超时时间设置。如果机床网络波动大超时设太短会导致频繁连接失败设太长程序启动时会卡在那里。我一般设成10秒。连接示例代码#include stdio.h #include string.h #include fwlib32.h #define CNC_IP 192.168.1.1 #define CNC_PORT 8193 #define TIMEOUT 10 FWLIBHANDLE FlibHndl (FWLIBHANDLE)0; int connect_cnc(void) { short ret cnc_allclibhndl3(CNC_IP, CNC_PORT, TIMEOUT, FlibHndl); if (ret EW_OK) { printf(connect ok\n); return 0; } else { printf(connect failed, ret%d\n, ret); return -1; } }连接成功后读取机床的坐标数据。FANUC系统中坐标数据分为相对坐标、绝对坐标、机械坐标、剩余移动量、运行速度等对应不同的读取函数和数据类型。这里以绝对坐标为例使用的是cnc_rdaxisdata函数ODBACT abs_pos; memset(abs_pos, 0, sizeof(abs_pos)); // 读取全部轴的绝对坐标轴号从1开始 short ret cnc_rdaxisdata(FlibHndl, 1, abs_pos); if (ret EW_OK) { for (int i 0; i abs_pos.type; i) { printf(axis %d pos %d.%d\n, i 1, abs_pos.data[i] / 1000, abs_pos.data[i] % 1000); } }注意ODBACT里的data是以最小输入增量为单位的整数通常1个增量对应0.001mm也就是1mm等于1000个增量单位。所以读取后要除以1000才是标准毫米值。还有一点axisdata结构里的type字段表示当前实际返回的轴数不同机床轴数不同不要用死循环去遍历全部轴数容易越界。主轴和进给的读取稍微复杂一点。主轴数据用cnc_rdspindle读取能拿到主轴转速指令值、实际转速、负载百分比、倍率、刀具号等。进给速度用cnc_rdact读取当前实际进给速度配合cnc_rdovrd读进给倍率。记得这些函数在系统处于不同模式手动、自动、MDI下返回的数值含义会有差别。比如在JOG手动模式下主轴实际转速可能是0但指令值有值在自动运行中实际进给速度才会体现出来。4. 数据采集的关键细节与代码实现4.1 坐标、主轴、进给、刀具数据怎么读最稳先说坐标。我在现场吃过亏最初我把绝对坐标、机械坐标、相对坐标都读出来然后发现相对坐标在某些机床上是浮动的需要定期清零实际上对OEE统计没有意义。后来我简化成只读绝对坐标和机械坐标绝对坐标用于记录当前工件坐标系下的位置机械坐标用于判断机床回零状态和超程保护。采集频率不用太高500ms一次足够观察到坐标变化趋势如果做到50ms一次系统通信压力会很明显而且对于机床自身的插补精度这点数据颗粒度也分析不出什么。主轴数据里面最有价值的是主轴负载百分比load。负载曲线是判断刀具磨损和加工状态的关键信号。主轴数据用cnc_rdspindle读取后结构体里就有sload字段单位是百分比。但要注意这个值是系统按主轴电机额定功率折算后的估算值不同型号的系数略有差异适合做趋势分析不适合做精确的功率计量。进给速度方面cnc_rdact返回当前实际进给速度cnc_rdovrd返回的是手动倍率和自动倍率也就是操作面板上那排旋钮的当前位置。实际有效进给速度 程序中指定的进给速度 × 倍率所以如果你看到程序F值是1000面板倍率在50%那实际进给就是500。这两个值采集下来对分析现场操作工的调节习惯很有帮助。刀具数据包含主轴上的当前刀具号T代码、刀具补偿号D/H、以及刀库里的刀具信息。FOCAS2提供了cnc_rdspindle读取主轴T号还有cnc_rdtoolinfo等函数可以读刀库信息。不过刀库信息在不同系统上差异很大有的机床厂家做了自定义的刀具管理宏变量从FOCAS2标准接口读出来反而不准。稳妥做法是标准功能能读的就读标准接口读不到的用宏变量补充。4.2 宏变量与自定义数据的采集有些数据在FOCAS2标准接口里没有或者机床厂家已经把它写进了用户宏变量这时候就要用宏变量采集。比如有些加工厂用宏变量保存工件计数、班次号、操作工编号。读取宏变量的函数是cnc_rdmacroODBM mac; short ret cnc_rdmacro(FlibHndl, 501, -1, mac); if (ret EW_OK) { printf(#501 %d.%d\n, mac.mcr_val / 1000, mac.mcr_val % 1000); }这里第二个参数是宏变量号第三个参数如果是-1表示读取公共宏变量如果指定了轴号可以读取轴相关的变量比如第2轴的工件坐标系数据。返回值是带小数精度的整数具体小数位数跟机床设定的宏变量数据类型有关。FANUC的宏变量默认精度是3位小数所以1500其实代表1.500这个换算关系要记得。宏变量还可以写入cnc_wrmacro可以远程修改机床上的宏变量。这个功能很有用比如远程设置刀具寿命计数或者向机床下发当前工单号。但远程写宏变量的权限管理要格外小心一旦写错可能影响加工。我在工业现场操作时只允许固定的几个宏变量号被上位机写入其余全部保持只读。4.3 报警信息和运行状态怎么抓报警信息是车间管理非常关注的数据直接影响停机和故障分析的准确性。FOCAS2提供了多个报警读取函数老版本常用cnc_rdalarm新版本推荐用cnc_rdalm2或者cnc_rdalm3。cnc_rdalm2可以读取当前报警、历史报警、报警状态等信息。我建议采集两个东西一是当前报警的报警号和报警文本二是系统当前运行状态自动/手动/报警等。运行状态用cnc_rdstat读取返回系统处于什么模式比如MDI、AUTO、JOG、EDIT、REF等。把运行状态和报警结合起来能判断一台机床是正常加工中还是处于等待状态还是已经报警停机。报警文本的读取需要注意编码问题。FANUC系统的报警文本默认可能是日文、英文或者中文取决于系统的语言包设置。我在一个项目里碰到过报警文本全是日文的情况中文Windows上位机显示乱码Linux下处理更麻烦需要做编码转换。最稳妥的做法是只读取报警号在数据库里建一张报警号对照表把每个报警号的描述信息提前维护好这样不管机床文本是什么语言上位机都能显示自己维护的中文描述。4.4 数据落地CSV、数据库还是时序库采集到什么数据只是第一步数据存哪里、怎么存同样重要。我的经验是分场景如果只是临时测试或者数据量很小比如半小时看一下趋势直接写CSV最简单。每条记录一行字段用逗号分隔。CSV文件的好处是方便用Excel打开坏处是数据量大了查询很慢而且采集进程如果中途崩溃最后一两行数据可能不完整。如果是要给MES系统做数据支撑建议直接写MySQL。表结构设计上建议按天分表或者至少对记录时间字段加索引。我常用的表结构大致是这样CREATE TABLE cnc_status ( id BIGINT AUTO_INCREMENT PRIMARY KEY, device_id VARCHAR(32) NOT NULL, record_time DATETIME NOT NULL, op_mode VARCHAR(16), program_name VARCHAR(64), axis_x_mm DECIMAL(10,3), axis_y_mm DECIMAL(10,3), axis_z_mm DECIMAL(10,3), spindle_speed_rpm INT, spindle_load_pct DECIMAL(5,1), feed_actual_mm_min DECIMAL(10,2), feed_override_pct INT, tool_no INT, alarm_no INT, INDEX idx_time (record_time), INDEX idx_device (device_id) );需要注意采集进程写数据库时不要一条条插入应该先攒一批比如50条然后一次批量插入。否则采集频率一高数据库会成为瓶颈反过来影响采集实时性。我在现场用1秒采集间隔30台机床同时采集批量插入方式下MySQL的压力很小。如果项目以后要做可视化看板、趋势分析建议把数据同时写一份到InfluxDB这种时序数据库。InfluxDB对时间序列数据做了优化配合Grafana可以快速画出坐标曲线、主轴负载曲线、报警统计图等。这个扩展后面会细说。5. 实操过程中踩过的坑和排查方法5.1 连不上机床多数从这三处查起我在项目现场接到最多的反馈就是程序跑起来了一直报连接失败。排查这类问题我把自己用的套路固化成了三步。第一步先ping机床IP。如果ping不通说明网络链路有问题检查网线、交换机端口、IP设置。注意FANUC机床系统里虽然能设定IP但有些老系统改完IP之后需要重启才能生效而且重启后要确认系统正常进入了数控界面而不是停在报警画面。我在现场遇到过一次操作工把系统重启后停在了一个PLC报警界面我ping了半天都不通后来发现机床根本没完全启动。第二步ping通了但连接失败那就测端口。Linux下用nc工具nc -zv 192.168.1.1 8193如果端口不通大概率是机床端没有开启FOCAS2/Ethernet功能或者机床侧防火墙挡住了。FANUC系统一般没有防火墙概念但功能选项缺失很常见。尤其是二手设备前一个工厂可能只用了RS232通信没开通以太网功能接手过来就得找系统服务商查功能选项。第三步端口也通了但程序还是连接超时检查上位机的连接参数和库版本。尤其要确认你用的FOCAS2库版本和机床系统版本是不是配套。FANUC的fwlib32库对不同系统版本的兼容性偶尔会抽风我遇到过31i系统连接正常18i系统连接就返回超时换了一个库版本后两台都能连了。所以连接前最好先把系统版本读取函数调通确认库能被系统接受。5.2 采集超时和卡顿的优化采集进程运行一段时间后可能会出现读数越来越慢甚至卡死的情况。这类问题排查思路通常是先看网络层。用mtr或者长时间ping测试看丢包率。车间网络环境复杂如果交换机端口接触不良、网线被拖拽压伤都会造成偶发丢包。FOCAS2连接是长连接底层TCP多次重传失败后系统才报错表现为读数据时偶尔卡一下。我的方案是建立一个独立的网络诊断定时器每30秒ping一次机床IP如果连续丢包超过3次主动断开FOCAS2连接并重新连接避免长时间挂死。再看进程内部。采集线程如果做了写数据库、写日志等耗时操作会拖慢采集节奏。我建议把采集线程和存储线程拆开中间用无锁队列或者互斥锁保护的有界队列交接数据。采集线程只管从CNC读取数据、放入队列存储线程负责批量消费队列写入CSV或者数据库。这样即使数据库临时卡住采集线程也不受影响。最后看系统资源。在Linux下用top、free、iostat看采集进程的CPU、内存和I/O。FOCAS2库本身不占太多CPU但如果代码里频繁做内存拷贝或者日志字符串格式化也会把CPU吃上去。我在高频率采集100ms一次时遇到过CPU占用30%以上的情况后来发现是日志模块每个循环都格式化完整的输出字符串改成按秒聚合日志后CPU降到3%以内。5.3 不同FANUC系统的采集差异实录同一套代码在不同型号的FANUC系统上跑结果经常不一样。我把自己实际遇到过的差异汇总一下帮你少走弯路。坐标数据方面0i系统的ODBACT结构返回的坐标类型可能只支持绝对坐标和机械坐标相对坐标读取函数在个别0i系统上返回错误码。31i系统支持8轴以上的多轴数据而0i标准版一般只到4轴。所以代码里读轴数据时一定先读控制轴数再按控制轴数循环。我用的方式是先调用cnc_rdaxisname获取轴名同时也能确认这个系统支持哪些功能。主轴数据方面老18i系统的cnc_rdspindle返回的主轴负载字段精度较低有时候负载值始终是整数百分比。31i系统则可以读到0.1%精度的负载值。如果项目要求高精度负载监测对老系统需要做额外的滤波或者标定。报警数据方面cnc_rdalm2是推荐方式但18i早期版本可能只支持cnc_rdalarm。我在代码里做了动态兼容优先调用cnc_rdalm2返回错误码后就降级到cnc_rdalarm。这样在两代系统上都能稳定工作。程序名读取也有差异。cnc_rdopnprog在31i上能正常返回当前运行程序的完整路径在18i上个别情况只能返回程序号名称比如O0001。如果你的MES系统要对接程序版本管理需要额外处理路径解析逻辑。宏变量方面老系统对某些宏变量号段有保留区域比如#500号以上的宏变量在不同系统上含义可能不同读取之前最好和机床厂家确认或者先读出当前值做比对。5.4 时间同步18i系列时间调整的一个小坑数据采集最怕时间戳对不齐。机床记录的历史报警时间用的是系统内部时间采集上位机时间戳用的又是Linux系统时间两边时间差了十几分钟报警溯源的时候就很恼火。我遇到的具体场景是一台FANUC 18i系统用户反馈报警记录的时间和真实时间差了8个小时。查下来是系统内部的时区设置和夏令时设置不对。对于18i系统要调整系统时间一般进入MDI方式按SYSTEM按键找到时间设定相关参数。不同系统版本的路径略有差异但基本原理一样通过系统参数设置当前时间和日期有些版本支持自动对时。更通用也更容易实现的方案是在采集程序里以数控系统时间为基准。连接成功后先用cnc_gettime读取CNC的系统时间然后跟Linux系统时间做差得到时间偏差。每条采集记录里同时保存CNC时间戳和上位机时间戳查询时优先用CNC时间。这样做的好处是即使上位机时间有偏差设备停机事件的先后顺序也不会乱。如果车间有多台机床建议在Linux采集端部署NTP服务统一同步所有采集工控机的系统时间。机床端如果支持NTP协议也可以配置不过多数老系统不支持所以还是以采集端做时间映射为主。在接收报警数据时时间一律用CNC时间入库这个习惯我建议你从第一天做起。6. 稳定性设计与扩展6.1 稳定性设计的三点心得数据采集这种程序功能能跑起来不算本事连续跑三个月不重启才算合格。我整理了自己的三点心得。第一进程必须能自愈合。FOCAS2连接是长连接必然会出现断线重连的场景。我的做法是采集主循环里每次读数据都检查返回值发现连接异常就进入重连流程重连失败则递增重试次数指数退避最多等待60秒后再尝试。同时加一个看门狗定时器如果超过30秒没有任何一次成功的读数据操作就强制重建整个连接。这个机制在车间网络抖动时救了我很多次。第二日志要能循环覆盖。采集进程长时间运行会生成大量日志如果不做日志轮转一个简单的printf信息流就能吃掉几十GB磁盘。我用的是自写的简单日志模块按天滚动每天一个文件保留最近30天超过自动删除。同时在日志里只记录关键的连接状态、错误信息、采集摘要不要每一条数据都落日志。第三配置文件独立于程序。机床IP、端口、采集间隔、数据库连接串等全部写到config.ini里程序启动时读取。这样现场调试时只需改配置不需要重新编译。我甚至把需要采集的数据项列表也做成配置项比如坐标、主轴、进给、报警各自是否开启方便现场按需裁剪。6.2 从单机采集到车间级采集的扩展这套程序刚完成时是三台机床的单机版后来工厂扩产很快扩展到二十多台机床。在这个过程里我摸索出一些可复用的扩展思路。如果只是增加采集设备最简单的方式是每个Linux工控机跑一个采集实例通过配置文件指定采集不同的机床。工控机数量不够时一台工控机可以跑多个采集进程每种机型一个进程。但要注意多个采集进程共享同一块磁盘和网络带宽需要控制采集频率避免互相拖累。我实测过一台普通工控机跑3个采集进程、每进程每1秒采集一次完全没问题。更进一步的方案是把数据统一汇聚到一套平台上。采集端先把数据写到本机InfluxDB或者MySQL平台层通过HTTP或者消息队列把数据汇总到中心数据库。如果用InfluxDB可以开启它的双写同步或者使用Telegraf做数据转发。如果从零开始搭我推荐Kafka做中间缓冲采集端写Kafka后端的MES、可视化、报警分析各自消费解耦效果好扩展能力也强。不过在车间场景里我没推荐在生产网络里硬塞Kafka这类组件除非工厂有专门的IT运维团队。大多数情况下一台中心服务器上装MySQL和InfluxDB采集端通过TCP直推已经能满足一个中等规模车间一年的数据积累和查询需求。架构简单才容易维护这是我在一线得出的结论。6.3 后续可扩展的方向这个采集项目做到后期已经不光是读数据了。我还加了几个实用的功能扩展供你参考。一是基于宏变量的远程控制。比如操作工在机床侧改动了一个宏变量采集程序写个监听逻辑自动把这个变量同步到数据库各生产线管理员可以在办公电脑上远程看到当前工单号、加工数量、刀具状态。更进一步可以开放一个安全接口让管理员远程把宏变量回写到机床实现双向互动。这个功能要非常谨慎必须做好权限控制和操作审计。二是报警消息推送。采集到报警后立即通过微信、钉钉或者企业微信机器人的Webhook推送到设备群。这个实现很简单无非是把报警号、报警文本、机床号拼成一条JSON用HTTP POST发出去。实际效果是当班组长能第一时间响应停机大幅缩短故障停机时间。三是结合Linux本身的运维能力做远程监控。比如用systemd管理采集进程崩溃后自动拉起用crontab定期备份数据库用inotify监控配置文件变化改配置不用重启采集。这些都是嵌入式Linux项目里很基础但特别实用的技术点。这次开发过程中我最大的体会是一套好的数据采集系统核心不在代码写得有多花哨而在于它对环境变化的容忍度。数控车间环境不比办公室网络、电磁、温湿度、操作工习惯都会影响系统稳定性。在Linux这样的系统上做采集天然拥有稳定性、可维护性和扩展性上的优势只要把连接管理、异常处理、数据落地这些基本功做扎实后面无论接MES、做看板还是上AI预测分析都有一条顺畅的数据管道等着你。希望这套基于Linux的FANUC数据采集方案能帮你少走点弯路。如果你也在搞类似的项目欢迎交流沟通。本文还有配套的精品资源点击获取
返回列表