VCSystem.cs 19 KB

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