HostManager.cs 22 KB

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