3、AI与PLC集成中的点表设计:AI信号(如视觉、传感器)如何映射到PLC点表、数据类型转换与地址分配策略

在AI+PLC融合项目中,点表(I/O List / Tag Table)是连接智能算法与工业控制逻辑的“数据契约”。传统PLC点表仅需处理开关量(DI/DO)和模拟量(AI/AO),而引入AI信号后,点表设计面临三个根本性挑战:非结构化数据(图像、点云)如何映射为结构化PLC变量?高维特征向量如何与PLC的原子数据类型兼容?实时推理结果如何与PLC扫描周期同步?本章将围绕AI信号到PLC点表的映射方法、数据类型转换规则、地址分配策略展开,并结合一个视觉引导分拣项目进行全流程拆解。

AI信号 → PLC点表映射链路 AI信号源 视觉检测 3D激光点云 力觉/温度阵列 振动/声学特征 特征提取与转换 ROI坐标/置信度 分类标签(INT) 位姿(REAL数组) 质量分数(REAL) 特征向量(REAL[]) PLC数据类型映射 Bool → 状态位 Int → 分类/计数 Real → 坐标/分数 Byte[] → 原始图像 UDT → 复合结构 PLC地址分配 DB块结构化 I/Q映射 M区暂存 通信映射区 掉电保持区 核心设计策略 ① 地址分区:AI输入区(DB100-199) / 处理暂存区(DB200-299) / 输出执行区(DB300-399) ② 数据类型:图像→Byte数组(压缩后) / 坐标→Real / 分类→Int / 状态→Bool ③ 同步机制:握手信号(请求/应答) + 数据有效性标志 + 时间戳 ④ 异常处理:超时标志 / 数据范围检查 / 看门狗复位 / 安全默认值 ⑤ 扩展预留:每类信号预留20%地址余量,支持后续算法迭代

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)四个变量。

映射粒度控制:建议将AI输出分为三个等级——状态级(Bool:OK/NG、运行/停止)、参数级(Real/Int:坐标、速度、温度、计数)、配置级(字符串/数组:配方参数、模型版本)。状态级信号直接参与PLC逻辑联锁,参数级信号用于运动控制或PID调节,配置级信号仅在初始化或换型时读写。

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区。

  1. AI输入映射区(DB100~DB199):存放AI计算单元写入的原始结果。每个功能块(视觉检测、力觉采集、振动分析)分配独立DB子区域。例如:DB100.DBD0为视觉OK标志,DB100.DBD4为X坐标,DB100.DBD8为Y坐标。
  2. 数据处理暂存区(DB200~DB299):用于PLC对AI数据进行中间计算,如坐标变换、滤波、单位换算。该区域数据不直接驱动输出,仅作为逻辑运算的中间变量。
  3. 输出执行区(DB300~DB399):经过PLC逻辑判断后的最终控制指令,直接关联物理输出(Q点)或运动控制指令。例如:DB300.DBX0.0为“启动分拣气缸”,DB300.DBD4为“伺服目标位置”。
  4. 通信握手区(DB500):包含请求(AI→PLC)、应答(PLC→AI)、数据有效标志、错误代码、看门狗计时器等。典型结构:DB500.DBX0.0(AI数据就绪)、DB500.DBX0.1(PLC已读取)、DB500.DBW2(通信状态字)。
地址分配禁忌:不要将AI数据直接映射到I/Q物理地址。I/Q区是面向传感器/执行器的实时信号,扫描周期固定且无数据保持功能。AI数据应通过通信方式写入DB块,再由PLC程序在OB1或循环中断中读取。若强行映射到I区,会导致通信延迟与扫描周期耦合,造成数据不一致。

对于大型项目,建议使用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并置位错误标志。

经验总结:AI+PLC点表设计应遵循“先定义语义,再分配地址”的顺序。建议在项目启动时,由AI工程师和PLC工程师共同签署一份《AI-PLC接口规格书》,明确每个信号的含义、单位、范围、更新频率、无效值处理方式。这份文档比任何代码都重要,它是两个系统之间的“法律合同”。

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控制各司其职、高效协同,为后续的联调、验收和运维打下坚实基础。