VirgoSignalTower.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.SCCore;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Device.Bases;
  6. using MECF.Framework.Common.Equipment;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using VirgoRT.Device.YASKAWA;
  13. using VirgoRT.Devices.EFEM;
  14. using VirgoRT.Modules;
  15. namespace VirgoRT.Devices
  16. {
  17. class VirgoSingalLight : SignalLightBase
  18. {
  19. public MECF.Framework.Common.Device.Bases.LightType Type { get; set; }
  20. public Efem EfemController { get; set; }
  21. private F_TRIG _trigError = new F_TRIG();
  22. private bool _isInit;
  23. private TowerLightStatus _preState = TowerLightStatus.Unknown;
  24. public VirgoSingalLight(string module, string name) : base(module, name)
  25. {
  26. _isInit = true;
  27. }
  28. protected override void SetOn()
  29. {
  30. SetLight(TowerLightStatus.On);
  31. }
  32. protected override void SetOff()
  33. {
  34. SetLight(TowerLightStatus.Off);
  35. }
  36. public override void SetOff(TowerLightStatus setpoint)
  37. {
  38. SetSignalLight(Type, setpoint);
  39. }
  40. protected override void SetBlinking(bool token)
  41. {
  42. SetLight(TowerLightStatus.Blinking);
  43. }
  44. private bool SetSignalLight(MECF.Framework.Common.Device.Bases.LightType type, TowerLightStatus setpoint)
  45. {
  46. VirgoRT.LightType virgoType;
  47. switch (type)
  48. {
  49. case MECF.Framework.Common.Device.Bases.LightType.Red:
  50. virgoType = LightType.RED;
  51. break;
  52. case MECF.Framework.Common.Device.Bases.LightType.Yellow:
  53. virgoType = LightType.YELLOW;
  54. break;
  55. case MECF.Framework.Common.Device.Bases.LightType.Green:
  56. virgoType = LightType.GREEN;
  57. break;
  58. case MECF.Framework.Common.Device.Bases.LightType.White:
  59. virgoType = LightType.WHITE;
  60. break;
  61. case MECF.Framework.Common.Device.Bases.LightType.Blue:
  62. virgoType = LightType.BLUE;
  63. break;
  64. case MECF.Framework.Common.Device.Bases.LightType.Buzzer:
  65. case MECF.Framework.Common.Device.Bases.LightType.Buzzer1:
  66. virgoType = LightType.BUZZER1;
  67. break;
  68. default:
  69. virgoType = LightType.BUZZER1;
  70. break;
  71. }
  72. VirgoRT.LightStatus virgoSetpoint;
  73. switch (setpoint)
  74. {
  75. case TowerLightStatus.Blinking:
  76. virgoSetpoint = LightStatus.BLINK;
  77. break;
  78. case TowerLightStatus.On:
  79. virgoSetpoint = LightStatus.ON;
  80. break;
  81. case TowerLightStatus.Off:
  82. virgoSetpoint = LightStatus.OFF;
  83. break;
  84. default:
  85. virgoSetpoint = LightStatus.OFF;
  86. break;
  87. }
  88. EfemController.SetLamp(virgoType, virgoSetpoint);
  89. return true;
  90. }
  91. private void SetLight(TowerLightStatus setpoint)
  92. {
  93. try
  94. {
  95. if (SC.GetValue<bool>($"System.EnableSignalTowerLog"))
  96. {
  97. LOG.Info($"SetLight:LightType={Type} setpoint={setpoint} preState={_preState} isInit={_isInit}");
  98. }
  99. if (setpoint != _preState || _isInit)
  100. {
  101. _trigError.CLK = SetSignalLight(Type, setpoint);
  102. if (_trigError.Q)
  103. {
  104. //EV.PostWarningLog(Module, $"Set {Type} signal light {setpoint} error, {reason}");
  105. }
  106. if (_trigError.M)
  107. {
  108. _isInit = false;
  109. _preState = setpoint;
  110. }
  111. }
  112. }
  113. catch (Exception ex)
  114. {
  115. LOG.Write(ex);
  116. }
  117. }
  118. public void ResetData()
  119. {
  120. _isInit = true;
  121. }
  122. public override void Reset()
  123. {
  124. _trigError.RST = true;
  125. base.Reset();
  126. }
  127. }
  128. public class VirgoSignalTower : SignalTowerBase
  129. {
  130. private Efem _efem;
  131. private List<VirgoSingalLight> _lights = new List<VirgoSingalLight>();
  132. public VirgoSignalTower(string module, string name) : base("", "")
  133. {
  134. base.Module = module;
  135. base.Name = name;
  136. base.Display = name;
  137. base.DeviceID = "";
  138. }
  139. public override bool Initialize()
  140. {
  141. base.Initialize();
  142. if (_efem == null)
  143. {
  144. _efem = Singleton<RouteManager>.Instance.EFEM.EfemDevice;
  145. }
  146. CustomSignalTower();
  147. return true;
  148. }
  149. //重新连接EFEM之后,需要重置灯塔
  150. public void ResetData()
  151. {
  152. foreach (var rorzeSingalLight in _lights)
  153. {
  154. rorzeSingalLight.ResetData();
  155. }
  156. }
  157. public override SignalLightBase CreateLight(MECF.Framework.Common.Device.Bases.LightType type)
  158. {
  159. var light = new VirgoSingalLight(ModuleName.System.ToString(), $"SignalLight{type}")
  160. { Type = type, EfemController = _efem };
  161. _lights.Add(light);
  162. return light;
  163. }
  164. }
  165. }