(十二)控制卡
1.控制卡抽象父类模块
1.1编写接口
- 控制卡是否初始化完成
- 是否就绪
- 运动轴是否回零
- 初始化控制卡
- 关闭控制卡
- 设置运动轴速度模式
- 运动轴回零
- 移动轴
- 停止轴运动
1.2 控制卡参数

1.3 控制卡配置提供者

1.4 枚举类型




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 子类
-
初始化
![image]()
-
停止运动
![image]()
-
获取AxisType枚举的元素集合 ,在父类中
![image]()
-
Enum.GetValues()主要用于以下两个方面:
- 获取枚举类型中所有可能的值
- 将一个枚举类型的所有可能值转换为数组,以方便使用







浙公网安备 33010602011771号