|
|
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Threading;
|
|
|
using GSG.NET.Concurrent;
|
|
|
+using GSG.NET.LINQ;
|
|
|
using GSG.NET.Logging;
|
|
|
using GSG.NET.Quartz;
|
|
|
using GSG.NET.Utils;
|
|
|
@@ -25,6 +26,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
public class Vehicle : ControlObjectBase, IDisposable
|
|
|
{
|
|
|
static Logger logger = Logger.GetLogger();
|
|
|
+ static Logger loggerPIO = Logger.GetLogger("PIO");
|
|
|
|
|
|
#region Properties
|
|
|
private double currentPosition;
|
|
|
@@ -179,7 +181,6 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
public void Init()
|
|
|
{
|
|
|
this.CreateClamp();
|
|
|
- this.CreateConveyor();
|
|
|
this.CreateSteering();
|
|
|
|
|
|
ThreadStart();
|
|
|
@@ -367,7 +368,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- result = this.conveyor.PIOAndLoad(sub.TargetID);
|
|
|
+ result = this.PIOAndLoad(sub.TargetID);
|
|
|
if (result != 0)
|
|
|
{
|
|
|
this.autoManager.ProcessAlarm(result);
|
|
|
@@ -401,7 +402,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- result = this.conveyor.PIOAndUnload(sub.TargetID);
|
|
|
+ result = this.PIOAndUnload(sub.TargetID);
|
|
|
if (result != 0)
|
|
|
{
|
|
|
this.autoManager.ProcessAlarm(result);
|
|
|
@@ -451,6 +452,256 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
#endregion
|
|
|
|
|
|
#region Machanical Method
|
|
|
+
|
|
|
+ #region Conveyor
|
|
|
+ int OnOffConveyor(bool isOn, bool isCW = false)
|
|
|
+ {
|
|
|
+ if (IsInverterError())
|
|
|
+ return 16;
|
|
|
+
|
|
|
+ if (isCW)
|
|
|
+ this.iO.OutputOn("OUT_CV_CWCCW");
|
|
|
+ else
|
|
|
+ this.iO.OutputOff("OUT_CV_CWCCW");
|
|
|
+
|
|
|
+ if (isOn)
|
|
|
+ this.iO.OutputOn("OUT_CV_RUN");
|
|
|
+ else
|
|
|
+ this.iO.OutputOff("OUT_CV_RUN");
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ void SetConveyorSpeed(bool IsHight)
|
|
|
+ {
|
|
|
+ if (IsHight)
|
|
|
+ this.iO.WriteOutputIO("OUT_CV_DA", true);
|
|
|
+ else
|
|
|
+ this.iO.WriteOutputIO("OUT_CV_DA", false);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 입구 감지 로딩시 감속 사용
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ bool IsDetectedLoadStart() => this.iO.IsOn("IN_CV_DETECT_00");
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 실물 감지
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool IsDetectedCenter() => this.iO.IsOn("IN_CV_DETECT_01");
|
|
|
+
|
|
|
+ bool IsDetectedLoadStop() => this.iO.IsOn("IN_CV_DETECT_02");
|
|
|
+ bool IsInverterError() => this.iO.IsOn("IN_CV_ERROR");
|
|
|
+ bool IsLifterPositinCheck() => this.iO.IsOn("IN_LIFTER_POSITION_DETECT");
|
|
|
+ bool IsLifterDuplication() => this.iO.IsOn("IN_LIFTER_DUPLICATION_DETECT");
|
|
|
+ bool IsPIOInterLockOn() => this.iO.IsOn("OUT_PIO_INTERLOCK");
|
|
|
+
|
|
|
+ int Load_Carrier()
|
|
|
+ {
|
|
|
+ if (IsDetectedCenter())
|
|
|
+ return 9;
|
|
|
+
|
|
|
+ OnOffConveyor(true, true);
|
|
|
+
|
|
|
+ long sTime = SwUtils.CurrentTimeMillis;
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND)) //Wait 20Sec
|
|
|
+ {
|
|
|
+ OnOffConveyor(false, true);
|
|
|
+ return 10;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (IsDetectedLoadStart())
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int UnloadCarrier()
|
|
|
+ {
|
|
|
+ if (!IsDetectedLoadStart())
|
|
|
+ return 11;
|
|
|
+
|
|
|
+ OnOffConveyor(true, true);
|
|
|
+
|
|
|
+ long sTime = SwUtils.CurrentTimeMillis;
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND)) //Wait 20Sec
|
|
|
+ {
|
|
|
+ OnOffConveyor(false, true);
|
|
|
+ return 12;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!IsDetectedLoadStart())
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int PIOAndLoad(string targetName)
|
|
|
+ {
|
|
|
+ if (this.IsInverterError())
|
|
|
+ return 16;
|
|
|
+
|
|
|
+ if (this.IsLifterPositinCheck())
|
|
|
+ return 14;
|
|
|
+
|
|
|
+ if (this.IsLifterDuplication())
|
|
|
+ return 11;
|
|
|
+
|
|
|
+ PIOClear();
|
|
|
+ loggerPIO.I($"Start Load PIO - [{targetName}]");
|
|
|
+ this.OnPIOStart?.Invoke(true);
|
|
|
+
|
|
|
+ this.iO.WriteOutputIO("OUT_PIO_RECEIVE_RUN", true);
|
|
|
+ loggerPIO.I("[Vehicle] - 4 Receive Run On");
|
|
|
+
|
|
|
+ if (!this.iO.WaitChangeInputIO(true, 1000, "IN_PIO_SENDABLE"))
|
|
|
+ {
|
|
|
+ PIOClear();
|
|
|
+ loggerPIO.E("[Port] - 4 Ready Time Out");
|
|
|
+ return 10;
|
|
|
+ }
|
|
|
+ loggerPIO.E("[Port] - 4 Ready On");
|
|
|
+
|
|
|
+ this.SetConveyorSpeed(true);
|
|
|
+ this.OnOffConveyor(true, true);
|
|
|
+ this.iO.WriteOutputIO("OUT_PIO_RECEIVE_RUN", true);
|
|
|
+ loggerPIO.I("[Vehicle] - Conveyor Run");
|
|
|
+ this.OnConveyorStart?.Invoke(true);
|
|
|
+
|
|
|
+ if (!this.iO.WaitChangeInputIO(true, 1000, "IN_PIO_SEND_RUN"))
|
|
|
+ {
|
|
|
+ this.OnOffConveyor(false, true);
|
|
|
+ PIOClear();
|
|
|
+ loggerPIO.E("[Port] - 5 Sending Run Time Out");
|
|
|
+ return 10;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool isStartDetected = false;
|
|
|
+ var sTime = SwUtils.CurrentTimeMillis;
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND))
|
|
|
+ {
|
|
|
+ PIOClear();
|
|
|
+ this.OnOffConveyor(false, true);
|
|
|
+ loggerPIO.E("[Vehicle] Conveyor Wait Time Out");
|
|
|
+ return 10; //Conveyor Moving Timeout
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.IsDetectedLoadStart() && !isStartDetected)
|
|
|
+ isStartDetected = true;
|
|
|
+
|
|
|
+ if (!this.IsDetectedLoadStart() && isStartDetected)
|
|
|
+ this.SetConveyorSpeed(false);
|
|
|
+
|
|
|
+ if (this.IsDetectedLoadStop()) break;
|
|
|
+
|
|
|
+ if (this.IsPIOInterLockOn())
|
|
|
+ {
|
|
|
+ PIOClear();
|
|
|
+ this.OnOffConveyor(false); //Stop
|
|
|
+ loggerPIO.E("[Port] PIO InterLock On ");
|
|
|
+ return 19; //Conveyor Moving Timeout
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.IsDetectedCenter())
|
|
|
+ this.OnCarrierDetected?.Invoke(true);
|
|
|
+
|
|
|
+ this.OnOffConveyor(false); //Stop
|
|
|
+ PIOClear();
|
|
|
+ this.OnConveyorStop?.Invoke(true);
|
|
|
+
|
|
|
+ this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", true);
|
|
|
+ this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", false, 1000);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int PIOAndUnload(string targetName)
|
|
|
+ {
|
|
|
+ if (this.IsInverterError())
|
|
|
+ return 16;
|
|
|
+
|
|
|
+ if (this.IsLifterDuplication())
|
|
|
+ return 15;
|
|
|
+
|
|
|
+ if (this.IsLifterPositinCheck())
|
|
|
+ return 13;
|
|
|
+
|
|
|
+ PIOClear();
|
|
|
+ loggerPIO.I($"Start Unload PIO - [{targetName}]");
|
|
|
+ this.OnPIOStart?.Invoke(false);
|
|
|
+
|
|
|
+ if (!this.iO.IsOn("IN_PIO_READY"))
|
|
|
+ {
|
|
|
+ loggerPIO.E("[Port] - 1 Ready not On");
|
|
|
+ return 12;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.iO.WriteOutputIO("OUT_PIO_READY", true);
|
|
|
+ loggerPIO.I("[Vehicle] - 1 Ready On");
|
|
|
+
|
|
|
+ if (!this.iO.WaitChangeInputIO(true, 1000, "IN_PIO_RECEIVE_RUN"))
|
|
|
+ {
|
|
|
+ PIOClear();
|
|
|
+ loggerPIO.E("[Port] - 2 Receive CV Run Timeout");
|
|
|
+ return 12;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.iO.WriteOutputIO("", true);
|
|
|
+ loggerPIO.I("[Vehicle] - 2 Send Run On");
|
|
|
+
|
|
|
+ this.SetConveyorSpeed(true);
|
|
|
+ this.OnOffConveyor(true);
|
|
|
+ this.OnConveyorStart?.Invoke(false);
|
|
|
+
|
|
|
+ var sTime = SwUtils.CurrentTimeMillis;
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND))
|
|
|
+ {
|
|
|
+ PIOClear();
|
|
|
+ this.OnOffConveyor(false, true);
|
|
|
+ loggerPIO.E("[Port] Conveyor Wait Time Out");
|
|
|
+ return 12; //Conveyor Moving Timeout
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.iO.IsOn("IN_PIO_RECEIVE_COMPLITE"))
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( !IsDetectedCenter() )
|
|
|
+ this.OnCarrierDetected?.Invoke(false);
|
|
|
+
|
|
|
+ this.OnOffConveyor(false); //Stop
|
|
|
+ this.OnConveyorStop?.Invoke(false);
|
|
|
+ PIOClear();
|
|
|
+
|
|
|
+ this.iO.WriteOutputIO("OUT_PIO_SEND_COMPLITE", true);
|
|
|
+ this.iO.WriteOutputIO("OUT_PIO_SEND_COMPLITE", false, 1000);
|
|
|
+
|
|
|
+ this.OnUnloadComplete?.Invoke();
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ void PIOClear()
|
|
|
+ {
|
|
|
+ string[] pio = { "OUT_PIO_READY", "OUT_PIO_SENDING_RUN", "OUT_PIO_SEND_COMPLITE", "OUT_PIO_RECEIVABLE", "OUT_PIO_RECEIVE_RUN", "OUT_PIO_RECIVE_COMPLITE", "OUT_PIO_INTERLOCK" };
|
|
|
+ pio.FwEach(x => { this.iO.OutputOff(x); });
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region Hardware Create Method
|
|
|
@@ -466,10 +717,6 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.clamp.Init();
|
|
|
}
|
|
|
|
|
|
- void CreateConveyor()
|
|
|
- {
|
|
|
- this.conveyor = new Conveyor(this.iO);
|
|
|
- }
|
|
|
#endregion
|
|
|
|
|
|
#region Help Method
|