C# netMarketing类库编写视觉+运动测试框架(三) 封装运动功能

勇哥注:
趁着需要测试运动回原的精度,加上本来需要编写netMarketing类库的应用教程,
那就顺手发一个制作视觉+运动测试框架的系列教程吧。
网上的netMarketing类库是1.3.0,这个版本需要使用halcon12.0
勇哥在演示的时候用的netMarketing版本比这个高,
这个版本还没有发布,使用的是halcon19.11。
所以下载文章源代码的朋友,注意halcon版本问题,不然运行不起来。


C# netMarketing类库编写视觉+运动测试框架(三) 封装运动功能


接下来封装运动卡的功能。


勇哥希望得到下面的效果:


  1.  所有品牌型号的运动控制卡类都继承抽象类MotionCardObj

  2.  电脑可以同时插多个品牌运动控制卡,只需要按类工厂方式切换控制卡类的实例即可

  3.  电脑中也可以同品牌同型号运动控制卡插多张。

  4.   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。

其它未知品牌的运动卡实现类也是如此。

image.png

(图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元,勇哥用以支付本站服务器费用。


支付20元或购买VIP会员后,才能查看本内容!立即支付升级会员查询订单




--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2022-07-02 21:12:28 编辑
  • 评论列表:
  •  manlsea
     发布于 2024-12-17 10:34:57  回复该评论
  • 你好,勇哥,这个版本能提供试用吗?谢谢

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年2月    »
12
3456789
10111213141516
17181920212223
2425262728
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864