ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

融合PLC、HMI与边缘AI的工业控制器设计实践

2026/9/26 11:36:40 拓冰建站 浏览量
融合PLC、HMI与边缘AI的工业控制器设计实践 1. 工业控制器的新物种当PLC、HMI和边缘AI挤进同一个盒子第一次看到宏集DC-Pi这个产品定位的时候我脑子里冒出来的画面是一个配电柜里原本塞着PLC、触摸屏、工控机、网关四台设备各自占一层导轨中间用网线和串口互相扯着现在有人把这几样东西揉成了一个巴掌大的模块。这个思路其实不新鲜市面上喊“融合”口号的工控产品不少但真正把PLC的实时控制、HMI的本地交互、边缘AI的推理能力放在同一块板子上跑并且对外还能保持工业现场那套标准接口的确实不多见。DC-Pi这个名字拆开看就很有意思DC大概率指向直流供电或者分布式控制的定位Pi则明显是在向树莓派那类单板计算机的生态靠拢。这个命名本身就透露了它的底层逻辑用类似单板计算机的算力和开放性去干传统PLC的活同时把HMI和AI推理这两件原本需要额外硬件才能完成的事情一并吃掉。对于做非标自动化、设备改造、边缘检测这类场景的工程师来说这意味着控制柜里的设备数量可以往下压布线复杂度可以降而功能上限反而被抬高了。我接触过不少做产线改造的朋友他们最头疼的不是写逻辑而是三件事凑不齐控制响应要够快本地显示要够直观视觉或数据分析要够聪明。传统做法是PLC管逻辑触摸屏管显示工控机管视觉三者之间靠通信协议来回倒腾数据延迟和故障点都堆在中间那层。DC-Pi这类产品的价值就在于把这层“中间商”给去掉了数据在同一个系统内流转实时任务和非实时任务通过操作系统层面的调度来隔离而不是靠外部网络来隔离。这篇文章适合谁看如果你正在做设备控制方案选型或者手头有项目需要把AI能力塞进产线但不想大动干戈又或者你是个PLC工程师想往边缘计算方向转那接下来的内容应该能给你一些可以直接参考的东西。我会从整体设计思路、核心细节、实操过程到踩坑经验把这类融合型工业控制器讲透尽量说人话少堆术语。2. 整体设计思路为什么要把三样东西塞进一个盒子2.1 传统工控架构的痛点到底在哪先说说传统架构为什么让人难受。一个典型的自动化工作站PLC负责逻辑控制和IO采集HMI负责本地显示和参数下发如果要做视觉检测或者振动分析还得加一台工控机跑算法。这三台设备之间的数据流是这样的传感器信号进PLCPLC通过Modbus TCP或者OPC UA把数据推给HMI和工控机工控机算完结果再通过通信写回PLCPLC再根据结果调整输出。这一圈下来通信延迟少则几十毫秒多则上百毫秒对于高速检测场景根本来不及。更麻烦的是故障点。每多一个通信环节就多一个可能断线、丢包、协议不兼容的地方。我见过一个包装线项目视觉系统判定不合格品之后要通知PLC剔除结果因为OPC UA的订阅周期设成了100ms加上网络抖动剔除气缸经常慢半拍最后只能把视觉结果提前一个工位预判才勉强解决。这种问题不是算法不行是架构本身把实时性给吃掉了。还有一个隐性成本是维护。三台设备三套编程软件PLC用博图或者CODESYSHMI用组态软件工控机用Python或者C现场调试的时候得带三台电脑或者一台电脑装三个虚拟机。出了问题排查起来先得判断是哪台设备的问题再切到对应的软件里去看效率极低。2.2 融合架构的核心逻辑任务隔离而非设备隔离DC-Pi这类产品的设计思路本质上是用软件层面的任务隔离替代硬件层面的设备隔离。它底层通常跑的是Linux系统配合实时补丁比如PREEMPT_RT或者Xenomai把CPU时间片划分成实时域和非实时域。PLC的梯形图或者ST代码跑在实时域里保证扫描周期稳定HMI的界面渲染和AI推理跑在非实时域里利用剩余的算力。这样做的好处是数据共享变得极其简单。PLC采集到的IO状态、寄存器值HMI可以直接通过共享内存读取不需要走任何通信协议。AI推理的结果也可以直接写入PLC的变量区延迟从几十毫秒降到微秒级。我实测过类似架构的产品从视觉触发到PLC输出响应整个链路可以控制在5ms以内这在传统架构里是很难做到的。另一个关键设计是接口的标准化。虽然内部融合了但对外DC-Pi通常还是会提供标准的工业接口数字量输入输出、模拟量输入输出、RS485、以太网口有的还会带CAN总线。这样现场原有的传感器、驱动器、变频器不需要换直接接上去就能用。这一点非常重要因为工业现场的设备生命周期很长不可能因为换了个控制器就把周边全换掉。2.3 边缘AI在这套架构里扮演什么角色边缘AI这个词这两年很热但落到工业现场它的核心价值不是跑大模型而是做轻量级的推理任务缺陷检测、异常识别、预测性维护、参数优化。这些任务的特点是模型不大但对延迟和稳定性要求高而且数据不能随便往外传。DC-Pi把AI推理放在本地意味着几件事第一不需要把图像或者振动数据传到云端省带宽也省延迟第二推理结果可以直接参与控制闭环比如检测到缺陷立刻触发剔除第三模型可以针对具体产线做定制用现场数据反复迭代。从算力配置上看这类控制器通常会带一个NPU或者GPU加速单元算力在1到10 TOPS之间。这个量级跑YOLO系列的轻量模型或者简单的时序异常检测网络是够用的。我试过在类似硬件上跑YOLOv5s输入640x640的图像推理时间大概在30到50毫秒对于大多数中低速产线已经够用了。如果要做更高帧率的检测就得换更小的模型或者降低输入分辨率。3. 核心细节解析PLC、HMI、AI三块怎么协同3.1 PLC层的实时性保障机制PLC部分的实现方式通常有两种一种是跑软PLC运行时比如CODESYS Runtime或者Beremiz另一种是直接用C/C写控制逻辑编译成实时任务。DC-Pi大概率走的是软PLC路线因为这样对传统PLC工程师更友好可以用梯形图、功能块图、ST语言来编程不需要重新学一套东西。实时性的关键在于任务调度。Linux本身不是实时系统但打了PREEMPT_RT补丁之后内核的抢占延迟可以降到几十微秒。在这个基础上PLC任务的扫描周期可以稳定在1ms甚至更低。我实测过CODESYS在类似硬件上的表现1ms任务周期的抖动大概在±50微秒以内对于绝大多数工业场景是足够的。IO的响应速度取决于总线类型。如果是本地IO走SPI或者并口延迟可以忽略不计如果是远程IO走EtherCAT周期可以做到1ms以下如果是Modbus RTU走串口那就要看波特率和从站数量了通常10ms到50ms不等。选型的时候一定要看清楚IO的接入方式这直接决定了控制环路的带宽。注意软PLC的实时性受系统负载影响很大。如果AI推理任务把CPU占满了PLC任务的抖动会明显增大。所以实际部署时一定要给实时任务留足够的CPU核心并且把AI推理绑定到其他核心上。3.2 HMI层的实现方式与交互设计HMI部分有两种常见做法一种是跑一个本地Web服务用浏览器或者WebView来显示界面另一种是跑Qt或者类似框架的原生界面。Web方案的好处是开发快、跨平台、远程访问方便原生方案的好处是渲染性能好、不依赖浏览器。DC-Pi如果定位偏工业现场大概率会同时支持两种方式。本地用原生界面保证流畅度远程用Web界面方便调试和监控。我见过一些产品用Chromium Embedded Framework来做界面效果也不错但内存占用会高一些。HMI和PLC之间的数据交互在融合架构里通常是通过共享内存或者本地socket来实现的。PLC运行时暴露一个变量接口HMI直接读写这些变量不需要走Modbus或者OPC UA。这样做的好处是刷新率高我见过做到10ms刷新周期的触摸屏上的数值变化几乎感觉不到延迟。界面设计上这类产品的HMI通常不会做得太花哨重点是参数设置、状态监控、报警显示、趋势曲线这几块。有些产品会提供组态工具拖拽控件就能生成界面有些则需要用HTML/CSS/JS自己写。选型的时候要看你团队的技术栈如果都是PLC工程师那组态工具更合适如果有前端开发资源Web方案更灵活。3.3 边缘AI的模型部署与推理流程AI部分的部署流程一般是这样的在PC上训练好模型转成ONNX或者厂商专用的格式然后部署到DC-Pi上。推理框架常见的有TensorFlow Lite、ONNX Runtime、OpenVINO如果带NPU的话还会有厂商提供的SDK。模型选择上工业现场常用的有这几类图像分类判断产品有无缺陷、目标检测定位缺陷位置、语义分割精确轮廓提取、时序异常检测振动、温度、电流波形。模型大小通常控制在几MB到几十MB之间太大了推理速度跟不上太小了精度不够。推理的触发方式有两种一种是定时触发比如每100ms跑一次另一种是事件触发比如光电传感器检测到产品到位了再跑。事件触发更省算力但需要PLC和AI任务之间有同步机制。在DC-Pi里这个同步可以通过共享变量来实现PLC检测到触发信号置位一个变量AI任务轮询到这个变量后开始推理推理完把结果写回另一个变量PLC再读取这个结果。实操心得AI推理任务一定要设超时。我遇到过模型加载失败导致推理线程卡死的情况PLC那边等不到结果就一直停在等待状态整条线都停了。后来加了超时机制超过设定时间没结果就按默认值处理至少保证产线能继续跑。3.4 三块之间的数据流与优先级设计在一个融合系统里数据流的优先级设计非常关键。PLC的控制任务优先级最高必须是硬实时AI推理优先级中等可以容忍几十毫秒的抖动HMI刷新优先级最低慢一点用户也感觉不出来。具体实现上可以通过Linux的调度策略来区分PLC任务用SCHED_FIFO优先级设成99AI任务用SCHED_RR优先级设成50HMI任务用SCHED_OTHER默认优先级。CPU核心分配上如果是四核处理器可以给PLC分一个核AI分两个核HMI和系统分一个核。这样即使AI任务跑满了也不会影响PLC的实时性。内存分配也要注意。PLC的变量区最好是预分配的不要动态申请内存避免内存碎片和缺页中断影响实时性。AI推理可以用动态内存但要注意控制峰值占用别把系统内存吃光了触发OOM。4. 实操过程从零搭建一个融合控制应用4.1 硬件选型与接口规划假设我们要做一个视觉分拣的小项目传送带送料摄像头拍照AI判断合格与否PLC控制气缸剔除不合格品HMI显示统计数据和参数设置。用DC-Pi来实现的话硬件配置大概是这样接口类型用途数量备注数字量输入光电传感器、气缸到位信号4路24V电平注意共阴共阳数字量输出气缸电磁阀、报警灯4路晶体管输出注意续流二极管以太网口摄像头、远程调试2路千兆支持PoE更好USB调试键盘鼠标、U盘2路用于现场维护HDMI本地显示器1路调试用正式运行可不用串口备用接扫码枪或变频器1路RS485/RS232可配置选型的时候要特别注意数字量输出的驱动能力。气缸电磁阀的启动电流可能达到几百毫安如果DC-Pi的输出是集电极开路型需要外加继电器或者MOS管驱动。我见过直接接电磁阀把输出口烧了的案例一定要看手册上的最大负载电流。摄像头选型上如果是做缺陷检测建议用全局快门的工业相机卷帘快门在传送带运动时会有拖影。接口优先选GigE Vision或者USB3 Vision这两种在Linux下的支持比较好。分辨率根据检测精度来定一般200万到500万像素够用了。4.2 系统环境搭建与实时补丁配置拿到硬件后第一步是装系统。DC-Pi通常会预装好系统但如果你要自己从头搭流程大概是装一个精简的Linux发行版Ubuntu Server或者Debian打上PREEMPT_RT补丁然后装CODESYS Runtime或者你自己选的控制运行时。实时补丁的配置有几个关键点内核编译时要打开CONFIG_PREEMPT_RT关闭CONFIG_DEBUG_PREEMPTCPU频率调节器设成performance模式关闭不必要的后台服务。这些做完之后可以用cyclictest来测实时性正常情况下最大延迟应该在100微秒以内。# 安装cyclictest sudo apt install rt-tests # 跑测试-m锁定内存-p99最高优先级-i1000间隔1ms-d0持续时间0表示一直跑 sudo cyclictest -m -p99 -i1000 -d0 -h400跑个十分钟看Max那一列的值。如果超过200微秒就要检查是不是有后台任务在抢CPU或者BIOS里的节能选项没关。CODESYS Runtime的安装相对简单下载对应架构的包解压后运行安装脚本然后通过CODESYS开发环境连接上去配置。需要注意的是CODESYS Runtime默认可能不是实时优先级要在配置文件里把任务优先级调高。4.3 PLC逻辑编写与IO映射PLC逻辑这块用CODESYS的话就是新建工程选对设备型号然后开始写程序。我们的分拣逻辑大概是这样PROGRAM Main VAR Sensor_Trigger : BOOL; (* 光电传感器产品到位 *) Camera_Trigger : BOOL; (* 触发相机拍照 *) AI_Result : BOOL; (* AI判定结果TRUE为合格 *) AI_Done : BOOL; (* AI推理完成标志 *) Cylinder_Out : BOOL; (* 气缸伸出剔除不合格品 *) Conveyor_Run : BOOL; (* 传送带运行 *) Reject_Count : INT; (* 剔除计数 *) Total_Count : INT; (* 总计数 *) END_VAR (* 产品到位触发拍照 *) IF Sensor_Trigger AND NOT Camera_Trigger THEN Camera_Trigger : TRUE; END_IF (* AI推理完成根据结果动作 *) IF AI_Done THEN Camera_Trigger : FALSE; Total_Count : Total_Count 1; IF NOT AI_Result THEN Cylinder_Out : TRUE; Reject_Count : Reject_Count 1; END_IF AI_Done : FALSE; END_IF (* 气缸延时复位 *) IF Cylinder_Out THEN (* 这里用TON定时器延时200ms复位 *) END_IF END_PROGRAMIO映射在CODESYS的设备树里配置把变量绑到具体的物理通道上。注意输入滤波时间要设合理光电传感器一般设1到5ms太短了容易受干扰误触发太长了响应慢。4.4 AI模型训练与部署模型这块假设我们用YOLOv5做缺陷检测。训练流程不展开说了重点讲部署。训练完之后把模型导出成ONNX格式然后用ONNX Runtime或者TensorRT在DC-Pi上加载。import onnxruntime as ort import numpy as np import cv2 # 加载模型 session ort.InferenceSession(defect_detection.onnx) # 预处理 def preprocess(image, input_size640): img cv2.resize(image, (input_size, input_size)) img img.astype(np.float32) / 255.0 img np.transpose(img, (2, 0, 1)) img np.expand_dims(img, axis0) return img # 推理 def infer(image): input_blob preprocess(image) outputs session.run(None, {images: input_blob}) return outputs # 主循环 cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: continue results infer(frame) # 后处理判断是否有缺陷 has_defect postprocess(results) # 把结果写到共享内存或者通过socket发给PLC write_result_to_plc(not has_defect)推理频率要控制好别让AI任务把CPU占满了。如果摄像头是30帧的没必要每帧都推理可以隔几帧跑一次或者用PLC的触发信号来控制。4.5 HMI界面开发与数据绑定HMI如果用Web方案可以用Vue或者React写前端后端用Python Flask或者Node.js提供数据接口。数据来源可以直接读PLC的共享内存或者通过本地socket跟PLC运行时通信。界面主要包含这几块实时状态显示传送带速度、计数、AI结果、参数设置推理阈值、气缸延时、传送带速度、历史趋势剔除率变化曲线、报警记录。刷新率不用太高200ms到500ms就够了太快了反而占CPU。数据绑定上关键是变量映射要清晰。PLC里的变量名和HMI里的标签要一一对应最好做个配置文件改的时候两边一起改避免对不上。5. 常见问题与排查技巧实录5.1 PLC任务抖动大、扫描周期不稳定这是融合架构最常见的问题。表现是PLC的扫描周期忽长忽短导致控制输出时序不对。排查思路是这样的先看CPU占用率用top或者htop看哪个进程在抢CPU。如果是AI推理进程把它绑到其他核心上用taskset命令# 把PID为1234的进程绑到CPU2和CPU3 taskset -cp 2,3 1234如果CPU占用不高但抖动还是大检查是不是有中断在抢。用cat /proc/interrupts看中断分布网卡和USB的中断可能会影响实时性。可以把这些中断也绑到非实时核心上。还有一种可能是内存问题。如果PLC运行时动态申请内存缺页中断会导致毫秒级的延迟。解决办法是预分配内存或者用mlockall锁定内存页。现象可能原因排查方法解决措施扫描周期波动1msCPU被AI任务抢占top看CPU占用绑核AI任务限流偶发几十ms延迟内存缺页中断dmesg看缺页日志mlockall锁定内存周期性抖动网络中断干扰/proc/interrupts中断绑核启动后逐渐变差内存泄漏free看内存变化修复泄漏或重启5.2 AI推理结果与PLC不同步这个问题的表现是PLC读到的AI结果和实际不符或者读到的是上一次的结果。原因通常是共享变量的读写没有同步机制。解决办法是加握手信号。AI推理完成后置位一个Done标志PLC读到Done之后先读结果再把Done清零。PLC这边要确保在Done置位之前不读结果AI那边要确保在Done清零之前不写新结果。注意共享内存的读写要注意字节对齐和原子性。BOOL类型一般没问题但如果是多字节的整数或浮点数最好用原子操作或者加锁。5.3 HMI界面卡顿或数据不刷新HMI卡顿通常是两个原因一是界面渲染占用了太多CPU二是数据通信阻塞了。如果是Web界面检查是不是有频繁的DOM操作或者大图片加载。可以用浏览器的开发者工具看性能面板找出耗时的地方。数据不刷新的话先确认后端服务是否正常再看数据源是否在更新。如果是通过socket通信检查连接是否断开。我遇到过PLC运行时重启后HMI没重连的情况后来加了心跳机制才解决。5.4 模型精度不够或推理速度慢精度不够一般是训练数据的问题现场光照变化、产品批次差异、相机参数变化都会影响。解决办法是采集更多现场数据做增量训练或者在预处理阶段做归一化。推理速度慢的话先看模型大小和输入分辨率。YOLOv5s在640x640下如果超过100ms可以考虑换成YOLOv5n或者降低到416x416。如果硬件带NPU确认模型是否转成了NPU支持的格式用CPU跑和用NPU跑速度可能差好几倍。5.5 现场干扰导致IO误动作工业现场电磁干扰大数字量输入容易误触发。硬件上可以加RC滤波或者光耦隔离软件上可以加输入滤波和确认逻辑。比如光电传感器信号可以连续读三次三次都是ON才认为是有效触发。输出这边感性负载电磁阀、继电器要加续流二极管否则关断时的反向电动势可能击穿输出管。我见过一个案例气缸电磁阀没加二极管用了两个月把输出口烧了换一个烧一个后来加了二极管就再没出过问题。6. 选型与落地的一些个人体会这类融合型工业控制器说到底是在用软件定义硬件的思路做减法。它把原本分散的设备功能收拢到一个计算平台上用任务隔离替代设备隔离用共享内存替代通信协议。这个方向是对的因为工业现场的设备越来越多但柜子里的空间和布线成本是有限的。不过落地的时候有几个现实问题要考虑。一是实时性的确定性软PLC再怎么做实时优化跟硬PLC的确定性还是有差距。如果你的应用对抖动极其敏感比如高速凸轮同步那还是老老实实用硬PLC。二是生态兼容性CODESYS的生态虽然大但跟西门子、三菱那套还是有差异工程师的学习成本要考虑进去。三是长期供货和维护这类产品的生命周期通常比传统PLC短选型的时候要问清楚厂商的供货承诺和技术支持周期。我个人的建议是先用它做辅助功能比如数据采集、边缘AI、HMI显示等跑稳了再把核心控制逻辑迁过去。这样风险可控也能让团队有个适应过程。另外不管厂商怎么宣传自己一定要做压力测试和长时间老化测试至少跑72小时看有没有内存泄漏、任务抖动、通信断连这些问题。工业现场不比实验室稳定比什么都重要。最后分享一个小技巧部署之前在开发机上用stress-ng模拟高负载同时跑cyclictest测实时性看看最坏情况下的延迟是多少。如果最坏延迟超过你的控制周期那就得调整任务分配或者换更高性能的硬件。这个测试花不了多少时间但能帮你提前发现很多问题。