|
@@ -25,6 +25,20 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
public class Vehicle : ControlObjectBase, IDisposable
|
|
public class Vehicle : ControlObjectBase, IDisposable
|
|
|
{
|
|
{
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// OCS Report Code
|
|
|
|
|
+ /// 목적지에 도착해서 Load, Unload 시 발생하는 Alarm
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ public enum eFailCode
|
|
|
|
|
+ {
|
|
|
|
|
+ Load_PortHasNotCarrier = 1,
|
|
|
|
|
+ Load_VehicleHasCarrier,
|
|
|
|
|
+ Unload_PortHasCarrier,
|
|
|
|
|
+ Unload_VehicleHasNotCarrier,
|
|
|
|
|
+ LoadPIOInterlockTimeout,
|
|
|
|
|
+ UnlaodPIOInterlockTimeout,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
static Logger logger = Logger.GetLogger();
|
|
static Logger logger = Logger.GetLogger();
|
|
|
static Logger loggerPIO = Logger.GetLogger("PIO");
|
|
static Logger loggerPIO = Logger.GetLogger("PIO");
|
|
|
|
|
|
|
@@ -50,7 +64,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
public bool IsMoving { get; set; }
|
|
public bool IsMoving { get; set; }
|
|
|
public double BatteryVolt { get; set; }
|
|
public double BatteryVolt { get; set; }
|
|
|
public bool IsError { get; set; }
|
|
public bool IsError { get; set; }
|
|
|
- public bool IsContain { get { return this.conveyor.IsDetectedCenter(); } }
|
|
|
|
|
|
|
+ public bool IsContain { get { return this.IsDetectedCenter(); } }
|
|
|
|
|
|
|
|
public SubCmd CurrentSubCommand { get; private set; }
|
|
public SubCmd CurrentSubCommand { get; private set; }
|
|
|
#endregion
|
|
#endregion
|
|
@@ -78,13 +92,14 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
public event Action OnManualLoad;
|
|
public event Action OnManualLoad;
|
|
|
public event Action OnManualUnload;
|
|
public event Action OnManualUnload;
|
|
|
public event Action OnManualCharging;
|
|
public event Action OnManualCharging;
|
|
|
|
|
+
|
|
|
|
|
+ public event Action<eFailCode> OnFailReport;
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
IIO iO = null;
|
|
IIO iO = null;
|
|
|
GSIMotion motion = null;
|
|
GSIMotion motion = null;
|
|
|
SqliteManager sql = null;
|
|
SqliteManager sql = null;
|
|
|
Clamp clamp = null;
|
|
Clamp clamp = null;
|
|
|
- Conveyor conveyor = null;
|
|
|
|
|
Steering steering = null;
|
|
Steering steering = null;
|
|
|
AutoManager autoManager = null;
|
|
AutoManager autoManager = null;
|
|
|
|
|
|
|
@@ -382,6 +397,9 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ sql.CommandDAL.UpdateState( sub.CmdID, eCommandState.Complete );
|
|
|
|
|
+ sql.SubCmdDAL.Delete(sub);
|
|
|
|
|
+
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -409,6 +427,9 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ sql.CommandDAL.UpdateState(sub.CmdID, eCommandState.Complete );
|
|
|
|
|
+ sql.SubCmdDAL.Delete( sub );
|
|
|
|
|
+
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -546,14 +567,45 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
|
|
public int PIOAndLoad(string targetName)
|
|
public int PIOAndLoad(string targetName)
|
|
|
{
|
|
{
|
|
|
|
|
+#if SIMULATION
|
|
|
|
|
+ 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");
|
|
|
|
|
+
|
|
|
|
|
+ Thread.Sleep(1000);//상대 IO 기다린다 생각.
|
|
|
|
|
+ loggerPIO.E("[Port] - 4 Ready On");
|
|
|
|
|
+
|
|
|
|
|
+ //Conveyor Start
|
|
|
|
|
+ loggerPIO.I("[Vehicle] - Conveyor Run");
|
|
|
|
|
+ this.OnConveyorStart?.Invoke(true);
|
|
|
|
|
+
|
|
|
|
|
+ Thread.Sleep(10000);//Conveyor 구동
|
|
|
|
|
+ this.OnCarrierDetected?.Invoke(true);
|
|
|
|
|
+
|
|
|
|
|
+ PIOClear();
|
|
|
|
|
+ Thread.Sleep(1000);
|
|
|
|
|
+ this.OnConveyorStop?.Invoke(true);
|
|
|
|
|
+#else
|
|
|
if (this.IsInverterError())
|
|
if (this.IsInverterError())
|
|
|
return 16;
|
|
return 16;
|
|
|
|
|
|
|
|
if (this.IsLifterPositinCheck())
|
|
if (this.IsLifterPositinCheck())
|
|
|
return 14;
|
|
return 14;
|
|
|
|
|
|
|
|
- if (this.IsLifterDuplication())
|
|
|
|
|
- return 11;
|
|
|
|
|
|
|
+ if ( !this.IsLifterDuplication() )
|
|
|
|
|
+ {
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.Load_PortHasNotCarrier );
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ( this.IsDetectedCenter() )
|
|
|
|
|
+ {
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.Load_VehicleHasCarrier );
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
PIOClear();
|
|
PIOClear();
|
|
|
loggerPIO.I($"Start Load PIO - [{targetName}]");
|
|
loggerPIO.I($"Start Load PIO - [{targetName}]");
|
|
@@ -566,7 +618,8 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
{
|
|
{
|
|
|
PIOClear();
|
|
PIOClear();
|
|
|
loggerPIO.E("[Port] - 4 Ready Time Out");
|
|
loggerPIO.E("[Port] - 4 Ready Time Out");
|
|
|
- return 10;
|
|
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
loggerPIO.E("[Port] - 4 Ready On");
|
|
loggerPIO.E("[Port] - 4 Ready On");
|
|
|
|
|
|
|
@@ -581,7 +634,8 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.OnOffConveyor(false, true);
|
|
this.OnOffConveyor(false, true);
|
|
|
PIOClear();
|
|
PIOClear();
|
|
|
loggerPIO.E("[Port] - 5 Sending Run Time Out");
|
|
loggerPIO.E("[Port] - 5 Sending Run Time Out");
|
|
|
- return 10;
|
|
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool isStartDetected = false;
|
|
bool isStartDetected = false;
|
|
@@ -593,7 +647,12 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
PIOClear();
|
|
PIOClear();
|
|
|
this.OnOffConveyor(false, true);
|
|
this.OnOffConveyor(false, true);
|
|
|
loggerPIO.E("[Vehicle] Conveyor Wait Time Out");
|
|
loggerPIO.E("[Vehicle] Conveyor Wait Time Out");
|
|
|
- return 10; //Conveyor Moving Timeout
|
|
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
|
|
|
|
|
+
|
|
|
|
|
+ if ( this.IsDetectedLoadStart() ) // 감지가 시작 되었으면 이동중 Error 로 판단 설비를 정지 상태로
|
|
|
|
|
+ return 10; //Conveyor Moving Timeout
|
|
|
|
|
+ else
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (this.IsDetectedLoadStart() && !isStartDetected)
|
|
if (this.IsDetectedLoadStart() && !isStartDetected)
|
|
@@ -609,7 +668,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
PIOClear();
|
|
PIOClear();
|
|
|
this.OnOffConveyor(false); //Stop
|
|
this.OnOffConveyor(false); //Stop
|
|
|
loggerPIO.E("[Port] PIO InterLock On ");
|
|
loggerPIO.E("[Port] PIO InterLock On ");
|
|
|
- return 19; //Conveyor Moving Timeout
|
|
|
|
|
|
|
+ return 19; //
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -623,16 +682,48 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", true);
|
|
this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", true);
|
|
|
this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", false, 1000);
|
|
this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", false, 1000);
|
|
|
|
|
|
|
|
|
|
+ this.OnLoadComplete?.Invoke();
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public int PIOAndUnload(string targetName)
|
|
public int PIOAndUnload(string targetName)
|
|
|
{
|
|
{
|
|
|
|
|
+#if SIMULATION
|
|
|
|
|
+ PIOClear();
|
|
|
|
|
+ loggerPIO.I($"Start Unload PIO - [{targetName}]");
|
|
|
|
|
+ this.OnPIOStart?.Invoke(false);
|
|
|
|
|
+
|
|
|
|
|
+ Thread.Sleep(1000);
|
|
|
|
|
+
|
|
|
|
|
+ this.iO.WriteOutputIO("OUT_PIO_READY", true);
|
|
|
|
|
+ loggerPIO.I("[Vehicle] - 1 Ready On");
|
|
|
|
|
+
|
|
|
|
|
+ Thread.Sleep(1000);
|
|
|
|
|
+ this.OnConveyorStart?.Invoke(false);
|
|
|
|
|
+
|
|
|
|
|
+ Thread.Sleep(10000);
|
|
|
|
|
+ this.OnOffConveyor(false); //Stop
|
|
|
|
|
+ this.OnConveyorStop?.Invoke(false);
|
|
|
|
|
+ PIOClear();
|
|
|
|
|
+
|
|
|
|
|
+ this.OnUnloadComplete?.Invoke();
|
|
|
|
|
+#else
|
|
|
if (this.IsInverterError())
|
|
if (this.IsInverterError())
|
|
|
return 16;
|
|
return 16;
|
|
|
|
|
|
|
|
- if (this.IsLifterDuplication())
|
|
|
|
|
- return 15;
|
|
|
|
|
|
|
+ if ( this.IsLifterDuplication() )
|
|
|
|
|
+ {
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.Unload_PortHasCarrier );
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ( !this.IsDetectedCenter() )
|
|
|
|
|
+ {
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.Unload_VehicleHasNotCarrier );
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
if (this.IsLifterPositinCheck())
|
|
if (this.IsLifterPositinCheck())
|
|
|
return 13;
|
|
return 13;
|
|
@@ -644,7 +735,8 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
if (!this.iO.IsOn("IN_PIO_READY"))
|
|
if (!this.iO.IsOn("IN_PIO_READY"))
|
|
|
{
|
|
{
|
|
|
loggerPIO.E("[Port] - 1 Ready not On");
|
|
loggerPIO.E("[Port] - 1 Ready not On");
|
|
|
- return 12;
|
|
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout);
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
this.iO.WriteOutputIO("OUT_PIO_READY", true);
|
|
this.iO.WriteOutputIO("OUT_PIO_READY", true);
|
|
@@ -654,7 +746,8 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
{
|
|
{
|
|
|
PIOClear();
|
|
PIOClear();
|
|
|
loggerPIO.E("[Port] - 2 Receive CV Run Timeout");
|
|
loggerPIO.E("[Port] - 2 Receive CV Run Timeout");
|
|
|
- return 12;
|
|
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
this.iO.WriteOutputIO("", true);
|
|
this.iO.WriteOutputIO("", true);
|
|
@@ -672,14 +765,18 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
PIOClear();
|
|
PIOClear();
|
|
|
this.OnOffConveyor(false, true);
|
|
this.OnOffConveyor(false, true);
|
|
|
loggerPIO.E("[Port] Conveyor Wait Time Out");
|
|
loggerPIO.E("[Port] Conveyor Wait Time Out");
|
|
|
- return 12; //Conveyor Moving Timeout
|
|
|
|
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
|
|
|
|
|
+ if ( IsDetectedLoadStart() || IsDetectedCenter()) //중간에 걸려 있다고 생각해서 알람 처리.
|
|
|
|
|
+ return 12; //Conveyor Moving Timeout
|
|
|
|
|
+ else
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (this.iO.IsOn("IN_PIO_RECEIVE_COMPLITE"))
|
|
if (this.iO.IsOn("IN_PIO_RECEIVE_COMPLITE"))
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ( !IsDetectedCenter() )
|
|
|
|
|
|
|
+ if (!IsDetectedCenter())
|
|
|
this.OnCarrierDetected?.Invoke(false);
|
|
this.OnCarrierDetected?.Invoke(false);
|
|
|
|
|
|
|
|
this.OnOffConveyor(false); //Stop
|
|
this.OnOffConveyor(false); //Stop
|
|
@@ -690,6 +787,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.iO.WriteOutputIO("OUT_PIO_SEND_COMPLITE", false, 1000);
|
|
this.iO.WriteOutputIO("OUT_PIO_SEND_COMPLITE", false, 1000);
|
|
|
|
|
|
|
|
this.OnUnloadComplete?.Invoke();
|
|
this.OnUnloadComplete?.Invoke();
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
@@ -700,11 +798,11 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
pio.FwEach(x => { this.iO.OutputOff(x); });
|
|
pio.FwEach(x => { this.iO.OutputOff(x); });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- #endregion
|
|
|
|
|
|
|
+#endregion
|
|
|
|
|
|
|
|
- #endregion
|
|
|
|
|
|
|
+#endregion
|
|
|
|
|
|
|
|
- #region Hardware Create Method
|
|
|
|
|
|
|
+#region Hardware Create Method
|
|
|
void CreateSteering()
|
|
void CreateSteering()
|
|
|
{
|
|
{
|
|
|
this.steering = new Steering(this.iO, this.sql, this.eventAggregator);
|
|
this.steering = new Steering(this.iO, this.sql, this.eventAggregator);
|
|
@@ -717,9 +815,9 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.clamp.Init();
|
|
this.clamp.Init();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- #endregion
|
|
|
|
|
|
|
+#endregion
|
|
|
|
|
|
|
|
- #region Help Method
|
|
|
|
|
|
|
+#region Help Method
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 현재 좌표 값이 등록된 Route 에 맞는 위치인지 확인한다.
|
|
/// 현재 좌표 값이 등록된 Route 에 맞는 위치인지 확인한다.
|
|
|
/// 판단 기준은 Route 에 Tolerance 범위를 사용.
|
|
/// 판단 기준은 Route 에 Tolerance 범위를 사용.
|
|
@@ -779,9 +877,9 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
return BitUtils.ChgInt32(bitArray);
|
|
return BitUtils.ChgInt32(bitArray);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- #endregion
|
|
|
|
|
|
|
+#endregion
|
|
|
|
|
|
|
|
- #region Event
|
|
|
|
|
|
|
+#region Event
|
|
|
private void Steering_OnSteeringError(object sender, int e)
|
|
private void Steering_OnSteeringError(object sender, int e)
|
|
|
{
|
|
{
|
|
|
if (e != 0)
|
|
if (e != 0)
|
|
@@ -802,7 +900,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
- #endregion
|
|
|
|
|
|
|
+#endregion
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|