跳到主要内容

飞行激光打标工站

1. 设备简介

飞行激光打标 (Fly Laser Marking / Marking-on-the-Fly) 是在输送带不停机的 前提下, 通过伺服协同 + 振镜动态补偿, 对运动中的工件打印二维码 / 序列号 / 生产日期 等信息。它是快消品、医药、电子元件、线缆、PVC 管等大规模流水线末端标记的刚需工艺。

本案例为某华东日化工厂洗衣液 PET 瓶身打码工位, 由 Darra 平台统一承接 输送带伺服 / 振镜扫描 / 激光触发 / 色标跟踪 / MES 追溯。核心挑战是瓶身不等距 到达 (灌装节拍抖动 ±8mm), 且彩色标签区域不允许打标, 必须用色标跟踪工艺对象 做动态偏移补偿。

主要工位流程:

  1. 上游灌装线 → 瓶身经过前置色标传感器 (识别标签边缘)
  2. Darra 虚轴跟随主编码器, 生成电子凸轮主凸轮曲线
  3. 振镜 X 轴通过 CamTable 工艺对象 1:1 跟随输送带速度
  4. 瓶身到达打标窗口中心, 开激光闸门 + 振镜 XY 动态扫描
  5. 振镜飞回零位, 等下一瓶色标触发
  6. 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/IPDarra 主机 ↔ 锐科激光器, 功率/频率设定
软件虚轴工艺对象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-820i5-12400 / 16G / 512SSD19,8009,800
2触摸屏威纶通 TK6071iP7" 电阻11,6001,600
3激光器锐科 RFL-P30M30W 光纤脉冲激光118,50018,500
4振镜SCANLAB intelliSCAN 14XY 14mm SL2-100 协议132,00032,000
5Fθ 镜头CNI 160mm波长 1064nm14,8004,800
6输送带伺服汇川 SV660N750W EtherCAT11,9801,980
7伺服电机汇川 ISMH2-75C750W 带编码器11,5201,520
8增量编码器欧姆龙 E6B2-CWZ6C1000P/R 主输送轴1680680
9色标传感器邦纳 R58AW 彩色3 色可学习21,8503,700
10到位光电邦纳 Q45漫反射44501,800
11远程 IO汇川 AM600 CPU1608TP16DI + 16DO12,4002,400
12电磁阀岛亚德客 4V-210 × 6EtherCAT11,5801,580
13安全光幕嘉准 JH-LG-60010 光轴29801,960
14激光防护罩自制钣金 + Class 1 窗口-18,5008,500
15除尘抽风吉纳 ESF-20002000 m³/h16,8006,800
16工业交换机研华 EKI-25255 口 EtherCAT 级联1980980
17UPS山特 C2K2kVA12,1002,100
18机架 / 线缆铝型材 + 线束-18,2008,200
19机械件滚筒 + 夹具 + 定位靠-19,2009,200
合计¥117,900

关键: 本方案不需要外购振镜控制卡 (如 XL-Scan / RTC6), 由 Darra 工艺对象 直接驱动 SL2-100 协议振镜, 同时省掉电子凸轮 / 色标跟踪 / 虚轴三个软件授权。


6. IO 模块配置 (IDE 操作流程)

6.1 选择 IO 模块

  1. 工程 → IO 设备向导 → 选择 "EtherCAT 主站"
  2. 扫描从站, 依次识别:
    • 汇川 AM600 (节点 1)
    • 汇川 SV660N 输送带 (节点 2)
    • 亚德客阀岛 (节点 3)
  3. 配置 → 外部编码器 里选择 "AM600 高速计数输入 HSC0"
  4. 配置 → 串口/光纤 里:
    • COM1: 绑定振镜 SL2-100 (2 Mbps)
    • TCP1: 绑定锐科激光器 (默认 192.168.1.50:5000)
  5. 配置 → 工艺对象 里创建:
    • VirtAxis (虚轴, 跟随 HSC0)
    • ScanX / ScanY (振镜伪轴, 挂在 Scanner 驱动下)
    • CamTab_FlyScan (电子凸轮表, 从 cam/ 目录加载)

6.2 IO 地址分配表

模块通道地址方向类型别名
AM600 DICh0I0.0DIBOOLSEN_Color1 (前置色标)
AM600 DICh1I0.1DIBOOLSEN_Color2 (确认色标)
AM600 DICh2I0.2DIBOOLSEN_BottlePresent
AM600 DICh3I0.3DIBOOLSEN_Double (双瓶)
AM600 DICh4I0.4DIBOOLSEN_LaserReady
AM600 DICh5I0.5DIBOOLSEN_SafetyOK
AM600 HSC0A/B-HSCDINTMainEncoder
AM600 DOCh0Q0.0DOBOOLACT_LaserGate
AM600 DOCh1Q0.1DOBOOLACT_BottleReject
AM600 DOCh2Q0.2DOBOOLACT_FanDust
AM600 DOCh3Q0.3DOBOOLACT_TowerRed
AM600 AOCh0AQ0AOREALLaserPower (%)
AM600 AOCh1AQ1AOREALLaserFreq (kHz)
SV660N_BeltPDO-AXIS_REFAxisBelt
Scanner_SL2--虚拟-ScanX, ScanY
Laser_RaycusTCP-协议-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 轴物理对应
ScanXCamSlave 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 上电启动流程

  1. OB100 初始化: 使能伺服 → 启动输送带匀速 → 加载凸轮表 → MC_CamIn
  2. 激光器 TCP 握手, 等 SEN_LaserReady
  3. 振镜 SL2-100 自检 (发送 Ping 原语)
  4. 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 驱动免第三方网关
HMIDarra 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 关键技术点

  1. 电子凸轮 + 色标跟踪双融合: 凸轮解决"跟随速度", 跟踪解决"动态偏移", 缺一不可
  2. 虚轴架构: 主编码器 → 虚轴 → 凸轮表 → 从轴 (振镜 X), 链路清晰, 易扩展
  3. 振镜 SL2-100 原生协议: 免外购 ¥15,000 RTC6 控制卡, 500us 握手与凸轮同步
  4. 锐科激光器原生驱动: TCP 协议直连, 免第三方网关
  5. HSC 硬件锁存: 色标到达 → HSC 计数器瞬间锁存编码器值, 延迟 < 100us

11.3 后续扩展方向

  • 药品追溯打标: GS1 DataMatrix 二维码, 医药行业
  • 打标质量 OCV: 接入 AOI 工位做光学字符验证 (OCV)
  • 集团 DarraCloud: 30 条激光线各自把功率/温度/产量数据上云, 供上层系统集中监视 (跨线汇总分析由上层 MES/BI 负责)

Darra 平台的电子凸轮 + 色标跟踪双工艺对象组合, 是飞行打标场景的决定性 能力。配合 Python 脚本宿主可接入 AI 字符识别, 真正实现 "一台控制器包打天下"