HostManager.cs 15 KB

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