3、AI与PLC集成中的点表设计:AI信号(如视觉、传感器)如何映射到PLC点表、数据类型转换与地址分配策略
在AI+PLC融合项目中,点表(I/O List / Tag Table)是连接智能算法与工业控制逻辑的“数据契约”。传统PLC点表仅需处理开关量(DI/DO)和模拟量(AI/AO),而引入AI信号后,点表设计面临三个根本性挑战:非结构化数据(图像、点云)如何映射为结构化PLC变量?高维特征向量如何与PLC的原子数据类型兼容?实时推理结果如何与PLC扫描周期同步?本章将围绕AI信号到PLC点表的映射方法、数据类型转换规则、地址分配策略展开,并结合一个视觉引导分拣项目进行全流程拆解。
3.1 核心原理:从“数据流”到“控制流”的映射逻辑
AI信号映射到PLC点表,本质上是将非确定性、高带宽、异步的智能计算输出,转换为确定性、低带宽、同步的PLC控制变量。这一过程遵循“三层映射”原理:
- 物理层映射:传感器/相机通过以太网、Profinet、EtherCAT等总线将原始数据(图像帧、点云、力觉波形)传输至AI计算单元(工控机、边缘盒子或智能相机)。
- 特征层映射:AI模型输出结构化结果——目标类别(整数编码)、边界框坐标(浮点数组)、置信度(0~1浮点)、缺陷类型(枚举)、位姿数据(6自由度浮点数组)。这些结果需要被“降维”为PLC可理解的标量或小数组。
- 控制层映射:PLC将AI结果写入特定数据块(DB)地址,通过梯形图/SCL程序进行逻辑判断,最终驱动执行机构(气缸、伺服、机器人)。
关键设计原则是“最小必要信息”——PLC不需要理解图像本身,只需要接收“是否有缺陷”“缺陷坐标”“分类编号”等决策变量。例如,一个500万像素的工业相机图像约10MB,若直接传输给PLC既不现实也无必要;正确做法是AI单元完成推理后,仅输出缺陷标志(Bool)、缺陷X坐标(Real)、缺陷Y坐标(Real)、缺陷类型(Int)四个变量。
3.2 数据类型转换:AI高维数据到PLC原子类型的降维策略
PLC原生数据类型包括Bool、Byte、Int、DInt、Real、String、Array、Struct(UDT)。AI输出数据必须经过转换才能被PLC识别,常见转换规则如下:
| AI原始输出 | 典型值/范围 | PLC数据类型 | 转换方法 | 精度/风险 |
|---|---|---|---|---|
| 分类标签(字符串) | "OK", "NG", "Type_A" | Int / USInt | 枚举映射表:0=OK, 1=NG, 2=Type_A | 需维护枚举表,避免歧义 |
| 边界框坐标(像素) | x: 0~2592, y: 0~1944 | Real(浮点) | 像素坐标→物理坐标(标定系数) | 需考虑相机标定误差 |
| 置信度分数 | 0.0 ~ 1.0 | Real | 直接映射,或放大1000倍存Int | 浮点精度足够,Int需约定缩放 |
| 目标数量 | 0~50个 | USInt / Int | 直接赋值 | 注意上限溢出 |
| 位姿(欧拉角/四元数) | 6个浮点数 | Array[0..5] of Real | 按固定顺序排列:X,Y,Z,Rx,Ry,Rz | 需定义坐标系约定 |
| 图像压缩包 | JPEG约50KB | Array[0..49999] of Byte | 分包传输,需重组 | 占用DB空间大,慎用 |
| 缺陷面积/长度 | 0~10000 mm² | DInt / Real | 直接映射 | 注意单位统一 |
数据类型转换中需特别注意字节序(Endian)和对齐(Alignment)问题。西门子PLC(S7-1200/1500)默认大端模式,而多数AI工控机(x86架构)为小端模式。通过Profinet或TCP通信时,必须在AI侧完成字节序转换,否则Real数据会被解释为乱码。建议在AI侧封装一个“数据打包函数”,统一输出为网络字节序(大端)。
// AI侧C#示例:将检测结果打包为PLC可读的字节流
public byte[] PackDetectionResult(DetectionResult result)
{
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter bw = new BinaryWriter(ms))
{
// 写入头部:帧号(UInt32) + 时间戳(UInt64)
bw.Write(IPAddress.HostToNetworkOrder(result.FrameId));
bw.Write(IPAddress.HostToNetworkOrder(result.Timestamp));
// 写入结果:目标数量(Int32) + 每个目标的类型(Int32) + 坐标(Real)
bw.Write(IPAddress.HostToNetworkOrder(result.ObjectCount));
foreach (var obj in result.Objects)
{
bw.Write(IPAddress.HostToNetworkOrder((int)obj.Type));
bw.Write(IPAddress.HostToNetworkOrder(BitConverter.SingleToInt32Bits(obj.X)));
bw.Write(IPAddress.HostToNetworkOrder(BitConverter.SingleToInt32Bits(obj.Y)));
}
return ms.ToArray();
}
}
3.3 地址分配策略:结构化分区与动态管理
PLC地址分配直接影响程序可读性、扩展性和维护效率。推荐采用“功能分区 + 模块化DB”策略,将AI相关数据集中管理,避免散落在M区或I/Q区。
- AI输入映射区(DB100~DB199):存放AI计算单元写入的原始结果。每个功能块(视觉检测、力觉采集、振动分析)分配独立DB子区域。例如:
DB100.DBD0为视觉OK标志,DB100.DBD4为X坐标,DB100.DBD8为Y坐标。 - 数据处理暂存区(DB200~DB299):用于PLC对AI数据进行中间计算,如坐标变换、滤波、单位换算。该区域数据不直接驱动输出,仅作为逻辑运算的中间变量。
- 输出执行区(DB300~DB399):经过PLC逻辑判断后的最终控制指令,直接关联物理输出(Q点)或运动控制指令。例如:
DB300.DBX0.0为“启动分拣气缸”,DB300.DBD4为“伺服目标位置”。 - 通信握手区(DB500):包含请求(AI→PLC)、应答(PLC→AI)、数据有效标志、错误代码、看门狗计时器等。典型结构:
DB500.DBX0.0(AI数据就绪)、DB500.DBX0.1(PLC已读取)、DB500.DBW2(通信状态字)。
对于大型项目,建议使用UDT(用户自定义类型)定义AI数据结构,实现代码复用和统一管理。例如定义一个“视觉检测结果”UDT:
TYPE "UDT_VisionResult"
VERSION : 0.1
STRUCT
Valid : Bool; // 数据有效
Timestamp : ULInt; // 时间戳
ObjectCount : USInt; // 目标数量
Objects : ARRAY[0..9] OF STRUCT
TypeID : Int; // 类型编码
X : Real; // X坐标(mm)
Y : Real; // Y坐标(mm)
Score : Real; // 置信度
END_STRUCT;
END_STRUCT
END_TYPE
3.4 实战案例:视觉引导的PCB缺陷检测与分拣项目
项目背景:某电子制造工厂需要升级SMT产线,在回流焊后增加AOI(自动光学检测)工位。原方案采用传统机器视觉(规则算法),误判率高达8%,导致大量良品被误分拣。现引入深度学习检测模型(YOLOv8),需与西门子S7-1500 PLC集成,控制分拣气缸和传送带速度。
初始约束与目标:
- 产线节拍:2.5秒/板,PLC扫描周期10ms,通信周期50ms。
- 检测项:缺件、偏移、极性反、桥连、虚焊,共5类缺陷。
- 目标:误判率<1%,PLC响应时间<200ms(从AI输出到气缸动作)。
- 现有PLC程序已占用DB1~DB80,需规划新地址区域。
点表设计过程:
第一步:信号梳理。AI单元(工控机+GPU)通过GigE相机采集图像,推理后输出:缺陷标志(Bool)、缺陷类型(Int 0~4)、缺陷X/Y坐标(Real,单位mm)、置信度(Real)、板卡条码(String)。
第二步:数据类型转换。将缺陷类型映射为枚举:0=无缺陷,1=缺件,2=偏移,3=极性反,4=桥连,5=虚焊。坐标通过标定矩阵转换为物理坐标。置信度放大1000倍存为Int(避免浮点比较误差)。
第三步:地址分配。新建DB150作为AI输入区,DB250作为处理区,DB350作为输出区。关键地址如下:
| 地址 | 名称 | 数据类型 | 说明 |
|---|---|---|---|
| DB150.DBX0.0 | AI_Data_Valid | Bool | AI数据就绪脉冲 |
| DB150.DBW2 | Defect_Type | Int | 缺陷类型编码 |
| DB150.DBD4 | Defect_X | Real | 缺陷X坐标(mm) |
| DB150.DBD8 | Defect_Y | Real | 缺陷Y坐标(mm) |
| DB150.DBD12 | Confidence | Int | 置信度×1000 |
| DB250.DBX0.0 | Is_NG | Bool | PLC判断结果 |
| DB250.DBD4 | Reject_Delay | Real | 分拣延时计算值 |
| DB350.DBX0.0 | Reject_Cylinder | Bool | 分拣气缸输出 |
第四步:通信与握手逻辑。AI单元每完成一次检测,将结果写入DB150,然后置位AI_Data_Valid。PLC在OB1中检测到该位后,读取数据并复位该位,同时置位PLC_Ack(DB500.DBX0.1)。若PLC在100ms内未收到新数据,则触发看门狗报警,传送带停止。
第五步:PLC逻辑实现。在OB1中编写SCL代码:
// 检测AI数据有效性
IF "DB150".AI_Data_Valid THEN
// 读取缺陷类型和坐标
#tempType := "DB150".Defect_Type;
#tempX := "DB150".Defect_X;
#tempY := "DB150".Defect_Y;
// 判断是否NG(缺陷类型≠0 且 置信度>800)
IF #tempType <> 0 AND "DB150".Confidence > 800 THEN
"DB250".Is_NG := TRUE;
// 计算分拣延时(传送带速度恒定,根据X坐标计算)
"DB250".Reject_Delay := (#tempX / 500.0) * 1000.0; // 单位ms
ELSE
"DB250".Is_NG := FALSE;
END_IF;
// 复位AI有效位,发送应答
"DB150".AI_Data_Valid := FALSE;
"DB500".PLC_Ack := TRUE;
END_IF;
结果与复盘:系统上线后,误判率从8%降至0.6%,PLC响应时间稳定在120ms(含通信50ms+逻辑处理20ms+气缸动作50ms)。项目成功的关键在于:①地址分区清晰,AI数据与PLC内部逻辑完全隔离;②握手信号设计合理,避免了数据竞争;③置信度阈值可调,方便现场工艺人员优化。但初期也遇到一个问题:AI单元偶尔输出NaN(非数值)坐标,导致PLC浮点运算异常。解决方案是在AI侧增加数据合法性检查,若坐标超出相机视野范围则强制置0并置位错误标志。
3.5 常见误区与设计复盘
误区一:将所有AI输出都映射为Real类型。实际上,分类标签、计数、状态等离散信号用Int或Bool更节省空间且便于比较。过度使用Real会导致DB块膨胀,且浮点比较存在精度问题。
误区二:忽略数据有效性标志。AI推理偶尔会超时或失败,若PLC直接读取旧数据,可能造成误动作。必须设计“数据有效”位和“时间戳”,PLC侧判断数据新鲜度。
误区三:地址分配无规划,随意放置。有些项目将AI数据散落在M0.0、M10.0、DB5.DBD20等位置,后期维护极其困难。应坚持“一个功能一个DB区域”的原则。
误区四:通信周期与PLC扫描周期不匹配。若AI每50ms发送一次数据,而PLC扫描周期为10ms,则PLC可能多次读取同一帧数据。建议在通信协议中加入“帧号”或“数据计数”,PLC侧检测到新帧号才处理。
误区五:未考虑掉电保持。AI输出的校准参数、配方数据需要掉电保持,应存放在保持性DB区(如S7-1500的保持性DB),而实时检测结果无需保持。
总结而言,AI信号到PLC点表的映射不是简单的“变量搬运”,而是一个涉及语义抽象、类型降维、地址规划、通信同步、异常处理的系统工程。设计良好的点表能让AI算法与PLC控制各司其职、高效协同,为后续的联调、验收和运维打下坚实基础。