1. 为什么我们需要统一的运动控制框架
在工业自动化领域,运动控制卡作为核心执行部件,直接影响设备精度与效率。但现实情况是:不同厂商的控制卡(如固高、雷赛、研华等)提供的SDK接口差异巨大,开发人员不得不为每款控制卡编写专用代码。我曾接手过一个改造项目,产线上同时使用了三套不同品牌的运动控制卡,维护三套代码的痛苦经历让我下定决心寻找更优解。
运动控制卡的核心功能其实高度相似:点位运动、直线插补、圆弧插补、IO控制等。差异主要体现在:
- 厂商提供的DLL函数命名规则不同(如GT_Start vs. MC_Start)
- 参数传递方式不同(结构体 vs. 独立参数)
- 回调机制实现不同(事件 vs. 轮询)
通过抽象这些共性操作,我们可以构建一个中间层框架,用统一的API对接不同硬件。这就像给各种品牌的电视配了一个万能遥控器——虽然内部芯片不同,但用户只需记住"开关""音量+"等通用按钮。
2. 框架设计核心思路
2.1 接口抽象的三层架构
我们的框架采用经典的三层设计:
code复制[应用层] ←→ [抽象接口层] ←→ [厂商适配层]
以直线插补功能为例,抽象接口层定义:
csharp复制public interface IMotionController
{
void LinearInterpolation(int axisGroup, double[] targetPos, double speed);
}
厂商适配层则实现具体转换。比如对固高控制卡:
csharp复制class GoogolAdapter : IMotionController
{
public void LinearInterpolation(int axisGroup, double[] targetPos, double speed)
{
GT_Line(axisGroup, targetPos, speed, 0.1); // 调用固高原生DLL
}
}
2.2 动态加载DLL的三种方案
不同控制卡的DLL需要动态加载,我们对比了三种实现方式:
| 方案 | 优点 | 缺点
