From b5e7fa2db4ac36fdb7bf9fd330d12a72ade9d483 Mon Sep 17 00:00:00 2001 From: patrick.xu <patrick.xu@broconcentric.com> Date: 星期日, 24 一月 2021 15:07:26 +0800 Subject: [PATCH] 0124 --- src/Bro.Device.GTSCard/GTSCardDriver.cs | 996 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 749 insertions(+), 247 deletions(-) diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs index b8e668e..25ec672 100644 --- a/src/Bro.Device.GTSCard/GTSCardDriver.cs +++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs @@ -21,7 +21,7 @@ public class GTSCardDriver : MotionCardBase { // 寮傚父浜嬩欢 - public Action<Exception> OnExceptionRaised; + //public Action<Exception> OnExceptionRaised; public GTSCardInitialConfig IIConfig { @@ -37,6 +37,20 @@ /// </summary> bool _isResetting = false; + /// <summary> + /// 鏄惁鏆傚仠涓� + /// </summary> + bool _isPause = false; + + /// <summary> + /// 杩愬姩杞寸珛鍗虫殏鍋� + /// </summary> + Dictionary<int, ManualResetEvent> axisImmediatePauseHandleDict = new Dictionary<int, ManualResetEvent>(); + Dictionary<int, bool> axisImmediatePauseFlag = new Dictionary<int, bool>(); + Dictionary<int, bool> axisPauseResumeFlag = new Dictionary<int, bool>(); + + //Dictionary<int, CancellationTokenSource> axisMoveCancelDict = new Dictionary<int, CancellationTokenSource>(); + public void SetResetFlag(bool isReset) { _isResetting = isReset; @@ -44,7 +58,17 @@ public override List<AxisInfo> GetCurrentAxisInfo(params string[] axisName) { - throw new NotImplementedException(); + List<AxisInfo> axisInfos = new List<AxisInfo>(); + IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled).ForEach(axisSetting => + { + AxisInfo axisInfo = new AxisInfo(); + axisInfo.AxisName = axisSetting.AxisName; + var axisMovingStatus = AxisStatusList.FirstOrDefault(u => u.AxisIndex == axisSetting.AxisIndex); + axisInfo.AxisLocation = axisMovingStatus == null ? 0 : Convert.ToDouble(axisMovingStatus.CurPosition); + + axisInfos.Add(axisInfo); + }); + return axisInfos; } #region DeviceBase @@ -52,21 +76,33 @@ protected override void Init() { InitialMotionCard(); + axisImmediatePauseHandleDict = IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled).ToDictionary(a => a.AxisIndex, a => new ManualResetEvent(true)); + //axisMoveCancelDict = IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled).ToDictionary(a => a.AxisIndex, a => new CancellationTokenSource()); + + //axisMoveCancelDict.Values.ToList().ForEach(c => + //{ + // c = new CancellationTokenSource(); + //}); } protected override void Pause() { - throw new NotImplementedException(); + } protected override void Resume() { - throw new NotImplementedException(); + } protected override void Start() { AllAxisOn(); + + MonitorPosition(); + MonitorAxisStatus(); + + base.Start(); } protected override void Stop() @@ -76,29 +112,60 @@ } /// <summary> - /// 璁惧 杩愯 + /// 璁惧 杩愯锛堟墽琛� 鏉垮崱绯诲垪鐨勬搷浣滅殑 闆嗗悎锛� /// </summary> /// <param name="config"></param> /// <returns></returns> public override ResponseMessage Run(IOperationConfig config) { ResponseMessage responseMessage = new ResponseMessage(); - var opConfig = config as GTSCardOperationConfig; + if (config is MotionCardOperationConfigBase motionCardOperationConfig) + { + foreach (var operationSet in motionCardOperationConfig.OperationCollection) + { + if (operationSet.DelayBefore > 0) + Thread.Sleep(operationSet.DelayBefore); + + responseMessage = RunOperationSet(operationSet); + if (!responseMessage.Result) + { + return responseMessage; + } + + if (operationSet.DelayAfter > 0) + Thread.Sleep(operationSet.DelayAfter); + } + } + return responseMessage; + } + + /// <summary> + /// 鎵ц 涓�涓郴鍒楃殑鎿嶄綔 + /// </summary> + private ResponseMessage RunOperationSet(MotionCardOperationSet operationSet) + { + ResponseMessage responseMessage = new ResponseMessage(); // 1.棰勬鏌� if (CurrentState == DeviceState.DSOpen) { - foreach (var preCheck in opConfig.PreCheckIOCollection) + foreach (var preCheck in operationSet.PreCheckIOCollection) { - int timeout = opConfig.PreCheckIOTimeout; - int? ioData = null; - while (CurrentState == DeviceState.DSOpen) + _pauseHandle.Wait(); + + IOValue? ioData = null; + if (CurrentState == DeviceState.DSOpen) { - Thread.Sleep(10); - ioData = MonitorValues.FirstOrDefault(u => u.IONum == preCheck.IOItem.IONum && u.IOType == preCheck.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇 - timeout -= 10; - if (preCheck.CheckValue == ioData || (opConfig.PreCheckIOTimeout > 0 && timeout < 0)) + int timeout = operationSet.PreCheckIOTimeout; + + while (CurrentState == DeviceState.DSOpen) { - break; + Thread.Sleep(10); + ioData = MonitorValues.FirstOrDefault(u => u.IONum == preCheck.IOItem.IONum && u.IOType == preCheck.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇 + timeout -= 10; + if (preCheck.CheckValue == ioData || (operationSet.PreCheckIOTimeout > 0 && timeout < 0)) + { + break; + } } } @@ -114,11 +181,15 @@ // 2.鏉垮崱杩愬姩 if (CurrentState == DeviceState.DSOpen) { - responseMessage = MoveToPoint(opConfig); + _pauseHandle.Wait(); - if (!responseMessage.Result) + if (CurrentState == DeviceState.DSOpen) { - return responseMessage; + responseMessage = MoveToPoint(new MotionOperationCollection() { MovingOps = operationSet.MovingOps }); + if (!responseMessage.Result) + { + return responseMessage; + } } } @@ -126,14 +197,23 @@ // 3.IO杈撳嚭 涓嶉渶瑕佽秴鏃� if (CurrentState == DeviceState.DSOpen) { - foreach (var ioOutput in opConfig.IOOutputCollection) + + foreach (var ioOutput in operationSet.IOOutputCollection) { - var ioData = MonitorValues.FirstOrDefault(u => u.IONum == ioOutput.IOItem.IONum && u.IOType == ioOutput.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇 - if (ioOutput.CheckValue != ioData) + _pauseHandle.Wait(); + + if (CurrentState == DeviceState.DSOpen) { - responseMessage.Result = false; - responseMessage.Message = $"IO杈撳嚭涓嶉�氳繃锛岄厤缃細{ioOutput.GetDisplayText()}锛屽綋鍓嶅�硷細{ioData}"; - return responseMessage; + WriteOutput((short)ioOutput.IOItem.IONum, ioOutput.CheckValue); + + //var ioData = MonitorValues.FirstOrDefault(u => u.IONum == ioOutput.IOItem.IONum && u.IOType == ioOutput.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇 + + //if (ioOutput.CheckValue != ioData) + //{ + // responseMessage.Result = false; + // responseMessage.Message = $"IO杈撳嚭涓嶉�氳繃锛岄厤缃細{ioOutput.GetDisplayText()}锛屽綋鍓嶅�硷細{ioData}"; + // return responseMessage; + //} } } } @@ -141,16 +221,16 @@ // 4.IO纭 if (CurrentState == DeviceState.DSOpen) { - foreach (var ioConfirm in opConfig.IOConfirmCollection) + foreach (var ioConfirm in operationSet.IOConfirmCollection) { - int timeout = opConfig.IOConfirmTimeout; - int? ioData = null; + int timeout = operationSet.IOConfirmTimeout; + IOValue? ioData = null; while (CurrentState == DeviceState.DSOpen) { Thread.Sleep(10); ioData = MonitorValues.FirstOrDefault(u => u.IONum == ioConfirm.IOItem.IONum && u.IOType == ioConfirm.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇 timeout -= 10; - if (ioConfirm.CheckValue == ioData || (opConfig.IOConfirmTimeout > 0 && timeout < 0)) + if (ioConfirm.CheckValue == ioData || (operationSet.IOConfirmTimeout > 0 && timeout < 0)) { break; } @@ -169,6 +249,51 @@ } #endregion + #region ImmediatePause + ManualResetEventSlim _pauseHandle = new ManualResetEventSlim(true); + + /// <summary> + /// 鍚姩绔嬪嵆鏆傚仠 + /// </summary> + public override void SetImmediatePause() + { + if (!_isResetting) + { + var immediatePauseAxis = IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled && a.IsImmediatePause).Select(u => u.AxisIndex).ToList(); + _pauseHandle.Reset(); + immediatePauseAxis.ForEach(async axisIndex => + { + axisImmediatePauseHandleDict[axisIndex].Reset(); + axisImmediatePauseFlag[axisIndex] = true; + + await MoveStop(axisIndex, 0);//鎵�鏈夎酱閮芥殏鍋� + }); + } + } + + /// <summary> + /// 鎭㈠绔嬪嵆鏆傚仠 + /// </summary> + public override void ResetImmediatePause(bool isResumeMoving) + { + var immediatePauseAxis = IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled && a.IsImmediatePause).Select(u => u.AxisIndex).ToList(); + _pauseHandle.Set(); + immediatePauseAxis.ForEach(axisIndex => + { + axisImmediatePauseFlag[axisIndex] = false; + axisImmediatePauseHandleDict[axisIndex].Set(); + if (isResumeMoving) + { + axisPauseResumeFlag[axisIndex] = true; + } + else + { + axisPauseResumeFlag[axisIndex] = false; + } + }); + } + #endregion + #region GTSCard /// <summary> @@ -180,21 +305,21 @@ { 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); + ClearStatus(1, IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled).Count); if (res != (short)GTSRetCode.GRCRunOK) { - throw new Exception("鏉垮崱杞藉叆閰嶇疆鏂囦欢寮傚父锛岄敊璇爜锛�" + res); + throw new ProcessException("鏉垮崱杞藉叆閰嶇疆鏂囦欢寮傚父锛岄敊璇爜锛�" + res); } } - public bool AllAxisOn() + public override bool AllAxisOn() { List<Task<bool>> taskList = new List<Task<bool>>(); ; // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱寮�鍚� - IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum => + IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled).ForEach(axisNum => { - var task = AxisOnAsync((short)IConfig.CardNum, (short)axisNum.AxisIndex); + var task = AxisOnAsync(axisNum.AxisIndex); taskList.Add(task); }); Task.WaitAll(taskList.ToArray()); @@ -202,13 +327,13 @@ return resultOK; } - public bool AllAxisOff() + public override bool AllAxisOff() { List<Task<bool>> taskList = new List<Task<bool>>(); ; // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱鍏抽棴 - IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum => + IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled).ForEach(axisNum => { - var task = AxisOffAsync((short)IConfig.CardNum, (short)axisNum.AxisIndex); + var task = AxisOffAsync(axisNum.AxisIndex); taskList.Add(task); }); Task.WaitAll(taskList.ToArray()); @@ -220,11 +345,11 @@ /// 鍗曚釜杞村紑鍚� /// </summary> /// <returns></returns> - public async Task<bool> AxisOnAsync(short cardNum, short axisNum) + public override async Task<bool> AxisOnAsync(int axisNum) { return await Task.Run(() => { - var ret = GTSCardAPI.GT_AxisOn(cardNum, axisNum); + var ret = GTSCardAPI.GT_AxisOn((short)IConfig.CardNum, (short)axisNum); return ret == (short)GTSRetCode.GRCRunOK; }); } @@ -233,11 +358,11 @@ /// 鍗曚釜杞村叧闂� /// </summary> /// <returns></returns> - public async Task<bool> AxisOffAsync(short cardNum, short axisNum) + public override async Task<bool> AxisOffAsync(int axisNum) { return await Task.Run(() => { - var ret = GTSCardAPI.GT_AxisOff(cardNum, axisNum); + var ret = GTSCardAPI.GT_AxisOff((short)IConfig.CardNum, (short)axisNum); return ret == (short)GTSRetCode.GRCRunOK; }); } @@ -250,24 +375,20 @@ public override ResponseMessage MoveToPoint(IOperationConfig opConfig) { ResponseMessage responseMessage = new ResponseMessage(); - 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) + if (opConfig is MotionOperationCollection gtsOperationCollection) { - //var task = factory.StartNew<bool>((op) => - //{ - // return SingleAxisMoving(op as MovingOption); - //}, movingOp); - var task = SingleAxisMoving(movingOp); - taskList.Add(task); - } - Task.WaitAll(taskList.ToArray()); - responseMessage.Result = taskList.All(u => u.GetAwaiter().GetResult()); - if (!responseMessage.Result) - { - responseMessage.Message = $"鐐逛綅杩愬姩寮傚父"; + List<bool> resultList = new List<bool>(); + Parallel.ForEach(gtsOperationCollection.MovingOps, movingOp => + { + axisImmediatePauseFlag[movingOp.AxisIndex] = false; + axisPauseResumeFlag[movingOp.AxisIndex] = true; + resultList.Add(SingleAxisMoving(movingOp).Result); + }); + responseMessage.Result = resultList.All(u => u == true); + if (!responseMessage.Result) + { + responseMessage.Message = $"鐐逛綅杩愬姩寮傚父"; + } } return responseMessage; } @@ -279,85 +400,107 @@ /// <returns></returns> private bool SetAxisParam(MovingOption optionPara) { - List<short> resultCode = new List<short>() { 0 }; + List<short> resultCode = new List<short>(); 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; - trapprm.acc = optionPara.VelocityPara.Acc != 0 ? optionPara.VelocityPara.Acc : 1; - trapprm.dec = optionPara.VelocityPara.Dec != 0 ? optionPara.VelocityPara.Dec : 1; + short axisIndex = short.Parse(optionPara.AxisIndexStr); + resultCode.Add(GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, axisIndex)); - 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)); + if (optionPara.VelocityPara.Acc != 0 || optionPara.VelocityPara.Dec != 0) + { + resultCode.Add(GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, axisIndex, out trapprm)); + trapprm.smoothTime = 1; + + if (optionPara.VelocityPara.Acc != 0) + { + trapprm.acc = optionPara.VelocityPara.Acc; + } + + if (optionPara.VelocityPara.Dec != 0) + { + trapprm.dec = optionPara.VelocityPara.Dec; + } + + resultCode.Add(GTSCardAPI.GT_SetTrapPrm((short)IConfig.CardNum, axisIndex, ref trapprm)); + } + + if (optionPara.VelocityPara.Velocity != 0) + { + resultCode.Add(GTSCardAPI.GT_SetVel((short)IConfig.CardNum, axisIndex, optionPara.VelocityPara.Velocity * IConfig.AxisVelocityRatio)); + } var resultOK = resultCode.All(u => u == (short)GTSRetCode.GRCRunOK); if (!resultOK) { - throw new Exception("杞�" + optionPara.AxisIndex + "璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛�" + string.Join(",", resultCode)); + //throw new ProcessException("杞�" + optionPara.AxisIndex + "璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛�" + string.Join(",", resultCode)); + LogAsync(DateTime.Now, $"杞磠optionPara.AxisIndex}璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛歿string.Join(",", resultCode)}", ""); } - return resultOK; + return true; } + TaskFactory taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning); /// <summary> /// 鍗曚釜杞� 杩愬姩(鐐瑰埌鐐� jog 鍥為浂...锛� /// </summary> /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param> - public async Task<bool> SingleAxisMoving(MovingOption optionPara) + public override Task<bool> SingleAxisMoving(MovingOption optionPara) { - return await Task.Run(() => + return Task.Run(() => { bool isSuccessAndStop = false; - try + do { - if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false) + axisImmediatePauseHandleDict[optionPara.AxisIndex].WaitOne(); + + if (axisPauseResumeFlag.ContainsKey(optionPara.AxisIndex) && !axisPauseResumeFlag[optionPara.AxisIndex]) + return true; + + try { - string _position = ""; - string motionType = optionPara.MoveMode == EnumHelper.MotorMoveMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString(); - - _position = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff},{optionPara.AxisIndex},{motionType},{GetPosition(optionPara.AxisIndex)},{GetPrfPosition(optionPara.AxisIndex)},{optionPara.Destination},"; - - switch (optionPara.MoveMode) + if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false) { - case MotorMoveMode.Normal: - { - if (_isResetting) - { - LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父"); - return false; - } + string motionType = optionPara.MoveMode == EnumHelper.MotionMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString(); - if (optionPara.IsAbsolute) + switch (optionPara.MoveMode) + { + case MotionMode.Normal: { - isSuccessAndStop = P2PMoveAbs(optionPara); - } - else - { - isSuccessAndStop = P2PMoveRel(optionPara); - } + if (_isResetting) + { + LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父"); + return false; + } - } - break; - case MotorMoveMode.FindOri: - { - isSuccessAndStop = GoHome(optionPara); - } - break; - case MotorMoveMode.Jog: - { - isSuccessAndStop = JogMove(optionPara); - } - break; + if (optionPara.IsAbsolute) + { + isSuccessAndStop = P2PMoveAbs(optionPara); + } + //else + //{ + // isSuccessAndStop = P2PMoveRel(optionPara); + //} + + } + break; + case MotionMode.FindOri: + { + //isSuccessAndStop = GoHome(optionPara); + isSuccessAndStop = P2PGoHome(optionPara); + } + break; + case MotionMode.Jog: + { + isSuccessAndStop = JogMove(optionPara); + } + break; + } } - _position += $"{GetPosition(optionPara.AxisIndex)},"; - _position += $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}"; - LogAsync(DateTime.Now, "", _position); } - } - catch (Exception ex) - { - isSuccessAndStop = false; - LogAsync(DateTime.Now, $"杞磠optionPara.AxisIndex}杩愬姩寮傚父", ex.GetExceptionMessage()); - } + catch (Exception ex) + { + isSuccessAndStop = false; + LogAsync(DateTime.Now, $"杞磠optionPara.AxisIndex}杩愬姩寮傚父", ex.GetExceptionMessage()); + } + } while (axisImmediatePauseFlag.ContainsKey(optionPara.AxisIndex) && axisImmediatePauseFlag[optionPara.AxisIndex]); return isSuccessAndStop; }); } @@ -374,9 +517,10 @@ 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); + throw new ProcessException("杞�" + axisNum + "鑾峰彇瑙勫垝浣嶇疆寮傚父锛岄敊璇爜锛�" + ret); } - position = prfpos / IConfig.AxisVelocityRatio; + //var AxisRatio = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum) == null ? 1 : IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum).AxisRatio; + position = prfpos; return position; } @@ -387,18 +531,52 @@ /// <returns></returns> public double GetPosition(int axisNum) { - lock (moveLock) + //lock (moveLock) { double position = 0; - int pPos = 0; - var ret = GTSCardAPI.GT_GetPos((short)IConfig.CardNum, (short)axisNum, out pPos); + double pPos = 0; + var ret = GTSCardAPI.GT_GetPrfPos((short)IConfig.CardNum, (short)axisNum, out pPos, 1, out uint pclock); if (ret != (short)GTSRetCode.GRCRunOK) { - throw new Exception("杞�" + axisNum + "鑾峰彇鐩爣浣嶇疆寮傚父锛岄敊璇爜锛�" + ret); + throw new ProcessException("杞�" + axisNum + "鑾峰彇鐩爣浣嶇疆寮傚父锛岄敊璇爜锛�" + ret); } - position = pPos / IConfig.AxisVelocityRatio; + //var AxisRatio = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum) == null ? 1 : IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum).AxisRatio; + position = pPos; return position; } + } + + /// <summary> + /// 鑾峰彇瑙勫垝閫熷害 + /// </summary> + /// <param name="axisNum">Axis number</param> + /// <returns>閫熷害鑴夊啿</returns> + public double GetPrfVelocity(int axisNum) + { + double prfVel = 0; + uint pclock = 0; + var ret = GTSCardAPI.GT_GetPrfVel((short)IConfig.CardNum, (short)axisNum, out prfVel, 1, out pclock); + if (ret != (short)GTSRetCode.GRCRunOK) + { + throw new ProcessException("杞�" + axisNum + "鑾峰彇瑙勫垝閫熷害寮傚父锛岄敊璇爜锛�" + ret); + } + return prfVel; + } + + /// <summary> + /// 鑾峰彇褰撳墠閫熷害 + /// </summary> + /// <param name="axisNum">Axis number</param> + /// <returns>閫熷害鑴夊啿</returns> + public double GetVelocity(int axisNum) + { + double vel = 0; + var ret = GTSCardAPI.GT_GetVel((short)IConfig.CardNum, (short)axisNum, out vel); + if (ret != (short)GTSRetCode.GRCRunOK) + { + throw new ProcessException("杞�" + axisNum + "鑾峰彇褰撳墠閫熷害寮傚父锛岄敊璇爜锛�" + ret); + } + return vel; } /// <summary> @@ -426,7 +604,7 @@ if (ret != (short)GTSRetCode.GRCRunOK) { - LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "APS_absolute_move寮傚父", "閿欒鐮侊細" + ret + ";" + "閲嶈瘯娆℃暟锛�" + repeatTime); + LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "JogMove寮傚父", "閿欒鐮侊細" + ret + ";" + "閲嶈瘯娆℃暟锛�" + repeatTime); Thread.Sleep(10); } repeatTime--; @@ -436,32 +614,9 @@ catch (Exception ex) { AllMoveStop(true); - OnExceptionRaised?.Invoke(ex); + OnExceptionOccured?.Invoke(DateTime.Now, ex); return false; } - - } - - /// <summary> - /// Set Single Axis Do stop Jog Move - /// </summary> - /// <param name="axisNum">AxisNo</param> - /// <returns></returns> - public bool StopJog(int 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> @@ -477,7 +632,7 @@ if (_isResetting) { LogAsync(DateTime.Now, "澶嶄綅杩囩▼寮傚父", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩"); - throw new Exception("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩"); + throw new ProcessException("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩"); } int repeatTime = 30; @@ -496,7 +651,9 @@ if (CurrentState != EnumHelper.DeviceState.DSOpen) { LogAsync(DateTime.Now, "闈炴甯哥姸鎬佸紓甯�", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�"); - throw new Exception("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null); + + return false; + //throw new ProcessException("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null); } LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination); @@ -505,11 +662,12 @@ int currentPosition = (int)GetPosition(optionPara.AxisIndex); int dPosition = optionPara.Destination + currentPosition; int timeout = optionPara.MovingTimeout; + var AxisRatio = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == optionPara.AxisIndex) == null ? 1 : IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == optionPara.AxisIndex).AxisRatio; while (CurrentState == DeviceState.DSOpen) { //璁剧疆 杩愬姩鍙傛暟 isSuccessSetAxisParam = SetAxisParam(optionPara); - ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(dPosition * IConfig.AxisVelocityRatio));// 璁剧疆瑙勫垝浣嶇疆 + ret = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(dPosition));// 璁剧疆鐩殑浣嶇疆 ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//鏇存柊杩愬姩 if (ret != (short)GTSRetCode.GRCRunOK) @@ -529,8 +687,8 @@ repeatTime = 1000; do { - isStop = IsStop((short)IConfig.CardNum, (short)optionPara.AxisIndex); Thread.Sleep(50); + isStop = IsStop((short)optionPara.AxisIndex); repeatTime--; } while (!isStop && repeatTime > 0); @@ -539,7 +697,7 @@ catch (Exception ex) { AllMoveStop(true); - OnExceptionRaised?.Invoke(ex); + OnExceptionOccured?.Invoke(DateTime.Now, ex); return false; } } @@ -552,10 +710,12 @@ { try { + axisImmediatePauseHandleDict[optionPara.AxisIndex].WaitOne(); + if (_isResetting) { LogAsync(DateTime.Now, "澶嶄綅杩囩▼寮傚父", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩"); - throw new Exception("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩"); + throw new ProcessException("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩"); } int repeatTime = 30; while (CurrentState != EnumHelper.DeviceState.DSOpen && repeatTime > 0) @@ -572,17 +732,21 @@ if (CurrentState != EnumHelper.DeviceState.DSOpen) { LogAsync(DateTime.Now, "闈炴甯哥姸鎬佸紓甯�", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�"); - throw new Exception("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null); + + return false; + //throw new ProcessException("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null); } + LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination); short ret = 0; bool isSuccessSetAxisParam = false; int timeout = optionPara.MovingTimeout; - while (CurrentState == DeviceState.DSOpen) + //var AxisRatio = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == optionPara.AxisIndex) == null ? 1 : IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == optionPara.AxisIndex).AxisRatio; + while (CurrentState == DeviceState.DSOpen && !_isPause) { //璁剧疆 杩愬姩鍙傛暟 isSuccessSetAxisParam = SetAxisParam(optionPara); - ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(optionPara.Destination * IConfig.AxisVelocityRatio));// 璁剧疆瑙勫垝浣嶇疆 + ret = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(optionPara.Destination));// 璁剧疆鐩爣浣嶇疆 ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//鏇存柊杩愬姩 if (ret != (short)GTSRetCode.GRCRunOK) @@ -599,19 +763,19 @@ bool isStop = false; repeatTime = 1000; - do + while (!isStop && repeatTime > 0) { - isStop = IsStop((short)IConfig.CardNum, (short)optionPara.AxisIndex); Thread.Sleep(50); + isStop = IsStop((short)optionPara.AxisIndex); repeatTime--; - } while (!isStop && repeatTime > 0); + } return (ret == (short)GTSRetCode.GRCRunOK) && isStop; } catch (Exception ex) { AllMoveStop(true); - OnExceptionRaised?.Invoke(ex); + OnExceptionOccured?.Invoke(DateTime.Now, ex); return false; } } @@ -622,20 +786,21 @@ /// <param name="axisNum">axisNo</param> /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param> /// <returns></returns> - public async Task<bool> MoveStop(int axisNum, int option) + public override async Task<bool> MoveStop(int axisNum, int option) { return await Task.Run(() => { bool isStop = false; if (option == 1) { - StateChange(EnumHelper.DeviceState.DSExcept); + //StateChange(EnumHelper.DeviceState.DSExcept); + LogAsync(DateTime.Now, "鎬ュ仠鍋滄", ""); } 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); + throw new ProcessException("杞�" + axisNum + "杩愬姩鍋滄寮傚父锛岄敊璇爜锛�" + ret); } else { @@ -644,8 +809,8 @@ int repeatTime = 100; do { - isStop = IsStop((short)IConfig.CardNum, (short)axisNum); Thread.Sleep(10); + isStop = IsStop((short)axisNum); repeatTime--; } while (!isStop && repeatTime > 0); @@ -671,54 +836,224 @@ var resultOK = taskList.All(u => u.GetAwaiter().GetResult()); } + ///// <summary> + ///// 鍥炲師鐐� + ///// </summary> + ///// <param name="movingOption">鍗″彿</param> + ///// <param name="axisn">杞村彿</param> + ///// <param name="homests">杞村洖鍘熺偣鐘舵��</param> + //public bool GoHome(MovingOption movingOption) + //{ + // try + // { + // PositionReset(movingOption.AxisIndex, 1); + // GTSCardAPI.THomePrm thomeprm; + // GTSCardAPI.THomeStatus homests; + // // 鍚姩Home鎹曡幏 + // short rtn = GTSCardAPI.GT_SetCaptureMode((short)IConfig.CardNum, (short)movingOption.AxisIndex, GTSCardAPI.CAPTURE_HOME); + // // 鍒囨崲鍒扮偣浣嶈繍鍔ㄦā寮� + // rtn = GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, (short)movingOption.AxisIndex); + // // 璇诲彇鐐逛綅妯″紡杩愬姩鍙傛暟 + // 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); //鍚姩鍥為浂 + + // bool isStop = false; + // int repeatTime = 1000; + // do + // { + // Thread.Sleep(10); + // GTSCardAPI.GT_GetHomeStatus((short)IConfig.CardNum, (short)movingOption.AxisIndex, out homests); + + // isStop = homests.run == 0; + // if (isStop && homests.error == 0) + // { + // Thread.Sleep(200); + // PositionReset(movingOption.AxisIndex, 1); + // } + // repeatTime--; + // } while (!isStop && repeatTime > 0); + + // return isStop; + // } + // catch (Exception ex) + // { + // AllMoveStop(true); + // OnExceptionOccured?.Invoke(DateTime.Now, ex); + // return false; + // } + //} + /// <summary> - /// 鍥炲師鐐� + /// P2P鏂瑰紡鍥炲師鐐� /// </summary> - /// <param name="movingOption">鍗″彿</param> - /// <param name="axisn">杞村彿</param> - /// <param name="homests">杞村洖鍘熺偣鐘舵��</param> - public bool GoHome(MovingOption movingOption) + /// <param name="movingOption">杩愬姩鍙傛暟</param> + public bool P2PGoHome(MovingOption movingOption) { try { - GTSCardAPI.GT_ZeroPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, 1); - GTSCardAPI.THomePrm thomeprm; - GTSCardAPI.THomeStatus homests; - 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); //鍚姩鍥為浂 + Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; - bool isStop = false; - int repeatTime = 1000; + var goHomePara = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == movingOption.AxisIndex).GoHomePara; + bool homeDirection = goHomePara.IsHomeDirPositive; + bool isRightLimitReached = false; + short capture = 0; + + GTSCardAPI.TTrapPrm trapPrm; + + // 鍒囨崲鍒扮偣浣嶈繍鍔ㄦā寮� + short sRtn = GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, (short)movingOption.AxisIndex); + // 璇诲彇鐐逛綅妯″紡杩愬姩鍙傛暟 + sRtn = GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, (short)movingOption.AxisIndex, out trapPrm); + trapPrm.acc = movingOption.VelocityPara.Acc; + trapPrm.dec = movingOption.VelocityPara.Dec; + // 璁剧疆鐐逛綅妯″紡杩愬姩鍙傛暟 + sRtn = GTSCardAPI.GT_SetTrapPrm((short)IConfig.CardNum, (short)movingOption.AxisIndex, ref trapPrm); + // 璁剧疆鐐逛綅妯″紡鐩爣閫熷害锛屽嵆鍥炲師鐐归�熷害 + sRtn = GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)movingOption.AxisIndex, goHomePara.HomeVelocity); + do { - Thread.Sleep(10); - GTSCardAPI.GT_GetHomeStatus((short)IConfig.CardNum, (short)movingOption.AxisIndex, out homests); + PositionReset(movingOption.AxisIndex, 1); + ClearStatus(movingOption.AxisIndex, 1); - isStop = homests.run == 0; - if (isStop && homests.error == 0) + //LogAsync(DateTime.Now, $"{Name}浣嶇疆缃浂", ""); + + if (goHomePara.IsCaptureMode) { - Thread.Sleep(200); - GTSCardAPI.GT_ZeroPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, 1); + //鎼滅储璺濈 闃舵1 + // 鍚姩Home鎹曡幏 + sRtn = GTSCardAPI.GT_SetCaptureMode((short)IConfig.CardNum, (short)movingOption.AxisIndex, GTSCardAPI.CAPTURE_HOME); } - repeatTime--; - } while (!isStop && repeatTime > 0); - return isStop; + // 璁剧疆鐐逛綅妯″紡鐩爣浣嶇疆锛屽嵆鍘熺偣鎼滅储璺濈 + sRtn = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, homeDirection ? 999999999 : -999999999); + // 鍚姩杩愬姩 + sRtn = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (movingOption.AxisIndex - 1)); + + int repeatTime = goHomePara.GoHomeTimeOut * 1000; + + bool isStop = false; + int pos = 0; + uint clk;//鏃堕挓鍙傛暟 + + int checkInterval = IConfig.MonitorInterval; + if (IConfig.MonitorInterval <= 0) + { + checkInterval = 10; + } + + do + { + Thread.Sleep(checkInterval); + + if (goHomePara.IsCaptureMode) + { + // 璇诲彇鎹曡幏鐘舵�� + GTSCardAPI.GT_GetCaptureStatus((short)IConfig.CardNum, (short)movingOption.AxisIndex, out capture, out pos, 1, out clk); + } + else + { + GTSCardAPI.GT_GetDi((short)IConfig.CardNum, GTSCardAPI.MC_HOME, out int pValue); + capture = (short)((pValue & (1 << (movingOption.AxisIndex - 1))) == 0 ? 1 : 0); + //LogAsync(DateTime.Now, $"鍘熺偣鐘舵�亄pValue}锛岃酱{movingOption.AxisIndex}鍘熺偣{capture}", ""); + } + isStop = IsStop((short)movingOption.AxisIndex); + repeatTime -= checkInterval; + } while (!(isStop || capture == 1 || repeatTime <= 0)); + + if (repeatTime <= 0) + { + MoveStop((short)movingOption.AxisIndex, 0); + throw new ProcessException($"杩愬姩杞磠movingOption.AxisIndex} 锛屽洖鍘熺偣瓒呮椂寮傚父"); + } + + var axisStatus = AxisStatusList.FirstOrDefault(u => u.AxisIndex == movingOption.AxisIndex); + + //if (isStop) + //{ + // LogAsync(DateTime.Now, $"杞磠movingOption.AxisIndex}澶嶄綅涓仠姝�", $"Capture鐘舵�亄capture}"); + //} + + if (isStop && capture != 1) + { + if (((axisStatus.AxisStatus & 0x20) != 0) || ((axisStatus.AxisStatus & 0x40) != 0)) + { + capture = 0; + + //姝i檺浣� + if ((axisStatus.AxisStatus & 0x20) != 0 && !goHomePara.IsCaptureDirPositive) + { + isRightLimitReached = true; + } + + //璐熼檺浣� + if ((axisStatus.AxisStatus & 0x40) != 0 && goHomePara.IsCaptureDirPositive) + { + isRightLimitReached = true; + } + + homeDirection = !homeDirection; + + LogAsync(DateTime.Now, $"杞磠movingOption.AxisIndex}鏋侀檺浣嶇疆鎹㈠悜", ""); + } + + ClearStatus(movingOption.AxisIndex, 1); + } + + if (capture == 1) + { + if (!isRightLimitReached) + { + capture = 0; + ClearStatus(movingOption.AxisIndex, 1); + //GTSCardAPI.GT_SetCaptureMode((short)IConfig.CardNum, (short)movingOption.AxisIndex, GTSCardAPI.CAPTURE_HOME); + continue; + } + + //鍏坰top + MoveStop((short)movingOption.AxisIndex, 0); + ClearStatus((short)movingOption.AxisIndex, 1); + + //宸茬粡鎹曡幏鍒癏ome鎵嶅彲浠ュ洖闆� 闃舵2 + // 杩愬姩鍒�"鎹曡幏浣嶇疆+鍋忕Щ閲�" + sRtn = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, pos + goHomePara.HomeOffset); + // 鍦ㄨ繍鍔ㄧ姸鎬佷笅鏇存柊鐩爣浣嶇疆 + sRtn = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (movingOption.AxisIndex - 1)); + isStop = false; + + repeatTime = 1000; + do + { + Thread.Sleep(20); + isStop = IsStop((short)movingOption.AxisIndex); + repeatTime--; + } while (!isStop && repeatTime > 0); + PositionReset(movingOption.AxisIndex, 1); + LogAsync(DateTime.Now, $"杞磠movingOption.AxisIndex}澶嶄綅瀹屾垚锛屼綅缃竻闆�", ""); + + return (sRtn == (short)GTSRetCode.GRCRunOK) && isStop; + } + + } while (!(capture == 1 && isRightLimitReached)); + + return false; } catch (Exception ex) { + LogAsync(DateTime.Now, $"{Name}鍥炲師鐐瑰紓甯�", ex.GetExceptionMessage()); AllMoveStop(true); - OnExceptionRaised?.Invoke(ex); + OnExceptionOccured?.Invoke(DateTime.Now, ex); return false; } } @@ -755,17 +1090,18 @@ /// 鎸変綅璁剧疆鏁板瓧 IO 杈撳嚭鐘舵�� /// </summary> /// <param name="index">杈撳嚭鍙�,杩斿洖1-16</param> - /// <param name="value">false琛ㄧず杈撳嚭锛宼rue琛ㄧず鍏抽棴</param> - public void WriteOut(short index, bool value) + /// <param name="value">false琛ㄧず鍏筹紝true琛ㄧず寮�锛屾澘鍗¤璁剧疆鍙栧弽</param> + public override void WriteOutput(short index, IOValue value) { short outNum = (short)(index % 100 + 1); - if (value) + if ((int)value <= 1) { - GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPO, outNum, 0); + GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPO, outNum, IConfig.IsOutputReversed ? (short)(value == IOValue.TRUE ? 0 : 1) : (short)value); } else { - GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPO, outNum, 1); + var currentValue = (int)MonitorValues.FirstOrDefault(u => u.IONum == outNum && u.IOType == IOType.OUTPUT).Value; + GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPO, outNum, (short)(currentValue == 1 ? 0 : 1)); } } @@ -775,15 +1111,47 @@ /// <param name="cardNum">鏉垮崱鍙�</param> /// <param name="axisNum">杞村彿</param> /// <returns></returns> - public bool IsStop(short cardNum, short axisNum) + public bool IsStop(short axisNum) { - lock (moveLock) + int sts = AxisStatusList.FirstOrDefault(u => u.AxisIndex == axisNum).AxisStatus; + if ((sts & 0x400) == 0) return true;//鍋滄杩斿洖true + else return false; //杩愯涓繑鍥瀎alse + } + + /// <summary> + /// 璇诲彇杞寸姸鎬� + /// </summary> + /// <param name="axisNum">杞村彿</param> + /// <returns></returns> + public override int GetAxisStatus(int axisNum) + { + //lock (moveLock) { int sts = 0; uint pclock = 0; - GTSCardAPI.GT_GetSts(cardNum, axisNum, out sts, 1, out pclock); - if ((sts & 0x400) == 0) return true;//鍋滄杩斿洖true - else return false; //杩愯涓繑鍥瀎alse + GTSCardAPI.GT_GetSts((short)IConfig.CardNum, (short)axisNum, out sts, 1, out pclock); + return sts; + } + } + + public override bool ClearStatus(int startAxisIndex, int count) + { + var rtn = GTSCardAPI.GT_ClrSts((short)IConfig.CardNum, (short)startAxisIndex, (short)count); + return rtn == (short)GTSRetCode.GRCRunOK; + } + + /// <summary> + /// 浣嶇疆鍥為浂 + /// </summary> + /// <param name="startAxisIndex"></param> + /// <param name="count"></param> + /// <returns></returns> + public override bool PositionReset(int startAxisIndex, int count) + { + //lock (moveLock) + { + var rtn = GTSCardAPI.GT_ZeroPos((short)IConfig.CardNum, (short)startAxisIndex, (short)count); + return rtn == (short)GTSRetCode.GRCRunOK; } } @@ -791,8 +1159,26 @@ #region IMonitor - public List<IOItem> MonitorValues { get; set; } = new List<IOItem>(); + public List<AxisMovingStatus> GetAxisMovingStatus() + { + List<AxisMovingStatus> axisMovingStatusesList = new List<AxisMovingStatus>(); + foreach (var axisConfig in IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled)) + { + AxisMovingStatus axisMovingStatus = new AxisMovingStatus(); + axisMovingStatus.AxisIndex = axisConfig.AxisIndex; + axisMovingStatus.AxisName = axisConfig.AxisName; + //axisMovingStatus.CurPosition = Convert.ToInt32(GetPosition(axisMovingStatus.AxisIndex)); + axisMovingStatus.Destination = Convert.ToInt32(GetPrfPosition(axisMovingStatus.AxisIndex)); + //axisMovingStatus.CurVelocity = GetVelocity(axisMovingStatus.AxisIndex); + //axisMovingStatus.PrfVelocity = GetPrfVelocity(axisMovingStatus.AxisIndex); + axisMovingStatus.AxisStatus = GetAxisStatus(axisMovingStatus.AxisIndex); + axisMovingStatusesList.Add(axisMovingStatus); + + } + + return axisMovingStatusesList; + } public List<IOItem> GetMonitorValues() { @@ -805,18 +1191,18 @@ GTSCardAPI.GT_GetDo((short)IConfig.CardNum, GTSCardAPI.MC_GPO, out outValue); //瑙f瀽缁撴灉 - for (var index = 1; index <= 16; index++) + for (var index = 0; index < 16; index++) { IOItem inItem = new IOItem() { IONum = index, - Value = (inValue & (1 << index)) == 0 ? 1 : 0, + Value = (inValue & (1 << index)) == 0 ? IOValue.TRUE : IOValue.FALSE, IOType = IOType.INPUT }; IOItem outItem = new IOItem() { IONum = index, - Value = (outValue & (1 << index)) == 0 ? 1 : 0, + Value = (outValue & (1 << index)) == 0 ? IOValue.TRUE : IOValue.FALSE, IOType = IOType.OUTPUT }; result.Add(inItem); @@ -824,6 +1210,79 @@ } return result; + } + + SpinWait _positionWait = new SpinWait(); + private async void MonitorPosition() + { + await Task.Run(() => + { + while (CurrentState != EnumHelper.DeviceState.DSClose && CurrentState != EnumHelper.DeviceState.DSExcept && CurrentState != EnumHelper.DeviceState.DSUninit) + { + try + { + if (!IConfig.IsEnableMonitor) + return; + + AxisStatusList.ForEach(a => + { + int curPosition = (int)GetPrfPosition(a.AxisIndex); + + if (a.CurPosition != curPosition) + { + a.CurPosition = curPosition; + AxisPositionChanged(a.AxisIndex, curPosition); + } + }); + + _positionWait.SpinOnce(); + } + catch (Exception ex) + { + if (CurrentState == DeviceState.DSOpen) + { + LogAsync(DateTime.Now, $"{this.Name}鐩戝惉杞翠俊鎭紓甯�", ex.GetExceptionMessage()); + } + } + } + }); + } + + SpinWait _statusWait = new SpinWait(); + private async void MonitorAxisStatus() + { + await Task.Run(() => + { + while (CurrentState != EnumHelper.DeviceState.DSClose && CurrentState != EnumHelper.DeviceState.DSExcept && CurrentState != EnumHelper.DeviceState.DSUninit) + { + try + { + if (!IConfig.IsEnableMonitor) + return; + + AxisStatusList.ForEach(a => + { + int curStatus = GetAxisStatus(a.AxisIndex); + + if (a.AxisStatus != curStatus) + { + int temp = a.AxisStatus; + a.AxisStatus = curStatus; + AxisStatusChanged(a.AxisIndex, temp, curStatus); + } + }); + + _statusWait.SpinOnce(); + } + catch (Exception ex) + { + if (CurrentState == DeviceState.DSOpen) + { + LogAsync(DateTime.Now, $"{this.Name}鐩戝惉杞翠俊鎭紓甯�", ex.GetExceptionMessage()); + } + } + } + }); } public async override void Monitor() @@ -836,25 +1295,39 @@ { if (!IConfig.IsEnableMonitor) return; + var newValues = GetMonitorValues(); + //var newAxisMovingStatus = GetAxisMovingStatus(); + if (newValues == null || newValues.Count == 0) continue; - Stopwatch sw = new Stopwatch(); - sw.Start(); + //Stopwatch sw = new Stopwatch(); + //sw.Start(); if (MonitorValues.Count == newValues.Count) { - var tempNew = newValues.DeepSerializeClone();//clone - var tempOld = MonitorValues.DeepSerializeClone(); + //var tempNew = newValues.DeepSerializeClone();//clone + //var tempOld = MonitorValues.DeepSerializeClone(); + var tempNew = new List<IOItem>(newValues);//clone + var tempOld = new List<IOItem>(MonitorValues); MonitorCheckAndInvoke(tempNew, tempOld); } - MonitorValues = new List<IOItem>(newValues); - sw.Stop(); - if (sw.ElapsedMilliseconds > 20) - { - LogAsync(DateTime.Now, $"{this.Name}杞鏃堕棿锛歿sw.ElapsedMilliseconds}", ""); - } + //if (AxisStatusList.Count == newAxisMovingStatus.Count) + //{ + // var tempNew = new List<AxisMovingStatus>(newAxisMovingStatus);//clone + // var tempOld = new List<AxisMovingStatus>(AxisStatusList); + // AxisStatusCheck(tempNew, tempOld); + //} + + //AxisStatusList = new List<AxisMovingStatus>(newAxisMovingStatus); + MonitorValues = new List<IOItem>(newValues); + //sw.Stop(); + + //if (sw.ElapsedMilliseconds > 20) + //{ + // LogAsync(DateTime.Now, $"{this.Name}杞鏃堕棿锛歿sw.ElapsedMilliseconds}", ""); + //} if (IConfig.MonitorInterval > 0) { @@ -873,29 +1346,52 @@ }); } - private void OnMethodInvoked(IAsyncResult ar) + private async void AxisStatusCheck(List<AxisMovingStatus> tempNew, List<AxisMovingStatus> tempOld) { - MotionCardMonitorSet monitorSet = ar.AsyncState as MotionCardMonitorSet; - ProcessResponse resValues = monitorSet.Response; - if (resValues.ResultValue == (int)ReplyValue.IGNORE) + await Task.Run(() => { - return; - } - - Stopwatch sw = new Stopwatch(); - sw.Start(); - // 灏嗘寚瀹欼OItem鍐欏叆鏉垮崱 - foreach (var replyIOData in monitorSet.ReplyIODatas) - { - //鍐欏叆IO杈撳嚭 - if (replyIOData.IOType == IOType.OUTPUT) + foreach (var newSts in tempNew) { - GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPI, (short)replyIOData.IONum, (short)replyIOData.Value); + var oldSts = tempOld.FirstOrDefault(u => u.AxisIndex == newSts.AxisIndex); + if (oldSts != null) + { + if (oldSts.AxisStatus != newSts.AxisStatus) + { + AxisStatusChanged(newSts.AxisIndex, oldSts.AxisStatus, newSts.AxisStatus); + } + + if (((newSts.AxisStatus >> 1 & 1) == 1) && ((oldSts.AxisStatus >> 1 & 1) == 0)) //鍒濇鎶ヨ + { + AxisAlarmRaised(newSts.AxisStatus, $"杞磠newSts.AxisIndex}:{newSts.AxisName}杞翠己鏈嶆姤璀�"); + } + } } - // in鍙涓嶈兘鍐� - } - sw.Stop(); - LogAsync(DateTime.Now, $"{Name}鍙嶉瀹屾垚锛岃�楁椂{sw.ElapsedMilliseconds}ms", $"{resValues.GetDisplayText()}"); + }); + } + + public override void OnMethodInvoked(IAsyncResult ar) + { + //MotionCardMonitorSet monitorSet = ar.AsyncState as MotionCardMonitorSet; + //ProcessResponse resValues = monitorSet.Response; + //if (resValues.ResultValue == (int)ReplyValue.IGNORE) + //{ + // return; + //} + + //Stopwatch sw = new Stopwatch(); + //sw.Start(); + //// 灏嗘寚瀹欼OItem鍐欏叆鏉垮崱 + //foreach (var replyIOData in monitorSet.ReplyIODatas) + //{ + // //鍐欏叆IO杈撳嚭 + // if (replyIOData.IOType == IOType.OUTPUT) + // { + // GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPI, (short)replyIOData.IONum, (short)replyIOData.Value); + // } + // // in鍙涓嶈兘鍐� + //} + //sw.Stop(); + //LogAsync(DateTime.Now, $"{Name}鍙嶉瀹屾垚锛岃�楁椂{sw.ElapsedMilliseconds}ms", $"{resValues.GetDisplayText()}"); } protected void MonitorCheckAndInvoke(List<IOItem> tempNew, List<IOItem> tempOld) @@ -905,13 +1401,12 @@ { MotionCardWarningSet warningSet = wSet as MotionCardWarningSet; - bool isOn = ((tempNew.FirstOrDefault(u => u.IONum == warningSet.TriggerIndex && u.IOType == warningSet.WarningIOModel)?.Value >> warningSet.TriggerIndex) & 1) == (warningSet.TriggerValue ? 1 : 0); + bool isOn = (((int)((tempNew.FirstOrDefault(u => u.IONum == warningSet.TriggerIndex && u.IOType == warningSet.WarningIOModel)?.Value)) >> warningSet.TriggerIndex) & 1) == (warningSet.TriggerValue ? 1 : 0); if (warningSet.CurrentStatus != isOn) { warningSet.CurrentStatus = isOn; warningSet.TriggerTime = DateTime.Now; - warningSet.WarningDescription = $"璀︽姤锛歿warningSet.Name}-瑙﹀彂绱㈠紩锛歿warningSet.TriggerIndex}-{warningSet.WarningIOModel.GetEnumDescription()}:{warningSet.WarningCode}"; SaveAlarmCSVAsync(DateTime.Now, this.Name, warningSet); ExcuteMonitorAlarm(DateTime.Now, this, warningSet); } @@ -932,7 +1427,7 @@ if (newIOItem?.Value != oldIOItem?.Value) { - if (monitorSet.TriggerValue == -999 || newIOItem.Value == monitorSet.TriggerValue) + if (monitorSet.TriggerValue == -999 || (int)newIOItem.Value == monitorSet.TriggerValue) { if (monitorSet.OpConfig == null) { @@ -941,10 +1436,11 @@ //monitorSet.OpConfig.InputPara = monitorSet.InputDataIndex.ConvertAll(index => //{ - // return tempNew[index].Value; + // return tempNew[index].Value == IOValue.TRUE ? 1 : 0; //}).ToList(); + monitorSet.OpConfig.InputPara = new List<int>() { (int)newIOItem.Value }; - ExcuteMonitorInvok(DateTime.Now, monitorSet.InvokeDevice, this, monitorSet, OnMethodInvoked); + ExcuteMonitorInvoke(DateTime.Now, monitorSet.InvokeDevice, this, monitorSet); } } }); @@ -954,18 +1450,24 @@ public override void ResetAlarm() { int axis_sts; - uint clk; var axisSettings = IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled); - GTSCardAPI.GT_ClrSts((short)IConfig.CardNum, 1, (short)axisSettings.Count); + ClearStatus(1, axisSettings.Count); + + if (AxisStatusList.Count == 0) + { + Thread.Sleep(10); + } + foreach (var axisSetting in axisSettings) { - GTSCardAPI.GT_GetSts((short)IConfig.CardNum, (short)axisSetting.AxisIndex, out axis_sts, 1, out clk); + //axis_sts = GetAxisStatus((short)axisSetting.AxisIndex); + axis_sts = AxisStatusList.FirstOrDefault(u => u.AxisIndex == axisSetting.AxisIndex)?.AxisStatus ?? 0; 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); + //// 鎵�鏈変綅缃闆� + //PositionReset(1, axisSettings.Count); // 姝f瀬闄愭姤璀� if ((axis_sts & 0x20) != 0) { @@ -990,7 +1492,7 @@ } // 娓呴櫎鐘舵�� - GTSCardAPI.GT_ClrSts((short)IConfig.CardNum, 1, (short)IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled).Count); + ClearStatus(1, axisSettings.Count); } object _alarmLock = new object(); -- Gitblit v1.8.0