勇哥注: 趁着需要测试运动回原的精度,加上本来需要编写netMarketing类库的应用教程, 那就顺手发一个制作视觉+运动测试框架的系列教程吧。 网上的netMarketing类库是1.3.0,这个版本需要使用halcon12.0 勇哥在演示的时候用的netMarketing版本比这个高, 这个版本还没有发布,使用的是halcon19.11。 所以下载文章源代码的朋友,注意halcon版本问题,不然运行不起来。
C# netMarketing类库编写视觉+运动测试框架(三) 封装运动功能
接下来封装运动卡的功能。
勇哥希望得到下面的效果:
所有品牌型号的运动控制卡类都继承抽象类MotionCardObj
电脑可以同时插多个品牌运动控制卡,只需要按类工厂方式切换控制卡类的实例即可
电脑中也可以同品牌同型号运动控制卡插多张。
MotionCardObj内部使用IAxis, IMotionCard, IinIO, IoutIO四个接口操作运动控制卡的资源
分别是:轴、卡、卡的输入IO、卡的输出IO
无论是什么品牌型号运动控制卡,外部调用者看到的接口函数完全一样,没有任何区别
在源代码中,dmc2210Card类就是一种品牌运动控制卡的实现。
其中Axis.cs, Card.cs, Inio.cs, Outio.cs 分别是 IAxis, IMotionCard, IinIO, IoutIO四个接口的实现类。
dmc2210api.cs是此品牌卡厂家提供的api。
dmc2210.cs 是此品牌卡的外部调用的类,这里勇哥把他设置为单例,原因是同品牌同型号卡无论在电脑里插多少张,对外部看来都是dmc2210类,只不过内部的IAxis, IinIO, IoutIO的数量不同罢了。
图1所示的就是运动卡品牌dmc2210的实现类dmc2210Card。
其它未知品牌的运动卡实现类也是如此。
(图1)
IAxis 轴接口的定义如下:
这里都只是定义了一些基础功能,以后可以扩展此接口。
/// <summary> /// 运动卡的轴对象的接口 /// </summary> public interface IAxis { /// <summary> /// 等待运动结果 /// </summary> /// <param name="axisid"></param> /// <returns></returns> bool WaitMotorDone(ushort axisid); /// <summary> /// ptp运动,不阻塞 /// </summary> /// <param name="axisid"></param> /// <param name="dist"></param> /// <param name="mode"></param> void PTP(PtpParameter para); /// <summary> /// ptp运动,等待完成 /// </summary> /// <param name="para"></param> void WaitPTP(PtpParameter para); /// <summary> /// jog运动 /// </summary> /// <param name="axisid"></param> /// <param name="dist"></param> void JOG(JogParameter para); /// <summary> /// 回原 /// </summary> /// <param name="axisid"></param> /// <param name="ori"></param> void HOME(HomeParameter para); /// <summary> /// 停止运动 /// </summary> /// <param name="axisid"></param> void StopMove(ushort axisid); /// <summary> /// 取轴的脉冲指令位置 /// </summary> /// <param name="axis"></param> /// <returns></returns> long GetPosition(ushort axis); /// <summary> /// 轴在负限位 1表示负限位有效, 0表示无效 /// </summary> /// <param name="axisId"></param> /// <returns></returns> int AxisMel(ushort axisId); /// <summary> /// 轴在正限位 1表示正限位有效, 0表示无效 /// </summary> /// <param name="axisId"></param> /// <returns></returns> int AxisPel(ushort axisId); /// <summary> /// 轴在原点 1表示在原点, 0表示无效 /// </summary> /// <param name="axisId"></param> /// <returns></returns> int AxisOrg(ushort axisId); /// <summary> /// 轴状态 0 表示控制轴运动完成,处于空闲状态;1 表示控制轴正在运动,其它值为调用出错 /// </summary> /// <param name="axisId"></param> /// <returns></returns> int AxisStatus(ushort axisId); }
输入IO的接口
/// <summary> /// 运动卡的输入IO对象的接口 /// </summary> public interface IInIO { /// <summary> /// 读取指定控制卡的某一位输入口的电平状态 /// </summary> /// <param name="cardno"></param> /// <param name="bitno"></param> /// <returns></returns> int ReadInbit(ushort cardno, ushort bitno); }
输出IO的接口
/// <summary> /// 运动卡的输出IO对象的接口 /// </summary> public interface IOutIO { /// <summary> /// 对指定控制卡的某一位输出口置位 /// </summary> /// <param name="cardno"></param> /// <param name="bitno"></param> /// <param name="on_off"></param> /// <returns></returns> int WriteOutbit(ushort cardno, ushort bitno, ushort on_off); /// <summary> /// 读取指定控制卡的某一位输出口的电平状态 /// </summary> /// <param name="cardno"></param> /// <param name="bitno"></param> /// <returns></returns> int ReadOutbit(ushort cardno, ushort bitno); }
抽象类MotionCardObj
实现一种未知品牌的运动控制卡,先要实现接口IAxis, IInIO, IMotionCard, IOutIO。
然后继承此抽象类,并且重写CardInit方法,
把内部的List<IAxis>,List<IInIO>, List<IOutIO>资源完成初始化。
图1所示的就是运动卡品牌dmc2210的实现类dmc2210Card。
/// <summary> /// 运动卡对象 /// </summary> public abstract class MotionCardObj { public List<IAxis> Axis = new List<IAxis>(); public List<IInIO> InIO = new List<IInIO>(); public List<IOutIO> OutIO = new List<IOutIO>(); public abstract bool CardInit(); }
本文视频讲解如下:
本文源码资料下载:
扫码收费20元,勇哥用以支付本站服务器费用。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

