HostManager.cs 17 KB

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