(十二)控制卡

1.控制卡抽象父类模块

1.1编写接口

  • 控制卡是否初始化完成
  • 是否就绪
  • 运动轴是否回零
  • 初始化控制卡
  • 关闭控制卡
  • 设置运动轴速度模式
  • 运动轴回零
  • 移动轴
  • 停止轴运动

1.2 控制卡参数

image

1.3 控制卡配置提供者

image

1.4 枚举类型

image
image
image
image

1.5 控制卡抽象父类

 public abstract class ControlCardBase : IControlCard
 {
     public bool Initialized { get; private set; }

     public bool IsReady => Initialized && IsAxisHomed;
     /// <summary>
     /// 运动轴是否归零
     /// </summary>
     public bool IsAxisHomed { get;private  set; }
     /// <summary>
     /// 运动轴正在回零中
     /// </summary>
     public bool IsAxisHoming {  get;  set; }
     /// <summary>
     /// 轴运动速度模式
     /// </summary>
     protected SpeedMode SpeedMode { get;private set; }
     /// <summary>
     /// 控制卡的配置参数
     /// </summary>
     protected ControlCardConfig Config { get;  set; }
     public void Close()
     {
         if (Initialized)
         {
             //先停止轴运动
             DoStop(null, AxisStopMode.DecelerationStops);//方式一:急停  方式二:缓慢停止
             DoClose();//关闭的方法不在这里写,在子类中需要完成相应的业务
             Initialized = false;
         }
     }

     public IControlCardConfigProvider Provider { get; private set; }
     public bool Init(IControlCardConfigProvider provider)
     {
         Provider = provider;
         Config = provider.ControlCardConfig;

         if (Initialized)
         {
             Logs.LogError(new Exception("控制卡重复初始化"));
         }

         if (DoInit())
         {
             Initialized = true;
             DoConfigure();
             return true;
         }
         return false;
     }

     public bool Move(AxisType axisType, double um, out string message)
     {
         if(IsReady)
         {
             message = "运动轴未准备好";
             return false;
         }
       
         bool result = MoveAxis(axisType, um, out string v);
         message = v;
         return result;
     }
     /// <summary>
     /// 移动轴功能
     /// </summary>
     /// <param name="axisType"></param>
     /// <param name="um"></param>
     /// <param name="v"></param>
     /// <returns></returns>
     private bool MoveAxis(AxisType axisType, double um, out string v)
     {
         //判断当前轴是否开启使能
         if (!DoGetAxisEnable(axisType))
         {
             v = "当前轴未开始使能";
             return false;
         }
         //判断当前轴是否正在运动
         if (!DoGetAxisStopped(axisType))
         {
             v = "当前轴正在运动中";
             return false;
         }

         bool result = DoMoveAxis(axisType, um);

         while (true)
         {
             if (DoGetAxisStopped(axisType))
             {
                 break;
             }

             Thread.Sleep(5);
         }

         v = "当前轴运动完成";
         return result;
     }
     /// <summary>
     /// 连续运动
     /// </summary>
     /// <param name="axisType"></param>
     /// <param name="moveDirection"></param>
     /// <returns></returns>
     /// <exception cref="NotImplementedException"></exception>
     public bool Move(AxisType axisType, MoveDirection moveDirection)
     {
         if(!IsReady)
             return false;
         if (!DoGetAxisEnable(axisType))
         {
             return false;
         }
         //判断当前轴是否正在运动
         if (!DoGetAxisStopped(axisType))
         {
             return false;
         }

         return DoMoveContinue(axisType, moveDirection);
     }

     public void SetSpeedMode(SpeedMode mode)
     {
         SpeedMode = mode;
     }

     public void Stop(AxisType? axisType)
     {
         DoStop(axisType, AxisStopMode.DecelerationStops);
     }
     /// <summary>
     /// 轴归零
     /// </summary>
     /// <param name="message"></param>
     /// <returns></returns>
     public bool GoHome(out string message)
     {
         if(!Initialized)
         {
             throw new Exception("控制卡未初始化");
         }
         //      AxisType.X
         DoStop(null,AxisStopMode.DecelerationStops);//减速停止
         //DoStop执行实际上是调用了厂家SDK封装的API,  调用执行,以及返回会有一个时间延迟
         Thread.Sleep(100);

         try
         {
             IsAxisHoming = true;
             IsAxisHomed = false;
             IsAxisHomed= DoGoHome(out message);
         }
         catch (Exception ex)
         {
             message=ex.Message;
         }
         finally
         {
             IsAxisHoming=false;
         }
         return true;
     }

2.仿真模块

2.1 准备阶段

  • 创建模块管理
    image
  • 安装prism.unity,reativeui.wpf,reativeui.fody
  • 项目引用
    image

2.2 子类

  1. 初始化
    image

  2. 停止运动
    image

  3. 获取AxisType枚举的元素集合 ,在父类中
    image

  4. Enum.GetValues()主要用于以下两个方面:

  • 获取枚举类型中所有可能的值
  • 将一个枚举类型的所有可能值转换为数组,以方便使用
posted @ 2023-12-21 10:41  huihui不会写代码  阅读(67)  评论(0)    收藏  举报