飞行激光打标工站
1. 设备简介
飞行激光打标 (Fly Laser Marking / Marking-on-the-Fly) 是在输送带不停机的 前提下, 通过伺服协同 + 振镜动态补偿, 对运动中的工件打印二维码 / 序列号 / 生产日期 等信息。它是快消品、医药、电子元件、线缆、PVC 管等大规模流水线末端标记的刚需工艺。
本案例为某华东日化工厂洗衣液 PET 瓶身打码工位, 由 Darra 平台统一承接 输送带伺服 / 振镜扫描 / 激光触发 / 色标跟踪 / MES 追溯。核心挑战是瓶身不等距 到达 (灌装节拍抖动 ±8mm), 且彩色标签区域不允许打标, 必须用色标跟踪工艺对象 做动态偏移补偿。
主要工位流程:
- 上游灌装线 → 瓶身经过前置色标传感器 (识别标签边缘)
- Darra 虚轴跟随主编码器, 生成电子凸轮主凸轮曲线
- 振镜 X 轴通过
CamTable工艺对象 1:1 跟随输送带速度 - 瓶身到达打标窗口中心, 开激光闸门 + 振镜 XY 动态扫描
- 振镜飞回零位, 等下一瓶色标触发
- MES 记录 "时间戳 + 批号 + 流水号 + 色标偏差"
关键能力: 120+ 瓶/分钟, 字符 Y 向 ±0.2 mm, X 向动态补偿后 ±0.1 mm, 换型 < 3 分钟, 24×7 运转, 零耗材 (替代喷墨)。
2. 项目模块组成
| 层次 | 模块 | 职责 |
|---|---|---|
| 机械 | 输送带 | 恒速运行, 线速 30~80 m/min 可调 |
| 机械 | 振镜支架 | 安装 SCANLAB intelliSCAN 14 + Fθ 镜头 |
| 机械 | 激光防护罩 | Class 1 激光安全等级, 观察窗 OD4+ |
| 机械 | 除尘抽风 | 烟尘过滤, 保护振镜镜片 |
| 电气 | EtherCAT 主干 | 1ms 周期, 控制伺服 + IO + 阀岛 |
| 电气 | SL2-100 光纤 | Darra 主机 ↔ 振镜, 2 Mbps 原生协议 |
| 电气 | TCP/IP | Darra 主机 ↔ 锐科激光器, 功率/频率设定 |
| 软件 | 虚轴工艺对象 | ExternalEncoder 把主编码器映射为虚拟主轴 |
| 软件 | 电子凸轮 | CamTable 让振镜 X 轴跟随输送带 |
| 软件 | 色标跟踪 | FB_MarkTracking 锁存色标时刻编码器值, 计算偏差 |
| 软件 | 振镜驱动 | Darra 内置 SL2-100 协议栈, 500us 与振镜握手 |
| 软件 | 激光协议 | 内置锐科驱动, 免第三方网关 |
| 软件 | HMI | 生产计数、线速仪表、振镜队列深度、报警 |
3. 机械装配架构
装配要点:
- 前置色标传感器距打标窗口中心 60 mm (定值, 写入配方)
- 确认色标传感器用于双重校验, 避免误触发
- 振镜俯视 90° 安装, 避免斜射导致畸变
- Fθ 镜头焦距 160mm, 对应扫描幅面 110×110 mm
- 激光防护罩采用 OD4+ 观察窗, 符合 IEC 60825-1 Class 1
- 除尘抽风 2000 m³/h, 每 8 小时清理滤芯
4. 程序架构
4.1 OB/FB 调用树
4.2 状态机流转
任务调度:
- OB1 (1ms): 主状态机、色标跟踪、配方管理、MES 上传
- OB35 (500us): 振镜 SL2-100 握手, 与电子凸轮同步
- OB100: 虚轴 + 凸轮表初始化
5. 硬件 BOM
单位: 人民币, 2026 年 3 月长三角参考价。
| 序号 | 分类 | 品牌 / 型号 | 规格 | 数量 | 单价 (¥) | 小计 (¥) |
|---|---|---|---|---|---|---|
| 1 | 工控机 | 研祥 IPC-820 | i5-12400 / 16G / 512SSD | 1 | 9,800 | 9,800 |
| 2 | 触摸屏 | 威纶通 TK6071iP | 7" 电阻 | 1 | 1,600 | 1,600 |
| 3 | 激光器 | 锐科 RFL-P30M | 30W 光纤脉冲激光 | 1 | 18,500 | 18,500 |
| 4 | 振镜 | SCANLAB intelliSCAN 14 | XY 14mm SL2-100 协议 | 1 | 32,000 | 32,000 |
| 5 | Fθ 镜头 | CNI 160mm | 波长 1064nm | 1 | 4,800 | 4,800 |
| 6 | 输送带伺服 | 汇川 SV660N | 750W EtherCAT | 1 | 1,980 | 1,980 |
| 7 | 伺服电机 | 汇川 ISMH2-75C | 750W 带编码器 | 1 | 1,520 | 1,520 |
| 8 | 增量编码器 | 欧姆龙 E6B2-CWZ6C | 1000P/R 主输送轴 | 1 | 680 | 680 |
| 9 | 色标传感器 | 邦纳 R58AW 彩色 | 3 色可学习 | 2 | 1,850 | 3,700 |
| 10 | 到位光电 | 邦纳 Q45 | 漫反射 | 4 | 450 | 1,800 |
| 11 | 远程 IO | 汇川 AM600 CPU1608TP | 16DI + 16DO | 1 | 2,400 | 2,400 |
| 12 | 电磁阀岛 | 亚德客 4V-210 × 6 | EtherCAT | 1 | 1,580 | 1,580 |
| 13 | 安全光幕 | 嘉准 JH-LG-600 | 10 光轴 | 2 | 980 | 1,960 |
| 14 | 激光防护罩 | 自制钣金 + Class 1 窗口 | - | 1 | 8,500 | 8,500 |
| 15 | 除尘抽风 | 吉纳 ESF-2000 | 2000 m³/h | 1 | 6,800 | 6,800 |
| 16 | 工业交换机 | 研华 EKI-2525 | 5 口 EtherCAT 级联 | 1 | 980 | 980 |
| 17 | UPS | 山特 C2K | 2kVA | 1 | 2,100 | 2,100 |
| 18 | 机架 / 线缆 | 铝型材 + 线束 | - | 1 | 8,200 | 8,200 |
| 19 | 机械件 | 滚筒 + 夹具 + 定位靠 | - | 1 | 9,200 | 9,200 |
| 合计 | ¥117,900 |
关键: 本方案不需要外购振镜控制卡 (如 XL-Scan / RTC6), 由 Darra 工艺对象 直接驱动 SL2-100 协议振镜, 同时省掉电子凸轮 / 色标跟踪 / 虚轴三个软件授权。
6. IO 模块配置 (IDE 操作流程)
6.1 选择 IO 模块
- 工程 → IO 设备向导 → 选择 "EtherCAT 主站"
- 扫描从站, 依次识别:
- 汇川 AM600 (节点 1)
- 汇川 SV660N 输送带 (节点 2)
- 亚德客阀岛 (节点 3)
- 在 配置 → 外部编码器 里选择 "AM600 高速计数输入 HSC0"
- 在 配置 → 串口/光纤 里:
- COM1: 绑定振镜 SL2-100 (2 Mbps)
- TCP1: 绑定锐科激光器 (默认 192.168.1.50:5000)
- 在 配置 → 工艺对象 里创建:
VirtAxis(虚轴, 跟随 HSC0)ScanX/ScanY(振镜伪轴, 挂在 Scanner 驱动下)CamTab_FlyScan(电子凸轮表, 从cam/目录加载)
6.2 IO 地址分配表
| 模块 | 通道 | 地址 | 方向 | 类型 | 别名 |
|---|---|---|---|---|---|
| AM600 DI | Ch0 | I0.0 | DI | BOOL | SEN_Color1 (前置色标) |
| AM600 DI | Ch1 | I0.1 | DI | BOOL | SEN_Color2 (确认色标) |
| AM600 DI | Ch2 | I0.2 | DI | BOOL | SEN_BottlePresent |
| AM600 DI | Ch3 | I0.3 | DI | BOOL | SEN_Double (双瓶) |
| AM600 DI | Ch4 | I0.4 | DI | BOOL | SEN_LaserReady |
| AM600 DI | Ch5 | I0.5 | DI | BOOL | SEN_SafetyOK |
| AM600 HSC0 | A/B | - | HSC | DINT | MainEncoder |
| AM600 DO | Ch0 | Q0.0 | DO | BOOL | ACT_LaserGate |
| AM600 DO | Ch1 | Q0.1 | DO | BOOL | ACT_BottleReject |
| AM600 DO | Ch2 | Q0.2 | DO | BOOL | ACT_FanDust |
| AM600 DO | Ch3 | Q0.3 | DO | BOOL | ACT_TowerRed |
| AM600 AO | Ch0 | AQ0 | AO | REAL | LaserPower (%) |
| AM600 AO | Ch1 | AQ1 | AO | REAL | LaserFreq (kHz) |
| SV660N_Belt | PDO | - | 轴 | AXIS_REF | AxisBelt |
| Scanner_SL2 | - | - | 虚拟 | - | ScanX, ScanY |
| Laser_Raycus | TCP | - | 协议 | - | Laser |
6.3 IO 用途分工
| 组别 | 用途 | 参与设备 |
|---|---|---|
| 色标检测 | 标签边缘识别 + 双确认 | SEN_Color1/2 + HSC 锁存 |
| 瓶位确认 | 单瓶/双瓶识别 | SEN_BottlePresent, SEN_Double |
| 激光握手 | 就绪 / 闸门 / 功率 | SEN_LaserReady, ACT_LaserGate, LaserPower |
| 振镜扫描 | 图形下发 / 动态偏移 | SL2-100 光纤 |
| 次品剔除 | 色标失效 / 双瓶 / 激光异常 | ACT_BottleReject 气缸 |
| 辅助 | 除尘风机、报警灯 | ACT_FanDust, ACT_TowerRed |
6.4 数据绑定到机器人/振镜
本工站振镜视作 2 自由度虚拟机器人 (X, Y), 由 Darra 统一管理:
(* 配方 → 振镜路径点 *)
Scanner.Points[1] := Point2D(0.0, 0.0); (* 起点 *)
Scanner.Points[2] := Point2D(Job.ColorMark_X, 0); (* 色标补偿后起点 *)
Scanner.SendLayout(
LayoutFile := Recipe.LayoutTemplate, (* .plt 矢量 *)
Offset_X := Job.ColorMark_X, (* 动态偏移 *)
Power := Recipe.Power,
Freq := Recipe.Freq_kHz
);
绑定规则 (在 IDE 的 "扫描头配置" 里设置):
| 振镜通道 | Darra 轴 | 物理对应 |
|---|---|---|
| ScanX | CamSlave of VirtAxis | 振镜 X 轴, 跟随输送带 |
| ScanY | 独立轴 | 振镜 Y 轴, 写字符 |
输送带伺服 AxisBelt 作为动力轴, 虚轴 VirtAxis 作为主凸轮,
ScanX 作为从凸轮跟随 VirtAxis。
7. 核心数据结构 UDT + DB
// 打标任务 UDT
TYPE UDT_MarkJob :
STRUCT
JobID : STRING[32];
BottleType : STRING[16]; // 500ml / 1L / 2L
Content_QR : STRING[64]; // 二维码内容
Content_Text : STRING[32]; // 流水号 + 日期
TriggerTime : DT;
ColorMark_X : LREAL; // 色标识别 X 偏差 (mm)
ColorMark_OK : BOOL;
LaserPower : REAL; // 实际功率 (%)
Duration_ms : UDINT;
Success : BOOL;
END_STRUCT
END_TYPE
// 产线状态 UDT
TYPE UDT_LineStatus :
STRUCT
LineSpeed_mpm : REAL; // 线速 m/min
EncoderPulses : DINT; // 累积脉冲
MarkCount : UDINT;
RejectCount : UDINT;
LastBottleTS : DT;
END_STRUCT
END_TYPE
// 配方 UDT
TYPE UDT_Recipe :
STRUCT
RecipeName : STRING[32];
BottleType : STRING[16];
Power : REAL; // 激光功率 %
Freq_kHz : REAL; // 脉冲频率
CamFile : STRING[64]; // 电子凸轮曲线文件
LayoutTemplate : STRING[64]; // .plt 矢量模板
MarkWindow_Y_mm : REAL;
ColorMarkExpectX : REAL; // 色标期望位置 (标签左侧)
END_STRUCT
END_TYPE
VAR_GLOBAL
Job : UDT_MarkJob;
LineStatus : UDT_LineStatus;
CurRecipe : UDT_Recipe;
SerialNo : UDINT;
END_VAR
8. 核心程序代码
8.1 虚轴 + 电子凸轮初始化 (工艺对象)
PROGRAM PRG_Init
VAR
VirtAxis : AXIS_REF;
AxisBelt : AXIS_REF;
ScanX : AXIS_REF;
ScanY : AXIS_REF;
MainEnc : EXTERNAL_ENCODER;
CamTab : CAM_TABLE;
END_VAR
(* 1. 配置虚轴跟随主编码器 *)
MC_SetEncoder(
Axis := VirtAxis,
Source := MainEnc,
PulsesPerUnit := 1000.0,
UnitsPerRev := 200.0, (* 200mm/圈 滚筒周长 *)
Mode := ENCODER_FOLLOW
);
(* 2. 输送带伺服电子齿轮跟随虚轴 (1:1) *)
MC_GearIn(
MasterAxis := VirtAxis,
SlaveAxis := AxisBelt,
RatioNumerator := 1,
RatioDenominator := 1
);
(* 3. 加载电子凸轮曲线, 振镜 X 轴跟随虚轴 *)
MC_CamTableSelect(
MasterAxis := VirtAxis,
SlaveAxis := ScanX,
CamTable := 'cam/mark_flyscan.cam',
MasterAbsolute := FALSE,
SlaveAbsolute := FALSE
);
MC_CamIn(
MasterAxis := VirtAxis,
SlaveAxis := ScanX,
StartMode := MC_CAM_STARTMODE_ABSOLUTE
);
8.2 色标跟踪 + 打标主状态机
PROGRAM PRG_MarkingMain
VAR
State : INT := 0;
MarkTrack : FB_MarkTracking; (* Darra 工艺对象 *)
LastEncLatch : DINT;
Scanner : FB_ScannerSL2;
Laser : FB_LaserRaycus;
TON_timeout : TON;
END_VAR
(* 色标跟踪工艺对象持续运行, 硬件锁存编码器 *)
MarkTrack(
MarkSignal := SEN_Color1,
EncoderRef := MainEnc,
LatchEnc => LastEncLatch,
Offset_mm => Job.ColorMark_X,
Valid => Job.ColorMark_OK,
Tolerance_mm := 0.5
);
CASE State OF
0: (* 等色标触发 *)
IF MarkTrack.Valid THEN
Job.JobID := GenJobID();
Job.BottleType := CurRecipe.BottleType;
Job.TriggerTime := DT#NOW;
SerialNo := SerialNo + 1;
Job.Content_Text := CONCAT(DateString(), '-', DINT_TO_STRING(SerialNo));
Job.Content_QR := QRContent(Job);
State := 1;
END_IF
1: (* 等虚轴到达打标窗口中心 (距色标 60mm) *)
IF VirtAxis.ActPos - LINT_TO_LREAL(LastEncLatch) * 0.2 >= 60.0 THEN
(* 发送打标图形到振镜 + 开激光闸门 *)
Scanner.Enable := TRUE;
Scanner.LayoutFile := CurRecipe.LayoutTemplate;
Scanner.Offset_X_mm := Job.ColorMark_X;
Scanner.LaserPower := CurRecipe.Power;
ACT_LaserGate := TRUE;
LaserPower := CurRecipe.Power;
LaserFreq := CurRecipe.Freq_kHz;
State := 2;
END_IF
2: (* 等振镜完成打标 *)
TON_timeout(IN := TRUE, PT := T#500ms);
IF Scanner.Done THEN
ACT_LaserGate := FALSE;
Scanner.Enable := FALSE;
TON_timeout(IN := FALSE);
Job.Duration_ms := Scanner.ElapsedMs;
Job.LaserPower := LaserPower;
Job.Success := TRUE;
MES.UploadMark(Job);
LineStatus.MarkCount := LineStatus.MarkCount + 1;
State := 0;
ELSIF TON_timeout.Q THEN
Alarm(2001, 'Scanner 超时');
Job.Success := FALSE;
ACT_BottleReject := TRUE; (* 推走次品 *)
LineStatus.RejectCount := LineStatus.RejectCount + 1;
TON_timeout(IN := FALSE);
State := 0;
END_IF
END_CASE
END_PROGRAM
8.3 振镜 SL2-100 驱动
FUNCTION_BLOCK FB_ScannerSL2
VAR_INPUT
Enable : BOOL;
LayoutFile : STRING;
Offset_X_mm : LREAL;
LaserPower : REAL;
END_VAR
VAR_OUTPUT
Busy, Done, Error : BOOL;
ElapsedMs : UDINT;
QueueDepth : UINT;
END_VAR
(* 内部:
- SL2-100 光纤协议 2 Mbps
- 发送打标命令到振镜, 振镜内部缓冲执行
- Darra 在 500us 周期与振镜握手, 跟主凸轮同步
- .plt 矢量被解析为 Goto/MarkLine 原语发送 *)
END_FUNCTION_BLOCK
8.4 激光器锐科协议 (TCP/IP)
FUNCTION_BLOCK FB_LaserRaycus
VAR_INPUT
Enable : BOOL;
IP : STRING;
Port : UINT;
Power_Pct : REAL;
Freq_kHz : REAL;
END_VAR
VAR_OUTPUT
Ready : BOOL;
Temp_C : REAL;
Alarm : UINT;
END_VAR
(* 锐科 RFL 系列原生 TCP 协议:
- 读温度/状态: 0x01 命令
- 设功率/频率: 0x02 命令
- 启闸门: 0x03 命令 (硬触发, 这里只做使能)
*)
END_FUNCTION_BLOCK
9. 运行与调试
9.1 上电启动流程
OB100初始化: 使能伺服 → 启动输送带匀速 → 加载凸轮表 →MC_CamIn- 激光器 TCP 握手, 等
SEN_LaserReady - 振镜 SL2-100 自检 (发送
Ping原语) - HMI 选择配方, 按 "启动", 进入
State 0 WaitMark
9.2 调试要点
| 环节 | 调试方法 |
|---|---|
| 凸轮曲线 | IDE 的 CAM Editor 可视化查看曲线, 检查加速度峰值 < 振镜额定 |
| 色标锁存 | 用 HSC 的硬件锁存功能, 示波器观察 SEN_Color1 到锁存延迟 < 100us |
| 振镜跟随误差 | HMI 画面显示 ScanX.ActPos - CamTable(VirtAxis.ActPos), 应 < 0.05mm |
| 激光功率 | 先关激光, 空走轨迹, 用热敏纸标记; 调功率逐步加到 Recipe 值 |
| 节拍 | 累计 MarkCount, 除以时长, 验证 120+ 瓶/分 |
| 色标误触发 | SEN_Color1 脉宽过短 (< 0.5ms) → 调传感器灵敏度 |
| MES 断网 | 本地 SQLite 缓存队列, 恢复后自动补传, 日志可见 MES.Queue.Size |
9.3 HMI 画面
HMI 首页采用双列布局 (HslCommunication Demo 规范):
- 左列: 生产实时数据 (线速 / 班产计数 / 报警条)
- 右列: 工艺数据 (激光功率 / 频率 / 振镜队列深度 / 色标偏差直方图)
- 底部: 最近 10 次打标耗时折线图
所有按钮静态声明 (Designer.cs), 动态生成禁止。
9.4 日志位置
| 日志 | 路径 |
|---|---|
| PLC 日志 | Darra IDE 日志窗口, 模块 Marking_Main / Scanner / Laser |
| 振镜握手记录 | D:/DarraPLC/logs/scanner_*.log |
| MES 上传队列 | D:/DarraPLC/queue/mes_mark.db (SQLite) |
10. Darra 功能对照表
| 需求 | Darra 对应功能 | 说明 |
|---|---|---|
| 虚轴 | ExternalEncoder + MC_SetEncoder | 内置 |
| 电子凸轮 | CamTable + MC_CamTableSelect + MC_CamIn | 内置, 免授权 |
| 色标跟踪 | FB_MarkTracking 工艺对象 | 硬件锁存 + 软件偏差计算 |
| 飞剪 (本站不需要, 共用引擎) | FB_FlyingShear | 内置 |
| 振镜 SL2-100 协议 | Darra 内置 Scanner 驱动 | 免 RTC6 / XL-Scan 硬件 |
| 锐科激光器协议 | 内置 TCP 驱动 | 免第三方网关 |
| HMI | Darra HMI Designer | 静态按钮 |
| MES 对接 | OPC UA / REST + SQLite 离线队列 | 内置 |
| 配方管理 | JSON + 在线切换 (< 8s) | 内置 |
| 远程运维 | DarraSync 加密隧道 | 内置 |
11. 项目总结
11.1 交付成果
- 节拍: 132 瓶/分钟 (目标 120, 超标 10%)
- 打标精度: 字符 Y 向 ±0.18 mm, X 向动态补偿后 ±0.09 mm
- 线速范围: 30~80 m/min 稳定运行
- 换型时间: 6.2 秒 (目标 3 分钟)
- 耗材: 0 (替代喷墨年省 ¥180,000 油墨)
11.2 关键技术点
- 电子凸轮 + 色标跟踪双融合: 凸轮解决"跟随速度", 跟踪解决"动态偏移", 缺一不可
- 虚轴架构: 主编码器 → 虚轴 → 凸轮表 → 从轴 (振镜 X), 链路清晰, 易扩展
- 振镜 SL2-100 原生协议: 免外购 ¥15,000 RTC6 控制卡, 500us 握手与凸轮同步
- 锐科激光器原生驱动: TCP 协议直连, 免第三方网关
- HSC 硬件锁存: 色标到达 → HSC 计数器瞬间锁存编码器值, 延迟 < 100us
11.3 后续扩展方向
- 药品追溯打标: GS1 DataMatrix 二维码, 医药行业
- 打标质量 OCV: 接入 AOI 工位做光学字符验证 (OCV)
- 集团 DarraCloud: 30 条激光线各自把功率/温度/产量数据上云, 供上层系统集中监视 (跨线汇总分析由上层 MES/BI 负责)
Darra 平台的电子凸轮 + 色标跟踪双工艺对象组合, 是飞行打标场景的决定性 能力。配合 Python 脚本宿主可接入 AI 字符识别, 真正实现 "一台控制器包打天下"。