From 9e1247ca8890d904b0ebf0ee1565839e32166ec3 Mon Sep 17 00:00:00 2001
From: wells.liu <wells.liu@broconcentric.com>
Date: 星期二, 30 六月 2020 11:15:47 +0800
Subject: [PATCH] 固高驱动
---
src/Bro.Device.GTSCard/GTSCardDriver.cs | 237 +++++++++++++++++++++++++++++++++++++----------
src/Bro.Device.GTSCard/GTSCardConfig.cs | 6
2 files changed, 188 insertions(+), 55 deletions(-)
diff --git a/src/Bro.Device.GTSCard/GTSCardConfig.cs b/src/Bro.Device.GTSCard/GTSCardConfig.cs
index e56fd79..b440e1b 100644
--- a/src/Bro.Device.GTSCard/GTSCardConfig.cs
+++ b/src/Bro.Device.GTSCard/GTSCardConfig.cs
@@ -211,12 +211,12 @@
[Category("閫熷害閰嶇疆")]
[DisplayName("鍔犻�熷害")]
[Description("Acc锛氬姞閫熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆")]
- public double Acc { get; set; } = 0;
+ public double Acc { get; set; } = 1;
[Category("閫熷害閰嶇疆")]
[DisplayName("鍑忛�熷害")]
- [Description("鍑忛�熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆銆傚洖鍘熺偣妯″紡鏃惰缃负鏇茬嚎鍙傛暟")]
- public double Dec { get; set; } = 0;
+ [Description("鍑忛�熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆")]
+ public double Dec { get; set; } = 1;
}
/// <summary>
diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs
index d4eea2e..e96d00c 100644
--- a/src/Bro.Device.GTSCard/GTSCardDriver.cs
+++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -68,12 +68,13 @@
protected override void Start()
{
- throw new NotImplementedException();
+ AllAxisOn();
}
protected override void Stop()
{
- throw new NotImplementedException();
+ AllMoveStop();
+ AllAxisOff();
}
#endregion
@@ -93,6 +94,60 @@
{
throw new Exception("鏉垮崱杞藉叆閰嶇疆鏂囦欢寮傚父锛岄敊璇爜锛�" + res);
}
+ }
+
+ public bool AllAxisOn()
+ {
+ List<Task<bool>> taskList = new List<Task<bool>>(); ;
+ // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱寮�鍚�
+ IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum =>
+ {
+ var task = AxisOnAsync((short)IConfig.CardNum, (short)axisNum.AxisIndex);
+ taskList.Add(task);
+ });
+ Task.WaitAll(taskList.ToArray());
+ var resultOK = taskList.All(u => u.GetAwaiter().GetResult());
+ return resultOK;
+ }
+
+ public bool AllAxisOff()
+ {
+ List<Task<bool>> taskList = new List<Task<bool>>(); ;
+ // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱鍏抽棴
+ IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum =>
+ {
+ var task = AxisOffAsync((short)IConfig.CardNum, (short)axisNum.AxisIndex);
+ taskList.Add(task);
+ });
+ Task.WaitAll(taskList.ToArray());
+ var resultOK = taskList.All(u => u.GetAwaiter().GetResult());
+ return resultOK;
+ }
+
+ /// <summary>
+ /// 鍗曚釜杞村紑鍚�
+ /// </summary>
+ /// <returns></returns>
+ public async Task<bool> AxisOnAsync(short cardNum, short axisNum)
+ {
+ return await Task.Run(() =>
+ {
+ var ret = GTSCardAPI.GT_AxisOn(cardNum, axisNum);
+ return ret == (short)GTSRetCode.GRCRunOK;
+ });
+ }
+
+ /// <summary>
+ /// 鍗曚釜杞村叧闂�
+ /// </summary>
+ /// <returns></returns>
+ public async Task<bool> AxisOffAsync(short cardNum, short axisNum)
+ {
+ return await Task.Run(() =>
+ {
+ var ret = GTSCardAPI.GT_AxisOff(cardNum, axisNum);
+ return ret == (short)GTSRetCode.GRCRunOK;
+ });
}
/// <summary>
@@ -123,14 +178,14 @@
}
/// <summary>
- /// Set AxisParam
+ /// 鐐瑰埌鐐硅繍鍔ㄨ缃弬鏁�
/// </summary>
/// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
/// <returns></returns>
private bool SetAxisParam(MovingOption optionPara)
{
List<short> resultCode = new List<short>() { 0 };
- GTSCardAPI.TTrapPrm trapprm;
+ GTSCardAPI.TTrapPrm trapprm = new GTSCardAPI.TTrapPrm();
resultCode.Add(GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, (short)optionPara.AxisIndex));
resultCode.Add(GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, (short)optionPara.AxisIndex, out trapprm));
trapprm.smoothTime = 1;
@@ -149,7 +204,7 @@
}
/// <summary>
- /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔�
+ /// 鍗曚釜杞� 杩愬姩(鐐瑰埌鐐� jog 鍥為浂...锛�
/// </summary>
/// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
public async Task<bool> SingleAxisMoving(MovingOption optionPara)
@@ -173,24 +228,26 @@
LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父");
return false;
}
- //璁剧疆 杩愬姩鍙傛暟
- var isSuccess = SetAxisParam(optionPara);
- if (isSuccess)
+
+ if (optionPara.IsAbsolute)
{
- if (optionPara.IsAbsolute)
- {
- isSuccessAndStop = MoveAbs(optionPara);
- }
- else
- {
- isSuccessAndStop = MoveRel(optionPara);
- }
+ isSuccessAndStop = P2PMoveAbs(optionPara);
}
+ else
+ {
+ isSuccessAndStop = P2PMoveRel(optionPara);
+ }
+
}
break;
case MotorMoveMode.FindOri:
{
isSuccessAndStop = GoHome(optionPara);
+ }
+ break;
+ case MotorMoveMode.Jog:
+ {
+ isSuccessAndStop = JogMove(optionPara);
}
break;
}
@@ -252,21 +309,38 @@
/// <param name="nDirection">Motion Direction 0: Negative, 1: Positive</param>
/// <param name="nMaxVel">max velocity</param>
/// <returns></returns>
- public bool StartJog(int axisNum, int nDirection, int velocity)
+ public bool JogMove(MovingOption optionPara)
{
- GTSCardAPI.TJogPrm jogprm = new GTSCardAPI.TJogPrm();
- short rtn = GTSCardAPI.GT_PrfJog((short)IConfig.CardNum, (short)axisNum);
- jogprm.acc = 1;
- jogprm.dec = 1;
- GTSCardAPI.GT_SetJogPrm((short)IConfig.CardNum, (short)axisNum, ref jogprm);//璁剧疆jog杩愬姩鍙傛暟
- GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)axisNum, velocity);//璁剧疆鐩爣閫熷害
- int ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (axisNum - 1));//鏇存柊杞磋繍鍔�
-
- if (ret != (int)GTSRetCode.GRCRunOK)
+ try
{
+ GTSCardAPI.TJogPrm jogprm = new GTSCardAPI.TJogPrm();
+ short ret = 0;
+ int repeatTime = 100;
+ do
+ {
+ ret = GTSCardAPI.GT_PrfJog((short)IConfig.CardNum, (short)optionPara.AxisIndex);
+ jogprm.acc = optionPara.VelocityPara.Acc;
+ jogprm.dec = optionPara.VelocityPara.Dec;
+ ret = GTSCardAPI.GT_SetJogPrm((short)IConfig.CardNum, (short)optionPara.AxisIndex, ref jogprm);//璁剧疆jog杩愬姩鍙傛暟
+ ret = GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)optionPara.AxisIndex, optionPara.VelocityPara.Velocity);//璁剧疆鐩爣閫熷害
+ ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//鏇存柊杞磋繍鍔�
+
+ if (ret != (short)GTSRetCode.GRCRunOK)
+ {
+ LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "APS_absolute_move寮傚父", "閿欒鐮侊細" + ret + ";" + "閲嶈瘯娆℃暟锛�" + repeatTime);
+ Thread.Sleep(50);
+ }
+ repeatTime--;
+ } while (ret != (short)GTSRetCode.GRCRunOK && repeatTime > 0);
+ return (ret == (short)GTSRetCode.GRCRunOK);
+ }
+ catch (Exception ex)
+ {
+ AllMoveStop(true);
+ OnExceptionRaised?.Invoke(ex);
return false;
}
- return true;
+
}
/// <summary>
@@ -297,7 +371,7 @@
/// <param name="axisNum">AxisNo</param>
/// <param name="nDistance">run distance</param>
/// <returns></returns>
- public bool MoveRel(MovingOption optionPara)
+ public bool P2PMoveRel(MovingOption optionPara)
{
try
{
@@ -328,11 +402,14 @@
LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination);
short ret = 0;
- repeatTime = 1000;
+ repeatTime = 100;
+ bool isSuccessSetAxisParam = false;
int currentPosition = (int)GetPosition(optionPara.AxisIndex);
int dPosition = optionPara.Destination + currentPosition;
do
{
+ //璁剧疆 杩愬姩鍙傛暟
+ isSuccessSetAxisParam = SetAxisParam(optionPara);
ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(dPosition * IConfig.AxisVelocityRatio));// 璁剧疆瑙勫垝浣嶇疆
ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//鏇存柊杩愬姩
@@ -342,7 +419,7 @@
Thread.Sleep(50);
}
repeatTime--;
- } while (ret != (short)GTSRetCode.GRCRunOK && repeatTime > 0);
+ } while (ret != (short)GTSRetCode.GRCRunOK && !isSuccessSetAxisParam && repeatTime > 0);
//杩愬姩寮�濮嬪悗 妫�鏌ヨ繍鍔ㄦ槸鍚﹀仠姝�
bool isStop = false;
@@ -368,7 +445,7 @@
/// 缁濆浣嶇疆杩愬姩
/// </summary>
/// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
- public bool MoveAbs(MovingOption optionPara)
+ public bool P2PMoveAbs(MovingOption optionPara)
{
try
{
@@ -396,9 +473,12 @@
}
LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination);
short ret = 0;
- repeatTime = 1000;
+ repeatTime = 100;
+ bool isSuccessSetAxisParam = false;
do
{
+ //璁剧疆 杩愬姩鍙傛暟
+ isSuccessSetAxisParam = SetAxisParam(optionPara);
ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(optionPara.Destination * IConfig.AxisVelocityRatio));// 璁剧疆瑙勫垝浣嶇疆
ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//鏇存柊杩愬姩
@@ -408,7 +488,7 @@
Thread.Sleep(50);
}
repeatTime--;
- } while (ret != (short)GTSRetCode.GRCRunOK && repeatTime > 0);
+ } while (ret != (short)GTSRetCode.GRCRunOK && !isSuccessSetAxisParam && repeatTime > 0);
bool isStop = false;
repeatTime = 1000;
@@ -435,36 +515,53 @@
/// <param name="axisNum">axisNo</param>
/// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param>
/// <returns></returns>
- public void MoveStop(int axisNum, int option)
+ public async Task<bool> MoveStop(int axisNum, int option)
{
- if (option == 1)
+ return await Task.Run(() =>
{
- StateChange(EnumHelper.DeviceState.DSExcept);
- }
- var ret = GTSCardAPI.GT_Stop((short)IConfig.CardNum, 1 << (axisNum - 1), option);
- if (ret != (short)GTSRetCode.GRCRunOK)
- {
- LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄寮傚父", "閿欒鐮侊細" + ret);
- throw new Exception("杞�" + axisNum + "杩愬姩鍋滄寮傚父锛岄敊璇爜锛�" + ret);
- }
- else
- {
- LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄", "");
- }
+ bool isStop = false;
+ if (option == 1)
+ {
+ StateChange(EnumHelper.DeviceState.DSExcept);
+ }
+ var ret = GTSCardAPI.GT_Stop((short)IConfig.CardNum, 1 << (axisNum - 1), option);
+ if (ret != (short)GTSRetCode.GRCRunOK)
+ {
+ LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄寮傚父", "閿欒鐮侊細" + ret);
+ throw new Exception("杞�" + axisNum + "杩愬姩鍋滄寮傚父锛岄敊璇爜锛�" + ret);
+ }
+ else
+ {
+ LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄", "");
+ }
+ int repeatTime = 100;
+ do
+ {
+ isStop = IsStop((short)IConfig.CardNum, (short)axisNum);
+ Thread.Sleep(10);
+ repeatTime--;
+ } while (!isStop && repeatTime > 0);
+
+ return (ret == (short)GTSRetCode.GRCRunOK) && isStop;
+ });
}
/// <summary>
- /// 鎵�鏈夊紑鍚殑杞村叧闂�
+ /// 鎵�鏈夊紑鍚殑杞村仠姝�
/// </summary>
/// <param name="emergencyStop"></param>
public void AllMoveStop(bool emergencyStop = false)
{
int option = emergencyStop ? 1 : 0;
-
+ List<Task<bool>> taskList = new List<Task<bool>>(); ;
+ // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱杩愬姩缁撴潫
IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum =>
{
- MoveStop(axisNum.AxisIndex, option);
+ var task = MoveStop(axisNum.AxisIndex, option);
+ taskList.Add(task);
});
+ Task.WaitAll(taskList.ToArray());
+ var resultOK = taskList.All(u => u.GetAwaiter().GetResult());
}
/// <summary>
@@ -632,9 +729,45 @@
public void ResetAlarm()
{
- throw new NotImplementedException();
- }
+ int axis_sts;
+ uint clk;
+ var axisSettings = IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled);
+ GTSCardAPI.GT_ClrSts((short)IConfig.CardNum, 1, (short)axisSettings.Count);
+ foreach (var axisSetting in axisSettings)
+ {
+ GTSCardAPI.GT_GetSts((short)IConfig.CardNum, (short)axisSetting.AxisIndex, out axis_sts, 1, out clk);
+ if ((axis_sts & 0x200) == 0)
+ {
+ var rst = GTSCardAPI.GT_AxisOn((short)IConfig.CardNum, (short)axisSetting.AxisIndex);
+ }
+ // 浣嶇疆璇烽浂
+ GTSCardAPI.GT_ZeroPos((short)IConfig.CardNum, 1, (short)axisSettings.Count);
+ // 姝f瀬闄愭姤璀�
+ if ((axis_sts & 0x20) != 0)
+ {
+ // 璐熷悜绉诲姩
+ MovingOption movingOption = new MovingOption();
+ movingOption.AxisIndex = (short)axisSetting.AxisIndex;
+ movingOption.Destination = -50; // 璐熷悜绉诲姩
+ movingOption.VelocityPara.Velocity = 50;
+ P2PMoveAbs(movingOption);
+ }
+ // 璐熸瀬闄愭姤璀�
+ if ((axis_sts & 0x40) != 0)
+ {
+ // 姝e悜绉诲姩
+ MovingOption movingOption = new MovingOption();
+ movingOption.AxisIndex = (short)axisSetting.AxisIndex;
+ movingOption.Destination = 50; // 璐熷悜绉诲姩
+ movingOption.VelocityPara.Velocity = 50;
+ P2PMoveAbs(movingOption);
+ }
+ }
+
+ // 娓呴櫎鐘舵��
+ GTSCardAPI.GT_ClrSts((short)IConfig.CardNum, 1, (short)IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled).Count);
+ }
}
}
--
Gitblit v1.8.0