VCSystem.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading;
  6. using FluentResults;
  7. using GSG.NET.Concurrent;
  8. using GSG.NET.Excel;
  9. using GSG.NET.Extensions;
  10. using GSG.NET.Logging;
  11. using GSG.NET.Quartz;
  12. using GSG.NET.Utils;
  13. using OHV.Common.Events;
  14. using OHV.Common.Model;
  15. using OHV.Common.Shareds;
  16. using OHV.SqliteDAL;
  17. using Prism.Events;
  18. using Prism.Ioc;
  19. using Prism.Modularity;
  20. using VehicleControlSystem.ControlLayer;
  21. using VehicleControlSystem.ControlLayer.Drive;
  22. using VehicleControlSystem.ControlLayer.IO;
  23. using VehicleControlSystem.ControlLayer.MQ;
  24. using VehicleControlSystem.ControlLayer.Serial.BatteryTabos;
  25. using VehicleControlSystem.Managers;
  26. namespace VehicleControlSystem
  27. {
  28. [Module(ModuleName = "VCSystem")]
  29. public class VCSystem : IModule, IDisposable
  30. {
  31. Logger logger = Logger.GetLogger();
  32. Scheduler scheduler = null;
  33. public AutoManager autoManager = null;
  34. HostManager hostManager = null;
  35. SqliteManager sql = null;
  36. IEventAggregator eventAggregator = null;
  37. public IIO IO = null;
  38. public ZmqManager ZmqManager { get; set; }
  39. BMUManager bMUManager = null;
  40. Conveyor conveyor = null;
  41. Steering steering = null;
  42. GSIDrive drive = null;
  43. Clamp clamp = null;
  44. public Vehicle vehicle = null;
  45. public RouteManager RouteManager { get; set; }
  46. public List<Alarm> Alarms { get; set; }
  47. public VCSystem(IEventAggregator ea, SqliteManager sql)
  48. {
  49. this.sql = sql;
  50. this.eventAggregator = ea;
  51. this.eventAggregator.GetEvent<ApplicationExitEvent>().Subscribe((o) => Dispose(), true);
  52. this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Unsubscribe(ReceivedMessageEvent);
  53. this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Subscribe(this.ReceivedMessageEvent, ThreadOption.BackgroundThread);
  54. }
  55. public void Init()
  56. {
  57. GSG.NET.Utils.MidnightNotifier.DayChanged += MidnightNotifier_DayChanged;
  58. QuartzUtils.Invoke("HIS_ALARM", QuartzUtils.GetExpnHour(5), this.CleanHisAlarm);
  59. this.Alarms = new ExcelMapper(Path.Combine(System.Environment.CurrentDirectory) + @"\Config\AlarmDefind.xlsx").Fetch<Alarm>().ToList();
  60. this.RouteManager = RouteManager.Instance;
  61. RouteManager.Instance.Init(this.sql);
  62. //Create IO
  63. this.IO = new EzIO();
  64. var mapPath = Path.Combine(System.Environment.CurrentDirectory) + @"\Config\IO.xlsx";
  65. this.IO.LoadIOMap(mapPath);
  66. this.IO.RunIOThread();
  67. var ezIO = this.IO as EzIO;
  68. ezIO.OnContd += EzIO_OnContd;
  69. ezIO.OnDiscontd += EzIO_OnDiscontd;
  70. ezIO.OnChangedIO += EzIO_OnChangedIO;
  71. ezIO.OnFirstColtd += EzIO_OnFirstColtd;
  72. //Battery
  73. this.bMUManager = new BMUManager();
  74. this.bMUManager.BMUConfig = new ControlLayer.Serial.BatteryTabos.Config() { ID = "0" };
  75. var setV = Convert.ToInt32(sql.ConfigDal.GetById(ConstString.BatteryCanType).Value);
  76. var canType = CastTo<BMUManager.eCANSelect>.From<int>(setV);
  77. this.bMUManager.Connect(canType);
  78. //Conveyor
  79. this.conveyor = new Conveyor(this.IO as EzIO);
  80. //Clamp
  81. this.clamp = new Clamp(this.sql, this.eventAggregator);
  82. this.clamp.Init();
  83. //Steering
  84. this.steering = new Steering();
  85. //ZeroMQ
  86. this.ZmqManager = new ZmqManager();
  87. this.ZmqManager.AssignRefObject(this.bMUManager, this.steering, this.IO);
  88. this.ZmqManager.Init();
  89. this.steering.AssignRefObject(this.IO, this.sql, this.eventAggregator, this.ZmqManager);
  90. //Drive
  91. this.drive = new GSIDrive(this.sql, this.steering, this.ZmqManager, this.Alarms);
  92. this.drive.Init();
  93. //Process
  94. this.autoManager = new AutoManager(this.IO, this.eventAggregator, this.sql, this.Alarms);
  95. this.scheduler = new Scheduler(eventAggregator, this.autoManager, this.sql, this.bMUManager);
  96. this.vehicle = new Vehicle(this.eventAggregator);
  97. this.hostManager = new HostManager(this.eventAggregator, this.vehicle, this.sql, this.autoManager, this.scheduler, this.IO);
  98. var refObject = new VehicleRefObjects();
  99. refObject.IO = this.IO as EzIO;
  100. refObject.BMUManager = this.bMUManager;
  101. refObject.Drive = this.drive;
  102. refObject.Conveyor = this.conveyor;
  103. refObject.Clamp = this.clamp;
  104. refObject.Steering = this.steering;
  105. refObject.ZmqManager = this.ZmqManager;
  106. refObject.Alarms = this.Alarms;
  107. refObject.Sqlite = this.sql;
  108. refObject.AutoManager = this.autoManager;
  109. refObject.HostManager = this.hostManager;
  110. this.vehicle.DependencyInjection(refObject);
  111. this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
  112. this.hostManager.Init();
  113. this.vehicle.Init();
  114. this.scheduler.Init();
  115. this.autoManager.Init(this.vehicle);
  116. this.sql.CommandDAL.Clean();
  117. this.sql.SubCmdDAL.Clean();
  118. }
  119. private void MidnightNotifier_DayChanged(object sender, EventArgs e)
  120. {
  121. try
  122. {
  123. var info = this.sql.VehicleInfoDAL.GetAll().FirstOrDefault();
  124. var iDist = Convert.ToInt32(info.CumulativeDistance);
  125. this.hostManager.Send_TotalDistacne(iDist);
  126. }
  127. catch (Exception ex)
  128. {
  129. logger.E(ex);
  130. }
  131. }
  132. void UIRenderingComplete()
  133. {
  134. }
  135. private void Vehicle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
  136. {
  137. var arg = new GUIMessageEventArgs();
  138. arg.Kind = GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange;
  139. arg.MessageKey = MessageKey.Vehicle;
  140. arg.ModelPropertyName = e.PropertyName;
  141. var property = sender.GetType().GetProperty(e.PropertyName);
  142. var newValue = property.GetValue(sender, null);
  143. arg.ModelPropertyName = e.PropertyName;
  144. arg.Args = newValue;
  145. GUIMessageEventPublish(arg);
  146. }
  147. public void CleanHisAlarm()
  148. {
  149. var backup = DateTime.Now.AddDays(-15);
  150. sql.HisAlarmDAL.Delete(x => x.OccurTime < backup);
  151. }
  152. #region EzIO Event
  153. private void EzIO_OnChangedIO(BitBlock bit)
  154. {
  155. //this.eventAggregator.GetEvent<IOChangedPubSubEvent>().Publish(new IOChangedMessageEventArgs { Args = bit });
  156. }
  157. private void EzIO_OnDiscontd(string ID)
  158. {
  159. //throw new NotImplementedException();
  160. }
  161. private void EzIO_OnContd(string ID)
  162. {
  163. //IO 연결 시 할일 들을 여기서 하자.
  164. this.IO.OutputOn("OUT_TEACH_MODE");
  165. this.autoManager.LampStateProperty = eLampState.Alarm;
  166. //throw new NotImplementedException();
  167. }
  168. private void EzIO_OnFirstColtd(string ID)
  169. {
  170. if (this.IO.IsOff("IN_MC_ON"))
  171. {
  172. this.vehicle.OccurVehicleAlarm(29);
  173. }
  174. this.steering.RequestControl(eSteeringState.Left);//초기에 직선 주행 상태로 핸들 조정.
  175. }
  176. #endregion
  177. #region ReqMessage Method
  178. void ReceivedMessageEvent(VCSMessageEventArgs msg)
  179. {
  180. switch (msg.Kind)
  181. {
  182. case VCSMessageEventArgs.eVCSMessageKind.ReqIOObject:
  183. ReqIOObjectMessage();
  184. break;
  185. case VCSMessageEventArgs.eVCSMessageKind.ReqIOMapList:
  186. break;
  187. case VCSMessageEventArgs.eVCSMessageKind.ReqCommandList:
  188. break;
  189. case VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange:
  190. break;
  191. case VCSMessageEventArgs.eVCSMessageKind.ReqManualModeChange:
  192. break;
  193. case VCSMessageEventArgs.eVCSMessageKind.ModelPropertyChange:
  194. break;
  195. case VCSMessageEventArgs.eVCSMessageKind.ReqAlarmReset:
  196. ReqAlarmReset();
  197. break;
  198. case VCSMessageEventArgs.eVCSMessageKind.ReqVehicleModeChange:
  199. this.ReqVehicleModeChange(msg);
  200. break;
  201. case VCSMessageEventArgs.eVCSMessageKind.ReqEStop:
  202. ReqEStop();
  203. break;
  204. case VCSMessageEventArgs.eVCSMessageKind.ReqBuzzerStop:
  205. ReqBuzzerStop();
  206. break;
  207. case VCSMessageEventArgs.eVCSMessageKind.ReqMachineModeChg:
  208. ReqMachineModeChg(msg);
  209. break;
  210. case VCSMessageEventArgs.eVCSMessageKind.ReqAddCommand:
  211. break;
  212. case VCSMessageEventArgs.eVCSMessageKind.ReqTest:
  213. #if TEST
  214. ReqTest();
  215. #endif
  216. break;
  217. case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorMove:
  218. ReqConveyorMove(msg);
  219. break;
  220. case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorLoad:
  221. ReqConveyorLoad(msg);
  222. break;
  223. case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorUnload:
  224. ReqConveyorUnload();
  225. break;
  226. case VCSMessageEventArgs.eVCSMessageKind.ReqObstaclePatternChg:
  227. ReqObsticlePatternChange(msg);
  228. break;
  229. case VCSMessageEventArgs.eVCSMessageKind.ReqObstaclePatternNo:
  230. ReqObsticlePatternNo();
  231. break;
  232. case VCSMessageEventArgs.eVCSMessageKind.ReqPIOConveyor:
  233. this.ReqPIOConveyor(msg);
  234. break;
  235. case VCSMessageEventArgs.eVCSMessageKind.ReqPIOBatteryCharge:
  236. this.ReqPIOBattery(msg);
  237. break;
  238. case VCSMessageEventArgs.eVCSMessageKind.ReqBatteryState:
  239. this.ReqBatteryState();
  240. break;
  241. case VCSMessageEventArgs.eVCSMessageKind.ReqPIOBatteryChargeStop:
  242. this.ReqBatteryChargeStop(msg);
  243. break;
  244. case VCSMessageEventArgs.eVCSMessageKind.ReqRouteManager:
  245. break;
  246. case VCSMessageEventArgs.eVCSMessageKind.ReqDirveSpeed:
  247. this.ReqSetDriveSpeed(msg);
  248. break;
  249. case VCSMessageEventArgs.eVCSMessageKind.ReqSpeedProfile:
  250. this.ReqSetSpeedProfile(msg);
  251. break;
  252. case VCSMessageEventArgs.eVCSMessageKind.ReqJogSpeed:
  253. this.ReqSetJogSpeed(msg);
  254. break;
  255. case VCSMessageEventArgs.eVCSMessageKind.ReqParamsSave:
  256. this.ReqParamsSave(msg);
  257. break;
  258. case VCSMessageEventArgs.eVCSMessageKind.ReqVehicleOnRailStateChg:
  259. this.ReqVehicleOnRailStateChg(msg);
  260. break;
  261. default:
  262. break;
  263. }
  264. }
  265. private void ReqVehicleOnRailStateChg(VCSMessageEventArgs msg)
  266. {
  267. var reply = new GUIMessageEventArgs();
  268. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleOnRailStateChg;
  269. var mode = CastTo<eVehicleOnRailState>.From<object>(msg.Arg);
  270. if (mode == eVehicleOnRailState.Install)
  271. {
  272. this.vehicle.VehicleOnRailState = eVehicleOnRailState.Install;
  273. reply.Args = eVehicleOnRailState.Install;
  274. reply.Result = FluentResults.Results.Ok<eVehicleOnRailState>(eVehicleOnRailState.Install);
  275. }
  276. else
  277. {
  278. this.vehicle.VehicleOnRailState = eVehicleOnRailState.Removed;
  279. reply.Args = eVehicleOnRailState.Removed;
  280. reply.Result = FluentResults.Results.Ok<eVehicleOnRailState>(eVehicleOnRailState.Removed);
  281. }
  282. GUIMessageEventPublish(reply);
  283. }
  284. private void ReqParamsSave(VCSMessageEventArgs msg)
  285. {
  286. var reply = new GUIMessageEventArgs
  287. {
  288. Kind = GUIMessageEventArgs.eGUIMessageKind.RspParamsSave,
  289. Result = FluentResults.Results.Fail("Fail ReqParamsSave"),
  290. };
  291. var result = this.ZmqManager.SetJogSpeed((double)msg.Args["JogSpeed"]);
  292. if (!result)
  293. {
  294. GUIMessageEventPublish(reply);
  295. return;
  296. }
  297. result = this.ZmqManager.SetDriveSpeed(msg.Args["Linear"].ToString(), msg.Args["Curve"].ToString());
  298. if (!result)
  299. {
  300. logger.E($"Set DriveSPeed Error");
  301. return;
  302. }
  303. result = this.ZmqManager.SetDriveSpeedProfile(msg.Args["Accel"].ToString(), msg.Args["Decel"].ToString(),
  304. msg.Args["Creep"].ToString(), msg.Args["CreepDistance"].ToString());
  305. if (!result)
  306. {
  307. logger.E($"Set SpeedProfile Error");
  308. return;
  309. }
  310. //Save Parameter.
  311. int ret = this.ZmqManager.SetDriveControl(eDriveControl.ParameterSave);
  312. if (ret != ConstInt.EXECUTE_SUCCESS)
  313. {
  314. GUIMessageEventPublish(reply);
  315. return;
  316. }
  317. reply.Result = FluentResults.Results.Ok();
  318. GUIMessageEventPublish(reply);
  319. //refresh Parameter.
  320. this.ZmqManager.SynchronizedParmeter();
  321. }
  322. private void ReqSetJogSpeed(VCSMessageEventArgs msg)
  323. {
  324. var reply = new GUIMessageEventArgs
  325. {
  326. Kind = GUIMessageEventArgs.eGUIMessageKind.RspJogSpeed,
  327. Result = FluentResults.Results.Fail("Fail SetJogSpeed"),
  328. };
  329. if (msg.Args.ContainsKey("JogSpeed"))
  330. {
  331. if (this.ZmqManager.SetJogSpeed((double)msg.Args["JogSpeed"]))
  332. {
  333. reply.Result = FluentResults.Results.Ok();
  334. }
  335. }
  336. GUIMessageEventPublish(reply);
  337. }
  338. private void ReqSetSpeedProfile(VCSMessageEventArgs msg)
  339. {
  340. var reply = new GUIMessageEventArgs
  341. {
  342. Kind = GUIMessageEventArgs.eGUIMessageKind.RspSpeedProfile,
  343. Result = FluentResults.Results.Fail("Fail SetSpeedProfile"),
  344. };
  345. if (msg.Args.ContainsKey("Accel") && msg.Args.ContainsKey("Decel") && msg.Args.ContainsKey("Creep") && msg.Args.ContainsKey("CreepDistance"))
  346. {
  347. if (this.ZmqManager.SetDriveSpeedProfile(msg.Args["Accel"].ToString(), msg.Args["Decel"].ToString(),
  348. msg.Args["Creep"].ToString(), msg.Args["CreepDistance"].ToString()))
  349. {
  350. reply.Result = FluentResults.Results.Ok();
  351. }
  352. }
  353. GUIMessageEventPublish(reply);
  354. }
  355. private void ReqSetDriveSpeed(VCSMessageEventArgs msg)
  356. {
  357. var reply = new GUIMessageEventArgs
  358. {
  359. Kind = GUIMessageEventArgs.eGUIMessageKind.RspDirveSpeed,
  360. Result = FluentResults.Results.Fail("Fail SetSpeedProfile"),
  361. };
  362. if (msg.Args.ContainsKey("Linear") && msg.Args.ContainsKey("Curve"))
  363. {
  364. if (this.ZmqManager.SetDriveSpeed(msg.Args["Linear"].ToString(), msg.Args["Curve"].ToString()))
  365. {
  366. reply.Result = FluentResults.Results.Ok();
  367. }
  368. }
  369. GUIMessageEventPublish(reply);
  370. }
  371. void ReqBatteryState()
  372. {
  373. BatteryInfo battery = new BatteryInfo();
  374. battery.Voltage = vehicle.BatteryVoltage;
  375. battery.Current = vehicle.BatteryCurrent;
  376. battery.ChargeTime = vehicle.BatteryChargeTime;
  377. battery.DisChargeTime = vehicle.BatteryDisChargeTime;
  378. battery.Capacity = vehicle.BatteryCapacity;
  379. battery.Energy = vehicle.BatteryEnergy;
  380. battery.SOC = vehicle.BatteryStateOfCharge;
  381. battery.SOH = vehicle.BatteryStateOfHealth;
  382. battery.State = vehicle.BatteryState;
  383. battery.IsConnect = vehicle.BatteryIsConnect;
  384. battery.Temperature = vehicle.BatteryTemperature;
  385. var reply = new GUIMessageEventArgs()
  386. {
  387. Args = battery,
  388. Kind = GUIMessageEventArgs.eGUIMessageKind.RspBatteryState
  389. };
  390. GUIMessageEventPublish(reply);
  391. }
  392. private void ReqConveyorMove(VCSMessageEventArgs msg)
  393. {
  394. this.vehicle.ReqConveyorMove(msg.MessageText);
  395. }
  396. private void ReqObsticlePatternNo()
  397. {
  398. var reply = new GUIMessageEventArgs();
  399. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspObstaclePatternNo;
  400. reply.MessageText = this.vehicle.GetObstacleDetectPattern().ToString();
  401. GUIMessageEventPublish(reply);
  402. }
  403. private void ReqObsticlePatternChange(VCSMessageEventArgs msg)
  404. {
  405. var patternNo = Convert.ToInt32(msg.MessageText);
  406. this.vehicle.ChgObstacleDetectPattern(patternNo);
  407. var reply = new GUIMessageEventArgs();
  408. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspObstaclePatternChg;
  409. reply.Result = FluentResults.Results.Ok();
  410. GUIMessageEventPublish(reply);
  411. }
  412. private void ReqConveyorUnload()
  413. {
  414. int result = 0;
  415. result = this.vehicle.ConveyorUnload();
  416. result = this.vehicle.ConveyorLoad();
  417. var reply = new GUIMessageEventArgs()
  418. {
  419. Kind = GUIMessageEventArgs.eGUIMessageKind.RspConveyorLoad,
  420. Result = FluentResults.Results.Ok()
  421. };
  422. if (result != 0)
  423. {
  424. reply.Result = FluentResults.Results.Fail("Conveyor Load FAIL");
  425. }
  426. GUIMessageEventPublish(reply);
  427. }
  428. private void ReqConveyorLoad(VCSMessageEventArgs msg)
  429. {
  430. int result = 0;
  431. result = this.vehicle.ConveyorLoad();
  432. var reply = new GUIMessageEventArgs()
  433. {
  434. Kind = GUIMessageEventArgs.eGUIMessageKind.RspConveyorLoad,
  435. Result = FluentResults.Results.Ok()
  436. };
  437. if (result != 0)
  438. {
  439. reply.Result = FluentResults.Results.Fail("Conveyor Load FAIL");
  440. }
  441. GUIMessageEventPublish(reply);
  442. }
  443. private void ReqPIOConveyor(VCSMessageEventArgs msg)
  444. {
  445. int result = 0;
  446. var reply = new GUIMessageEventArgs()
  447. {
  448. Kind = GUIMessageEventArgs.eGUIMessageKind.RspPIOConveyor,
  449. MessageText = msg.MessageText,
  450. };
  451. /*PIO Load// Unload*/
  452. if (msg.MessageText.Equals("PL"))
  453. result = this.vehicle.ManualPIOAndLoad();
  454. else
  455. result = this.vehicle.ManualPIOAndUnlaod();
  456. //실행 결과 확인
  457. if (result == ConstInt.EXECUTE_SUCCESS)
  458. reply.Result = FluentResults.Results.Ok();
  459. else
  460. {
  461. string alarmText = string.Empty;
  462. var alarm = this.Alarms.Where(a => a.AlarmId == result).FirstOrDefault();
  463. if (alarm == null)
  464. alarmText = "Not Define";
  465. else
  466. alarmText = alarm.Text;
  467. reply.Result = FluentResults.Results.Fail(alarmText);
  468. }
  469. GUIMessageEventPublish(reply);
  470. }
  471. private void ReqPIOBattery(VCSMessageEventArgs msg)
  472. {
  473. int result = 1;
  474. var reply = new GUIMessageEventArgs()
  475. {
  476. Kind = GUIMessageEventArgs.eGUIMessageKind.RspPIOBatteryCharge,
  477. MessageText = msg.MessageText,
  478. };
  479. result = this.vehicle.StartBatteryCharge();
  480. if (result == ConstInt.EXECUTE_SUCCESS)
  481. reply.Result = FluentResults.Results.Ok();
  482. else
  483. {
  484. string alarmText = string.Empty;
  485. var alarm = this.Alarms.Where(a => a.AlarmId == result).FirstOrDefault();
  486. if (alarm == null)
  487. alarmText = "Not Define";
  488. else
  489. alarmText = alarm.Text;
  490. reply.Result = FluentResults.Results.Fail(alarmText);
  491. }
  492. GUIMessageEventPublish(reply);
  493. }
  494. private void ReqBatteryChargeStop(VCSMessageEventArgs msg)
  495. {
  496. int result = 1;
  497. var reply = new GUIMessageEventArgs()
  498. {
  499. Kind = GUIMessageEventArgs.eGUIMessageKind.RsqPIOBatteryChargeStop,
  500. MessageText = msg.MessageText,
  501. };
  502. result = this.vehicle.StopBatteryCharge();
  503. if (result <= 0)
  504. reply.Result = FluentResults.Results.Ok();
  505. else
  506. reply.Result = FluentResults.Results.Fail("Battery Charge Stop Fail");
  507. GUIMessageEventPublish(reply);
  508. }
  509. private void ReqTest()
  510. {
  511. var isS = QuartzUtils.StopSchedule("SteerTest");
  512. LockUtils.Wait(1000);
  513. QuartzUtils.Invoke("SteerTest", QuartzUtils.GetExpnSecond(30), StartSteerTest);
  514. }
  515. bool isSteerLeft = true;
  516. void StartSteerTest()
  517. {
  518. var sT = SwUtils.CurrentTimeMillis;
  519. if (isSteerLeft)
  520. {
  521. this.steering.RequestControl(eSteeringState.Right);
  522. isSteerLeft = false;
  523. }
  524. else
  525. {
  526. this.steering.RequestControl(eSteeringState.Left);
  527. isSteerLeft = true;
  528. }
  529. }
  530. private void ReqMachineModeChg(VCSMessageEventArgs msg)
  531. {
  532. var reply = new GUIMessageEventArgs();
  533. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspMachineModeChg;
  534. var mode = CastTo<eMachineMode>.From<object>(msg.Arg);
  535. if (mode == eMachineMode.HostMode)
  536. {
  537. if (this.autoManager.OperationModeProperty != eOperatationMode.AutoMode)
  538. reply.Result = FluentResults.Results.Fail("Vehicle Not Start");
  539. else
  540. {
  541. if (vehicle.VehicleOnRailState != eVehicleOnRailState.Install)
  542. reply.Result = Results.Fail("Vehicle is not On Rail");
  543. else
  544. {
  545. this.vehicle.MachineMode = eMachineMode.HostMode;
  546. reply.Result = FluentResults.Results.Ok();
  547. reply.Args = eMachineMode.HostMode;
  548. }
  549. }
  550. }
  551. else
  552. {
  553. this.vehicle.MachineMode = eMachineMode.LocalMode;
  554. reply.Result = FluentResults.Results.Ok<eMachineMode>(eMachineMode.LocalMode);
  555. reply.Args = eMachineMode.LocalMode;
  556. }
  557. GUIMessageEventPublish(reply);
  558. }
  559. private void ReqBuzzerStop()
  560. {
  561. this.IO.OutputOff("OUT_BUZZER_00");
  562. this.IO.OutputOff("OUT_BUZZER_01");
  563. this.IO.OutputOff("OUT_BUZZER_02");
  564. }
  565. private void ReqAlarmReset()
  566. {
  567. //this.autoManager.IsErrorProcessing = false;
  568. //this.vehicle.VehicleStateProperty = eVehicleState.Idle;
  569. if (!this.IO.IsOn("IN_MC_ON"))
  570. {
  571. this.IO.WriteOutputIO("OUT_SAFETY_RESET", true);
  572. Thread.Sleep(2000);
  573. this.IO.WriteOutputIO("OUT_SAFETY_RESET", false);
  574. Thread.Sleep(1000);
  575. }
  576. if (this.conveyor.IsInverterError())
  577. {
  578. this.conveyor.OnOffConveyor(false);
  579. }
  580. this.ZmqManager.SetDriveControl(eDriveControl.ResetFault);
  581. this.autoManager.IsErrorProcessing = false;
  582. this.vehicle.VehicleStateProperty = eVehicleState.Idle;
  583. this.vehicle.PIOClear();
  584. }
  585. private void ReqEStop()
  586. {
  587. this.vehicle.EStop();
  588. autoManager.ProcessAlarm(23);
  589. }
  590. private void ReqVehicleModeChange(VCSMessageEventArgs msg)
  591. {
  592. GUIMessageEventArgs reply;
  593. if (msg.MessageKey.Equals(MessageKey.AutoMode))
  594. {
  595. //#if TEST
  596. // if (!QuartzUtils.StopSchedule("SteerTest"))
  597. // return;
  598. //#endif
  599. if (!this.ZmqManager.IsReqConnected)
  600. {
  601. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Fail(new Error("Drive P/G not Connected")), MessageKey = MessageKey.ManualMode };
  602. GUIMessageEventPublish(reply);
  603. return;
  604. }
  605. if (!this.ZmqManager.IsCanStanbyLocation)
  606. {
  607. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Fail(new Error("NotOnRoute")), MessageKey = MessageKey.ManualMode };
  608. GUIMessageEventPublish(reply);
  609. return;
  610. }
  611. int result = vehicle.InitializationVehicle();
  612. if (result != ConstInt.EXECUTE_SUCCESS)
  613. {
  614. var al = this.Alarms.FirstOrDefault(a => a.AlarmId == result);
  615. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Fail(new Error(al.Text)), MessageKey = MessageKey.ManualMode };
  616. GUIMessageEventPublish(reply);
  617. return;
  618. }
  619. //ToDo: 주행 측 준비 되면 활성.
  620. result = drive.DriveInit();
  621. if (result != ConstInt.EXECUTE_SUCCESS)
  622. {
  623. var al = this.Alarms.FirstOrDefault(a => a.AlarmId == result);
  624. if (al == null)
  625. al = new Alarm()
  626. {
  627. Text = "Not Define"
  628. };
  629. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Fail(new Error(al.Text)), MessageKey = MessageKey.ManualMode };
  630. GUIMessageEventPublish(reply);
  631. return;
  632. }
  633. if (!ZmqManager.SetOperationState(eOperatationMode.AutoMode))
  634. {
  635. var al = this.Alarms.Where(x => x.AlarmId == 38).FirstOrDefault();
  636. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Fail(new Error(al.Text)), MessageKey = MessageKey.ManualMode };
  637. GUIMessageEventPublish(reply);
  638. return;
  639. }
  640. //2020.08.13. Kang. Break 는 자동 상태 일때 주행에서 Control.
  641. this.IO.OutputOff("OUT_DRIVE_BRAKE_OFF");
  642. this.autoManager.AutoModeStateProperty = eAutoModeState.StartRun;
  643. this.autoManager.OperationModeProperty = eOperatationMode.AutoMode;
  644. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Ok(), MessageKey = MessageKey.AutoMode };
  645. GUIMessageEventPublish(reply);
  646. }
  647. else
  648. {
  649. //2020.07.29. Kang. Vehicle Stop 시 LocalMode 변경.
  650. this.vehicle.MachineMode = eMachineMode.LocalMode;
  651. //2020.08.04. Kang Manual Mode 변경은 조그 사용 화면 DirveView 를 사용 시에만 전환.
  652. //if (!ZmqManager.SetOperationState(eOperatationMode.ManualMode))
  653. //{
  654. // var al = this.Alarms.Where(x => x.AlarmId == 38).FirstOrDefault();
  655. // reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Fail(new Error(al.Text)), MessageKey = MessageKey.ManualMode };
  656. // GUIMessageEventPublish(reply);
  657. // return;
  658. //}
  659. //명령 삭제 위치 변경 AutoManager OperationState 변경시로 이동
  660. //this.sql.SubCmdDAL.Clean();
  661. //this.sql.CommandDAL.Clean();
  662. this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.WaitStop;
  663. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Ok(), MessageKey = MessageKey.ManualMode };
  664. GUIMessageEventPublish(reply);
  665. }
  666. }
  667. void ReqIOObjectMessage()
  668. {
  669. var rspMsg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspIOObject, Args = this.IO };
  670. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(rspMsg);
  671. }
  672. void ReqDriveDistanceReset()
  673. {
  674. var info = sql.VehicleInfoDAL.GetAll().FirstOrDefault();
  675. info.TripDistance = 0d;
  676. info.TripResetTime = DateTime.Now;
  677. sql.VehicleInfoDAL.Update(info);
  678. }
  679. #endregion
  680. /// <summary>
  681. /// GUI 로 보내는 Event
  682. /// </summary>
  683. /// <param name="args"></param>
  684. public void GUIMessageEventPublish(GUIMessageEventArgs args)
  685. {
  686. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(args);
  687. }
  688. public void Dispose()
  689. {
  690. this.scheduler.Dispose();
  691. this.hostManager.Dispose();
  692. this.vehicle.Dispose();
  693. this.autoManager.Dispose();
  694. this.bMUManager.Disconnect();
  695. this.drive.Dispose();
  696. this.steering.Dispose();
  697. this.ZmqManager.Dispose();
  698. (this.IO as IDisposable).Dispose(); //IO 는 마지막에 정리함.
  699. }
  700. public void RegisterTypes(IContainerRegistry containerRegistry)
  701. {
  702. if (!containerRegistry.IsRegistered<VCSystem>())
  703. containerRegistry.RegisterSingleton<VCSystem>();
  704. }
  705. public void OnInitialized(IContainerProvider containerProvider)
  706. {
  707. this.Init();
  708. }
  709. }
  710. }