
工业控制系统这个词放在十年前大家脑子里浮现的还是PLC、DCS、SCADA那一套经典三层架构。但到了2026年情况已经完全不一样了。我最近半年参与了两个AI工业控制相关的项目一个是流程工业的智能优化一个是离散制造的视觉质检闭环踩了不少坑也积累了一些实战经验。这篇文章不打算讲那些教科书上的概念而是从工程落地的角度把AI工业控制系统怎么搭这件事拆开揉碎讲清楚。如果你是一个自动化工程师想往AI方向转或者是一个AI工程师被拉进工业项目又或者是一个技术负责人正在规划工厂的智能化改造这篇文章应该能帮你少走一些弯路。我会从架构设计、数据层搭建、模型选型与训练、边缘部署、系统集成这几个维度展开每个环节都会说清楚为什么这么做以及我实际怎么做的。1. 先搞清楚AI工业控制系统到底控制什么1.1 传统工控和AI工控的本质区别传统工业控制系统的核心逻辑是确定性——给定输入通过PID、MPC等控制算法产生确定的输出。这套体系运行了几十年非常成熟可靠。但它的局限也很明显面对强非线性、大滞后、多变量耦合的复杂工况传统方法要么建模困难要么控制效果不理想。AI工业控制系统的核心思路是用数据驱动的方法来补充甚至替代部分基于机理模型的控制策略。注意我说的是补充甚至替代不是完全取代。这一点非常关键很多项目失败就是因为一上来就想用AI把传统控制全部换掉结果连基本的安全底线都守不住。我参与的第一个项目就犯过这个错误。当时团队想用一个强化学习模型直接输出阀门开度指令绕过了原有的PID控制器。结果在工况突变时模型输出了一个激进的调节量导致系统振荡。后来我们调整了架构让AI模型只负责输出设定值setpoint底层仍然由PID来做快速响应问题就解决了。所以AI工业控制系统的本质定位应该是在传统控制系统的上层增加一个智能决策层。这个决策层负责优化设定值、预测工况变化、识别异常模式而底层的高速控制回路仍然交给成熟的传统方案。1.2 三类典型的AI工控场景根据我这半年的观察目前落地比较多的AI工控场景可以分成三类第一类是过程优化类。典型场景包括化工反应釜的温度曲线优化、水泥窑的燃烧效率优化、钢铁高炉的炉温预测等。这类场景的特点是变量多、耦合强、滞后大传统MPC建模成本极高而AI模型可以从历史数据中学习到复杂的非线性关系。第二类是视觉检测与闭环控制类。比如产品表面缺陷检测后直接联动产线分拣或者焊接质量实时监测后调整焊接参数。这类场景对实时性要求高通常需要边缘部署。第三类是预测性维护与自适应控制类。通过振动、温度、电流等信号预测设备故障并提前调整控制策略。这类场景对数据质量要求极高但一旦跑通ROI非常可观。这三类场景的技术栈有重叠但侧重点不同。下面我会以过程优化类为主线来展开因为它的架构最完整其他两类可以在此基础上做裁剪。1.3 搭建前必须想清楚的三个问题在动手搭建之前有三个问题必须先回答清楚否则后面一定返工问题一你的数据够不够AI模型是数据喂出来的。如果你们的工厂连历史数据都没有好好存或者数据采样频率太低比如只有小时级那很多方案根本跑不起来。我建议至少要有半年以上的历史数据关键变量采样频率不低于分钟级。问题二你的安全边界在哪里AI模型一定会出错问题是出错的时候能不能兜住。你需要明确哪些变量AI可以调调整范围是多少超出范围谁来接管。这些必须在系统设计阶段就定好。问题三你的团队有没有闭环能力AI工控不是做完模型就结束了需要有人持续监控模型表现、定期更新模型、处理异常情况。如果团队里只有算法工程师没有工艺工程师或者只有IT人员没有OT人员这个项目很难持续。2. 数据层搭建整个系统的地基2.1 工业数据采集的特殊性工业数据采集和互联网数据采集完全是两回事。互联网数据你可以随便爬、随便存但工业数据有几个特殊之处实时性要求高。很多控制场景要求数据延迟在毫秒级这就意味着你不能用传统的HTTP轮询方式去采集必须用OPC UA订阅或者Modbus TCP直连。数据质量参差不齐。传感器漂移、通信中断、量程设置错误这些问题在工业现场太常见了。我见过一个项目温度传感器坏了三个月没人发现导致训练出来的模型完全不可用。协议五花八门。一个中等规模的工厂可能同时存在Modbus、Profibus、OPC DA、OPC UA、MQTT等好几种协议。你需要一个统一的采集层来屏蔽这些差异。我的做法是在边缘侧部署一个数据采集网关用OPC UA作为统一的上行协议。OPC UA的好处是自带信息模型可以把每个变量的语义信息单位、量程、描述一起传上来而不是只传一个裸数值。这个信息模型在后面做特征工程的时候非常有用。# 一个简单的OPC UA数据采集示例基于asyncua库 import asyncio from asyncua import Client, ua async def collect_data(): async with Client(urlopc.tcp://192.168.1.100:4840) as client: # 获取需要监控的节点 nodes { reactor_temp: client.get_node(ns2;sReactor.Temperature), reactor_pressure: client.get_node(ns2;sReactor.Pressure), feed_flow: client.get_node(ns2;sFeed.FlowRate), } # 创建订阅 handler DataHandler() subscription await client.create_subscription(100, handler) for name, node in nodes.items(): await subscription.subscribe_data_change(node) # 持续运行 while True: await asyncio.sleep(1) class DataHandler: def datachange_notification(self, node, val, data): # 这里处理数据变化事件 print(fNode {node} changed to {val})这段代码看起来简单但实际部署时要注意几个点订阅周期不要设得太短否则网络和CPU压力会很大要处理断线重连要对数据进行时间戳对齐。2.2 时序数据库选型为什么我最终选了TDengine工业数据天然是时序数据所以时序数据库是标配。市面上主流的选择有InfluxDB、TimescaleDB、TDengine、QuestDB等。我三个项目分别用了InfluxDB和TDengine说一下我的实际感受。InfluxDB的生态很好文档齐全Grafana集成也很顺。但它的开源版本在集群能力上有限制而且写入性能在数据量大了之后会下降。TimescaleDB基于PostgreSQLSQL支持很好但写入吞吐量不如专门的时序数据库。TDengine是我最终选择的方向。它的写入性能确实强单机就能扛住百万级数据点每秒的写入。而且它自带缓存和流计算功能对于一些简单的实时聚合场景可以直接在数据库层面完成不用再搭一个Flink。建表的时候有个技巧把同一类设备的测点放在一张超级表里用标签区分不同设备。这样查询的时候可以用标签过滤效率很高。-- 创建超级表 CREATE STABLE reactor_metrics ( ts TIMESTAMP, temperature FLOAT, pressure FLOAT, flow_rate FLOAT, level FLOAT ) TAGS ( reactor_id BINARY(32), workshop BINARY(32) ); -- 为每个反应釜创建子表 CREATE TABLE reactor_01 USING reactor_metrics TAGS (R01, WorkshopA); CREATE TABLE reactor_02 USING reactor_metrics TAGS (R02, WorkshopA);2.3 数据清洗最脏最累但最重要的活我可以说在一个AI工控项目里数据清洗的时间占比不会低于50%。工业数据的问题包括但不限于缺失值通信中断导致的整段缺失或者传感器故障导致的单点缺失异常值传感器漂移、电磁干扰导致的尖峰时间戳不对齐不同采集源的时钟不同步量纲不统一有的用摄氏度有的用华氏度有的用kPa有的用MPa处理缺失值的时候不要无脑用均值填充。对于时序数据线性插值通常更合理如果缺失段太长比如超过10个采样周期我建议直接标记为无效段不要强行填充。异常值检测我常用两种方法结合3-sigma准则做粗筛孤立森林做精筛。3-sigma简单快速但对非正态分布的数据效果不好孤立森林不需要假设分布但计算量稍大。import numpy as np from sklearn.ensemble import IsolationForest def clean_sensor_data(data, window_size100): 清洗传感器数据 # 1. 线性插值处理短缺失 data data.interpolate(methodlinear, limit10) # 2. 3-sigma粗筛 mean data.mean() std data.std() outliers_sigma np.abs(data - mean) 3 * std # 3. 孤立森林精筛 iso_forest IsolationForest(contamination0.01, random_state42) rolling_features data.rolling(windowwindow_size).agg([mean, std, min, max]) rolling_features rolling_features.dropna() preds iso_forest.fit_predict(rolling_features) outliers_if preds -1 # 合并两种检测结果 combined_outliers outliers_sigma | outliers_if # 4. 将异常值替换为NaN再插值 data[combined_outliers] np.nan data data.interpolate(methodlinear, limit5) return data注意数据清洗的规则一定要和工艺工程师确认。有些看起来是异常值的点可能是真实的工况变化。我曾经把一次真实的开车过程当成异常数据清洗掉了导致模型完全学不到开车阶段的动态特性。3. 模型选型与训练不是越先进越好3.1 为什么我放弃了Transformer改用TCN2026年了Transformer在NLP和CV领域已经是绝对主流。但在工业时序数据上我的实际体验是Transformer不一定是最好的选择。原因有几个工业数据的信噪比通常很低Transformer的自注意力机制容易被噪声干扰工业数据的样本量往往不大相比互联网数据Transformer容易过拟合工业场景对推理延迟有要求Transformer的计算量偏大。我最终在过程优化场景中选择了TCN时序卷积网络。TCN的核心是因果卷积加膨胀卷积既能捕捉长程依赖又不会看到未来的信息这一点在控制场景中非常重要。而且TCN的参数量比同等的Transformer小很多推理速度快。import torch import torch.nn as nn class TemporalConvNet(nn.Module): def __init__(self, input_size, hidden_size, output_size, kernel_size3, num_layers4, dropout0.2): super().__init__() layers [] for i in range(num_layers): in_channels input_size if i 0 else hidden_size dilation 2 ** i # 膨胀系数指数增长 padding (kernel_size - 1) * dilation layers.append(nn.Conv1d( in_channels, hidden_size, kernel_size, paddingpadding, dilationdilation )) layers.append(nn.ReLU()) layers.append(nn.Dropout(dropout)) # 因果卷积需要裁剪掉未来的部分 layers.append(CausalSlice(padding)) self.network nn.Sequential(*layers) self.fc nn.Linear(hidden_size, output_size) def forward(self, x): # x shape: (batch, seq_len, features) x x.transpose(1, 2) # 转为 (batch, features, seq_len) out self.network(x) out out.transpose(1, 2) return self.fc(out[:, -1, :]) # 只取最后一个时间步 class CausalSlice(nn.Module): def __init__(self, padding): super().__init__() self.padding padding def forward(self, x): if self.padding 0: return x return x[:, :, :-self.padding]当然如果你的数据量足够大比如有几年以上的高频数据Transformer或者基于Transformer的时序模型如PatchTST、iTransformer也值得尝试。关键是要做充分的对比实验不要因为某个模型在论文上效果好就直接用。3.2 混合建模机理模型加数据驱动纯数据驱动的模型有个致命问题外推能力差。如果工况超出了训练数据的范围模型输出完全不可信。而工业场景中工况变化是常态。我的解决方案是混合建模用机理模型比如简化的物理方程提供基础预测用数据驱动模型学习残差。这样即使工况超出了训练范围机理模型也能提供一个保底的预测。具体做法是先根据工艺原理建立一个简化的机理模型不需要很精确用机理模型的预测值和实际值做差得到残差用AI模型学习残差的模式最终预测 机理模型预测 AI残差修正这样做的好处是AI模型只需要学习机理模型没捕捉到的部分学习难度大大降低需要的训练数据也更少。3.3 训练数据的划分不能随机打乱这是很多AI工程师容易犯的错误。在互联网场景中我们习惯把数据随机打乱后划分训练集和测试集。但在工业时序场景中绝对不能随机打乱。原因很简单工业数据有时间相关性。如果随机打乱训练集中可能包含测试集相邻时间点的数据导致数据泄露测试效果虚高。正确的做法是按时间顺序划分用前70%的数据做训练中间15%做验证最后15%做测试。而且要在划分点之间留一段缓冲期避免边界效应。另外工业场景中不同工况的数据分布差异很大。比如夏季和冬季的环境温度不同会导致同样的控制策略产生不同的效果。所以训练集要尽量覆盖各种工况必要时可以做工况分层采样。4. 边缘部署把模型放到离设备最近的地方4.1 为什么一定要边缘部署我见过一些项目把AI模型部署在云端通过API调用来做实时控制。这种方案在Demo阶段没问题但实际生产环境中会遇到几个致命问题延迟不可控。云端推理的延迟受网络状况影响很大从几十毫秒到几秒都有可能。对于控制周期在秒级的场景这个延迟是不可接受的。网络中断风险。工厂网络并不是100%可靠的一旦网络中断云端模型无法访问控制系统就瘫痪了。数据安全顾虑。很多工厂不愿意把核心生产数据传到云端。所以边缘部署是AI工业控制系统的必选项。模型必须跑在工厂本地的边缘服务器或工控机上。4.2 边缘硬件的选型考量边缘硬件的选择要根据模型复杂度和实时性要求来定。我整理了一个对比表格硬件类型典型型号适用场景推理延迟功耗价格区间工控机GPU研华MIC-770RTX A2000复杂模型、多路视频10-50ms200-400W1.5-3万边缘AI盒子NVIDIA Jetson Orin中等模型、视觉检测5-30ms15-60W0.5-1.5万工业PC西门子IPC轻量模型、逻辑控制1-10ms50-150W0.8-2万PLCAI模块西门子S7-1500AI极低延迟、安全关键1ms10-30W1-2万我的建议是如果是过程优化类场景模型推理频率不高分钟级用一台带GPU的工控机就够了。如果是视觉检测类场景Jetson Orin的性价比最高。如果是安全关键场景一定要用PLCAI模块的方案确保即使AI部分失效底层控制仍然安全。4.3 模型量化与加速边缘设备的算力有限模型量化是常用的加速手段。我通常用INT8量化把FP32的模型压缩到INT8推理速度可以提升2-4倍精度损失通常在1%以内。用ONNX Runtime做量化比较方便import onnxruntime as ort from onnxruntime.quantization import quantize_dynamic, QuantType # 动态量化 quantize_dynamic( model_inputmodel_fp32.onnx, model_outputmodel_int8.onnx, weight_typeQuantType.QInt8 ) # 加载量化后的模型 session ort.InferenceSession(model_int8.onnx) input_name session.get_inputs()[0].name output session.run(None, {input_name: input_data})但要注意量化后的模型精度需要重新验证。我遇到过一次量化后模型在某个特定工况下误差突然变大的情况后来发现是那个工况的数据在量化校准集中没有覆盖到。所以量化校准集一定要有代表性。5. 系统集成AI层怎么和传统控制系统对接5.1 通信架构设计AI层和传统控制系统的对接是整个项目中最容易出问题的环节。我推荐用OPC UA作为中间层原因是它既能向上提供标准化的数据接口又能向下兼容各种传统协议。典型的架构是这样的底层PLC/DCS通过OPC UA Server暴露数据AI边缘服务器作为OPC UA Client读取实时数据写入优化设定值原有的控制系统仍然负责底层控制回路AI层和传统控制层之间设置安全联锁AI输出超出范围时自动切回传统控制这里有个关键设计AI层的输出不是直接写到底层控制器而是写入一个中间寄存器。底层控制器读取这个寄存器作为设定值但同时会做范围检查。如果设定值超出安全范围控制器会忽略AI的输出使用默认值。5.2 安全联锁机制的设计安全联锁是AI工控系统的生命线。我的设计原则是第一层范围限制。AI输出的每个变量都有硬性上下限超出范围直接截断。第二层变化率限制。即使AI输出的值在范围内如果变化太快比如阀门开度从10%跳到90%也要限制变化速率。第三层异常检测。如果AI模型连续多次输出异常值或者推理时间超过阈值自动切换到传统控制策略。第四层人工接管。操作员随时可以一键切换到手动模式。这四层机制必须在系统设计阶段就确定好并且在调试阶段逐一验证。5.3 实际部署中的一个教训说一个我踩过的坑。在一个化工项目中AI模型输出的设定值通过OPC UA写入PLC。测试阶段一切正常但上线后发现偶尔会出现设定值跳变。排查了很久才发现问题OPC UA的写入是异步的有时候网络抖动导致写入失败但AI层没有收到失败通知以为写入成功了。下一次推理时AI基于错误的当前值计算出了一个新的设定值导致跳变。解决方案是每次写入后都要回读确认。如果回读的值和写入的值不一致就重试或者报警。这个逻辑看起来简单但在实际项目中很容易被忽略。async def write_setpoint(client, node_id, value, max_retries3): 带确认的设定值写入 node client.get_node(node_id) for attempt in range(max_retries): try: # 写入 await node.write_value(value) # 回读确认 await asyncio.sleep(0.1) # 等待写入生效 readback await node.read_value() if abs(readback - value) 0.001: return True else: print(f写入确认失败: 期望{value}, 实际{readback}) except Exception as e: print(f写入异常 (尝试 {attempt1}): {e}) await asyncio.sleep(0.5) # 多次重试失败触发报警 raise WriteFailedError(f设定值写入失败: {node_id})6. 模型运维上线只是开始6.1 模型性能监控AI模型上线后性能会随着时间推移而下降原因是工况漂移、设备老化、原料变化等。所以必须建立模型性能监控体系。我通常监控三类指标预测精度指标MAE、RMSE等按天或按周统计。如果精度下降超过阈值触发告警。数据分布指标输入数据的均值、方差、分布形态。如果输入分布发生显著变化用KL散度或PSI衡量说明工况漂移了。业务指标最终的控制效果比如能耗、产品质量、产量等。这是最直接的指标但反馈周期较长。6.2 模型更新策略模型更新有两种策略定期更新和触发式更新。定期更新就是每隔一段时间比如一个月用新数据重新训练模型。这种方式简单但可能错过突发的工况变化。触发式更新是当监控指标超过阈值时自动触发更新。这种方式响应快但需要更完善的自动化流程。我的做法是两者结合每月定期更新一次同时设置触发条件当精度下降超过10%时立即触发更新。更新后的模型不能直接上线必须经过影子模式验证新模型和旧模型并行运行只记录新模型的输出但不实际执行对比一段时间后再决定是否切换。6.3 一个容易被忽略的问题模型版本管理当你有多个模型在多个边缘设备上运行时版本管理就变得非常重要。我见过一个项目因为模型版本混乱导致A设备用的是上周的模型B设备用的是上个月的模型两个设备的控制策略不一致产生了严重的协调问题。我的建议是建立统一的模型仓库每次训练产出的模型都要有唯一的版本号、训练数据的时间范围、性能指标等信息。部署时明确指定版本号不要用latest这种模糊的标签。7. 团队配置与项目推进节奏7.1 需要什么样的人AI工控项目需要三类人工艺专家、自动化工程师、AI工程师。工艺专家负责定义问题和验证结果他们最清楚哪些变量重要、哪些工况关键。自动化工程师负责数据采集和系统集成他们熟悉PLC、DCS、OPC UA这些东西。AI工程师负责模型开发和训练。这三类人必须紧密协作不能各干各的。我的经验是项目初期一定要让AI工程师去现场待一段时间亲眼看看设备怎么运行的亲手操作一下控制系统。否则AI工程师很容易做出脱离实际的方案。7.2 项目推进的节奏建议我建议把项目分成四个阶段第一阶段可行性验证1-2个月。用历史数据做一个离线模型验证AI方法在这个场景下是否有效。这个阶段不需要动现场设备风险最低。第二阶段影子模式2-3个月。把模型部署到边缘设备上读取实时数据并输出预测但不实际控制。对比模型输出和实际操作评估模型的实际表现。第三阶段半闭环2-3个月。让AI模型控制一部分非关键变量关键变量仍然由人工或传统控制负责。逐步建立信心。第四阶段全闭环持续。在充分验证后逐步扩大AI控制的范围。但安全联锁机制始终保留。这个节奏看起来慢但实际上是快的。我见过太多项目因为急于求成在验证不充分的情况下就全量上线结果出了问题被叫停反而耽误了更多时间。8. 关于成本的一些实话最后说点实在的。AI工业控制系统的投入并不低我粗略算一下一个中等规模项目单条产线的成本构成项目费用范围说明边缘服务器2-5万含GPU的工控机数据采集改造5-15万传感器加装、网络改造软件平台10-30万时序数据库、AI平台模型开发20-50万人力成本为主实施与调试10-20万现场实施年度运维10-20万模型更新、系统维护总计首年投入在50-120万之间。所以这个项目必须要有明确的ROI测算。常见的收益来源包括能耗降低通常5-15%、产品质量提升不良率降低20-50%、产量提升3-10%、人工成本降低。如果算下来ROI周期超过两年我建议先做小范围的试点验证效果后再扩大。这个领域变化很快新的模型架构、新的边缘硬件、新的工业协议都在不断涌现。但底层的方法论是不变的理解工艺、保证安全、持续迭代。把这三点做好了技术选型反而不是最难的部分。