勇哥注: 趁着需要测试运动回原的精度,加上本来需要编写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元,勇哥用以支付本站服务器费用。
[Xhide][/Xhide]
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!