系列:C# 视觉量检测工程师成长路线图
本篇定位:打通"视觉感知 → 决策判断 → 运动执行"的完整闭环
目标读者:已掌握视觉检测、需要与运动控制系统对接的 C# 开发者
前置知识:视觉检测基础、基础运动控制概念、TCP/Modbus 通信
阅读时间:约 18 分钟
一、视觉与运动控制的集成架构
工业自动化系统的核心是三个环节的闭环:
感知(视觉) → 决策(算法/PLC) → 执行(运动控制) ↑_________________________________________| 反馈闭环典型的运动控制系统架构:上位机(C#)通过以太网连接运动控制卡,控制卡通过 EtherCAT/CANOpen 驱动伺服电机,编码器提供位置反馈。
1.1 系统集成模式
| 模式 | 架构 | 特点 | 适用场景 |
|---|---|---|---|
| 视觉主导 | C# 上位机直接控制运动卡 | 灵活性高,开发快 | 中小项目、快速原型 |
| PLC 主导 | PLC 做主站,视觉做从站 | 稳定性高,标准化 | 大型产线、汽车行业 |
| 混合模式 | C# + PLC 分工协作 | 兼顾灵活与稳定 | 大多数工业项目 |
推荐:C# 上位机负责视觉算法和 UI,PLC 负责安全联锁和 I/O 控制,两者通过通信协议交互。
二、运动控制基础
2.1 核心概念
| 概念 | 说明 | 视觉开发者的关注点 |
|---|---|---|
| 轴(Axis) | 一个独立的运动自由度 | 了解轴号、行程范围 |
| 点位运动(PTP) | 从 A 点直接运动到 B 点 | 用于粗定位 |
| 直线插补(Line) | 多轴联动走直线 | 用于视觉引导的精确路径 |
| 编码器反馈 | 实时读取电机位置 | 用于飞拍时的位置同步 |
| 触发模式 | 编码器触发/软件触发/外部触发 | 决定拍照时机 |
2.2 运动控制卡选型
典型的 PCI 总线运动控制卡,支持多轴脉冲输出和编码器反馈。
| 品牌 | 代表型号 | 接口 | C# 支持 | 特点 |
|---|---|---|---|---|
| 固高科技 | GTS/GTN 系列 | PCI/PCIe | 官方 DLL | 国产,性价比高 |
| 研华科技 | PCI-1245/1265 | PCI | 官方 DLL | 稳定可靠 |
| 雷赛智能 | DMC3000 系列 | PCI/网口 | 官方 DLL | 国产,服务响应快 |
| ACS | SPiiPlus | EtherCAT | .NET API | 高端,多轴同步 |
| 倍福 | EL 系列 | EtherCAT | TwinCAT ADS | 德系,精度极高 |
三、C# 与运动控制卡通信
3.1 固高运动控制卡集成示例
usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;publicclassGTSMotionController{// 固高 API 导入(以 GTS-800 为例)[DllImport("gts.dll")]privatestaticexternshortGTN_Open(shortchannel,shortparam);[DllImport("gts.dll")]privatestaticexternshortGTN_Close(shortchannel);[DllImport("gts.dll")]privatestaticexternshortGTN_ClrSts(shortchannel,shortaxis,shortcount);[DllImport("gts.dll")]privatestaticexternshortGTN_AxisOn(shortchannel,shortaxis);[DllImport("gts.dll")]privatestaticexternshortGTN_AxisOff(shortchannel,shortaxis);[DllImport("gts.dll")]privatestaticexternshortGTN_LnXY(shortchannel,intx,inty,doublevel,doubleacc);[DllImport("gts.dll")]privatestaticexternshortGTN_GetPrfPos(shortchannel,shortaxis,outdoublepos);[DllImport("gts.dll")]privatestaticexternshortGTN_GetEncPos(shortchannel,shortaxis,outdoublepos);[DllImport("gts.dll")]privatestaticexternshortGTN_SetDoBit(shortchannel,shortdoType,shortindex,shortvalue);privateshortchannel=1;privateshortxAxis=1;privateshortyAxis=2;/// <summary>/// 初始化运动控制卡/// </summary>publicvoidInitialize(){shortret=GTN_Open(channel,0);if(ret!=0)thrownewException($"打开运动控制卡失败,错误码:{ret}")