HostManager.cs 16 KB

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