VCSystem.cs 31 KB

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