ICommand
一、RelayCommand 到底是干嘛的?
一句话:它就是个 「方法包装器」 ,把你 ViewModel 里的普通方法(比如 Connect()),包装成 XAML 里 Button 能绑定的 ICommand 接口对象。
核心目的:让 UI 控件(按钮)能调用 ViewModel 里的方法,实现 MVVM 的解耦。
本质:就是实现了 ICommand 接口的一个简单类。
二、必记的「核心骨架」
1. 第一步:实现 ICommand 接口
csharp
public class RelayCommand : ICommand
{
// 接口要求的3个成员
public bool CanExecute(object parameter); // 判断能不能执行
public void Execute(object parameter); // 真正执行的逻辑
public event EventHandler CanExecuteChanged; // 执行状态变化通知
}
2. 第二步:定义 2 个私有字段(存要执行的方法)
csharp
// 要执行的方法(比如你的 Connect())
private readonly Action _execute;
// 判断能不能执行的方法(可选,比如按钮是否禁用)
private readonly Func<bool> _canExecute;
3. 第三步:写 2 个构造函数(适配你的调用方式)
csharp
// ① 单参数:只传要执行的方法,默认永远可以执行(最常用)
public RelayCommand(Action execute)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute));
_canExecute = () => true; // 默认永远可执行
}
// ② 双参数:同时传"执行方法"和"能否执行的判断"
public RelayCommand(Action execute, Func<bool> canExecute)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute));
_canExecute = canExecute ?? throw new ArgumentNullException(nameof(canExecute));
}
4. 第四步:实现接口方法(把逻辑交给字段)
csharp
// 能否执行:调用 _canExecute 方法
public bool CanExecute(object parameter) => _canExecute();
// 执行:调用 _execute 方法
public void Execute(object parameter) => _execute();
// 状态变化通知:用 CommandManager 绑定(固定写法,背下来就行)
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
接口 + 2字段 + 2构造 + 3方法 + 1事件
1 接口:实现 ICommand
2 字段:_execute + _canExecute
2 构造:单参数(Action)+ 双参数(Action + Func)
3 方法:CanExecute / Execute / CanExecuteChanged(事件)
1 固定写法:CommandManager.RequerySuggested
Halcon视觉
一、前置核心配置(第一步必做)
1. DLL 引用要求
必须引用 2 类库
HalconDotNet.dll:C# 托管桥接库(项目右键→添加引用)
halcon.dll(及依赖):C++ 底层算法库(直接放进程序运行目录)
关键设置:原生 DLL 属性 → 复制到输出目录 = 如果较新则复制
作用:没有 DLL,C# 完全调用不了 Halcon 任何功能
2. 项目平台 强制设为 x64(唯一正确选项)
必须这么做的 4 个原因
Halcon 底层是 64 位 C++ 编写,不支持 32 位系统
默认 Any CPU 会自动适配 32/64 位,必报 DLL 找不到
机器视觉图像占用内存大,64 位程序内存空间更大,不溢出
工业相机、轴卡等设备 SDK 全是 64 位,统一位数兼容
二、核心代码固定流程(死死记住 4 步)
csharp
// 1. 引用命名空间
using HalconDotNet;
// 按钮点击事件
private void btn_Click(object sender, RoutedEventArgs e)
{
// UI线程异步绘图(必加,防卡顿/报错)
Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
{
// ① 读取图像:创建HImage对象,加载图片
HImage image = new HImage("fabrik");
// ② 设置显示区域:适配图片尺寸,完整显示
HalconViewer.HalconWindow.SetPart(0, 0, 511, 511);
// ③ 显示图像:绘制到界面控件
HalconViewer.HalconWindow.DispImage(image);
// ④ 手动释放资源:必须加!防内存泄漏
image.Dispose();
}));
}
四、高频报错坑点 + 规避方法(必记)
报错:DLL 找不到 / 无法加载程序集
原因:
缺少 halcon.dll 原生库
DLL 没有复制到输出目录
项目平台不是 x64
解决:
补全 DLL + 设置复制属性
项目属性→生成→目标平台强制 x64
运动控制基础概念
一、轴卡控制
基本定义
安装在工控机内的运动控制板卡,是上位机与电机之间的指令中转硬件。
核心作用
接收 C# 上位机下发的运动指令,解析后驱动伺服、步进电机完成机械动作,同时采集设备运行状态回传上位机。
市面常用型号
固高、雷赛、新代(工控面试高频提及固高轴卡)
执行链路
上位机下发指令 → 轴卡接收解析 → 驱动电机运转
二、点位移动
按照预设坐标控制设备精准走位,分为三种常用模式
绝对定位:以设备机械原点为基准,移动到固定坐标位置
相对定位:以设备当前所在位置为基准,偏移指定距离
原点回归:设备复位校准基准位置,消除累计定位误差
三、设备启停基础逻辑
启动:电机上电使能,设备进入就绪状态,触发运动指令开始作业
正常停止:逐级减速平稳停机,保护机械结构不受冲击
紧急停止:故障、危险场景下立刻断电制动,优先保障设备与人身安全
上位机功能:下发启停指令,实时监测运行、待机、故障状态
四、调速基础逻辑
匀速运行:设备全程保持固定转速、进给速度作业
加减速调速:启动阶段缓慢加速、停止前逐步减速,规避机械碰撞、抖动
操控方式:上位机设置速度数值,下发至轴卡即可完成速度调节
五、工业常用通信协议及作用
Modbus
工业通用简易协议,多用于读写设备寄存器,实现设备启停控制、传感器数据、点位参数读取
OPC UA
跨设备、跨系统通用通信协议,用于上位机对接多台设备、同步 MES 生产管理系统数据
SECS/GEM
半导体、锂电行业专用协议,负责设备间交互、生产工序数据上报
TCP/IP
网络通信方式,通过网线实现电脑与工控设备之间指令、数据传输
整体工作流程
C# 上位机编辑点位、速度、启停指令 → 通信协议传输指令 → 轴卡驱动电机动作 → 设备状态反向回传上位机展示判断