VCSystem.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using GSG.NET;
  8. using GSG.NET.Extensions;
  9. using GSG.NET.Logging;
  10. using GSG.NET.ObjectBase;
  11. using GSG.NET.Quartz;
  12. using OHV.Common.Events;
  13. using OHV.Common.Model;
  14. using OHV.Common.Shareds;
  15. using OHV.SqliteDAL;
  16. using Prism.Events;
  17. using Prism.Ioc;
  18. using Prism.Modularity;
  19. using VehicleControlSystem.ControlLayer;
  20. using VehicleControlSystem.ControlLayer.IO;
  21. using VehicleControlSystem.Managers;
  22. namespace VehicleControlSystem
  23. {
  24. [Module(ModuleName = "VCSystem")]
  25. public class VCSystem : IModule, IDisposable
  26. {
  27. Logger logger = Logger.GetLogger();
  28. Scheduler scheduler = null;
  29. IEventAggregator eventAggregator = null;
  30. public IIO IO = null;
  31. public AutoManager autoManager = null;
  32. HostManager hostManager = null;
  33. Vehicle vehicle = null;
  34. SqliteManager sql = null;
  35. public VCSystem(IEventAggregator ea, SqliteManager sql)
  36. {
  37. this.sql = sql;
  38. this.eventAggregator = ea;
  39. this.eventAggregator.GetEvent<ApplicationExitEvent>().Subscribe((o) => Dispose(), true);
  40. this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Unsubscribe(ReceivedMessageEvent);
  41. this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Subscribe(this.ReceivedMessageEvent, ThreadOption.BackgroundThread);
  42. }
  43. public void Init()
  44. {
  45. QuartzUtils.Invoke("HIS_ALARM", QuartzUtils.GetExpnMinute(1), this.CleanHisAlarm);
  46. //Create IO
  47. this.IO = new EzIO();
  48. var mapPath = Path.Combine(System.Environment.CurrentDirectory) + @"\Config\IO.xlsx";
  49. this.IO.LoadIOMap(mapPath);
  50. this.IO.RunIOThread();
  51. var ezIO = this.IO as EzIO;
  52. ezIO.OnContd += EzIO_OnContd;
  53. ezIO.OnDiscontd += EzIO_OnDiscontd;
  54. ezIO.OnChangedIO += EzIO_OnChangedIO;
  55. this.autoManager = new AutoManager(this.IO, this.eventAggregator, this.sql);
  56. this.scheduler = new Scheduler(eventAggregator, this.autoManager, this.sql );
  57. this.vehicle = new Vehicle(this.IO, this.sql, this.eventAggregator, this.autoManager);
  58. this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
  59. this.hostManager = new HostManager(this.eventAggregator, this.vehicle, this.sql, this.autoManager, this.scheduler);
  60. this.hostManager.Init();
  61. this.vehicle.Init();
  62. this.scheduler.Init();
  63. this.autoManager.Init(this.vehicle);
  64. }
  65. private void Vehicle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
  66. {
  67. var arg = new GUIMessageEventArgs();
  68. arg.Kind = GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange;
  69. arg.MessageKey = MessageKey.Vehicle;
  70. arg.ModelPropertyName = e.PropertyName;
  71. var property = sender.GetType().GetProperty(e.PropertyName);
  72. var newValue = property.GetValue(sender, null);
  73. arg.ModelPropertyName = e.PropertyName;
  74. arg.Args = newValue;
  75. GUIMessageEventPublish(arg);
  76. }
  77. public void CleanHisAlarm()
  78. {
  79. sql.HisAlarmDAL.Delete(20);
  80. }
  81. #region EzIO Event
  82. private void EzIO_OnChangedIO(BitBlock bit)
  83. {
  84. this.eventAggregator.GetEvent<IOChangedPubSubEvent>().Publish(new IOChangedMessageEventArgs { Args = bit });
  85. }
  86. private void EzIO_OnDiscontd(string ID)
  87. {
  88. //throw new NotImplementedException();
  89. }
  90. private void EzIO_OnContd(string ID)
  91. {
  92. this.IO.OutputOn( "OUT_TEACH_MODE" );
  93. //throw new NotImplementedException();
  94. }
  95. #endregion
  96. #region ReqMessage Method
  97. void ReceivedMessageEvent(VCSMessageEventArgs msg)
  98. {
  99. switch ( msg.Kind )
  100. {
  101. case VCSMessageEventArgs.eVCSMessageKind.ReqIOObject:
  102. ReqIOObjectMessage();
  103. break;
  104. case VCSMessageEventArgs.eVCSMessageKind.ReqIOMapList:
  105. break;
  106. case VCSMessageEventArgs.eVCSMessageKind.ReqCommandList:
  107. break;
  108. case VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange:
  109. break;
  110. case VCSMessageEventArgs.eVCSMessageKind.ReqManualModeChange:
  111. break;
  112. case VCSMessageEventArgs.eVCSMessageKind.ModelPropertyChange:
  113. break;
  114. case VCSMessageEventArgs.eVCSMessageKind.ReqAlarmReset:
  115. ReqAlarmReset();
  116. break;
  117. case VCSMessageEventArgs.eVCSMessageKind.ReqVehicleModeChange:
  118. this.ReqVehicleModeChange( msg );
  119. break;
  120. case VCSMessageEventArgs.eVCSMessageKind.ReqEStop:
  121. ReqEStop();
  122. break;
  123. case VCSMessageEventArgs.eVCSMessageKind.ReqBuzzerStop:
  124. ReqBuzzerStop();
  125. break;
  126. case VCSMessageEventArgs.eVCSMessageKind.ReqMachineModeChg:
  127. ReqMachineModeChg( msg );
  128. break;
  129. case VCSMessageEventArgs.eVCSMessageKind.ReqAddCommand:
  130. break;
  131. case VCSMessageEventArgs.eVCSMessageKind.ReqTest:
  132. ReqTest();
  133. break;
  134. case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorLoad:
  135. ReqConveyorLoad();
  136. break;
  137. case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorUnload:
  138. ReqConveyorUnload();
  139. break;
  140. default:
  141. break;
  142. }
  143. }
  144. private void ReqConveyorUnload()
  145. {
  146. int result = 0;
  147. result = this.vehicle.ConveyorUnload();
  148. }
  149. private void ReqConveyorLoad()
  150. {
  151. int result = 0;
  152. result = this.vehicle.ConveyorLoad();
  153. }
  154. private void ReqTest()
  155. {
  156. logger.D( "Test Request" );
  157. if ( this.IO.WaitChangeInputIO( true, 30000, "IN_CV_DETECT_00" ) )
  158. logger.D( "Test - Time in" );
  159. else
  160. logger.D( "Test - Time out" );
  161. }
  162. private void ReqMachineModeChg( VCSMessageEventArgs msg )
  163. {
  164. var reply = new GUIMessageEventArgs();
  165. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspMachineModeChg;
  166. var mode = CastTo<eMachineMode>.From<object>( msg.Arg );
  167. if ( mode == eMachineMode.HostMode )
  168. {
  169. if (this.autoManager.OperationModeProperty != eOperatationMode.AutoMode )
  170. reply.Result = FluentResults.Results.Fail( "Vehicle Not Start" );
  171. else
  172. {
  173. this.vehicle.MachineMode = eMachineMode.HostMode;
  174. reply.Result = FluentResults.Results.Ok();
  175. reply.Args = eMachineMode.HostMode;
  176. }
  177. }
  178. else
  179. {
  180. this.vehicle.MachineMode = eMachineMode.LocalMode;
  181. reply.Result = FluentResults.Results.Ok<eMachineMode>( eMachineMode.LocalMode );
  182. reply.Args = eMachineMode.LocalMode;
  183. }
  184. GUIMessageEventPublish( reply );
  185. }
  186. private void ReqBuzzerStop( )
  187. {
  188. this.IO.OutputOff( "OUT_BUZZER_00" );
  189. this.IO.OutputOff( "OUT_BUZZER_01" );
  190. this.IO.OutputOff( "OUT_BUZZER_02" );
  191. }
  192. private void ReqAlarmReset()
  193. {
  194. this.autoManager.IsErrorProcessing = false;
  195. this.vehicle.VehicleStateProperty = eVehicleState.Idle;
  196. if ( !this.IO.IsOn( "IN_MC_ON" ) )
  197. {
  198. this.IO.WriteOutputIO( "OUT_SAFETY_RESET", true );
  199. this.IO.WriteOutputIO( "OUT_SAFETY_RESET", false, 3000 );
  200. }
  201. }
  202. private void ReqEStop()
  203. {
  204. this.vehicle.EStop();
  205. }
  206. private void ReqVehicleModeChange(VCSMessageEventArgs msg)
  207. {
  208. GUIMessageEventArgs reply;
  209. if (msg.MessageKey.Equals(MessageKey.AutoMode))
  210. {
  211. int result = vehicle.InitializationVehicle();
  212. if (result != 0)
  213. {
  214. this.autoManager.ProcessAlarm(result); //Alarm 내용을 UI로 전달 해주니까 Reply 가 필요 없다.
  215. return;
  216. }
  217. this.autoManager.AutoModeStateProperty = eAutoModeState.StartRun;
  218. this.autoManager.OperationModeProperty = eOperatationMode.AutoMode;
  219. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Ok(), MessageKey = MessageKey.AutoMode };
  220. }
  221. else
  222. {
  223. this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.WaitStop;
  224. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Ok(), MessageKey = MessageKey.ManualMode };
  225. }
  226. GUIMessageEventPublish(reply);
  227. }
  228. void ReqIOObjectMessage()
  229. {
  230. var rspMsg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspIOObject, Args = this.IO };
  231. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(rspMsg);
  232. }
  233. #endregion
  234. /// <summary>
  235. /// GUI 로 보내는 Event
  236. /// </summary>
  237. /// <param name="args"></param>
  238. public void GUIMessageEventPublish(GUIMessageEventArgs args)
  239. {
  240. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(args);
  241. }
  242. public void Dispose()
  243. {
  244. this.scheduler.Dispose();
  245. this.autoManager.Dispose();
  246. this.hostManager.Dispose();
  247. this.vehicle.Dispose();
  248. (this.IO as IDisposable).Dispose(); //IO 는 마지막에 정리함.
  249. }
  250. public void RegisterTypes(IContainerRegistry containerRegistry)
  251. {
  252. if (!containerRegistry.IsRegistered<VCSystem>())
  253. containerRegistry.RegisterSingleton<VCSystem>();
  254. }
  255. public void OnInitialized(IContainerProvider containerProvider)
  256. {
  257. this.Init();
  258. }
  259. }
  260. }