From 328d4212fdacd1d6b3a907d680f7b26fb06cf888 Mon Sep 17 00:00:00 2001 From: xcd <834800634@qq.com> Date: 星期二, 30 六月 2020 16:23:11 +0800 Subject: [PATCH] Merge branch 'master' of http://gitblit.broconcentric.com:8088/r/M071 --- src/Bro.Device.GTSCard/GTSCardDriver.cs | 321 +++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 222 insertions(+), 99 deletions(-) diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs index ffe11a6..e96d00c 100644 --- a/src/Bro.Device.GTSCard/GTSCardDriver.cs +++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs @@ -33,29 +33,6 @@ } } - static Dictionary<int, object> axisMoveLockDict = new Dictionary<int, object>(); - - /// <summary> - /// 杞磋繍鍔ㄥ紑濮嬫椂鐨勬娴嬶紝true:鏈夊啿绐� 涓嶅彲缁х画鎵ц false锛氭棤鍐茬獊,鍙户缁墽琛� - /// </summary> - public event OnAxisStartToCheckDelegate OnAxisStartToCheckConfliction; - /// <summary> - /// 鏆傚仠锛堢嚎绋嬪悓姝ヤ簨浠讹級 - /// </summary> - Dictionary<int, ManualResetEvent> axisImmediatePauseHandleDict = new Dictionary<int, ManualResetEvent>(); - Dictionary<int, CancellationTokenSource> axisMoveCancelDict = new Dictionary<int, CancellationTokenSource>(); - /// <summary> - /// 杩愯杩囩▼涓殑绾跨▼绛夊緟 - /// </summary> - private Dictionary<int, ManualResetEvent> runningEventDic = new Dictionary<int, ManualResetEvent>(); - private Dictionary<int, AutoResetEvent> axisMovingHandleDict = new Dictionary<int, AutoResetEvent>(); - private ConcurrentDictionary<int, int> axisDestination = new ConcurrentDictionary<int, int>(); - - private ObservableCollection<int> _commandAxisList = new ObservableCollection<int>(); - public Action<bool> CommandAxisCountChangedAction = null; - private Dictionary<int, VelocityPara> velIndexDict = new Dictionary<int, VelocityPara>(); - ManualResetEvent _pauseHandle = new ManualResetEvent(true); - static object moveLock = new object(); /// <summary> /// 鏄惁澶嶄綅鏍囧織 @@ -79,7 +56,6 @@ InitialMotionCard(); } - protected override void Pause() { throw new NotImplementedException(); @@ -92,12 +68,13 @@ protected override void Start() { - throw new NotImplementedException(); + AllAxisOn(); } protected override void Stop() { - throw new NotImplementedException(); + AllMoveStop(); + AllAxisOff(); } #endregion @@ -119,6 +96,60 @@ } } + 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> /// 鐐逛綅鍒扮偣浣嶈繍鍔� /// </summary> @@ -128,22 +159,33 @@ { bool resultOK = false; var gtsOperationConfig = opConfig as GTSCardOperationConfig; + List<Task<bool>> taskList = new List<Task<bool>>(); + //TaskFactory factory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); + // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱杩愬姩缁撴潫 foreach (var movingOp in gtsOperationConfig.MovingOps) { - resultOK = SingleAxisMoving(movingOp); + //var task = factory.StartNew<bool>((op) => + //{ + // return SingleAxisMoving(op as MovingOption); + //}, movingOp); + var task = SingleAxisMoving(movingOp); + taskList.Add(task); } + Task.WaitAll(taskList.ToArray()); + resultOK = taskList.All(u => u.GetAwaiter().GetResult()); + return resultOK; } /// <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; @@ -162,54 +204,59 @@ } /// <summary> - /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔� + /// 鍗曚釜杞� 杩愬姩(鐐瑰埌鐐� jog 鍥為浂...锛� /// </summary> /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param> - public bool SingleAxisMoving(MovingOption optionPara) + public async Task<bool> SingleAxisMoving(MovingOption optionPara) { - bool isSuccessAndStop = false; - if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false) + return await Task.Run(() => { - 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) + bool isSuccessAndStop = false; + if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false) { - case MotorMoveMode.Normal: - { - if (_isResetting) + 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: { - LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父"); - return false; - } - //璁剧疆 杩愬姩鍙傛暟 - var isSuccess = SetAxisParam(optionPara); - if (isSuccess) - { + if (_isResetting) + { + LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父"); + return false; + } + if (optionPara.IsAbsolute) { - isSuccessAndStop = MoveAbs(optionPara); + isSuccessAndStop = P2PMoveAbs(optionPara); } else { - isSuccessAndStop = MoveRel(optionPara); + isSuccessAndStop = P2PMoveRel(optionPara); } + } - } - break; - case MotorMoveMode.FindOri: - { - isSuccessAndStop = GoHome(optionPara); - } - break; + break; + case MotorMoveMode.FindOri: + { + isSuccessAndStop = GoHome(optionPara); + } + break; + case MotorMoveMode.Jog: + { + isSuccessAndStop = JogMove(optionPara); + } + break; + } + _position += $"{GetPosition(optionPara.AxisIndex)},"; + _position += $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}"; + LogAsync(DateTime.Now, "", _position); } - _position += $"{GetPosition(optionPara.AxisIndex)},"; - _position += $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}"; - LogAsync(DateTime.Now, "", _position); - } - return isSuccessAndStop; + return isSuccessAndStop; + }); } /// <summary> @@ -262,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> @@ -307,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 { @@ -338,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));//鏇存柊杩愬姩 @@ -352,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; @@ -378,7 +445,7 @@ /// 缁濆浣嶇疆杩愬姩 /// </summary> /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param> - public bool MoveAbs(MovingOption optionPara) + public bool P2PMoveAbs(MovingOption optionPara) { try { @@ -406,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));//鏇存柊杩愬姩 @@ -418,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; @@ -445,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> @@ -642,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