4. 控制器数据采集机制
在 Studio 5000 与 MES 集成的场景中,控制器侧的数据采集并不是“读一个标签”这么简单。生产计数、状态字、报警字、质量数据分布在不同的任务和程序里,采集的实时性、完整性和一致性,直接取决于这些数据由哪种任务产生、以什么周期刷新。理解周期任务、连续任务与事件任务对数据采集的影响,是设计可靠采集方案的前提。
三种任务类型如何影响数据刷新
ControlLogix 和 CompactLogix 控制器支持多种任务类型,与数据采集关系最密切的是周期任务、连续任务和事件任务。
连续任务(Continuous Task)是默认任务,只要控制器没有更高优先级任务需要执行,它就持续运行。它的扫描周期不固定,随程序量和通信负载波动。如果生产计数、状态字放在连续任务中,MES 读到的值可能在一次扫描中途被读取,出现“计数已加但状态字未更新”的中间态。因此连续任务适合放置对实时性要求不高、允许轻微抖动的数据,例如班次累计、配方号、设备铭牌信息。
周期任务(Periodic Task)按设定周期触发,例如 20 ms、50 ms、100 ms。它的执行时间可预测,适合放置需要稳定刷新节拍的数据。生产计数、节拍统计、质量判定结果通常放在周期任务中,使 MES 能以固定节奏采集到一致的数据快照。周期设置过短会挤占控制器资源,过长则丢失快速事件;一般根据设备最快动作节拍选择,例如包装机每 30 ms 完成一次动作,周期任务可设为 20 ms 或 10 ms。
事件任务(Event Task)由特定事件触发,例如某个标签上升沿、消费特定事件指令或模块中断。它响应最快,适合捕捉瞬时事件:一次报警触发、一个不合格品剔除、一次急停。事件任务不适合承载持续变化的生产计数,但非常适合把“发生了什么”写入报警字或质量标志,再由 MES 采集。
生产计数的采集方法
生产计数通常用 DINT 类型保存,放在周期任务中累加。采集时要注意三个问题:计数位宽、清零时机和溢出处理。DINT 最大约 21 亿,一般不会溢出,但若用 INT 保存,32767 就会翻转,必须提前规划。清零时机要与 MES 的班次或工单边界对齐,常见做法是控制器内保留“班次累计”和“工单累计”两个计数,MES 只读工单累计,班次累计由控制器在换班信号触发时清零。
采集生产计数时,建议同时读取一个“计数有效”标志位。该标志位在周期任务中与计数同步更新,MES 读到标志位为 1 时才认为计数可信。这样可避免在控制器刚上电、计数尚未初始化时读到旧值。
状态字与报警字的采集方法
状态字和报警字通常用 DINT 的位来表示。状态字描述设备当前运行模式,例如 bit0=自动、bit1=手动、bit2=运行、bit3=故障、bit4=待料。报警字描述当前存在的报警,例如 bit0=急停、bit1=安全门开、bit2=气压低、bit3=电机过载。MES 采集时不应逐位读取,而应一次性读取整个 DINT,再在 MES 侧按位解析,这样能保证同一时刻的位状态来自同一次扫描。
报警字还需要区分“当前报警”和“历史报警”。当前报警字由事件任务在报警触发时置位、在报警恢复时复位;历史报警则用另一个 DINT 或数组记录,只在触发时置位,由 MES 读取后通过写标签复位。这样 MES 不会因为轮询间隔错过短时报警。
质量数据的采集方法
质量数据包括测量值、判定结果和缺陷代码。测量值用 REAL 保存,例如扭矩 12.35 N·m、压力 0.62 MPa;判定结果用 BOOL 或 INT 保存,1 为合格、0 为不合格;缺陷代码用 INT 保存,例如 101=扭矩不足、102=扭矩过大、103=角度超差。质量数据应在周期任务中与生产计数同步更新,使 MES 读到的“第 N 件产品”与“第 N 件的质量结果”严格对应。
一个常见的采集结构是:周期任务中每完成一件产品,生产计数加 1,同时把该件的质量结果写入一个长度为 20 的数组,数组下标由计数对 20 取模得到。MES 以高于生产节拍的频率读取该数组和计数,就能按顺序取走每一件的质量数据。这种“环形缓冲 + 计数索引”的方式,比逐件握手更简单,也不容易丢数据。
任务类型与采集方式的对应关系
| 任务类型 | 典型数据 | 刷新特征 | 推荐采集方式 |
|---|---|---|---|
| 连续任务 | 班次累计、配方号、铭牌 | 周期不固定 | 低频轮询,允许抖动 |
| 周期任务 | 生产计数、质量结果、状态字 | 固定周期,可预测 | 固定节拍轮询或环形缓冲 |
| 事件任务 | 报警字、剔除标志、急停 | 事件触发,瞬时 | 置位保持 + MES 读取后复位 |
采集参数示例与判断依据
假设某装配工位节拍为 40 ms,控制器中设置一个 20 ms 周期任务,任务内完成计数累加、质量判定和状态字更新。MES 通过 OPC UA 以 10 ms 周期读取以下标签:
ProductionCount DINT 工单累计产量
QualityResult INT 1=合格 0=不合格
QualityValue REAL 扭矩测量值 N·m
StatusWord DINT bit2=运行 bit3=故障
AlarmWord DINT bit0=急停 bit1=安全门
QualityBuffer INT[20] 最近20件质量结果环形缓冲
判断采集是否正常,可以观察三个现象:一是 ProductionCount 单调递增,不跳变、不回退;二是 QualityBuffer 中数据与计数索引对应,没有出现同一件产品被读两次或漏读;三是 AlarmWord 在报警发生后能被 MES 读到,即使报警只持续了 30 ms。若出现计数跳变,应检查 MES 采集周期是否大于控制器周期任务周期;若报警丢失,应检查报警是否只用了瞬时位而没有做保持。
掌握任务类型与数据对象的对应关系后,采集方案的设计就有了明确依据:周期任务负责稳定刷新,事件任务负责捕捉瞬时事件,连续任务只承载低频信息;生产计数、状态字、报警字和质量数据分别按各自特征选择采集方式,才能保证 MES 拿到的数据既完整又可信。