C#联合Halcon运动控制源代码,视觉框架源码, 连线式,halcon程序,运动控制可以自己随意添加。 代码开源可二次开发。

最近在捣鼓C#和Halcon的联合作业方案时,整了个挺有意思的视觉框架。这个架构最大的特点是模块之间像乐高积木似的随便拼装——视觉检测和运动控制完全解耦,你甚至能在泡面的时候顺手写个新的运动控制模块插进去。

先看视觉处理的核心部分。Halcon导出的C#代码虽然能用,但直接调用这些函数可能会有点笨重。咱们把它封装成可热插拔的组件:

public class VisionEngine
{
    private HDevEngine _engine;
    
    // 加载Halcon脚本就像扔文件进去那么简单
    public void LoadProcedure(string hdevPath)
    {
        _engine?.Dispose();
        _engine = new HDevEngine();
        _engine.ExecuteProgram(hdevPath);
    }

    // 带异常处理的视觉任务执行
    public HTuple Run(string operationName, params HTuple[] inputs)
    {
        try {
            using (HDevProcedure proc = _engine.GetProcedure(operationName)) {
                proc.Execute(inputs);
                return proc.GetOutputParams();
            }
        }
        catch (HDevEngineException ex) {
            // 这里可以接入自定义的报警系统
            throw new VisionException("视觉算子炸了", ex);
        }
    }
}

运动控制部分更自由,咱们做个抽象接口让使用者随意发挥。比如这个给Modbus准备的模板:

public interface IMotionController
{
    void Connect(string configPath);
    void MoveTo(double[] coordinates);
    event Action<string> StatusChanged;
}

// 举个直线电机的实现例子
public class LinearMotorController : IMotionController
{
    public void MoveTo(double[] pos)
    {
        // 这里实际是调用运动控制卡的SDK
        Console.WriteLine($"假装在移动:X{pos[0]} Y{pos[1]}");
        Thread.Sleep(500); // 模拟运动耗时
    }
    
    // 事件触发可以用在状态监控界面
    public event Action<string> StatusChanged;
}

核心调度逻辑用事件驱动把两个模块串起来。当视觉检测到位置偏移时,自动触发运动补偿:

public class SystemScheduler
{
    private VisionEngine _vision;
    private IMotionController _motion;

    public void BindModules(VisionEngine ve, IMotionController mc)
    {
        _vision = ve;
        _motion = mc;
        _vision.ResultProcessed += OnVisionResult;
    }

    private void OnVisionResult(object sender, VisionResult result)
    {
        if (result.OffsetX > 0.5) {
            // 根据视觉结果生成运动指令
            double[] targetPos = CalculateCompensation(result);
            _motion.MoveTo(targetPos);
        }
    }
}

二次开发时想加新功能?比如给机械臂添加旋转轴控制,只需要继承运动控制接口:

public class RotaryStageController : IMotionController
{
    public void MoveTo(double[] angles)
    {
        // 控制旋转平台的实现
        Console.WriteLine($"旋转到{angles[0]}度");
    }
}

这个框架的GitHub仓库里已经扔了二十几个常用功能的实现案例,从简单的串口通信到EtherCAT总线控制都有现成模板。特别适合需要快速验证方案的场景——昨天刚有个做半导体检测的哥们儿用这个框架,三小时就搭出了晶圆定位系统。

(项目地址扔在评论区,需要自取。注意别在产线电脑上直接跑demo,运动控制部分记得加软限位保护!)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐