ARTICLE DETAIL

资讯详情

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

生产过程数据采集与管理:协议选型、服务架构与质量验证

生产过程数据采集与管理:协议选型、服务架构与质量验证 简介这是一份围绕生产过程数据采集与管理的企业实践案例资料以沈阳航天三菱汽车发动机制造有限公司为对象面向制造业生产管理、质量追溯与信息化建设从业者。资料针对原有流程中工件上线、离线、下线、检测、组拍以及装配零件和人员信息缺失、无法追溯等问题给出了基于条形码与二维码的完整采集方案包括毛坯批次、班组、零件唯一标识、供应商批次、装配人员等数据的记录与统计也涵盖异常下线与返线原因录入、成品组拍、测量数据自动采集等关键环节。包体为单个PDF格式文档大小2.33MB内容涉及公司概况、生产线设备与控制、信息采集流程、机器视觉防错识别、安灯系统等章节既有案例背景也有操作细节。目前已有25人学习适合需要参考汽车发动机行业数据采集与质量追溯落地经验的读者快速了解。1. 生产过程数据采集与管理先打通点位再谈数据治理车间里并不缺数据缺的是能直接交给管理系统使用的数据。设备 PLC 里的温度、压力、转速机床控制器里的主轴负载注塑机里的模温和保压时间这些信号一直在刷新但到了生产报表上往往是手填表格和 Excel 台账。数据量越大人工环节越不可信追溯不良品时甚至要翻纸质单据确认当时的工艺参数。生产过程数据采集与管理解决的就是这条链路从设备接口把离散信号按统一点位采集上来经过网关和服务端整理成带时间戳、带设备维度、带班次属性的结构化数据再交给 MES、看板和质量分析。它不是一套现成软件的安装过程而是协议选型、采集服务部署、数据建模、质量验证的组合。这篇文章适合负责车间数字化改造的 IT 工程师、自动化工程师以及刚接手制造数据平台的技术管理者。下文从协议选型讲起落到基于 WebServer 的采集服务和时序存储最后给出可复现的 SQL 验证方案。2. 生产过程数据采集的协议选型Modbus、OPC UA 与机床/注塑机接口2.1 先定采集点位表生产过程数据采集的原点是 Tag无论设备来自哪个厂商采集工作开始前都要先回答一个问题这台设备要采哪些信号每个信号用什么标识、什么数据类型、什么单位。常见做法是先做一张点位表也就是工业现场常说的 Tag 表。点位的粒度决定了后面所有工作的复杂程度把整台设备当一个点只能做“开机/停机”统计把每个工艺参数当一个点才能做参数追溯和能耗分析。点位表至少要包含设备编号、信号名称、数据类型、单位、采集方式、采样周期六列。设备编号要能和 ERP 或 MES 里的固定资产编码对上否则采集上来的数据在管理系统里找不到归属。采集方式这一列用来区分这个信号是走 Modbus 寄存器、OPC UA 节点还是厂商私有 API。采样周期不一定要统一温度、压力这类变化慢的信号可以 5 秒采一次振动、电流这类瞬态信号则需要 100 毫秒甚至更短。点位表在建表阶段多花半天后面写采集配置和做报表时能省下数天时间。提示点位表建议建完后让工艺工程师签个字。设备铭牌上的型号和实际可用信号经常不一致工艺人员确认过才能避免采集上线后再返工。2.2 Modbus 轮询与 OPC UA 订阅怎么选现场设备接口分两类。一类是老的串口或网口的 Modbus RTU、Modbus TCP另一类是基于 OPC UA 的现代接口。选型不是越新越好而是看设备控制器支持什么、车间网络能不能承载。对比项Modbus TCPOPC UA报文方式请求-响应轮询订阅/发布也支持轮询实时性受轮询周期限制通常 100ms~1s订阅模式下可达 10ms 级是否带语义只有寄存器地址需要点位表解释节点带类型、单位、描述安全机制基本没有支持证书、签名、加密接入成本低任意语言都能解析中高需要 SDK 和证书管理大多数老 PLC 只有 Modbus 接口没有别的选择那就按轮询来做。轮询周期要按寄存器总量和现场总线负载综合估算单台设备 100 个寄存器、50ms 超时一轮轮询大约需要 1~2 秒。如果设备数量超过 30 台就要分多个采集线程或分片轮询避免出现严重的采集延迟。OPC UA 则适合新设备或对实时性要求高的场景订阅模式让服务器主动推送变化值只需要维护好 Session 和订阅周期网络开销比同等规模的 Modbus 轮询小得多。2.3 机床数据采集FOCAS 的常见接法与参数数控机床数据采集是车间里最容易被低估的一块。FANUC 系统的 FOCAS 库是行业里最常见的接入方式热词里“FOCAS 机床数据采集”频繁出现说明这块需求一直很集中。FOCAS 的全称是 FANUC Open CNC API Specification它通过机床的以太网接口或嵌入式板卡把 PMC、CNC 内部参数以函数方式暴露出来。读取主轴负载、坐标、倍率、报警号都可以走这一套接口。2.3.1 FOCAS 连接参数与握手流程常见做法是机床侧开启以太网功能设置 IP、端口和定时器编号。连接时先建立句柄再逐个读取数据项最后释放句柄。下面是一个极简的 FOCAS 读取流程示例import focas # 厂商或第三方提供的 FOCAS 绑定库 # 1. 建立连接句柄机床侧需开启以太网功能 handle focas.alloc_handle() ret focas.cnc_allclibhndl3(192.168.10.20, 8193, 10, handle) if ret ! 0: print(连接失败错误码, ret) exit(1) # 2. 读取主轴负载每个轴一个数据项 for axis in range(3): load focas.cnc_rdspindle(handle, axis, None) print(f主轴{axis 1}负载{load}%) # 3. 结束时释放句柄 focas.free_handle(handle)这里的三个参数值得说明。IP 是机床的以太网地址端口默认 8193这是 FOCAS 约定俗成的服务端口一般不需要改。第三个参数是超时时间单位秒对应握手时的等待上限车间网络抖动大的时候可以适当调大到 20 秒但超过 30 秒就要先查网络而不是调参数。读取主轴负载使用的cnc_rdspindle只是 FOCAS 众多接口中的一个同样的机制还可以读取坐标、程序号、报警号和倍率信号。2.3.2 FOCAS 采集服务的进程管理问题FOCAS 库在设计上是同步阻塞的一个句柄在同一时刻只能处理一个请求。如果一台机床要同时采集十几个数据项最好在一个进程内顺序读取不要开几十个线程同时向同一台机床发起请求。多线程并发情况下部分 FOCAS 实现会出现句柄冲突表现为偶发读取失败或返回异常数据。另一种常见做法是把每台机床放在独立进程中用一个简单的 supervisor 守护崩溃后自动拉起。这样一台机床的采集异常不会拖垮整个采集服务。2.4 注塑机数据采集Euromap 63/66 与厂商网关注塑机数据采集是热词里另一个高频方向。注塑机与通用 PLC 的区别在于它的工艺参数高度集中模温、料温、注射速度、保压压力、开合模位置这些都是质量追溯的关键字段。新一点的机器支持 Euromap 63 或 Euromap 66 协议Euromap 66 基于 OPC UA可以直接用 OPC UA 客户端接入Euromap 63 则是老旧的串口或以太网文本协议需要解析厂商自定义的报文。没有标准协议的老注塑机常见做法是用厂商提供的网关盒子或数据采集一体机。这种一体机通常已经实现了协议解析对外提供 Modbus TCP 或 WebService 接口采集系统只需要对接一体机不必关心注塑机内部的寄存器布局。这个模式适合设备品牌杂、数量多的车间代价是一体机的点位表和设备地址需要逐一配置实施时要把这部分工作量算进项目周期。3. 基于 WebServer 的采集服务与生产数据管理建模3.1 基于 WebServer 的工业数据采集服务架构采集协议定好之后下一步是把各路数据收拢到一个统一的服务里。常见做法是采用边缘采集网关加 WebServer 的架构网关负责和设备通信WebServer 负责对外提供统一的 HTTP 接口上层 MES、看板、报表系统都只和 WebServer 打交道不直接碰设备协议。采上来的数据好不好管理就看这一层做得干不干净。设备侧的变化被隔离在网关层上层系统不用跟着改。下面是一个用 Flask 实现的简化版 WebServer 采集服务from flask import Flask, jsonify, request from collector import ModbusCollector, FocasCollector app Flask(__name__) # 设备注册表设备编号 - 采集器实例 # 上层系统只需依赖设备编号不关心底层协议 collectors { mold_01: ModbusCollector(192.168.10.10, 502, tags[temp, pressure]), cnc_01: FocasCollector(192.168.10.20, 8193, tags[spindle_load]), } app.route(/api/v1/tags/latest, methods[GET]) def get_latest_tags(): 返回所有设备最新点位值供看板轮询 result {} device_id request.args.get(device_id) targets [device_id] if device_id else list(collectors.keys()) for dev_id in targets: dev collectors.get(dev_id) if dev: result[dev_id] dev.read_latest() return jsonify(result) if __name__ __main__: app.run(host0.0.0.0, port8000, threadedTrue)这段代码里的关键是设备注册表和/api/v1/tags/latest接口。注册表把设备编号和采集器实例绑定上层系统只需要知道mold_01这个编号不需要关心它是 Modbus 还是 FOCAS。接口参数device_id用于按设备拉取点位值不传则返回全部设备方便不同页面按需请求。threadedTrue让 Flask 以多线程处理并发请求但要注意底层采集器实例必须是线程安全的FOCAS 句柄就是前面提到的不安全项。实际生产环境里WebServer 还要加上 Basic Auth 或 Token 认证否则车间内网里的控制类接口很容易被误操作。3.2 时序存储选型与生产过程数据建模采集服务把数据收上来之后要回答“存到哪里”。生产数据的特点是写多读少、按时间追加、很少更新旧记录这正好是时序数据库的适用场景。选型时优先看三点写入吞吐、数据压缩比、SQL 兼容性。InfluxDB 和 TDengine 是工业现场最常见的两个选择前者生态成熟后者在 SQL 兼容和集群部署上更贴合国内制造企业的使用习惯。时序库的表设计沿用的是“标签 字段 时间戳”模型。一个典型的生产数据表CREATE TABLE process_data ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, device_id VARCHAR(32) NOT NULL, tag_name VARCHAR(64) NOT NULL, tag_value DOUBLE NOT NULL, quality TINYINT DEFAULT 1, batch_no VARCHAR(32) );device_id和tag_name是标签列负责检索维度tag_value是字段列存储采集值quality记录质量码0 表示无效、1 表示正常、2 表示估算值这是后续数据质量验证的重要字段。batch_no用来关联生产批次一个批次在多个设备上产生的数据可以通过它聚合查询。如果查询模式以设备和时间范围为主可以把device_id和ts建为联合索引避免全表扫描。真实项目里建议把点位元数据单独建表tag_name只存编码点和名称的对应关系交给管理端维护换名称时不用回刷历史数据。3.3 设备维度、班次维度与工单维度的映射时序表解决的是“什么时间什么值”的问题但生产过程数据采集与管理还需要回答“谁干的、哪个班次、哪个工单”。这些信息不在设备侧而在管理侧需要靠维度映射来补充。常见做法是维护三张维度表再在采集数据入库时做关联。设备维度表包含设备编号、设备名称、所属产线、车间班次维度表包含班次编码、开始时间、结束时间工单维度表包含工单号、产品型号、计划数量、实际开始时间。采集服务在写入时序表时根据设备编号关联设备维度再根据时间戳判断属于哪个班次补上班次编码。这个映射逻辑放在入库链路里做比在报表查询时再做要高效得多因为查报表时往往已经不知道某个时间点属于哪个班次了。一个需要注意的细节是跨天班次。夜班从晚上 20 点开始到次日 4 点结束时间戳落在两天。班次维度的开始时间和结束时间必须支持跨天判断判断逻辑不能用简单的日期比较要先用班次开始时间减去时间戳取模 24 小时再判断是否在班次时长内。这个坑在项目初期最容易踩等报表对不上再来改返工成本很高。4. 采集服务的参数调优与常见故障排错4.1 采集频率、超时与写库并发怎么调采集参数的设定不是越大越好也不是越小越好。频率过高设备控制器忙于响应请求正常工作流程被打扰频率过低瞬态工艺参数的变化采不到数据失去分析价值。以通用设备为例外部温度、压力等过程变量建议 3~5 秒采一次电流、振动等快速信号用 OPC UA 订阅或高速采集模块做到 100ms 级别。FOCAS 机床数据采集不需要追求高频率主轴负载、坐标这类信号 1~2 秒采集一次足够频率再高反而会触发控制器的超时限制。写库并发是另一个常见问题。每台设备的采集线程各自写库设备一多就会出现连接风暴。常见做法是采集线程只把数据放进内存队列由独立写入线程批量入库一批 500 条或 1000 条根据设备总数调整。批量写入能显著降低数据库的连接数也能减少磁盘 IO 次数。下面是一个写入参数的参考范围参数建议范围说明普通过程变量采集周期3~5 秒温度、压力、液位快速信号采集周期100ms~1s电流、振动、主轴负载FOCAS 采集周期1~2 秒过高会触发控制器超时批量写入条数500~1000 条根据内存和数据库吞吐调整写库超时3~5 秒超时后进入重试队列4.2 数据断档与时间戳乱序的处理策略数据断档几乎是必然会发生的问题是要能及时看见。断档分两类一类是设备侧通信中断所有点位都采不到另一类是单点异常某个 Tag 长时间没有新值。针对前者采集服务要维护每个设备的最近心跳时间超过 3 个采集周期没有新数据就标记设备离线针对后者可以按点位统计最近一次更新时间在管理端展示“数据新鲜度”列表。断档后的补采要看设备的缓冲能力有些 PLC 能保留历史值可以从断点续采没有缓冲的设备只能记录缺失区间等待工艺系统侧补偿。时间戳乱序比较隐蔽。设备时钟不同步、采集线程并发写库、网络抖动都可能导致先采集到的数据比后采集到的数据时间戳更大。时序数据库大多要求按时间顺序写入乱序数据会造成存储膨胀和查询异常。处理策略是在写入队列里按时间戳排序后批量提交队列长度超过阈值时丢弃尾部最旧的数据并记录告警日志。注意是丢弃最旧而不是丢弃最新因为生产过程中旧的延迟数据对实时看板已经没有意义。4.3 用日志指标定位采集链路瓶颈采集链路分为设备通信、数据整理、批量写入三个环节瓶颈出现时先看日志指标再改代码。推荐在采集服务里定期输出四个指标单次请求耗时 P95、单位时间采集点数、写库批量耗时、重试次数。下面是一个统计最近 1000 次采集耗时的脚本import collections history collections.deque(maxlen1000) def log_request_cost(ms): history.append(ms) def report(): if not history: return {count: 0} sorted_costs sorted(history) p95 sorted_costs[int(len(sorted_costs) * 0.95) - 1] p99 sorted_costs[int(len(sorted_costs) * 0.99) - 1] return { count: len(history), avg_ms: sum(history) / len(history), p95_ms: p95, p99_ms: p99, }P95 比平均值更能反映真实体验平均值会被少数极快请求拉低。请求耗时如果超过采集周期的一半说明链路已经吃紧需要检查设备侧并发数、网络带宽和数据库写入延迟。重试次数持续增大时首先要看目标设备 IP 是否可达用 ping 和 telnet 确认网络链路而不是继续调大超时。设备侧偶发超时是正常的只要重试后能恢复就不算故障重试还失败就要把采集线程降级为离线状态防止请求堆积拖垮整个服务。5. 用 SQL 验证生产过程数据采集质量再落成看板5.1 计算采集完整率和迟到率数据采上来了但没人知道采得好不好这是很多项目的真实状态。上正式报表系统之前先用 SQL 量化两个指标采集完整率和迟到率。完整率指实际收到的数据点数与理论上应收到的点数之比迟到率指时间戳落后于写入时间超过阈值的记录占比。-- 以 5 秒采集周期为例统计某台设备某天的采集完整率 SELECT device_id, COUNT(*) AS actual_points, 86400 / 5 AS expected_points, ROUND(COUNT(*) * 5.0 / 86400 * 100, 1) AS completion_rate FROM process_data WHERE device_id mold_01 AND ts TIMESTAMP 2025-01-01 00:00:00 AND ts TIMESTAMP 2025-01-02 00:00:00 GROUP BY device_id;-- 统计迟到率写入时间与数据时间戳相差超过 10 秒的记录 SELECT device_id, COUNT(*) AS total_rows, SUM(CASE WHEN write_ts - ts INTERVAL 10 seconds THEN 1 ELSE 0 END) AS late_rows FROM process_data WHERE ts TIMESTAMP 2025-01-01 00:00:00 AND ts TIMESTAMP 2025-01-02 00:00:00 GROUP BY device_id;第一个查询里期望值 86400 除以 5 得到 17280 个理论点数实际点数低于 90% 时优先查设备通信链路而不是查数据库。第二个查询的write_ts字段表示写入时间如果采集服务没有单独记录可以用数据库的接收时间近似需要提前说明的是write_ts必须建在采集服务侧而不是设备侧否则网络延迟会被计入误差。迟到率超过 5% 说明写入链路有积压需要检查批量队列长度和数据库吞吐。5.2 看板刷新的缓存与聚合策略验证数据质量之后实时看板才有意义。看板页面的刷新方式要区分两种数据实时点位值用 1~2 秒轮询直接读最新值趋势图和汇总统计用 5~10 秒轮询读预聚合结果。不要在每次刷新时对原始明细表做聚合计算设备多了以后这条 SQL 会越跑越慢最优的做法是建一张按分钟或按小时预聚合的表后台定时更新前端只查聚合表。聚合间隔的选择取决于看板的展示粒度。总览页按小时聚合足够车间明细页按 5 分钟聚合比较合适单台设备的参数曲线则必须回到原始明细。为了不牺牲展示精度可以在聚合表里同时保留 max、min、avg 三个值前端绘制走势时用 avg标出异常点用 max/min 区间。这样一个简单的双表结构就能在等待专业报表平台落地前把数据采集的成果稳定展示出来。本文还有配套的精品资源点击获取
返回列表