HostManager.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. using System;
  2. using GSG.NET.Logging;
  3. using OHV.Common.Events;
  4. using OHV.Common.Shareds;
  5. using OHV.SqliteDAL;
  6. using OHVConnector;
  7. using Prism.Events;
  8. using VehicleControlSystem.ControlLayer;
  9. using GSG.NET.Extensions;
  10. using OHV.Common.Model;
  11. using GSG.NET.Quartz;
  12. using System.Text;
  13. using GSG.NET.LINQ;
  14. using System.Linq;
  15. namespace VehicleControlSystem.Managers
  16. {
  17. /// <summary>
  18. /// OCS 와 통신 관리
  19. /// </summary>
  20. public class HostManager : IDisposable
  21. {
  22. static Logger loggerHost = Logger.GetLogger( "Host" );
  23. static Logger logger = Logger.GetLogger();
  24. OHVConnector.Manager manager = new OHVConnector.Manager();
  25. IEventAggregator eventAggregator = null;
  26. Vehicle vehicle = null;
  27. SqliteManager sql = null;
  28. public HostManager( IEventAggregator ea, Vehicle vehicle, SqliteManager sqlite, AutoManager autoManager, Scheduler scheduler )
  29. {
  30. this.eventAggregator = ea;
  31. this.vehicle = vehicle;
  32. this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
  33. this.sql = sqlite;
  34. autoManager.OnOccurAlarm += AutoManager_OnOccurAlarm;
  35. autoManager.OnClearAlarm += AutoManager_OnClearAlarm;
  36. scheduler.OnMaualAddedCommand += Scheduler_OnMaualAddedCommand;
  37. }
  38. private void Scheduler_OnMaualAddedCommand( Command obj )
  39. {
  40. var tID = Convert.ToInt32( obj.TargetID );
  41. var msg = new OCSMessage()
  42. {
  43. Kind = eKind.P,
  44. Tag = tID.ToString("0000"),
  45. };
  46. switch ( obj.Type )
  47. {
  48. case eCommandType.Move:
  49. msg.SubCode = "001";
  50. break;
  51. case eCommandType.MoveNLoad:
  52. msg.SubCode = "010";
  53. break;
  54. case eCommandType.MoveNUnload:
  55. msg.SubCode = "100";
  56. break;
  57. case eCommandType.Charging:
  58. msg.SubCode = "111";
  59. break;
  60. default:
  61. break;
  62. }
  63. this.manager.Send( msg );
  64. }
  65. private void AutoManager_OnClearAlarm( int obj )
  66. {
  67. var msg = new OCSMessage();
  68. msg.Kind = eKind.E;
  69. msg.Tag = obj.ToString("0000");
  70. msg.SubCode = "100";
  71. this.manager.Send( msg );
  72. }
  73. private void AutoManager_OnOccurAlarm( int obj )
  74. {
  75. var msg = new OCSMessage();
  76. msg.Kind = eKind.E;
  77. msg.Tag = obj.ToString("0000");
  78. msg.SubCode = "101";
  79. this.manager.Send( msg );
  80. }
  81. private void Vehicle_PropertyChanged( object sender, System.ComponentModel.PropertyChangedEventArgs e )
  82. {
  83. if ( e.PropertyName.Equals( "MachineMode" ) )
  84. {
  85. var property = sender.GetType().GetProperty( e.PropertyName );
  86. var newValue = property.GetValue( sender, null );
  87. var msg = new OCSMessage();
  88. var mode = CastTo<eMachineMode>.From<object>( newValue );
  89. if ( mode == eMachineMode.HostMode )
  90. {
  91. msg.Kind = eKind.I;
  92. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  93. msg.IsSubCode1 = this.vehicle.IsContain;
  94. msg.IsSubCode2 = vehicle.IsMoving;
  95. msg.IsSubCode3 = vehicle.IsError;
  96. }
  97. else
  98. {
  99. msg.Kind = eKind.O;
  100. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  101. msg.IsSubCode1 = this.vehicle.IsContain;
  102. msg.IsSubCode2 = vehicle.IsMoving;
  103. msg.IsSubCode3 = vehicle.IsError;
  104. }
  105. this.manager.Send( msg );
  106. }
  107. }
  108. public void Init()
  109. {
  110. this.manager.Config = new OHVConnector.Config
  111. {
  112. ID = sql.ConfigDal.GetById( ConstString.VehicleID ).Value,
  113. IpAddress = sql.ConfigDal.GetById( ConstString.Addr ).Value,
  114. Port = Convert.ToInt16( sql.ConfigDal.GetById( ConstString.PortNo ).Value ),
  115. HostID = sql.ConfigDal.GetById( ConstString.OCSID ).Value,
  116. };
  117. this.manager.OnContd += Manager_OnContd;
  118. this.manager.OnDiscontd += Manager_OnDiscontd;
  119. this.manager.OnLog += Manager_OnLog;
  120. this.manager.OnT3Timeout += Manager_OnT3Timeout;
  121. this.manager.OnRecd += Manager_OnRecd;
  122. this.manager.OnSent += Manager_OnSent;
  123. //Vehicle Server.
  124. this.manager.Connect( false );
  125. //Vehicle Event
  126. vehicle.OnBatteryVelueChanged += Vehicle_OnBatteryVelueChanged;
  127. vehicle.OnChargingStart += Vehicle_OnChargingStart;
  128. vehicle.OnCharging += Vehicle_OnCharging;
  129. vehicle.OnChargingFull += Vehicle_OnChargingFull;
  130. vehicle.OnCurrentTagChanged += Vehicle_OnCurrentTagChanged;
  131. //vehicle.OnManualLoad += Vehicle_OnManualLoad;
  132. //vehicle.OnManualMove += Vehicle_OnManualMove;
  133. //vehicle.OnManualUnload += Vehicle_OnManualUnload;
  134. //vehicle.OnManualCharging += Vehicle_OnManualCharging;
  135. vehicle.OnPIOStart += Vehicle_OnPIOStart;
  136. vehicle.OnConveyorStart += Vehicle_OnConveyorStart;
  137. vehicle.OnConveyorStop += Vehicle_OnConveyorStop;
  138. vehicle.OnLoadComplete += Vehicle_OnLoadComplete;
  139. vehicle.OnUnloadComplete += Vehicle_OnUnloadComplete;
  140. vehicle.OnCarrierDetected += Vehicle_OnCarrierDetected;
  141. vehicle.OnFailReport += Vehicle_OnFailReport;
  142. }
  143. private void Vehicle_OnFailReport( Vehicle.eFailCode obj )
  144. {
  145. var msg = new OCSMessage();
  146. msg.Kind = eKind.F;
  147. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  148. msg.SubCode = CastTo<int>.From( obj ).ToString( "000" );
  149. this.manager.Send( msg );
  150. }
  151. private void Vehicle_OnChargingFull()
  152. {
  153. var msg = new OCSMessage();
  154. msg.Kind = eKind.H;
  155. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  156. msg.IsSubCode1 = false;
  157. msg.IsSubCode2 = false;
  158. msg.IsSubCode3 = false;
  159. this.manager.Send( msg );
  160. }
  161. private void Vehicle_OnCharging()
  162. {
  163. var msg = new OCSMessage();
  164. msg.Kind = eKind.H;
  165. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  166. msg.IsSubCode1 = false;
  167. msg.IsSubCode2 = true;
  168. msg.IsSubCode3 = false;
  169. this.manager.Send( msg );
  170. }
  171. private void Vehicle_OnChargingStart()
  172. {
  173. var msg = new OCSMessage();
  174. msg.Kind = eKind.H;
  175. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  176. msg.IsSubCode1 = true;
  177. msg.IsSubCode2 = false;
  178. msg.IsSubCode3 = false;
  179. this.manager.Send( msg );
  180. }
  181. private void Vehicle_OnCarrierDetected( bool isLoad )
  182. {
  183. var msg = new OCSMessage();
  184. if ( isLoad )
  185. msg.Kind = eKind.L;
  186. else
  187. msg.Kind = eKind.U;
  188. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  189. msg.IsSubCode1 = true;
  190. msg.IsSubCode2 = true;
  191. msg.IsSubCode3 = false;
  192. this.manager.Send( msg );
  193. }
  194. private void Vehicle_OnUnloadComplete()
  195. {
  196. var msg = new OCSMessage();
  197. msg.Kind = eKind.U;
  198. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  199. msg.IsSubCode1 = true;
  200. msg.IsSubCode2 = true;
  201. msg.IsSubCode3 = true;
  202. this.manager.Send( msg );
  203. }
  204. private void Vehicle_OnLoadComplete()
  205. {
  206. var msg = new OCSMessage();
  207. msg.Kind = eKind.L;
  208. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  209. msg.IsSubCode1 = true;
  210. msg.IsSubCode2 = true;
  211. msg.IsSubCode3 = true;
  212. this.manager.Send( msg );
  213. }
  214. private void Vehicle_OnConveyorStop( bool isLoad )
  215. {
  216. var msg = new OCSMessage();
  217. if ( isLoad )
  218. msg.Kind = eKind.L;
  219. else
  220. msg.Kind = eKind.U;
  221. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  222. msg.IsSubCode1 = true;
  223. msg.IsSubCode2 = false;
  224. msg.IsSubCode3 = true;
  225. this.manager.Send( msg );
  226. }
  227. private void Vehicle_OnConveyorStart( bool isLoad )
  228. {
  229. var msg = new OCSMessage();
  230. if ( isLoad )
  231. msg.Kind = eKind.L;
  232. else
  233. msg.Kind = eKind.U;
  234. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  235. msg.IsSubCode1 = true;
  236. msg.IsSubCode2 = false;
  237. msg.IsSubCode3 = false;
  238. this.manager.Send( msg );
  239. }
  240. private void Vehicle_OnPIOStart( bool isLoad )
  241. {
  242. var msg = new OCSMessage();
  243. if ( isLoad )
  244. msg.Kind = eKind.L;
  245. else
  246. msg.Kind = eKind.U;
  247. msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
  248. msg.IsSubCode1 = false;
  249. msg.IsSubCode2 = false;
  250. msg.IsSubCode3 = false;
  251. this.manager.Send( msg );
  252. }
  253. //private void Vehicle_OnManualCharging()
  254. //{
  255. // this.Send_ManualCharging();
  256. //}
  257. //private void Vehicle_OnManualUnload()
  258. //{
  259. // this.Send_ManualUnlaod();
  260. //}
  261. //private void Vehicle_OnManualMove()
  262. //{
  263. // this.Send_ManualMove();
  264. //}
  265. //private void Vehicle_OnManualLoad()
  266. //{
  267. // this.Send_ManualLoad();
  268. //}
  269. private void Vehicle_OnCurrentTagChanged( int point )
  270. {
  271. this.Send_Tcmd( point );
  272. }
  273. private void Vehicle_OnBatteryVelueChanged( double obj )
  274. {
  275. this.Send_Bcmd( obj );
  276. }
  277. #region Event Method
  278. private void Manager_OnSent( OHVConnector.OCSMessage msg )
  279. {
  280. loggerHost.I( "[Sent] : " + msg.LogFormat() );
  281. }
  282. private void Manager_OnRecd( OHVConnector.OCSMessage msg )
  283. {
  284. loggerHost.I( "[Received] : " + msg.LogFormat() );
  285. switch ( msg.Kind )
  286. {
  287. case OHVConnector.eKind.Unknown:
  288. break;
  289. case OHVConnector.eKind.E://Error 보고 요청.
  290. break;
  291. case OHVConnector.eKind.S://마지막으로 읽은 TagNo
  292. break;
  293. case OHVConnector.eKind.B://battery Report
  294. break;
  295. case OHVConnector.eKind.T://위치 응답
  296. break;
  297. case OHVConnector.eKind.C://제어 요청
  298. break;
  299. case OHVConnector.eKind.P://수동명령보고
  300. break;
  301. case OHVConnector.eKind.I:
  302. break;
  303. case OHVConnector.eKind.O:
  304. break;
  305. case OHVConnector.eKind.A://Alive
  306. break;
  307. case OHVConnector.eKind.L:
  308. break;
  309. case OHVConnector.eKind.U:
  310. break;
  311. case OHVConnector.eKind.F:
  312. break;
  313. case OHVConnector.eKind.M:
  314. ReceiveMCommand( msg );
  315. break;
  316. case OHVConnector.eKind.R:
  317. ReceiveRCommand( msg );
  318. break;
  319. case OHVConnector.eKind.H:
  320. break;
  321. case OHVConnector.eKind.Z:
  322. break;
  323. default:
  324. break;
  325. }
  326. }
  327. void Reply( OCSMessage recieve )
  328. {
  329. var reply = new OCSMessage();
  330. reply.Kind = recieve.Kind;
  331. reply.Tag = recieve.Tag;
  332. reply.SubCode = recieve.SubCode;
  333. this.manager.Reply( reply );
  334. }
  335. private void ReceiveRCommand( OCSMessage msg )
  336. {
  337. this.Reply( msg );
  338. if ( msg.SubCode.Equals( "100" ) )
  339. {
  340. Send_Scmd( );
  341. }
  342. if ( msg.SubCode.Equals( "010" ) )
  343. {
  344. Send_Bcmd( this.vehicle.BatteryVoltage );
  345. }
  346. }
  347. private void ReceiveMCommand( OCSMessage msg )
  348. {
  349. this.Reply( msg );
  350. var cmd = new Command();
  351. var info = sql.VehicleInfoDAL.GetAll().FirstOrDefault();
  352. if ( info.MachineMode == eMachineMode.LocalMode )
  353. {
  354. loggerHost.E( $"[OCS] Cmd - Current Mode Local Mode " );
  355. return;
  356. }
  357. var hasCommand = this.sql.CommandDAL.GetAll().FirstOrDefault();
  358. if ( hasCommand != null )
  359. {
  360. if ( !hasCommand.IsSecondCommanded )
  361. sql.CommandDAL.Delete( hasCommand.CommandID );
  362. else
  363. {
  364. loggerHost.E( $"[OCS] Cmd - {msg.Kind} Message Tag [{msg.Tag}] - Already Load/Unload " );
  365. return;
  366. }
  367. cmd.ByWho = eCommandByWho.HostOverWrite;
  368. }
  369. else
  370. cmd.ByWho = eCommandByWho.Host;
  371. switch ( msg.SubCode )
  372. {
  373. case "000": //Move
  374. cmd.Type = eCommandType.Move;
  375. break;
  376. case "001": //Move and Load
  377. cmd.Type = eCommandType.MoveNLoad;
  378. break;
  379. case "002": //Move and Unload
  380. cmd.Type = eCommandType.MoveNUnload;
  381. break;
  382. case "003": //Move and Charge
  383. cmd.Type = eCommandType.Charging;
  384. break;
  385. default:
  386. return;
  387. }
  388. //Todo: 등록 되어 있는 경로 가 있는 지 확인 필요.
  389. //var route = this.sql.RouteDal.GetRouteFromOCSMatchID( msg.Tag );
  390. //if ( route == null )
  391. //{
  392. // loggerHost.E( $"[OCS] Message Tag [{msg.Tag}] - not found route" );
  393. // return;
  394. //}
  395. cmd.TargetID = msg.Tag;
  396. this.sql.CommandDAL.Insert( cmd );
  397. logger.I( $"[Command] - Add Host : Target {cmd.TargetID} / Type {cmd.Type}" );
  398. }
  399. private void Manager_OnT3Timeout( OHVConnector.OCSMessage msg )
  400. {
  401. loggerHost.E( "[TimeOut] : " + msg.LogFormat() );
  402. }
  403. private void Manager_OnLog( string id, string log )
  404. {
  405. loggerHost.I( "[Log] : " + log );
  406. }
  407. private void Manager_OnDiscontd( string id, Exception e )
  408. {
  409. var msg = new HostConnectedEventArgs( HostConnectedEventArgs.eConnectedState.Disconnected );
  410. this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Publish( msg );
  411. QuartzUtils.StopSchedule( "BatteryReport" );
  412. }
  413. private void Manager_OnContd( string id )
  414. {
  415. var msg = new HostConnectedEventArgs( HostConnectedEventArgs.eConnectedState.Connected );
  416. this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Publish( msg );
  417. QuartzUtils.Invoke( "BatteryReport", QuartzUtils.GetExpnMinute( 1 ), BatteryState_Report );
  418. }
  419. #endregion
  420. #region Pooling Report
  421. void BatteryState_Report()
  422. {
  423. Send_Bcmd( this.vehicle.BatteryVoltage );
  424. }
  425. #endregion
  426. #region Send
  427. /// <summary>
  428. /// 현재 위치 보고
  429. /// </summary>
  430. public void Send_Scmd( )
  431. {
  432. var msg = new OCSMessage();
  433. msg.Kind = eKind.S;
  434. msg.Tag = this.vehicle.CurrentTag.ToString("0000");
  435. msg.IsSubCode1 = this.vehicle.IsContain;
  436. msg.IsSubCode2 = vehicle.IsMoving;
  437. msg.IsSubCode3 = vehicle.IsError;
  438. this.manager.Send( msg );
  439. }
  440. public void Send_Bcmd( double volt )
  441. {
  442. var msg = new OCSMessage();
  443. msg.Kind = eKind.B;
  444. var bData = volt;
  445. msg.Tag = bData.ToString( "00.00" ).Replace( ".", "" );
  446. msg.IsSubCode1 = this.vehicle.IsContain;
  447. msg.IsSubCode2 = vehicle.IsMoving;
  448. msg.IsSubCode3 = vehicle.IsError;
  449. this.manager.Send( msg );
  450. }
  451. public void Send_Ecmd(int AlarmNo)
  452. {
  453. var msg = new OCSMessage();
  454. msg.Tag = AlarmNo.ToString( "0000" );
  455. msg.IsSubCode1 = this.vehicle.IsContain;
  456. msg.IsSubCode2 = vehicle.IsMoving;
  457. msg.IsSubCode3 = vehicle.IsError;
  458. this.manager.Send( msg );
  459. }
  460. public void Send_Tcmd( int point )
  461. {
  462. var msg = new OCSMessage();
  463. msg.Kind = eKind.T;
  464. msg.Tag = point.ToString( "0000" );
  465. msg.IsSubCode1 = this.vehicle.IsContain;
  466. msg.IsSubCode2 = vehicle.IsMoving;
  467. msg.IsSubCode3 = vehicle.IsError;
  468. this.manager.Send( msg );
  469. }
  470. public void Send_Ccmd( string crossPointID )
  471. {
  472. var msg = new OCSMessage();
  473. msg.Kind = eKind.C;
  474. msg.Tag = crossPointID;
  475. msg.IsSubCode1 = this.vehicle.IsContain;
  476. msg.IsSubCode2 = vehicle.IsMoving;
  477. msg.IsSubCode3 = vehicle.IsError;
  478. this.manager.Send( msg );
  479. }
  480. public void Send_ManualMove()
  481. {
  482. var msg = new OCSMessage()
  483. {
  484. Kind = eKind.P,
  485. Tag = this.vehicle.CurrentTag.ToString( "0000" ),
  486. IsSubCode1 = false,
  487. IsSubCode2 = false,
  488. IsSubCode3 = true,
  489. };
  490. this.manager.Send( msg );
  491. }
  492. public void Send_ManualLoad()
  493. {
  494. var msg = new OCSMessage()
  495. {
  496. Kind = eKind.P,
  497. Tag = this.vehicle.CurrentTag.ToString( "0000" ),
  498. IsSubCode1 = false,
  499. IsSubCode2 = true,
  500. IsSubCode3 = false,
  501. };
  502. this.manager.Send( msg );
  503. }
  504. public void Send_ManualUnlaod()
  505. {
  506. var msg = new OCSMessage()
  507. {
  508. Kind = eKind.P,
  509. Tag = this.vehicle.CurrentTag.ToString( "0000" ),
  510. IsSubCode1 = true,
  511. IsSubCode2 = false,
  512. IsSubCode3 = false,
  513. };
  514. this.manager.Send( msg );
  515. }
  516. public void Send_ManualCharging()
  517. {
  518. var msg = new OCSMessage()
  519. {
  520. Kind = eKind.P,
  521. Tag = this.vehicle.CurrentTag.ToString( "0000" ),
  522. IsSubCode1 = true,
  523. IsSubCode2 = true,
  524. IsSubCode3 = true,
  525. };
  526. this.manager.Send( msg );
  527. }
  528. #endregion
  529. public void Dispose()
  530. {
  531. this.manager.Disconnect();
  532. }
  533. }
  534. }