using System; using System.Collections.Generic; using System.Diagnostics; using Aitex.Core.Common.DeviceData; using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Device; using Aitex.Core.RT.Device.Unit; using Aitex.Core.Util; using Aitex.Platform; using Aitex.Triton160.Common; namespace Aitex.Triton160.RT.Device { public enum LightType { RED, GREEN, YELLOW, BUZZER } public enum LightStatus { OFF, ON, BLINK } public class IoSignalTower : BaseDevice, IDevice { //device private IoSignalLight red = null; private IoSignalLight yellow = null; private IoSignalLight green = null; private IoSignalLight alarmBuzzer = null; private bool _buzzerCleared = false; /// /// 用于生成闪烁信号 /// private bool binking = false; /// /// 闪烁定时器 (500ms) /// private DeviceTimer timer = new DeviceTimer(); /// /// 信号灯状态定义 /// public TowerLightStatus Red { get; private set; } public TowerLightStatus Yellow { get; private set; } public TowerLightStatus Green { get; private set; } public TowerLightStatus Buzzer_Alarm { get; private set; } public bool IsGreenOn => green.Value; public bool IsYellowOn => yellow.Value; public bool IsRedOn => red.Value; public bool IsBuzzerOn = false; public DeviceTimer _timerBuzzerBlinking = new DeviceTimer(); public IoSignalTower(string module, string name, string display, string deviceID) : base(module, name, display, deviceID) { } public bool Initialize() { red = DeviceModel.SignalTowerRedLight; yellow = DeviceModel.SignalTowerYellowLight; green = DeviceModel.SignalTowerGreenLight; alarmBuzzer = DeviceModel.SignalTowerBuzzer; Debug.Assert(red != null && yellow != null && green != null && alarmBuzzer != null); DATA.Subscribe(string.Format("Device.{0}.{1}", ModuleName.System, Name), () => { AITSignalTowerData data = new AITSignalTowerData() { DeviceName = Name, DeviceSchematicId = DeviceID, DisplayName = Display, IsBlueLightOn = false, IsGreenLightOn = IsGreenOn, IsRedLightOn = IsRedOn, IsYellowLightOn = IsYellowOn, }; return data; }, SubscriptionAttribute.FLAG.IgnoreSaveDB); DEVICE.Register(string.Format("{0}.{1}", Name, AITSignalTowerOperation.SwitchOffBuzzer), (out string reason, int time, object[] param) => { reason = ""; PMState state = (PMState)DATA.Poll(ModuleNameString.System, StateData.PMState.ToString()); _buzzerCleared = state == PMState.Error; alarmBuzzer.Value = false; return true; }); return true; } public void Terminate() { } /// /// 控制各种灯 /// /// /// public void SetLight(LightType light, LightStatus st) { switch (light) { case LightType.RED: red.Value = st == LightStatus.ON ? true : false; break; case LightType.GREEN: green.Value = st == LightStatus.ON ? true : false; break; case LightType.YELLOW: yellow.Value = st == LightStatus.ON ? true : false; break; case LightType.BUZZER: // TODO, buzzer暂时还用老的BuzzerBlinking [4/30/2020 TerryLu] break; default: break; } } //响3声,通知工艺正常结束 public void BuzzerBlinking(double time) { IsBuzzerOn = true; _timerBuzzerBlinking.Start(time); } public void BuzzerStop() { IsBuzzerOn = false; _timerBuzzerBlinking.Stop(); } public void Monitor() { Buzzer_Alarm = TowerLightStatus.Off; if (timer.IsIdle()) timer.Start(500); if (timer.IsTimeout()) { timer.Start(500); binking = !binking; } PMState state = (PMState)DATA.Poll(ModuleNameString.System, StateData.PMState.ToString()); List valves = DEVICE.GetDevice(); //pumping valve开,vent purge valve开,Gas valve开,RF开,只要有其中之一处于开的状态,就是绿灯 if (state == PMState.Error) { Green = TowerLightStatus.Off; Red = TowerLightStatus.On; Yellow = TowerLightStatus.Off; Buzzer_Alarm = _buzzerCleared ? TowerLightStatus.Off : TowerLightStatus.On; } else if (DeviceModel.Rf.IsRfOn || valves.Exists(v => v.Status)) { Green = TowerLightStatus.On; Red = TowerLightStatus.Off; Yellow = TowerLightStatus.Off; Buzzer_Alarm = TowerLightStatus.Off; } else { Green = TowerLightStatus.Off; Red = TowerLightStatus.Off; Yellow = TowerLightStatus.On; } if (!_timerBuzzerBlinking.IsIdle() && !_timerBuzzerBlinking.IsTimeout()) { Buzzer_Alarm = IsBuzzerOn ? TowerLightStatus.On : TowerLightStatus.Off; } else { Buzzer_Alarm = TowerLightStatus.Off; IsBuzzerOn = false; } //update tower light status switch (Red) { case TowerLightStatus.On: red.Value = true; break; case TowerLightStatus.Off: red.Value = false; break; case TowerLightStatus.Blinking: red.Value = binking; break; } switch (Yellow) { case TowerLightStatus.On: yellow.Value = true; break; case TowerLightStatus.Off: yellow.Value = false; break; case TowerLightStatus.Blinking: yellow.Value = binking; break; } switch (Green) { case TowerLightStatus.On: green.Value = true; break; case TowerLightStatus.Off: green.Value = false; break; case TowerLightStatus.Blinking: green.Value = binking; break; } switch (Buzzer_Alarm) { case TowerLightStatus.On: alarmBuzzer.Value = true; break; case TowerLightStatus.Off: alarmBuzzer.Value = false; break; case TowerLightStatus.Blinking: alarmBuzzer.Value = binking; break; } //System.Diagnostics.Trace.WriteLine(DateTime.Now.Minute.ToString() + ":"+DateTime.Now.Second+"."+DateTime.Now.Millisecond+ "," + (alarmBuzzer.Value ? "1" : "0")); } /// /// 关闭所有灯和蜂鸣器 /// public void Reset() { red.Value = false; yellow.Value = false; green.Value = false; alarmBuzzer.Value = false; _buzzerCleared = false; } } }