VCSystem.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading;
  6. using GSG.NET.Excel;
  7. using GSG.NET.Extensions;
  8. using GSG.NET.Logging;
  9. using GSG.NET.Quartz;
  10. using OHV.Common.Events;
  11. using OHV.Common.Model;
  12. using OHV.Common.Shareds;
  13. using OHV.SqliteDAL;
  14. using Prism.Events;
  15. using Prism.Ioc;
  16. using Prism.Modularity;
  17. using VehicleControlSystem.ControlLayer;
  18. using VehicleControlSystem.ControlLayer.Drive;
  19. using VehicleControlSystem.ControlLayer.IO;
  20. using VehicleControlSystem.ControlLayer.MQ;
  21. using VehicleControlSystem.ControlLayer.Serial.BatteryTabos;
  22. using VehicleControlSystem.Managers;
  23. namespace VehicleControlSystem
  24. {
  25. [Module( ModuleName = "VCSystem" )]
  26. public class VCSystem : IModule, IDisposable
  27. {
  28. Logger logger = Logger.GetLogger();
  29. Scheduler scheduler = null;
  30. public AutoManager autoManager = null;
  31. HostManager hostManager = null;
  32. SqliteManager sql = null;
  33. IEventAggregator eventAggregator = null;
  34. public IIO IO = null;
  35. ZmqManager zmqManager = null;
  36. BMUManager bMUManager = null;
  37. Conveyor conveyor = null;
  38. Steering steering = null;
  39. GSIDrive drive = null;
  40. Clamp clamp = null;
  41. Vehicle vehicle = null;
  42. public RouteManager RouteManager { get; set; }
  43. public List<Alarm> Alarms { get; set; }
  44. public VCSystem( IEventAggregator ea, SqliteManager sql )
  45. {
  46. this.sql = sql;
  47. this.eventAggregator = ea;
  48. this.eventAggregator.GetEvent<ApplicationExitEvent>().Subscribe( ( o ) => Dispose(), true );
  49. this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Unsubscribe( ReceivedMessageEvent );
  50. this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Subscribe( this.ReceivedMessageEvent, ThreadOption.BackgroundThread );
  51. }
  52. public void Init()
  53. {
  54. QuartzUtils.Invoke( "HIS_ALARM", QuartzUtils.GetExpnHour( 5 ), this.CleanHisAlarm );
  55. this.RouteManager = RouteManager.Instance;
  56. RouteManager.Instance.Init( this.sql );
  57. Alarms = new ExcelMapper( Path.Combine( System.Environment.CurrentDirectory ) + @"\Config\AlarmDefind.xlsx" ).Fetch<Alarm>().ToList();
  58. //Create IO
  59. this.IO = new EzIO();
  60. var mapPath = Path.Combine( System.Environment.CurrentDirectory ) + @"\Config\IO.xlsx";
  61. this.IO.LoadIOMap( mapPath );
  62. this.IO.RunIOThread();
  63. var ezIO = this.IO as EzIO;
  64. ezIO.OnContd += EzIO_OnContd;
  65. ezIO.OnDiscontd += EzIO_OnDiscontd;
  66. ezIO.OnChangedIO += EzIO_OnChangedIO;
  67. ezIO.OnFirstColtd += EzIO_OnFirstColtd;
  68. //Battery
  69. this.bMUManager = new BMUManager();
  70. this.bMUManager.BMUConfig = new ControlLayer.Serial.BatteryTabos.Config() { ID = "0" };
  71. var setV = Convert.ToInt32( sql.ConfigDal.GetById( ConstString.BatteryCanType ).Value );
  72. var canType = CastTo<BMUManager.eCANSelect>.From<int>( setV );
  73. this.bMUManager.Connect( canType );
  74. //Conveyor
  75. this.conveyor = new Conveyor( this.IO as EzIO );
  76. //Clamp
  77. this.clamp = new Clamp( this.sql, this.eventAggregator );
  78. this.clamp.Init();
  79. //Steering
  80. this.steering = new Steering( this.IO, this.sql, this.eventAggregator );
  81. //ZeroMQ
  82. this.zmqManager = new ZmqManager( this.bMUManager, this.steering );
  83. this.zmqManager.Init();
  84. //Drive
  85. this.drive = new GSIDrive( this.sql, this.steering, this.zmqManager );
  86. this.drive.Init();
  87. var refObject = new VehicleRefObjects();
  88. refObject.IO = this.IO as EzIO;
  89. refObject.BMUManager = this.bMUManager;
  90. refObject.Drive = this.drive;
  91. refObject.Conveyor = this.conveyor;
  92. refObject.Clamp = this.clamp;
  93. refObject.Steering = this.steering;
  94. refObject.ZmqManager = this.zmqManager;
  95. //Process
  96. this.autoManager = new AutoManager( this.IO, this.eventAggregator, this.sql, this.Alarms );
  97. this.scheduler = new Scheduler( eventAggregator, this.autoManager, this.sql );
  98. this.vehicle = new Vehicle( refObject, this.IO, this.sql, this.eventAggregator, this.autoManager );
  99. this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
  100. this.hostManager = new HostManager( this.eventAggregator, this.vehicle, this.sql, this.autoManager, this.scheduler );
  101. this.hostManager.Init();
  102. this.vehicle.Init();
  103. this.scheduler.Init();
  104. this.autoManager.Init( this.vehicle );
  105. }
  106. private void Vehicle_PropertyChanged( object sender, System.ComponentModel.PropertyChangedEventArgs e )
  107. {
  108. var arg = new GUIMessageEventArgs();
  109. arg.Kind = GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange;
  110. arg.MessageKey = MessageKey.Vehicle;
  111. arg.ModelPropertyName = e.PropertyName;
  112. var property = sender.GetType().GetProperty( e.PropertyName );
  113. var newValue = property.GetValue( sender, null );
  114. arg.ModelPropertyName = e.PropertyName;
  115. arg.Args = newValue;
  116. GUIMessageEventPublish( arg );
  117. }
  118. public void CleanHisAlarm()
  119. {
  120. var backup = DateTime.Now.AddDays( -15 );
  121. sql.HisAlarmDAL.Delete( x=>x.OccurTime < backup );
  122. }
  123. #region EzIO Event
  124. private void EzIO_OnChangedIO( BitBlock bit )
  125. {
  126. this.eventAggregator.GetEvent<IOChangedPubSubEvent>().Publish( new IOChangedMessageEventArgs { Args = bit } );
  127. }
  128. private void EzIO_OnDiscontd( string ID )
  129. {
  130. //throw new NotImplementedException();
  131. }
  132. private void EzIO_OnContd( string ID )
  133. {
  134. //IO 연결 시 할일 들을 여기서 하자.
  135. this.IO.OutputOn( "OUT_TEACH_MODE" );
  136. this.autoManager.LampStateProperty = eLampState.Alarm;
  137. //throw new NotImplementedException();
  138. }
  139. private void EzIO_OnFirstColtd( string ID )
  140. {
  141. if ( this.IO.IsOff( "IN_MC_ON" ) )
  142. {
  143. this.vehicle.OccurVehicleAlarm( 29 );
  144. }
  145. this.steering.ControlSteering( true );//초기에 직선 주행 상태로 핸들 조정.
  146. }
  147. #endregion
  148. #region ReqMessage Method
  149. void ReceivedMessageEvent( VCSMessageEventArgs msg )
  150. {
  151. switch ( msg.Kind )
  152. {
  153. case VCSMessageEventArgs.eVCSMessageKind.ReqIOObject:
  154. ReqIOObjectMessage();
  155. break;
  156. case VCSMessageEventArgs.eVCSMessageKind.ReqIOMapList:
  157. break;
  158. case VCSMessageEventArgs.eVCSMessageKind.ReqCommandList:
  159. break;
  160. case VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange:
  161. break;
  162. case VCSMessageEventArgs.eVCSMessageKind.ReqManualModeChange:
  163. break;
  164. case VCSMessageEventArgs.eVCSMessageKind.ModelPropertyChange:
  165. break;
  166. case VCSMessageEventArgs.eVCSMessageKind.ReqAlarmReset:
  167. ReqAlarmReset();
  168. break;
  169. case VCSMessageEventArgs.eVCSMessageKind.ReqVehicleModeChange:
  170. this.ReqVehicleModeChange( msg );
  171. break;
  172. case VCSMessageEventArgs.eVCSMessageKind.ReqEStop:
  173. ReqEStop();
  174. break;
  175. case VCSMessageEventArgs.eVCSMessageKind.ReqBuzzerStop:
  176. ReqBuzzerStop();
  177. break;
  178. case VCSMessageEventArgs.eVCSMessageKind.ReqMachineModeChg:
  179. ReqMachineModeChg( msg );
  180. break;
  181. case VCSMessageEventArgs.eVCSMessageKind.ReqAddCommand:
  182. break;
  183. case VCSMessageEventArgs.eVCSMessageKind.ReqTest:
  184. ReqTest();
  185. break;
  186. case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorMove:
  187. ReqConveyorMove( msg );
  188. break;
  189. case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorLoad:
  190. ReqConveyorLoad( msg );
  191. break;
  192. case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorUnload:
  193. ReqConveyorUnload();
  194. break;
  195. case VCSMessageEventArgs.eVCSMessageKind.ReqObstaclePatternChg:
  196. ReqObsticlePatternChange( msg );
  197. break;
  198. case VCSMessageEventArgs.eVCSMessageKind.ReqObstaclePatternNo:
  199. ReqObsticlePatternNo();
  200. break;
  201. case VCSMessageEventArgs.eVCSMessageKind.ReqPIOConveyor:
  202. this.ReqPIOConveyor( msg );
  203. break;
  204. case VCSMessageEventArgs.eVCSMessageKind.ReqPIOBatteryCharge:
  205. this.ReqPIOBattery( msg );
  206. break;
  207. case VCSMessageEventArgs.eVCSMessageKind.ReqBatteryState:
  208. this.ReqBatteryState();
  209. break;
  210. case VCSMessageEventArgs.eVCSMessageKind.ReqPIOBatteryChargeStop:
  211. this.ReqBatteryChargeStop( msg );
  212. break;
  213. default:
  214. break;
  215. }
  216. }
  217. void ReqBatteryState()
  218. {
  219. BatteryInfo battery = new BatteryInfo();
  220. battery.Voltage = vehicle.BatteryVoltage;
  221. battery.Current = vehicle.BatteryCurrent;
  222. battery.ChargeTime = vehicle.BatteryChargeTime;
  223. battery.DisChargeTime = vehicle.BatteryDisChargeTime;
  224. battery.Capacity = vehicle.BatteryCapacity;
  225. battery.Energy = vehicle.BatteryEnergy;
  226. battery.SOC = vehicle.BatteryStateOfCharge;
  227. battery.SOH = vehicle.BatteryStateOfHealth;
  228. battery.State = vehicle.BatteryState;
  229. battery.IsConnect = vehicle.BatteryIsConnect;
  230. battery.Temperature = vehicle.BatteryTemperature;
  231. var reply = new GUIMessageEventArgs()
  232. {
  233. Args = battery,
  234. Kind = GUIMessageEventArgs.eGUIMessageKind.RspBatteryState
  235. };
  236. GUIMessageEventPublish( reply );
  237. }
  238. private void ReqConveyorMove( VCSMessageEventArgs msg )
  239. {
  240. var result = 0;
  241. this.vehicle.ReqConveyorMove( msg.MessageText );
  242. }
  243. private void ReqObsticlePatternNo()
  244. {
  245. var reply = new GUIMessageEventArgs();
  246. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspObstaclePatternNo;
  247. reply.MessageText = this.vehicle.GetObstacleDetectPattern().ToString();
  248. GUIMessageEventPublish( reply );
  249. }
  250. private void ReqObsticlePatternChange( VCSMessageEventArgs msg )
  251. {
  252. var patternNo = Convert.ToInt32( msg.MessageText );
  253. this.vehicle.ChgObstacleDetectPattern( patternNo );
  254. var reply = new GUIMessageEventArgs();
  255. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspObstaclePatternChg;
  256. reply.Result = FluentResults.Results.Ok();
  257. GUIMessageEventPublish( reply );
  258. }
  259. private void ReqConveyorUnload()
  260. {
  261. int result = 0;
  262. result = this.vehicle.ConveyorUnload();
  263. }
  264. private void ReqConveyorLoad( VCSMessageEventArgs msg )
  265. {
  266. int result = 0;
  267. result = this.vehicle.ConveyorLoad();
  268. }
  269. private void ReqPIOConveyor( VCSMessageEventArgs msg )
  270. {
  271. int result = 0;
  272. var reply = new GUIMessageEventArgs()
  273. {
  274. Kind = GUIMessageEventArgs.eGUIMessageKind.RspPIOConveyor,
  275. MessageText = msg.MessageText,
  276. };
  277. /*PIO Load// Unload*/
  278. if ( msg.MessageText.Equals( "PL" ) )
  279. result = this.vehicle.PIOAndLoad( "" );
  280. else
  281. result = this.vehicle.PIOAndUnload( "" );
  282. //실행 결과 확인
  283. if ( result <= 0 )
  284. reply.Result = FluentResults.Results.Ok();
  285. else
  286. reply.Result = FluentResults.Results.Fail( "PIO Fail" );
  287. GUIMessageEventPublish( reply );
  288. }
  289. private void ReqPIOBattery( VCSMessageEventArgs msg )
  290. {
  291. int result = 1;
  292. var reply = new GUIMessageEventArgs()
  293. {
  294. Kind = GUIMessageEventArgs.eGUIMessageKind.RspPIOBatteryCharge,
  295. MessageText = msg.MessageText,
  296. };
  297. result = this.vehicle.StartBatteryCharge();
  298. if ( result <= 0 )
  299. reply.Result = FluentResults.Results.Ok();
  300. else
  301. reply.Result = FluentResults.Results.Fail( "Battery Charge Start Fail" );
  302. GUIMessageEventPublish( reply );
  303. }
  304. private void ReqBatteryChargeStop( VCSMessageEventArgs msg )
  305. {
  306. int result = 1;
  307. var reply = new GUIMessageEventArgs()
  308. {
  309. Kind = GUIMessageEventArgs.eGUIMessageKind.RsqPIOBatteryChargeStop,
  310. MessageText = msg.MessageText,
  311. };
  312. result = this.vehicle.StopBatteryCharge();
  313. if ( result <= 0 )
  314. reply.Result = FluentResults.Results.Ok();
  315. else
  316. reply.Result = FluentResults.Results.Fail( "Battery Charge Stop Fail" );
  317. GUIMessageEventPublish( reply );
  318. }
  319. private void ReqTest()
  320. {
  321. //logger.D( "Test Request" );
  322. //if ( this.IO.WaitChangeInputIO( true, 30000, "IN_CV_DETECT_00" ) )
  323. // logger.D( "Test - Time in" );
  324. //else
  325. // logger.D( "Test - Time out" );
  326. }
  327. private void ReqMachineModeChg( VCSMessageEventArgs msg )
  328. {
  329. var reply = new GUIMessageEventArgs();
  330. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspMachineModeChg;
  331. var mode = CastTo<eMachineMode>.From<object>( msg.Arg );
  332. if ( mode == eMachineMode.HostMode )
  333. {
  334. if ( this.autoManager.OperationModeProperty != eOperatationMode.AutoMode )
  335. reply.Result = FluentResults.Results.Fail( "Vehicle Not Start" );
  336. else
  337. {
  338. this.vehicle.MachineMode = eMachineMode.HostMode;
  339. reply.Result = FluentResults.Results.Ok();
  340. reply.Args = eMachineMode.HostMode;
  341. }
  342. }
  343. else
  344. {
  345. this.vehicle.MachineMode = eMachineMode.LocalMode;
  346. reply.Result = FluentResults.Results.Ok<eMachineMode>( eMachineMode.LocalMode );
  347. reply.Args = eMachineMode.LocalMode;
  348. }
  349. GUIMessageEventPublish( reply );
  350. }
  351. private void ReqBuzzerStop()
  352. {
  353. this.IO.OutputOff( "OUT_BUZZER_00" );
  354. this.IO.OutputOff( "OUT_BUZZER_01" );
  355. this.IO.OutputOff( "OUT_BUZZER_02" );
  356. }
  357. private void ReqAlarmReset()
  358. {
  359. //this.autoManager.IsErrorProcessing = false;
  360. //this.vehicle.VehicleStateProperty = eVehicleState.Idle;
  361. if ( !this.IO.IsOn( "IN_MC_ON" ) )
  362. {
  363. this.IO.WriteOutputIO( "OUT_SAFETY_RESET", true );
  364. Thread.Sleep( 2000 );
  365. this.IO.WriteOutputIO( "OUT_SAFETY_RESET", false );
  366. Thread.Sleep( 1000 );
  367. }
  368. this.autoManager.IsErrorProcessing = false;
  369. this.vehicle.VehicleStateProperty = eVehicleState.Idle;
  370. }
  371. private void ReqEStop()
  372. {
  373. this.scheduler.IsCreateDryRunCommand = !this.scheduler.IsCreateDryRunCommand;
  374. //this.vehicle.EStop();
  375. }
  376. private void ReqVehicleModeChange( VCSMessageEventArgs msg )
  377. {
  378. GUIMessageEventArgs reply;
  379. if ( msg.MessageKey.Equals( MessageKey.AutoMode ) )
  380. {
  381. int result = vehicle.InitializationVehicle();
  382. if ( result != 0 )
  383. {
  384. this.autoManager.ProcessAlarm( result );
  385. return;
  386. }
  387. this.autoManager.AutoModeStateProperty = eAutoModeState.StartRun;
  388. this.autoManager.OperationModeProperty = eOperatationMode.AutoMode;
  389. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Ok(), MessageKey = MessageKey.AutoMode };
  390. }
  391. else
  392. {
  393. this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.WaitStop;
  394. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Ok(), MessageKey = MessageKey.ManualMode };
  395. }
  396. GUIMessageEventPublish( reply );
  397. }
  398. void ReqIOObjectMessage()
  399. {
  400. var rspMsg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspIOObject, Args = this.IO };
  401. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish( rspMsg );
  402. }
  403. #endregion
  404. /// <summary>
  405. /// GUI 로 보내는 Event
  406. /// </summary>
  407. /// <param name="args"></param>
  408. public void GUIMessageEventPublish( GUIMessageEventArgs args )
  409. {
  410. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish( args );
  411. }
  412. public void Dispose()
  413. {
  414. this.scheduler.Dispose();
  415. this.hostManager.Dispose();
  416. this.vehicle.Dispose();
  417. this.autoManager.Dispose();
  418. this.bMUManager.Disconnect();
  419. this.drive.Dispose();
  420. this.zmqManager.Dispose();
  421. ( this.IO as IDisposable ).Dispose(); //IO 는 마지막에 정리함.
  422. }
  423. public void RegisterTypes( IContainerRegistry containerRegistry )
  424. {
  425. if ( !containerRegistry.IsRegistered<VCSystem>() )
  426. containerRegistry.RegisterSingleton<VCSystem>();
  427. }
  428. public void OnInitialized( IContainerProvider containerProvider )
  429. {
  430. this.Init();
  431. }
  432. }
  433. }