From 767d0876af17721c3d708a6723112352dff1284f Mon Sep 17 00:00:00 2001
From: wells.liu <wells.liu@broconcentric.com>
Date: 星期一, 29 六月 2020 18:45:10 +0800
Subject: [PATCH] 板卡驱动
---
src/Bro.Device.GTSCard/GTSCardDriver.cs | 1068 +++++++++++++---------------------------------------
src/Bro.Device.GTSCard/GTSCardConfig.cs | 66 +++
src/Bro.Device.GTSCard/GTSCardAPI.cs | 10
3 files changed, 343 insertions(+), 801 deletions(-)
diff --git a/src/Bro.Device.GTSCard/GTSCardAPI.cs b/src/Bro.Device.GTSCard/GTSCardAPI.cs
index 0a83f81..0ddd544 100644
--- a/src/Bro.Device.GTSCard/GTSCardAPI.cs
+++ b/src/Bro.Device.GTSCard/GTSCardAPI.cs
@@ -143,16 +143,6 @@
public const short LASER_CTRL_VOLTAGE = 2;
public const short LASER_CTRL_MODE_PWM2 = 3;
- //鎸囦护杩斿洖鍊�
- public const short ResultSuccess = 0;
- public const short ResultError = 1;
- public const short ResultNotSupported = 2;
- public const short ParameterError = 7;
- public const short CommunicationFailed = -1;
- public const short OpenFailed = -6;
- public const short NoResponse = -7;
-
-
public struct TTrapPrm
{
public double acc;
diff --git a/src/Bro.Device.GTSCard/GTSCardConfig.cs b/src/Bro.Device.GTSCard/GTSCardConfig.cs
index de7aad9..e56fd79 100644
--- a/src/Bro.Device.GTSCard/GTSCardConfig.cs
+++ b/src/Bro.Device.GTSCard/GTSCardConfig.cs
@@ -201,7 +201,7 @@
/// <summary>
/// 閫熷害鍙傛暟瀵硅薄
/// </summary>
- public class VelocityPara
+ public class VelocityPara
{
[Category("閫熷害閰嶇疆")]
[DisplayName("閫熷害")]
@@ -217,6 +217,54 @@
[DisplayName("鍑忛�熷害")]
[Description("鍑忛�熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆銆傚洖鍘熺偣妯″紡鏃惰缃负鏇茬嚎鍙傛暟")]
public double Dec { get; set; } = 0;
+ }
+
+ /// <summary>
+ /// 鍥炲師鐐瑰弬鏁板璞�
+ /// </summary>
+ public class GoHomePara
+ {
+ [Category("鍥炲師鐐瑰弬鏁�")]
+ [DisplayName("鍥炲師鐐规柟寮�")]
+ [Description("HomeMode锛氬洖鍘熺偣鏂瑰紡 锛圚OME_MODE_LIMIT = 10; HOME_MODE_LIMIT_HOME = 11; HOME_MODE_LIMIT_INDEX = 12; HOME_MODE_LIMIT_HOME_INDEX = 13;HOME_MODE_HOME = 20;HOME_MODE_HOME_INDEX = 22;HOME_MODE_INDEX = 30;")]
+ public short HomeMode { get; set; } = 11;
+
+ [Category("鍥炲師鐐瑰弬鏁�")]
+ [DisplayName("鍥炲師鐐规柟鍚�")]
+ [Description("HomeDir锛�1 姝e悜锛�-1 璐熷悜")]
+ public short HomeDir { get; set; } = 1;
+
+ [Category("鍥炲師鐐瑰弬鏁�")]
+ [DisplayName("鍥炲師鐐规柟鍚�")]
+ [Description("HomeDir锛�1 姝e悜锛�-1 璐熷悜")]
+ public short Edge { get; set; } = 0;
+
+ [Category("鍥炲師鐐瑰弬鏁�")]
+ [DisplayName("鍥炲師鐐规渶浣庨�熷害")]
+ [Description("LowVelocity锛氶�熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆")]
+ public double LowVelocity { get; set; } = 50;
+
+
+ [Category("鍥炲師鐐瑰弬鏁�")]
+ [DisplayName("鍥炲師鐐规渶楂橀�熷害")]
+ [Description("HighVelocity锛氶�熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆")]
+ public double HighVelocity { get; set; } = 50;
+
+ [Category("鍥炲師鐐瑰弬鏁�")]
+ [DisplayName("鎼滄悳璺濈")]
+ [Description("SearchHomeDistance锛氭悳鎼滆窛绂�")]
+ public int SearchHomeDistance { get; set; } = 9999999;
+
+ [Category("鍥炲師鐐瑰弬鏁�")]
+ [DisplayName("鍋忕Щ璺濈")]
+ [Description("HomeOffset锛氬亸绉昏窛绂�")]
+ public int HomeOffset { get; set; } = 0;
+
+ [Category("鍥炲師鐐瑰弬鏁�")]
+ [DisplayName("璺宠繃姝ラ暱")]
+ [Description("EscapeStep锛氳烦杩囨闀�")]
+ public int EscapeStep { get; set; } = 1000;
+
}
/// <summary>
@@ -316,6 +364,22 @@
}
}
+ private GoHomePara goHomePara = new GoHomePara();
+ [Category("杩愬姩閰嶇疆")]
+ [DisplayName("鍥炲師鐐瑰弬鏁�")]
+ [Description("GoHomePara锛氶�熷害鍙傛暟")]
+ [TypeConverter(typeof(ComplexObjectConvert))]
+ [Editor(typeof(PropertyObjectEditor), typeof(UITypeEditor))]
+ public GoHomePara GoHomePara
+ {
+ get => goHomePara;
+ set
+ {
+ goHomePara = value;
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("GoHomePara"));
+ }
+ }
+
internal List<AxisSetting> _axisSettingList = new List<AxisSetting>();
public void SetAxisSetting(List<AxisSetting> settings)
{
diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs
index 03b4c15..ffe11a6 100644
--- a/src/Bro.Device.GTSCard/GTSCardDriver.cs
+++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -11,6 +11,7 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
+using static Bro.Common.Helper.EnumHelper;
namespace Bro.Device.GTSCard
{
@@ -55,8 +56,7 @@
private Dictionary<int, VelocityPara> velIndexDict = new Dictionary<int, VelocityPara>();
ManualResetEvent _pauseHandle = new ManualResetEvent(true);
- static object lockObj = new object();
- static object _commandAxisLock = new object();
+ static object moveLock = new object();
/// <summary>
/// 鏄惁澶嶄綅鏍囧織
/// </summary>
@@ -76,27 +76,9 @@
protected override void Init()
{
- InitialMotionCard((short)IConfig.CardNum, IConfig.InitialConfigFilePath);
-
- axisMoveLockDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new object());
- runningEventDic = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new ManualResetEvent(false));
- axisMovingHandleDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new AutoResetEvent(true));
- axisImmediatePauseHandleDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new ManualResetEvent(true));
- axisMoveCancelDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new CancellationTokenSource());
-
- axisMoveCancelDict.Values.ToList().ForEach(c =>
- {
- c = new CancellationTokenSource();
- });
-
- _commandAxisList.CollectionChanged -= CommandAxisList_CollectionChanged;
- _commandAxisList.CollectionChanged += CommandAxisList_CollectionChanged;
+ InitialMotionCard();
}
- private void CommandAxisList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
- {
- CommandAxisCountChangedAction?.Invoke(_commandAxisList.Count > 0);
- }
protected override void Pause()
{
@@ -121,229 +103,157 @@
#region GTSCard
- public void ClearPosition(short cardNum, short axisNum)
- {
- int ret = GTSCardAPI.GT_SetPos(cardNum, axisNum, 0);
- }
-
/// <summary>
/// Load Motion Card parameter from file
/// </summary>
/// <param name="fileName">Invalid Parameter</param>
/// <returns></returns>
- public void InitialMotionCard(short cardNum, string fileName)
+ public void InitialMotionCard()
{
- var res = GTSCardAPI.GT_LoadConfig(cardNum, fileName);
- if (res != GTSCardAPI.ResultSuccess)
+ var res = GTSCardAPI.GT_Open((short)IConfig.CardNum, 0, 1); //鎵撳紑杩愬姩鎺у埗鍣ㄣ�傚弬鏁板繀椤讳负锛�0,1锛夛紝涓嶈兘淇敼銆�
+ res += GTSCardAPI.GT_LoadConfig((short)IConfig.CardNum, IConfig.InitialConfigFilePath);
+ res += GTSCardAPI.GT_ClrSts(0, 1, 8);
+ if (res != (short)GTSRetCode.GRCRunOK)
{
throw new Exception("鏉垮崱杞藉叆閰嶇疆鏂囦欢寮傚父锛岄敊璇爜锛�" + res);
}
-
}
/// <summary>
- /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔紙寮傛锛�
+ /// 鐐逛綅鍒扮偣浣嶈繍鍔�
/// </summary>
/// <param name="item">杩愬姩瀵硅薄</param>
- /// <returns></returns>
- public async Task SingleAxisMovingAsync(MovingOption item)
+ /// <returns>杩愬姩鎺у埗+鍋滄鍒ゆ柇</returns>
+ public bool MoveToPoint(IOperationConfig opConfig)
{
- await Task.Run(() =>
+ bool resultOK = false;
+ var gtsOperationConfig = opConfig as GTSCardOperationConfig;
+ foreach (var movingOp in gtsOperationConfig.MovingOps)
{
- SingleAxisMoving(item);
- });
- }
-
- /// <summary>
- /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔紙寮傛锛�
- /// </summary>
- /// <param name="item">杩愬姩瀵硅薄</param>
- public void SingleAxisMoving(MovingOption item)
- {
- if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == item.AxisIndex)?.IsAxisEnabled ?? false)
- {
- axisImmediatePauseHandleDict[item.AxisIndex].WaitOne();
- VelocityPara vel = new VelocityPara();
- if (item.VelocityPara.Velocity != 0)
- {
- velIndexDict[item.AxisIndex] = vel = item.VelocityPara;
- }
- else
- {
- vel = velIndexDict[item.AxisIndex];
- }
-
- string _position = "";
- string motionType = item.MoveMode == EnumHelper.MotorMoveMode.Normal ? (item.IsAbsolute ? "Abs" : "Rel") : item.MoveMode.ToString();
-
- _position = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},{item.AxisIndex},{motionType},{GetCmdOrPosition(item.AxisIndex, 0).ToString()},{GetCmdOrPosition(item.AxisIndex, 1).ToString()},{item.Destination},";
-
- lock (axisMoveLockDict[item.AxisIndex])
- {
- Task.Run(() =>
- {
- lock (_commandAxisLock)
- {
- try
- {
- if (!_commandAxisList.Contains(item.AxisIndex))
- {
- _commandAxisList.Add(item.AxisIndex);
- }
- }
- catch (Exception)
- {
- }
- }
- });
-
- switch (item.MoveMode)
- {
- case EnumHelper.MotorMoveMode.Normal:
- {
- if (_isResetting)
- {
- LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", item.AxisIndex + "鍚姩杩愬姩寮傚父");
- return;
- }
-
- SetAxisParam(item.AxisIndex, vel);
- if (item.IsAbsolute)
- {
- MoveAbs(item.AxisIndex, item.Destination, (int)(vel.Velocity * IConfig.AxisVelocityRatio));
- }
- else
- {
- MoveRel(item.AxisIndex, item.Destination, (int)(vel.Velocity * IConfig.AxisVelocityRatio));
- }
- }
- break;
- case EnumHelper.MotorMoveMode.FindOri:
- {
- AxisSetting setting = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == item.AxisIndex);
- StartHoming(item.AxisIndex, setting.HomeMode, setting.IsHomePositive ? 1 : 0, item.VelocityPara.Dec, item.VelocityPara.Acc, item.VelocityPara.Velocity);
- }
- break;
- }
-
- Task.Run(() =>
- {
- lock (_commandAxisLock)
- {
- try
- {
- _commandAxisList.Remove(item.AxisIndex);
- }
- catch (Exception)
- {
- }
- }
- });
- }
-
- _position += $"{GetCmdOrPosition(item.AxisIndex, 0).ToString()},";
- _position += $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}";
- LogAsync(DateTime.Now, "", _position);
+ resultOK = SingleAxisMoving(movingOp);
}
- }
-
- public int GetCmdOrPosition(int axisNum, int flag = 0)
- {
- int position = 0;
-
- if (flag == 0)
- {
- GetPosition(axisNum, ref position);
- }
- else
- {
- GetCmdPosition(axisNum, ref position);
- }
-
- return position;
- }
-
- /// <summary>
- ///Get single Axis Feedback position
- /// </summary>
- /// <param name="axisNum">Axis number</param>
- /// <param name="nPosition">Feedback/Encorde position </param>
- /// <returns></returns>
- public void GetPosition(int axisNum, ref int nPosition)
- {
- lock (lockObj)
- {
- double prfpos = 0; uint pclock = 0;
- var ret = GTSCardAPI.GT_GetPrfPos((short)IConfig.CardNum, (short)axisNum, out prfpos, 1, out pclock);
- if (ret != GTSCardAPI.ResultSuccess)
- {
- throw new Exception("杞�" + axisNum + "鑾峰彇褰撳墠浣嶇疆寮傚父锛岄敊璇爜锛�" + ret);
- }
- nPosition = prfpos / IConfig.AxisVelocityRatio;
- }
- }
-
- public int GetPosition(int axisNum)
- {
- int position = 0;
-
- if (!IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum).IsUseCmmdPosition)
- {
- GetPosition(axisNum, ref position);
- }
- else
- {
- GetCmdPosition(axisNum, ref position);
- }
-
- return position;
- }
-
- /// <summary>
- ///Get single Axis Command position
- /// </summary>
- /// <param name="axisNum">Axis number</param>
- /// <param name="nPosition">Command position </param>
- /// <returns></returns>
- public void GetCmdPosition(int axisNum, ref int nPosition)
- {
- var ret = GTSCardAPI.APS_get_command(axisNum, ref nPosition);
- if (ret != (Int32)GTSCardParameter.ResultSuccess)
- {
- throw new Exception("杞�" + axisNum + "鑾峰彇褰撳墠浣嶇疆寮傚父锛岄敊璇爜锛�" + ret);
- }
- nPosition = prfpos / IConfig.AxisVelocityRatio;
+ return resultOK;
}
/// <summary>
/// Set AxisParam
/// </summary>
- /// <param name="axisNo"></param>
- /// <param name="param"></param>
+ /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
/// <returns></returns>
- public void SetAxisParam(int axisNum, VelocityPara param)
+ private bool SetAxisParam(MovingOption optionPara)
{
- int ret = 0;
+ List<short> resultCode = new List<short>() { 0 };
GTSCardAPI.TTrapPrm trapprm;
- GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, (short)axisNum);
- GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, (short)axisNum, out trapprm);
+ 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;
- if (param.Acc != 0)
- {
- trapprm.acc = param.Acc;
- }
- if (param.Dec != 0)
- {
- trapprm.dec = param.Dec;
- }
- ret += GTSCardAPI.GT_SetTrapPrm((short)IConfig.CardNum, (short)axisNum, ref trapprm);
- ret += GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)axisNum, param.Velocity * IConfig.AxisVelocityRatio);
+ trapprm.acc = optionPara.VelocityPara.Acc != 0 ? optionPara.VelocityPara.Acc : 1;
+ trapprm.dec = optionPara.VelocityPara.Dec != 0 ? optionPara.VelocityPara.Dec : 1;
- if (ret != (int)APS_Define.ResultSuccess)
+ resultCode.Add(GTSCardAPI.GT_SetTrapPrm((short)IConfig.CardNum, (short)optionPara.AxisIndex, ref trapprm));
+ resultCode.Add(GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)optionPara.AxisIndex, optionPara.VelocityPara.Velocity * IConfig.AxisVelocityRatio));
+
+ var resultOK = resultCode.All(u => u == (short)GTSRetCode.GRCRunOK);
+ if (!resultOK)
{
- throw new Exception("杞�" + axisNum + "璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛�" + ret);
+ throw new Exception("杞�" + optionPara.AxisIndex + "璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛�" + string.Join(",", resultCode));
+ }
+ return resultOK;
+ }
+
+ /// <summary>
+ /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔�
+ /// </summary>
+ /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
+ public bool SingleAxisMoving(MovingOption optionPara)
+ {
+ bool isSuccessAndStop = false;
+ if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false)
+ {
+ string _position = "";
+ string motionType = optionPara.MoveMode == EnumHelper.MotorMoveMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString();
+
+ _position = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},{optionPara.AxisIndex},{motionType},{GetPosition(optionPara.AxisIndex).ToString()},{GetPrfPosition(optionPara.AxisIndex).ToString()},{optionPara.Destination},";
+
+ switch (optionPara.MoveMode)
+ {
+ case MotorMoveMode.Normal:
+ {
+ if (_isResetting)
+ {
+ LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父");
+ return false;
+ }
+ //璁剧疆 杩愬姩鍙傛暟
+ var isSuccess = SetAxisParam(optionPara);
+ if (isSuccess)
+ {
+ if (optionPara.IsAbsolute)
+ {
+ isSuccessAndStop = MoveAbs(optionPara);
+ }
+ else
+ {
+ isSuccessAndStop = MoveRel(optionPara);
+ }
+ }
+ }
+ break;
+ case MotorMoveMode.FindOri:
+ {
+ isSuccessAndStop = GoHome(optionPara);
+ }
+ break;
+ }
+ _position += $"{GetPosition(optionPara.AxisIndex)},";
+ _position += $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}";
+ LogAsync(DateTime.Now, "", _position);
+ }
+ return isSuccessAndStop;
+ }
+
+ /// <summary>
+ /// 鑾峰彇瑙勫垝浣嶇疆锛堣鍘荤殑浣嶇疆锛�
+ /// </summary>
+ /// <param name="axisNum">Axis number</param>
+ /// <returns></returns>
+ public double GetPrfPosition(int axisNum)
+ {
+ lock (moveLock)
+ {
+ double position = 0;
+ double prfpos = 0; uint pclock = 0;
+ var ret = GTSCardAPI.GT_GetPrfPos((short)IConfig.CardNum, (short)axisNum, out prfpos, 1, out pclock);
+ if (ret != (short)GTSRetCode.GRCRunOK)
+ {
+ throw new Exception("杞�" + axisNum + "鑾峰彇瑙勫垝浣嶇疆寮傚父锛岄敊璇爜锛�" + ret);
+ }
+ position = prfpos / IConfig.AxisVelocityRatio;
+ return position;
}
}
+
+ /// <summary>
+ /// 鑾峰彇鐩墠褰撳墠浣嶇疆
+ /// </summary>
+ /// <param name="axisNum">Axis number</param>
+ /// <returns></returns>
+ public double GetPosition(int axisNum)
+ {
+ lock (moveLock)
+ {
+ double position = 0;
+ int pPos = 0;
+ var ret = GTSCardAPI.GT_GetPos((short)IConfig.CardNum, (short)axisNum, out pPos);
+ if (ret != (short)GTSRetCode.GRCRunOK)
+ {
+ throw new Exception("杞�" + axisNum + "鑾峰彇鐩爣浣嶇疆寮傚父锛岄敊璇爜锛�" + ret);
+ }
+ position = pPos / IConfig.AxisVelocityRatio;
+ return position;
+ }
+ }
+
/// <summary>
/// Set Single Axis Do Jog Move
@@ -362,7 +272,7 @@
GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)axisNum, velocity);//璁剧疆鐩爣閫熷害
int ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (axisNum - 1));//鏇存柊杞磋繍鍔�
- if (ret != (int)APS_Define.ResultSuccess)
+ if (ret != (int)GTSRetCode.GRCRunOK)
{
return false;
}
@@ -376,296 +286,173 @@
/// <returns></returns>
public bool StopJog(int axisNum)
{
- MoveStop();
- return IsStop((short)IConfig.CardNum, (short)axisNum);
+ //鍋滄杩愬姩
+ MoveStop(axisNum, 0);
+ //杩愬姩寮�濮嬪悗 妫�鏌ヨ繍鍔ㄦ槸鍚﹀仠姝�
+ bool isStop = false;
+ int repeatTime = 1000;
+ do
+ {
+ isStop = IsStop((short)IConfig.CardNum, (short)axisNum);
+ Thread.Sleep(50);
+ repeatTime--;
+ } while (!isStop && repeatTime > 0);
+
+ return isStop;
}
/// <summary>
- /// Set Single Axis Do Rel Move
+ /// 鐩稿浣嶇疆杩愬姩
/// </summary>
/// <param name="axisNum">AxisNo</param>
/// <param name="nDistance">run distance</param>
/// <returns></returns>
- public void MoveRel(int axisNum, int nDistance, int nMaxVel)
+ public bool MoveRel(MovingOption optionPara)
{
try
{
+ if (_isResetting)
+ {
+ LogAsync(DateTime.Now, "澶嶄綅杩囩▼寮傚父", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩");
+ throw new Exception("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩");
+ }
+
+ int repeatTime = 30;
+ while (CurrentState != EnumHelper.DeviceState.DSOpen && repeatTime > 0)
+ {
+ Thread.Sleep(10);
+ repeatTime--;
+ }
+
if (CurrentState == EnumHelper.DeviceState.DSExcept)
{
- LogAsync(DateTime.Now, "鏉垮崱寮傚父鐘舵��", "杞�" + axisNum + "璇曞浘寮傚父鐘舵�佽繍鍔�");
- return;
+ LogAsync(DateTime.Now, "鏉垮崱寮傚父鐘舵��", "杞�" + optionPara.AxisIndex + "璇曞浘寮傚父鐘舵�佽繍鍔�");
+ return false;
}
if (CurrentState != EnumHelper.DeviceState.DSOpen)
{
- return;
+ LogAsync(DateTime.Now, "闈炴甯哥姸鎬佸紓甯�", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�");
+ throw new Exception("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null);
}
- int currentPosition = GetPosition(axisNum);
-
- if (OnAxisStartToCheckConfliction != null && OnAxisStartToCheckConfliction.Invoke(axisNum, currentPosition, currentPosition + nDistance))
+ LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination);
+ short ret = 0;
+ repeatTime = 1000;
+ int currentPosition = (int)GetPosition(optionPara.AxisIndex);
+ int dPosition = optionPara.Destination + currentPosition;
+ do
{
- return;
- }
+ 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));//鏇存柊杩愬姩
- int ret = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)axisNum, nDistance * IConfig.AxisVelocityRatio);
+ 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);
- ret += GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (axisNum - 1));
- if (ret != (Int32)APS_Define.ResultSuccess)
+ //杩愬姩寮�濮嬪悗 妫�鏌ヨ繍鍔ㄦ槸鍚﹀仠姝�
+ bool isStop = false;
+ repeatTime = 1000;
+ do
{
- throw new Exception("杞�" + axisNum + "鍚姩鐩稿杩愬姩寮傚父锛岄敊璇爜锛�" + ret);
- }
+ isStop = IsStop((short)IConfig.CardNum, (short)optionPara.AxisIndex);
+ Thread.Sleep(50);
+ repeatTime--;
+ } while (!isStop && repeatTime > 0);
- RunFinish(axisNum, false);
+ return (ret == (short)GTSRetCode.GRCRunOK) && isStop;
}
catch (Exception ex)
{
- MoveStop();
+ AllMoveStop(true);
OnExceptionRaised?.Invoke(ex);
+ return false;
}
}
/// <summary>
- /// Set Single Axis Do Absolute Move
+ /// 缁濆浣嶇疆杩愬姩
/// </summary>
- /// <param name="axisNum">AxisNo</param>
- /// <param name="nDistance">run distance</param>
- /// <param name="nMaxVel">max velocity</param>
- /// <returns></returns>
- public void MoveAbs(int axisNum, int nPosition, int nMaxVel)
+ /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
+ public bool MoveAbs(MovingOption optionPara)
{
try
{
- ReMove:
- MoveAbsAsync(axisNum, nPosition);
-
- var runFinish = Task.Run(() => RunFinish(axisNum), axisMoveCancelDict[axisNum].Token);
- try
+ if (_isResetting)
{
- runFinish.Wait(axisMoveCancelDict[axisNum].Token);
+ LogAsync(DateTime.Now, "澶嶄綅杩囩▼寮傚父", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩");
+ throw new Exception("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩");
}
- catch (OperationCanceledException ex)
+ int repeatTime = 30;
+ while (CurrentState != EnumHelper.DeviceState.DSOpen && repeatTime > 0)
{
- goto ReMove;
+ Thread.Sleep(10);
+ repeatTime--;
+ }
+ if (CurrentState == EnumHelper.DeviceState.DSExcept)
+ {
+ LogAsync(DateTime.Now, "鏉垮崱寮傚父鐘舵��", "杞�" + optionPara.AxisIndex + "璇曞浘寮傚父鐘舵�佽繍鍔�");
+ return false;
}
- //// 鍒犻櫎璁板綍
- //if (currentCommandDic.ContainsKey(axisNum))
- //{
- // currentCommandDic.TryRemove(axisNum, out int[] temp);
- //}
+ if (CurrentState != EnumHelper.DeviceState.DSOpen)
+ {
+ LogAsync(DateTime.Now, "闈炴甯哥姸鎬佸紓甯�", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�");
+ throw new Exception("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null);
+ }
+ LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination);
+ short ret = 0;
+ repeatTime = 1000;
+ do
+ {
+ 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));//鏇存柊杩愬姩
+
+ 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);
+
+ bool isStop = false;
+ repeatTime = 1000;
+ do
+ {
+ isStop = IsStop((short)IConfig.CardNum, (short)optionPara.AxisIndex);
+ Thread.Sleep(50);
+ repeatTime--;
+ } while (!isStop && repeatTime > 0);
+
+ return (ret == (short)GTSRetCode.GRCRunOK) && isStop;
}
catch (Exception ex)
{
- MoveStop();
+ AllMoveStop(true);
OnExceptionRaised?.Invoke(ex);
- }
- }
-
- static object moveLock = new object();
-
- /// <summary>
- /// 缁濆杩愬姩锛堝紓姝ワ級
- /// </summary>
- /// <param name="axisNum"></param>
- /// <param name="nPosition"></param>
- public void MoveAbsAsync(int axisNum, int nPosition)
- {
- try
- {
- lock (moveLock)
- {
- axisImmediatePauseHandleDict[axisNum].WaitOne();
- _pauseHandle.WaitOne();
-
- int currentPosition = GetPosition(axisNum);
- if (OnAxisStartToCheckConfliction != null && OnAxisStartToCheckConfliction.Invoke(axisNum, currentPosition, nPosition))
- {
- return;
- }
-
- if (_isResetting)
- {
- LogAsync(DateTime.Now, "澶嶄綅杩囩▼寮傚父", "杞�" + axisNum + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩");
- throw new Exception("杞�" + axisNum + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩");
- }
-
- int repeatTime = 30;
- while (CurrentState != EnumHelper.DeviceState.DSOpen && repeatTime > 0)
- {
- Thread.Sleep(10);
- repeatTime--;
- }
-
- if (CurrentState == EnumHelper.DeviceState.DSExcept)
- {
- LogAsync(DateTime.Now, "鏉垮崱寮傚父鐘舵��", "杞�" + axisNum + "璇曞浘寮傚父鐘舵�佽繍鍔�");
- return;
- }
-
- if (CurrentState != EnumHelper.DeviceState.DSOpen)
- {
- LogAsync(DateTime.Now, "闈炴甯哥姸鎬佸紓甯�", "杞�" + axisNum + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�");
- throw new Exception("杞�" + axisNum + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null);
- }
-
- int ret = 0;
- repeatTime = 50;
- do
- {
- LogAsync(DateTime.Now, "杞�" + axisNum + "鍚姩杩愬姩", "鐩爣鍧愭爣锛�" + nPosition);
- ret = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)axisNum, nPosition * IConfig.AxisVelocityRatio);
-
- ret += GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (axisNum - 1));
- if (ret != (Int32)APS_Define.ResultSuccess)
- {
- LogAsync(DateTime.Now, "杞�" + axisNum + "APS_absolute_move寮傚父", "杩斿洖鍊硷細" + ret + "锛涢噸璇曟鏁帮細" + repeatTime);
- Thread.Sleep(50);
- }
- repeatTime--;
- } while (ret != (Int32)APS_Define.ResultSuccess && repeatTime > 0);
-
- if (ret != (Int32)APS_Define.ResultSuccess)
- {
- LogAsync(DateTime.Now, "杞�" + axisNum + "鍚姩缁濆杩愬姩寮傚父", "閿欒鐮侊細" + ret);
- throw new Exception("杞�" + axisNum + "鍚姩缁濆杩愬姩寮傚父锛岄敊璇爜锛�" + ret);
- }
- }
- }
- catch (Exception ex)
- {
- MoveStop();
- OnExceptionRaised?.Invoke(ex);
- }
- }
-
- Dictionary<int, AxisMovingStay> _axisStayDict = new Dictionary<int, AxisMovingStay>();
-
- private async void MoveAbsStay(int axisNum)
- {
- await Task.Run(() =>
- {
- while (CurrentState != EnumHelper.DeviceState.DSClose)
- {
- if (!_axisStayDict.ContainsKey(axisNum))
- {
- _axisStayDict[axisNum] = new AxisMovingStay();
- }
-
- _axisStayDict[axisNum].MoveHandle.WaitOne();
- MoveAbsAsync(axisNum, _axisStayDict[axisNum].Position);
- _axisStayDict[axisNum].MoveSendHandle.Set();
- }
- });
- }
-
- /// <summary>
- /// 鍔ㄤ綔缁撴潫
- /// </summary>
- /// <param name="axisNum"></param>
- /// <returns></returns>
- public void RunFinish(int axisNum, bool isAbs = true)
- {
- MOTION_IO_STATUS MotionIoSts = new MOTION_IO_STATUS();
- MOTION_BOOL_STATUS MotionSts = new MOTION_BOOL_STATUS();
- var axisSetting = IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == axisNum);
- int startTime = System.Environment.TickCount;
-
- //MDN淇″彿
- if (axisSetting.IsUseMDNStopSignal)
- {
- while (GetMotionIoStatus(axisNum, ref MotionIoSts) && GetMotionStatus(axisNum, ref MotionSts))
- {
- if (MotionIoSts.EMG)
- {
- LogAsync(DateTime.Now, "杞�" + axisNum + "鎬ュ仠", "");
- throw new Exception("杞�" + axisNum + "鎬ュ仠");
- }
-
- if (MotionSts.MDN)
- {
- int stopCode = -1;
- APS168.APS_get_stop_code(axisNum, ref stopCode);
-
- LogAsync(DateTime.Now, "杞�" + axisNum + "StopCode锛�", stopCode.ToString());
-
- //0 姝e父鍋滄 4 姝f瀬闄� 5 璐熸瀬闄�
- if (new List<int>() { 0, 4, 5 }.Contains(stopCode))
- {
- if (new List<int>() { 4, 5 }.Contains(stopCode) && axisSetting.IsUseWarning)
- {
- MoveStop(true);
- OnExceptionRaised?.Invoke(new Exception("杞�" + axisNum + "杩愬姩鑷虫瀬闄愪綅缃紝stopCode锛�" + stopCode.ToString(), null));
- return;
- }
- if (IConfig.ActionAfterDelay > 0)
- {
- Thread.Sleep(IConfig.ActionAfterDelay);
- }
-
- int feedBack = 0;
- GetPosition(axisNum, ref feedBack);
- LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩缁撴潫", "褰撳墠浣嶇疆锛�" + feedBack);
- break;
- }
- }
-
- }
- }
- else //INP淇″彿
- {
- while (GetMotionIoStatus(axisNum, ref MotionIoSts) && GetMotionStatus(axisNum, ref MotionSts))
- {
- if (MotionIoSts.EMG)
- {
- LogAsync(DateTime.Now, "杞�" + axisNum + "鎬ュ仠", "");
- throw new Exception("杞�" + axisNum + "鎬ュ仠");
- }
-
-
- if (MotionSts.MDN && MotionIoSts.INP)
- {
- int stopCode = -1;
- APS168.APS_get_stop_code(axisNum, ref stopCode);
-
- LogAsync(DateTime.Now, "杞�" + axisNum + "StopCode锛�", stopCode.ToString());
-
- //0 姝e父鍋滄 4 姝f瀬闄� 5 璐熸瀬闄�
- if (new List<int>() { 0, 4, 5 }.Contains(stopCode))
- {
- if (new List<int>() { 4, 5 }.Contains(stopCode) && axisSetting.IsUseWarning)
- {
- MoveStop(true);
- OnExceptionRaised?.Invoke(new AMPRunException("杞�" + axisNum + "杩愬姩鑷虫瀬闄愪綅缃紝stopCode锛�" + stopCode.ToString(), null));
- return;
- }
-
- if (IConfig.ActionAfterDelay > 0)
- {
- Thread.Sleep(IConfig.ActionAfterDelay);
- }
-
- int feedBack = 0;
- GetPosition(axisNum, ref feedBack);
- LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩缁撴潫", "褰撳墠浣嶇疆锛�" + feedBack);
- break;
- }
- }
-
- }
+ return false;
}
}
/// <summary>
- /// Stop single axis move
+ /// 杩愬姩鍋滄
/// </summary>
/// <param name="axisNum">axisNo</param>
/// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param>
/// <returns></returns>
public void MoveStop(int axisNum, int option)
{
- int ret = GTSCardAPI.GT_Stop((short)IConfig.CardNum, 1 << (axisNum - 1), option);
- if (ret != (Int32)APS_Define.ResultSuccess)
+ 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);
@@ -676,74 +463,13 @@
}
}
- static object motionIOLock = new object();
/// <summary>
- /// Get single Axis Motion_Io status and motion status
+ /// 鎵�鏈夊紑鍚殑杞村叧闂�
/// </summary>
- /// <param name="nAxis"></param>
- /// <param name="nMotionSts"></param>
- /// <returns></returns>
- public bool GetMotionStatus(int nAxis, ref MOTION_BOOL_STATUS strcMotionSts)
+ /// <param name="emergencyStop"></param>
+ public void AllMoveStop(bool emergencyStop = false)
{
- lock (motionIOLock)
- {
- int nMotionSts = 0;
- nMotionSts = APS168.APS_motion_status(nAxis);
- if (nMotionSts < 0)
- {
- return false;
- }
- strcMotionSts.ASTP = Convert.ToBoolean(nMotionSts & (1 << (int)MOTION_STATUS.ASTP));
- strcMotionSts.HMV = Convert.ToBoolean(nMotionSts & (1 << (int)MOTION_STATUS.HMV));
- strcMotionSts.MDN = Convert.ToBoolean(nMotionSts & (1 << (int)MOTION_STATUS.MDN));
- strcMotionSts.DIR = Convert.ToBoolean(nMotionSts & (1 << (int)MOTION_STATUS.DIR));
- }
- return true;
- }
-
- /// <summary>
- /// Get single Axis Motion_Io status and motion status
- /// </summary>
- /// <param name="nAxis"></param>
- /// <param name="nMotionIoSts"></param>
- /// <returns></returns>
- public bool GetMotionIoStatus(int nAxis, ref MOTION_IO_STATUS strcMotionIoSts)
- {
- lock (motionIOLock)
- {
- //Thread.Sleep(15);
- int nMotionIoSts = 0;
- nMotionIoSts = APS168.APS_motion_io_status(nAxis);
- if (nMotionIoSts < 0)
- {
- return false;
- }
-
- bool isAlarm = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.ALM));
- if (strcMotionIoSts.ALM != isAlarm)
- {
- strcMotionIoSts.ALM = isAlarm;
- OnMotionAlarm?.Invoke(nAxis, isAlarm);
- }
-
- strcMotionIoSts.PEL = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.PEL));
- strcMotionIoSts.MEL = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.MEL));
- strcMotionIoSts.ORG = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.ORG));
- strcMotionIoSts.EMG = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.EMG));
- strcMotionIoSts.INP = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.INP));
- strcMotionIoSts.SVON = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.SVON));
- }
- return true;
- }
-
- public void MoveStop(bool emergencyStop = false)
- {
- int option = 0;
- if (emergencyStop)
- {
- option = 1;
- StateChange(EnumHelper.DeviceState.DSExcept);
- }
+ int option = emergencyStop ? 1 : 0;
IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum =>
{
@@ -754,237 +480,53 @@
/// <summary>
/// 鍥炲師鐐�
/// </summary>
- /// <param name="cardn">鍗″彿</param>
+ /// <param name="movingOption">鍗″彿</param>
/// <param name="axisn">杞村彿</param>
/// <param name="homests">杞村洖鍘熺偣鐘舵��</param>
- public bool GoHome(short cardn, short axisn, short home_mode, short home_dir, int homeoffset)
+ public bool GoHome(MovingOption movingOption)
{
try
{
- GTSCardAPI.GT_ZeroPos(cardn, axisn, 1);
+ GTSCardAPI.GT_ZeroPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, 1);
GTSCardAPI.THomePrm thomeprm;
GTSCardAPI.THomeStatus homests;
- short rtn = GTSCardAPI.GT_GetHomePrm(cardn, axisn, out thomeprm);
- thomeprm.mode = home_mode;//鍥為浂鏂瑰紡
- thomeprm.moveDir = home_dir;//鍥為浂鏂瑰悜
- thomeprm.edge = 0;
- thomeprm.velHigh = 50;
- thomeprm.velLow = 50;
- thomeprm.acc = 50;
- thomeprm.dec = 50;
- thomeprm.searchHomeDistance = 9999999;//鎼滄悳璺濈
- thomeprm.homeOffset = 0; //鍋忕Щ璺濈
- thomeprm.escapeStep = 1000;
- rtn = GTSCardAPI.GT_GoHome(cardn, axisn, ref thomeprm); //鍚姩鍥為浂
+ short rtn = GTSCardAPI.GT_GetHomePrm((short)IConfig.CardNum, (short)movingOption.AxisIndex, out thomeprm);
+ thomeprm.mode = movingOption.GoHomePara.HomeMode;//鍥為浂鏂瑰紡
+ thomeprm.moveDir = movingOption.GoHomePara.HomeDir;//鍥為浂鏂瑰悜
+ thomeprm.edge = movingOption.GoHomePara.Edge;
+ thomeprm.velHigh = movingOption.GoHomePara.HighVelocity;
+ thomeprm.velLow = movingOption.GoHomePara.LowVelocity;
+ thomeprm.acc = movingOption.VelocityPara.Acc;
+ thomeprm.dec = movingOption.VelocityPara.Dec;
+ thomeprm.searchHomeDistance = movingOption.GoHomePara.SearchHomeDistance;//鎼滄悳璺濈
+ thomeprm.homeOffset = movingOption.GoHomePara.HomeOffset; //鍋忕Щ璺濈
+ thomeprm.escapeStep = movingOption.GoHomePara.EscapeStep;
+ rtn = GTSCardAPI.GT_GoHome((short)IConfig.CardNum, (short)movingOption.AxisIndex, ref thomeprm); //鍚姩鍥為浂
- while (true)
+ bool isStop = false;
+ int repeatTime = 1000;
+ do
{
- Thread.Sleep(5);
- GTSCardAPI.GT_GetHomeStatus(cardn, axisn, out homests);
- if (homests.run == 0)
+ Thread.Sleep(10);
+ GTSCardAPI.GT_GetHomeStatus((short)IConfig.CardNum, (short)movingOption.AxisIndex, out homests);
+
+ isStop = homests.run == 0;
+ if (isStop && homests.error == 0)
{
- if (homests.error == 0)
- {
- Thread.Sleep(200);
- GTSCardAPI.GT_ZeroPos(cardn, axisn, 1);
- }
- return true;
+ Thread.Sleep(200);
+ GTSCardAPI.GT_ZeroPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, 1);
}
- }
+ repeatTime--;
+ } while (!isStop && repeatTime > 0);
+
+ return isStop;
}
catch (Exception ex)
{
- MoveStop();
+ AllMoveStop(true);
OnExceptionRaised?.Invoke(ex);
return false;
}
- }
-
- /// <summary>
- /// 鍥炲師鐐�
- /// </summary>
- /// <param name="axisId"></param>
- public void StartHoming(int axisId)
- {
- try
- {
- //servo on
- APS168.APS_set_servo_on(axisId, 1);
- Thread.Sleep(500); // Wait stable.
-
- // 2. Start home move
- APS168.APS_home_move(axisId);
-
- WaitHomeFinish(axisId);
-
- axisDestination[axisId] = 0;
- }
- catch (Exception ex)
- {
- MoveStop();
- OnExceptionRaised?.Invoke(ex);
- }
- }
-
- /// <summary>
- /// 鍥炲師鐐�
- /// </summary>
- /// <param name="axisId"></param>
- /// <param name="homeMode"></param>
- /// <param name="homeDir"></param>
- /// <param name="praCurve"></param>
- /// <param name="praAcc"></param>
- /// <param name="praVm"></param>
- public void StartHoming(int axisId, int homeMode, int homeDir, double praCurve, double praAcc, double praVm)
- {
- // 1. Select home mode and config home parameters
- APS168.APS_set_axis_param(axisId, (Int32)APS_Define.PRA_HOME_MODE, homeMode); // Set home mode
- APS168.APS_set_axis_param(axisId, (Int32)APS_Define.PRA_HOME_DIR, homeDir); // Set home direction
- APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_CURVE, praCurve); // Set acceleration paten (T-curve)
- APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_ACC, praAcc); // Set homing acceleration rate
- APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_VM, praVm); // Set homing maximum velocity.
- APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_VO, praVm / 5); // Set homing VO speed
- APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_EZA, 0); // Set EZ signal alignment (yes or no)
- APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_SHIFT, 0); // Set home position shfit distance.
- APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_POS, 0); // Set final home position.
-
- StartHoming(axisId);
- }
-
- /// <summary>
- /// 鍥炲師鐐圭粨鏉�
- /// </summary>
- /// <param name="axisNum"></param>
- /// <returns></returns>
- public void WaitHomeFinish(int axisNum)
- {
- MOTION_IO_STATUS MotionIoSts = new MOTION_IO_STATUS();
- MOTION_BOOL_STATUS MotionSts = new MOTION_BOOL_STATUS();
- var axisSetting = IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == axisNum);
- int startTime = System.Environment.TickCount;
- while ((GetMotionIoStatus(axisNum, ref MotionIoSts)) && (GetMotionStatus(axisNum, ref MotionSts)))
- {
- if (MotionIoSts.EMG)
- {
- LogAsync(DateTime.Now, "杞村浣嶄腑" + axisNum + "鎬ュ仠", "");
- throw new Exception("杞村浣嶄腑" + axisNum + "鎬ュ仠");
- }
-
- if (axisSetting.HomeMode == 0)
- {
- if (!MotionSts.HMV && MotionIoSts.ORG)
- break;
- }
- else
- {
- if (!MotionSts.HMV)
- break;
- }
-
- if (axisSetting.TimeOutHome < System.Environment.TickCount - startTime)
- {
- LogAsync(DateTime.Now, "杞村浣嶄腑" + axisNum + "鍥炲師鐐硅秴鏃�", "");
- MoveStop(axisNum);
- throw new Exception("杞村浣嶄腑" + axisNum + "鍥炲師鐐硅秴鏃�");
- }
- }
-
- //ClearPosition(axisNum);
- }
-
- static object _ioLock = new object();
- /// <summary>
- /// 璁剧疆IO鍗¤緭鍑�
- /// </summary>
- /// <param name="DINo">IO绔彛搴忓彿</param>
- /// <param name="Value">璁剧疆鍊�(true:楂樼數骞筹紝 false:浣庣數骞�)</param>
- /// <returns></returns>
- public bool SetOutput(int DINo, bool Value)
- {
- if (OnCheckOutputAllowed?.Invoke(DINo, Value, new Dictionary<int, int>(axisDestination.ToDictionary(u => u.Key, u => u.Value))) ?? false)
- {
- OnExceptionRaised?.Invoke(new AMPRunException(DINo + "杈撳嚭" + Value.ToString() + "涓嶈鍏佽", null));
- return false;
- }
-
- int ret = -1;
- lock (_ioLock)
- {
- ret = APS168.APS_write_d_channel_output(0, 0, DINo, Value ? 1 : 0);
- }
- if (ret < 0)
- {
- return false;
- }
- return true;
- }
-
- /// <summary>
- /// 鑾峰彇杈撳叆淇″彿
- /// </summary>
- /// <param name="stateType"></param>
- /// <returns></returns>
- public bool[] GetInputState()
- {
- int diVaule = 0;
-
- lock (_ioLock)
- {
- APS168.APS_read_d_input(0, 0, ref diVaule);
- }
- return GetBoolSig(diVaule);
- //return new bool[16];
- }
-
- /// <summary>
- /// 鑾峰彇杈撳嚭淇″彿
- /// </summary>
- /// <param name="stateType"></param>
- /// <returns></returns>
- public bool[] GetOutputState()
- {
- int doVaule = 0;
-
- lock (_ioLock)
- {
- APS168.APS_read_d_output(0, 0, ref doVaule);
- }
-
- return GetBoolSig(doVaule);
-
- }
-
- /// <summary>
- /// 灏嗘棤绗﹀彿鏁村瀷杞崲涓築ool鍨嬫暟缁�
- /// </summary>
- /// <param name="sigStr"></param>
- /// <returns></returns>
- private bool[] GetBoolSig(int sigStr)
- {
- bool[] state = new bool[32];
-
- for (int i = 0; i < 32; i++)
- {
- state[i] = (sigStr & (1 << i)) != 0;
- }
- return state;
- }
-
- /// <summary>
- /// 灏哹ool鏁扮粍杞崲鎴愭棤绗﹀彿鏁村瀷
- /// </summary>
- /// <param name="sigArray"></param>
- /// <returns></returns>
- private int GetintSig(bool[] sigArray)
- {
- int state = -1;
-
- for (int i = 31; i > -1; i--)
- {
- state = (state << 1) + (sigArray[i] ? 1 : 0);
- }
-
- return state;
}
/// <summary>
@@ -1023,31 +565,6 @@
/// <summary>
/// 鍋滄 鏌愪釜杞�
/// </summary>
- /// <param name="cardNum">鍗″彿</param>
- /// <param name="axisNum">杞村彿</param>
- /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param>
- public void Stop(short cardNum, short axisNum, short option)
- {
- GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), option);
- }
-
- /// <summary>
- /// 鍋滄 鏌愪釜杞达紙寮傛锛�
- /// </summary>
- /// <param name="cardNum">鍗″彿</param>
- /// <param name="axisNum">杞村彿</param>
- /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param>
- public async Task StopAsync(short cardNum, short axisNum, short option)
- {
- await Task.Run(() =>
- {
- GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), option);
- });
- }
-
- /// <summary>
- /// 鍋滄 鏌愪釜杞�
- /// </summary>
/// <param name="cardNum"></param>
/// <param name="axisNum">杞村彿</param>
/// <param name="value">鍋滄鏂瑰紡锛宖alse琛ㄧず骞虫粦鍋滄锛宼rue琛ㄧず绱ф�ュ仠姝�</param>
@@ -1060,19 +577,6 @@
else
{
GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), 0);
- }
- }
-
- /// <summary>
- /// 鍋滄 鍏ㄩ儴杞�
- /// </summary>
- /// <param name="cardNum"></param>
- /// <param name="value">鍋滄鏂瑰紡锛宖alse琛ㄧず骞虫粦鍋滄锛宼rue琛ㄧず绱ф�ュ仠姝�</param>
- public void StopAll(short cardNum, bool value)
- {
- for (short i = 1; i <= GTSCardParameter.AxisCount; i++)
- {
- Stop(cardNum, i, value);
}
}
@@ -1111,34 +615,15 @@
else return false;
}
-
-
-
- /// <summary>
- /// 璇诲彇褰撳墠鍊�
- /// </summary>
- /// <param name="cardNum">鍗″彿</param>
- /// <param name="axisNum">杞村彿</param>
- /// <returns>杩斿洖褰撳墠鍊硷紝鍗曚綅姣背</returns>
- public double GetPosMM(short cardNum, short axisNum)
- {
- lock (lockObj)
- {
- double prfpos = 0; uint pclock = 0;
- GTSCardAPI.GT_GetPrfPos(cardNum, axisNum, out prfpos, 1, out pclock);
- return prfpos / IConfig.AxisVelocityRatio;
- }
- }
-
/// <summary>
/// 璇诲彇杞寸姸鎬侊紝鍒ゆ柇鐢垫満鏄惁鍋滄
/// </summary>
- /// <param name="cardNum"></param>
- /// <param name="axisNum"></param>
+ /// <param name="cardNum">鏉垮崱鍙�</param>
+ /// <param name="axisNum">杞村彿</param>
/// <returns></returns>
public bool IsStop(short cardNum, short axisNum)
{
- lock (lockObj)
+ lock (moveLock)
{
int sts = 0;
uint pclock = 0;
@@ -1147,6 +632,7 @@
else return false; //杩愯涓繑鍥瀎alse
}
}
+
#endregion
public void Monitor()
@@ -1158,5 +644,7 @@
{
throw new NotImplementedException();
}
+
+
}
}
--
Gitblit v1.8.0