在工业自动化领域,贴片机作为SMT产线的核心设备,其控制系统的开发一直存在技术门槛高、开发周期长的痛点。本项目采用Halcon机器视觉库与C#语言协同开发的方案,结合雷赛四轴运动控制卡,实现了一套高性价比的贴片机控制系统。这套方案最大的优势在于:
系统架构分为三个核心层次:
提示:实际项目中建议采用工控机+运动控制卡的硬件方案,CPU至少选择i5-8代以上,确保能同时处理视觉运算和运动控制任务。
雷赛DMC-4080控制卡是本项目的核心硬件,其特点包括:
硬件连接示意图:
code复制[工控机] --PCIe--> [雷赛控制卡] --差分信号--> [伺服驱动器] --电机线--> [伺服电机]
|
|--IO信号--> [光电传感器/电磁阀]
关键参数配置代码示例:
csharp复制// 轴参数初始化
public void InitAxis(int axis)
{
// 单位转换:将工程单位(mm/s²)转换为脉冲单位(pulse/s²)
double acc_pulse = _config.Acceleration * _pulsePerMM;
double dec_pulse = _config.Deceleration * _pulsePerMM;
double vel_pulse = _config.Velocity * _pulsePerMM;
// 设置运动参数
LTSMC.smc_set_profile(axis, acc_pulse, dec_pulse, vel_pulse, 0.1);
// 设置软限位(单位:mm)
LTSMC.smc_set_position_limit(axis,
_config.NegativeLimit * _pulsePerMM,
_config.PositiveLimit * _pulsePerMM);
}
S曲线参数优化:
雷赛卡的S曲线时间参数(0-1.0)实际影响的是加速度的变化率。经过实测:
0.5:基本等同于梯形加减速
多轴插补运动:
实现XYθZ四轴协同运动的代码结构:
csharp复制public void MoveTo(double x, double y, double z, double theta)
{
// 1. 检查各轴限位
if(!CheckLimits(x, y, z, theta)) return;
// 2. 启动插补运动
int ret = LTSMC.smc_pmove_unit(0, x, 0); // X轴
ret |= LTSMC.smc_pmove_unit(1, y, 0); // Y轴
ret |= LTSMC.smc_pmove_unit(2, z, 0); // Z轴
ret |= LTSMC.smc_pmove_unit(3, theta, 0);// θ轴
// 3. 等待运动完成
while(!AllAxesReady())
{
Thread.Sleep(1);
}
}
注意:实际项目中建议使用运动完成信号(INP)而非软件轮询,可提高响应速度。
本项目采用混合编程方案:
典型视觉处理流程:
csharp复制public Point2d GetComponentPosition()
{
using (HDevEngine engine = new HDevEngine())
{
// 加载HDev脚本
engine.SetProcedurePath("./vision_procedures");
using (HDevProcedure proc = new HDevProcedure("find_component"))
{
// 设置输入参数
HDevProcedureCall call = proc.CreateCall();
call.SetInputIconicParamObject("Image", _currentImage);
// 执行并获取结果
call.Execute();
double row = call.GetOutputCtrlParamTuple("Row").D;
double col = call.GetOutputCtrlParamTuple("Column").D;
return PixelToWorld(row, col);
}
}
}
halcon复制edges_sub_pix(Image, Edges, 'canny', 1.5, 20, 40)
fit_line_contour_xld(Edges, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
csharp复制// 根据环境温度调整像素当量
double adjustedPixelRatio = _basePixelRatio * (1 + 0.000023*(_currentTemp - 25));
推荐的生产者-消费者模型实现:
csharp复制// 图像采集线程
void CameraThread()
{
while(_running)
{
Mat image = _camera.Capture();
_imageQueue.Enqueue(image); // 生产者
_imageReadyEvent.Set();
}
}
// 视觉处理线程
void VisionThread()
{
while(_running)
{
_imageReadyEvent.WaitOne();
if(_imageQueue.TryDequeue(out Mat image))
{
ProcessImage(image);
}
}
}
线程优先级设置建议:
csharp复制// 预加载运动指令(雷赛卡支持指令缓冲)
LTSMC.smc_buffer_mode(1); // 开启缓冲模式
for(int i=0; i<100; i++)
{
LTSMC.smc_pmove_unit(0, positions[i], 0);
}
LTSMC.smc_buffer_start(); // 开始执行缓冲指令
halcon复制* 在模板创建时增加鲁棒性参数
create_shape_model (ImageReduced, 'auto', rad(-5), rad(10), 'auto',
'no_pregeneration', 'use_polarity',
['auto','ignore_global_polarity'], [], [], ModelID)
csharp复制try
{
// 运动控制代码
int ret = LTSMC.smc_pmove_unit(axis, pos, 0);
if(ret != 0)
{
throw new MotionException($"Axis {axis} move failed, error code: {ret}");
}
}
catch(MotionException ex)
{
_logger.Error(ex.Message);
EmergencyStop(); // 触发急停
throw;
}
csharp复制// 程序启动时预加载Halcon算子
static Program()
{
HOperatorSet.SetSystem('use_window_thread', 'true');
HOperatorSet.SetSystem('do_low_error', 'false');
}
这套系统经过多个实际项目验证,在LED贴片机应用中达到CPK≥1.33的工艺要求。对于不同应用场景,主要调整参数包括:
开发过程中特别要注意的是,Halcon的某些算子(如create_shape_model)在不同版本间存在兼容性问题,建议在项目初期就确定Halcon版本并全程保持一致。