From 78584911d0457ad9fc26d9dfc6f374b7ef531c0f Mon Sep 17 00:00:00 2001 From: xcd <834800634@qq.com> Date: 星期日, 22 十一月 2020 13:45:09 +0800 Subject: [PATCH] 1. 添加操作员输入和界面显示 2. 添加通过输入窗体 3. 添加webservice调用帮助类 4. M071添加MES数据检查和数据上传功能,添加相关界面显示和流程控制 --- src/Bro.M071.Process/M071Process_MotionCard.cs | 448 ++++++++++++++++++++++++++++++++----------------------- 1 files changed, 259 insertions(+), 189 deletions(-) diff --git a/src/Bro.M071.Process/M071Process_MotionCard.cs b/src/Bro.M071.Process/M071Process_MotionCard.cs index 70bb5c8..5423b8f 100644 --- a/src/Bro.M071.Process/M071Process_MotionCard.cs +++ b/src/Bro.M071.Process/M071Process_MotionCard.cs @@ -17,109 +17,135 @@ public partial class M071Process { public Timer ResetTimer = null; - const int FULLRESETTIME = 5; object machineStateLock = new object(); + //MachineState _machineStatePre = MachineState.Unknown; MachineState machineState = MachineState.Unknown; public MachineState MachineState { get => machineState; set { + if (machineState == value) + return; + machineState = value; - switch (machineState) + Task.Run(() => { - case MachineState.Ready: - lock (machineStateLock) - { - SwitchBeep(false); - SwitchLightRed(false); - SwitchLightYellow(false); - } - - Task.Run(() => - { + switch (machineState) + { + case MachineState.Ready: lock (machineStateLock) + { + SwitchBeep(false); + SwitchLightRed(false); + SwitchLightYellow(false); + } + + Task.Run(() => { while (MachineState == MachineState.Ready) { - SwitchLightGreen(true); - Thread.Sleep(1000); - SwitchLightGreen(false); - Thread.Sleep(1000); + lock (machineStateLock) + { + SwitchLightGreen(true); + Thread.Sleep(1000); + SwitchLightGreen(false); + Thread.Sleep(1000); + } } - } - }); + }); - break; - case MachineState.Running: - lock (machineStateLock) - { - SwitchBeep(false); - SwitchLightRed(false); - SwitchLightYellow(false); - SwitchLightGreen(true); - } - break; - case MachineState.Alarm: - lock (machineStateLock) - { - SwitchBeep(true); - SwitchLightRed(true); - SwitchLightYellow(false); - SwitchLightGreen(false); - } - break; - case MachineState.Pause: - lock (machineStateLock) - { - SwitchBeep(false); - SwitchLightRed(false); - } - Task.Run(() => - { + break; + case MachineState.Running: lock (machineStateLock) + { + SwitchBeep(false); + SwitchLightRed(false); + SwitchLightYellow(false); + SwitchLightGreen(true); + } + break; + case MachineState.Alarm: + lock (machineStateLock) + { + SwitchBeep(true); + SwitchLightRed(true); + SwitchLightYellow(false); + SwitchLightGreen(false); + } + break; + case MachineState.Pause: + lock (machineStateLock) + { + SwitchBeep(false); + SwitchLightRed(false); + } + Task.Run(() => { while (MachineState == MachineState.Pause) { - SwitchLightYellow(true); - SwitchLightGreen(true); - Thread.Sleep(1000); - SwitchLightYellow(false); - SwitchLightGreen(false); - Thread.Sleep(1000); + lock (machineStateLock) + { + SwitchLightYellow(true); + SwitchLightGreen(true); + Thread.Sleep(1000); + SwitchLightYellow(false); + SwitchLightGreen(false); + Thread.Sleep(1000); + } } - } - }); - break; - case MachineState.Resetting: - lock (machineStateLock) - { - SwitchBeep(false); - SwitchLightRed(false); - SwitchLightGreen(false); - } - Task.Run(() => - { + }); + break; + case MachineState.Resetting: lock (machineStateLock) + { + SwitchBeep(false); + SwitchLightRed(false); + SwitchLightGreen(false); + } + Task.Run(() => { while (MachineState == MachineState.Resetting) { - SwitchLightYellow(true); - Thread.Sleep(1000); - SwitchLightYellow(false); - Thread.Sleep(1000); + lock (machineStateLock) + { + SwitchLightYellow(true); + Thread.Sleep(1000); + SwitchLightYellow(false); + Thread.Sleep(1000); + } } - } - }); - break; - default: - break; - } + }); + break; + default: + break; + } + }); OnMachineStateChanged?.Invoke(machineState); } + } + + private void Pause() + { + #region 鏉垮崱鏆傚仠鍔ㄤ綔 + outputCtrlCard.SetImmediatePause(); + #endregion + + //_pauseHandle.WaitHandle.Reset(); + //_pauseHandle.WaitResult = true; + } + + private void Resume(bool isResumeContinueMoving) + { + #region 鏉垮崱鎭㈠鍔ㄤ綔 + outputCtrlCard.ResetImmediatePause(isResumeContinueMoving); + #endregion + + //_pauseHandle.WaitHandle.Set(); + //_pauseHandle.WaitResult = false; } private void MotionCardSettingCheck() @@ -185,30 +211,36 @@ } } + [ProcessMethod("MotionCardBase", "GotoReadyPosition", "杩愬姩鍒伴澶囦綅缃�", InvokeType.TestInvoke)] + public ProcessResponse GotoReadyPosition(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) + { + MotionCardDefaultRun("GotoReadyPosition", ref opConfig, ref invokeDevice); + + LogAsync(DateTime.Now, "杩愬姩鍒伴澶囦綅缃畬鎴�", ""); + + return new ProcessResponse(true); + } + [ProcessMethod("MotionCardBase", "Reset", "绠�鍗曞浣嶆搷浣�", InvokeType.TestInvoke)] public ProcessResponse Reset(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) { - //if (opConfig == null) - //{ - // var monitorSet = Config.MonitorSetCollection.FirstOrDefault(u => u.MethodCode == "Reset"); - // if (monitorSet == null) - // throw new ProcessException("鏈厤缃粯璁ゅ浣嶆搷浣�"); + if (ResetTimer == null) + { + ResetTimer = new Timer(FullReset, null, -1, -1); + } - // opConfig = monitorSet.OpConfig; - // if (opConfig == null) - // throw new ProcessException("鏈厤缃浣嶆搷浣滃叿浣撻厤缃姩浣�"); + if (opConfig?.InputPara != null && opConfig.InputPara.Count > 0) + { + //澶у浣嶄俊鍙� + ResetTimer.Change(opConfig.InputPara[0] == 1 ? Config.FullResetRequiredDuration * 1000 : -1, -1); - // if (invokeDevice == null) - // { - // invokeDevice = DeviceCollection.FirstOrDefault(u => u.Id == monitorSet.InvokeDevice); - // if (invokeDevice == null) - // throw new ProcessException("鏈厤缃浣嶆搷浣滄墽琛岃澶�"); - // } - //} + if (opConfig.InputPara[0] == 0) + return new ProcessResponse(true); + } if (!IsAllowedWork) { - LogAsync(DateTime.Now, $"{(IsSafetyDoorTrigged ? "瀹夊叏闂�" : "")}{(IsSafetyBeamTrigged ? " 瀹夊叏鍏夌嚎" : "")}{(isEmergencyStopped ? " 鎬ュ仠鎸夐挳" : "")}瑙﹀彂涓紝澶嶄綅澶辫触", ""); + LogAsync(DateTime.Now, $"{SafetyMsg}锛屽浣嶅け璐�", ""); return new ProcessResponse(false); } @@ -216,29 +248,23 @@ (invokeDevice as MotionCardBase).ResetAlarm(); RaisedAlarm(""); - MachineState = MachineState.Ready; + + if (MachineState != MachineState.Pause) + { + MachineState = MachineState.Ready; + } + else + { + LogAsync(DateTime.Now, "璁惧鏆傚仠涓紝鏃犳硶澶嶄綅", ""); + return new ProcessResponse(true); + } if (IsEmergencyStopped) { RaisedAlarm("鎬ュ仠鎸夐挳鏈仮澶嶏紝璇锋墽琛屽ぇ澶嶄綅"); MachineState = MachineState.Alarm; + return new ProcessResponse(true); } - - if (ResetTimer == null) - { - ResetTimer = new Timer(FullReset, null, -1, -1); - } - - if (opConfig.InputPara.Count > 0) - { - //澶у浣嶄俊鍙� - ResetTimer.Change(-1, opConfig.InputPara[0] == 1 ? FULLRESETTIME * 1000 : -1); - } - - //if (invokeDevice is MotionCardBase motionCard) - //{ - // motionCard.Run(opConfig); - //} LogAsync(DateTime.Now, "鏅�氬浣嶅姩浣滃畬鎴�", ""); @@ -261,28 +287,16 @@ [ProcessMethod("MotionCardBase", "FullReset", "澶у浣嶆搷浣�", InvokeType.TestInvoke)] public ProcessResponse FullReset(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) { - //if (opConfig == null) - //{ - // var monitorSet = Config.MonitorSetCollection.FirstOrDefault(u => u.MethodCode == "FullReset"); - // if (monitorSet == null) - // throw new ProcessException("鏈厤缃粯璁ゅぇ澶嶄綅鎿嶄綔"); + if (!IsAllowedWork) + { + LogAsync(DateTime.Now, $"{SafetyMsg}锛屽ぇ澶嶄綅澶辫触", ""); + return new ProcessResponse(false); + } - // opConfig = monitorSet.OpConfig; - // if (opConfig == null) - // throw new ProcessException("鏈厤缃ぇ澶嶄綅鎿嶄綔鍏蜂綋閰嶇疆鍔ㄤ綔"); - - // if (invokeDevice == null) - // { - // invokeDevice = DeviceCollection.FirstOrDefault(u => u.Id == monitorSet.InvokeDevice); - // if (invokeDevice == null) - // throw new ProcessException("鏈厤缃ぇ澶嶄綅鎿嶄綔鎵ц璁惧"); - // } - //} - - //if (invokeDevice is MotionCardBase motionCard) - //{ - // motionCard.Run(opConfig); - //} + if (MachineState == MachineState.Pause) + { + Resume(false); + } MachineState = MachineState.Resetting; MotionCardDefaultRun("FullReset", ref opConfig, ref invokeDevice); @@ -299,6 +313,8 @@ RaisedAlarm(""); MachineState = MachineState.Ready; + GotoReadyPosition(null, null, null); + return new ProcessResponse(true); } @@ -307,12 +323,12 @@ /// WaitHandle 鏆傚仠鍙ユ焺 榛樿涓洪潪闃诲 鍙墽琛� /// WaitResult 鏆傚仠鏍囧織 true 姝e父鎵ц false 鏆傚仠涓� /// </summary> - ManualWaitConfirm _pauseHandle = new ManualWaitConfirm() - { - WaitHandle = new ManualResetEvent(true), - WaitResult = true, - }; - MachineState _machineStateBeforePause = MachineState.Unknown; + //ManualWaitConfirm _pauseHandle = new ManualWaitConfirm() + //{ + // WaitHandle = new ManualResetEvent(true), + // WaitResult = true, + //}; + List<MachineState> _statesAllowPause = new List<MachineState>() { MachineState.Running, MachineState.Ready, MachineState.Pause }; [ProcessMethod("", "SwitchJobStatus", "娴佺▼鐘舵�佸垏鎹�", InvokeType.TestInvoke)] public ProcessResponse SwitchJobStatus(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) @@ -330,66 +346,53 @@ throw new ProcessException("鏈幏鍙栨澘鍗¤澶�"); bool? isToPause = null; //true 鏆傚仠 false 缁х画 - if (opConfig.InputPara != null && opConfig.InputPara.Count > 0) + + if (opConfig.InputPara[0] == 10) { - isToPause = opConfig.InputPara[0] == 1; + isToPause = false; + } + else if (opConfig.InputPara[0] == 11) + { + isToPause = true; } if (isToPause == null) { - if (!_pauseHandle.WaitResult) - { - #region 鏉垮崱鏆傚仠鍔ㄤ綔 - motionDevice.SetImmediatePause(); - #endregion - - _pauseHandle.WaitHandle.Reset(); - _pauseHandle.WaitResult = true; - _machineStateBeforePause = MachineState; - MachineState = MachineState.Pause; - } - else if (!_pauseHandle.WaitResult) - { - #region 鏉垮崱鎭㈠鍔ㄤ綔 - motionDevice.ResetImmediatePause(); - #endregion - - _pauseHandle.WaitHandle.Set(); - _pauseHandle.WaitResult = false; - MachineState = _machineStateBeforePause; - } + IsManualPaused = !IsManualPaused; } else { - if (isToPause.Value) - { - if (!_pauseHandle.WaitResult) - { - #region 鏉垮崱鏆傚仠鍔ㄤ綔 - motionDevice.SetImmediatePause(); - #endregion + //if (isToPause.Value) + //{ + // if (!_pauseHandle.WaitResult) + // { + // //#region 鏉垮崱鏆傚仠鍔ㄤ綔 + // //motionDevice.SetImmediatePause(); + // //#endregion - _pauseHandle.WaitHandle.Reset(); - _pauseHandle.WaitResult = true; - MachineState = MachineState.Pause; - } - } - else - { - if (!_pauseHandle.WaitResult) - { - #region 鏉垮崱鎭㈠鍔ㄤ綔 - motionDevice.ResetImmediatePause(); - #endregion + // //_pauseHandle.WaitHandle.Reset(); + // //_pauseHandle.WaitResult = true; + // MachineState = MachineState.Pause; + // } + //} + //else + //{ + // if (!_pauseHandle.WaitResult) + // { + // //#region 鏉垮崱鎭㈠鍔ㄤ綔 + // //motionDevice.ResetImmediatePause(); + // //#endregion - _pauseHandle.WaitHandle.Set(); - _pauseHandle.WaitResult = false; - MachineState = _machineStateBeforePause; - } - } + // //_pauseHandle.WaitHandle.Set(); + // //_pauseHandle.WaitResult = false; + // MachineState = _machineStatePre; + // } + //} + + IsManualPaused = isToPause.Value; } - return new ProcessResponse(_pauseHandle.WaitResult); + return new ProcessResponse(IsManualPaused); } ////[ProcessMethod("", "PauseJob", "鏆傚仠娴佺▼", InvokeType.TestInvoke)] @@ -598,24 +601,93 @@ get => !(IsSafetyBeamTrigged || IsSafetyDoorTrigged || IsEmergencyStopped); } + string SafetyMsg + { + get => $"{(IsSafetyBeamTrigged ? "瀹夊叏鍏夊箷" : "")}{(IsSafetyDoorTrigged ? " 瀹夊叏闂�" : "")}{(IsEmergencyStopped ? " 鎬ュ仠鎸夐挳" : "")}瑙﹀彂涓�"; + } + #region 瀹夊叏闂� & 瀹夊叏鍏夌嚎 bool isSafetyDoorTrigged = false; bool isSafetyBeamTrigged = false; + bool isManualPaused = false; public bool IsSafetyDoorTrigged { - get => !Config.IsSafetyDoorBlocked && isSafetyDoorTrigged; - set => isSafetyDoorTrigged = value; + get => (!Config.IsSafetyDoorBlocked) && isSafetyDoorTrigged; + set + { + isSafetyDoorTrigged = value; + CheckMachinePauseState(); + } } public bool IsSafetyBeamTrigged { - get => !Config.IsSafetyBeamBlocked && isSafetyBeamTrigged; - set => isSafetyBeamTrigged = value; + get => (!Config.IsSafetyBeamBlocked) && isSafetyBeamTrigged; + set + { + isSafetyBeamTrigged = value; + CheckMachinePauseState(); + } + } + + public bool IsManualPaused + { + get => isManualPaused; + set + { + isManualPaused = value; + CheckMachinePauseState(); + } + } + + ManualResetEventSlim _pausedHandle = new ManualResetEventSlim(true); + MachineState _machineStateBeforePause = MachineState.Unknown; + private void CheckMachinePauseState() + { + //await Task.Run(() => + { + if (IsMachinePaused) + { + if (MachineState == MachineState.Ready || MachineState == MachineState.Running) + { + _machineStateBeforePause = MachineState; + } + MachineState = MachineState.Pause; + _pausedHandle.Reset(); + + if (_machineStateBeforePause == MachineState.Running) + { + Pause(); + } + } + else + { + if (MachineState == MachineState.Pause) + { + if (_machineStateBeforePause == MachineState.Running) + { + Resume(true); + } + _pausedHandle.Set(); + RaisedAlarm(""); + MachineState = _machineStateBeforePause; + } + } + } + //); + } + + public bool IsMachinePaused + { + get => IsSafetyBeamTrigged || IsSafetyDoorTrigged || IsManualPaused; } [ProcessMethod("", "SafetyDoorSignal", "瀹夊叏闂ㄤ俊鍙风洃鎺э紝姝e父ON锛孫FF鏃舵姤璀�", InvokeType.TestInvoke)] public ProcessResponse SafetyDoorSignal(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) { + //if (MachineState != MachineState.Running && MachineState != MachineState.Pause) + // return new ProcessResponse(true); + if (opConfig.InputPara == null || opConfig.InputPara.Count == 0) throw new ProcessException("瀹夊叏闂ㄧ洃鎺ф湭閰嶇疆杈撳叆淇″彿"); @@ -624,7 +696,6 @@ if (IsSafetyDoorTrigged) { RaisedAlarm("瀹夊叏闂ㄦ湭姝e父鍏抽棴"); - MachineState = MachineState.Alarm; } return new ProcessResponse(true); @@ -641,7 +712,6 @@ if (IsSafetyBeamTrigged) { RaisedAlarm("瀹夊叏鍏夌嚎琚伄鎸�"); - MachineState = MachineState.Alarm; } return new ProcessResponse(true); @@ -674,9 +744,9 @@ if (opConfig.InputPara == null || opConfig.InputPara.Count == 0) throw new ProcessException("鎬ュ仠鎸夐挳鏈厤缃緭鍏ヤ俊鍙�"); - IsEmergencyStopped = opConfig.InputPara[0] == 1; + IsEmergencyStopped = opConfig.InputPara[0] == 0; - if (IsEmergencyStopped) + if (isEmergencyStopped) { RaisedAlarm("鎬ュ仠鎸夐挳琚媿涓�"); MachineState = MachineState.Alarm; -- Gitblit v1.8.0