|
|
@@ -2,7 +2,6 @@
|
|
|
using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
-using System.Security.Cryptography.X509Certificates;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using FluentResults;
|
|
|
@@ -10,7 +9,6 @@ using GSG.NET.Concurrent;
|
|
|
using GSG.NET.Extensions;
|
|
|
using GSG.NET.LINQ;
|
|
|
using GSG.NET.Logging;
|
|
|
-using GSG.NET.Quartz;
|
|
|
using GSG.NET.Utils;
|
|
|
using OHV.Common.Events;
|
|
|
using OHV.Common.Model;
|
|
|
@@ -167,6 +165,11 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
{
|
|
|
if ( SetField( ref this.vehicleState, value ) )
|
|
|
{
|
|
|
+ if ( value == eVehicleState.Charge )
|
|
|
+ this.OnCharging?.Invoke();
|
|
|
+ else
|
|
|
+ this.OnChargingFull?.Invoke();
|
|
|
+
|
|
|
var info = sql.VehicleInfoDAL.GetAll().FirstOrDefault();
|
|
|
info.VehicleState = value;
|
|
|
sql.VehicleInfoDAL.Update( info );
|
|
|
@@ -869,6 +872,10 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.CurrentSubCommand = subCmd;
|
|
|
this.BatteryCharge( subCmd );
|
|
|
break;
|
|
|
+ case eSubCommandType.Cancel:
|
|
|
+ this.CurrentSubCommand = subCmd;
|
|
|
+ CancelCommand( subCmd );
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
@@ -885,6 +892,18 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
logger.D( "Vehicle - _ThSubCmdWorker Dispose" );
|
|
|
}
|
|
|
|
|
|
+ private void CancelCommand( SubCmd subCmd )
|
|
|
+ {
|
|
|
+ this.refObjects.Drive.CancelCommand( subCmd );
|
|
|
+
|
|
|
+ var cmd = sql.CommandDAL.GetById( subCmd.CmdID );
|
|
|
+ cmd.State = eCommandState.Complete;
|
|
|
+ sql.CommandDAL.Update( cmd );
|
|
|
+ sql.SubCmdDAL.Clean();
|
|
|
+
|
|
|
+ logger.D( $"[Cancel Command] {cmd.TargetID} / {cmd.Type}" );
|
|
|
+ }
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region Control Action Method
|
|
|
@@ -923,10 +942,12 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ sql.SubCmdDAL.Clean();
|
|
|
+
|
|
|
this.taskMoveCancel.Cancel();
|
|
|
this.taskMoveCancel.WaitAll();
|
|
|
|
|
|
- sql.SubCmdDAL.Clean();
|
|
|
+ logger.D( $"[Move Command Complete] {sub.TargetID}" );
|
|
|
}
|
|
|
|
|
|
int MoveTo( SubCmd sub )
|
|
|
@@ -982,7 +1003,6 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
if ( SwUtils.Gt( st, waitTime ) )
|
|
|
{
|
|
|
- //Todo: 이동시간 초과 시 동작들.
|
|
|
logger.D( "Wait4MoveDone Time Over" );
|
|
|
return 39;
|
|
|
}
|
|
|
@@ -1057,10 +1077,13 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.PIOSensorOff();
|
|
|
|
|
|
//Load, Unload 가 끝나면 메인 Command 를 완료 했다고 판단.
|
|
|
- var cmd = sql.CommandDAL.GetById( sub.CmdID );
|
|
|
- cmd.State = eCommandState.Complete;
|
|
|
- sql.CommandDAL.Update( cmd );
|
|
|
sql.SubCmdDAL.Clean();
|
|
|
+ var cmd = sql.CommandDAL.GetById( sub.CmdID );
|
|
|
+ if ( cmd != null )
|
|
|
+ {
|
|
|
+ cmd.State = eCommandState.Complete;
|
|
|
+ sql.CommandDAL.Update( cmd );
|
|
|
+ }
|
|
|
|
|
|
LockUtils.Wait( 1000 );
|
|
|
this.OnLoadComplete?.Invoke(); //일찍 주면 다음 명령을 500ms 안에 주는 현상 있음. 그러니까 천천히 주자
|
|
|
@@ -1107,10 +1130,13 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
this.PIOSensorOff();
|
|
|
|
|
|
- var cmd = sql.CommandDAL.GetById( sub.CmdID );
|
|
|
- cmd.State = eCommandState.Complete;
|
|
|
- sql.CommandDAL.Update( cmd );
|
|
|
sql.SubCmdDAL.Clean();
|
|
|
+ var cmd = sql.CommandDAL.GetById( sub.CmdID );
|
|
|
+ if ( cmd != null )
|
|
|
+ {
|
|
|
+ cmd.State = eCommandState.Complete;
|
|
|
+ sql.CommandDAL.Update( cmd );
|
|
|
+ }
|
|
|
|
|
|
LockUtils.Wait( 1000 );
|
|
|
this.OnUnloadComplete?.Invoke(); //일찍 주면 다음 명령을 500ms 안에 주는 현상 있음. 그러니까 천천히 주자
|
|
|
@@ -1128,10 +1154,14 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
if ( result != ConstInt.EXECUTE_SUCCESS )
|
|
|
this.OccurVehicleAlarm( result );
|
|
|
|
|
|
+ sql.SubCmdDAL.Clean();
|
|
|
+
|
|
|
var cmd = sql.CommandDAL.GetById( subCmd.CmdID );
|
|
|
+ if ( cmd == null )
|
|
|
+ return;
|
|
|
+
|
|
|
cmd.State = eCommandState.Complete;
|
|
|
sql.CommandDAL.Update( cmd );
|
|
|
- sql.SubCmdDAL.Clean();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -1250,6 +1280,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
return 0;
|
|
|
#else
|
|
|
this.PIOSensorOn();
|
|
|
+ LockUtils.Wait( 500 );
|
|
|
|
|
|
var pioTimeout = Convert.ToInt32( sql.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
|
|
|
|
|
|
@@ -1267,7 +1298,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECEIVABLE", true );
|
|
|
loggerPIO.I( "[Vehicle] - 4 Receivable" );
|
|
|
|
|
|
- if ( !this.refObjects.IO.WaitChangeInputIO( true, 20000, "IN_PIO_SEND_RUN" ) )
|
|
|
+ if ( !this.refObjects.IO.WaitChangeInputIO( true, 5000, "IN_PIO_SEND_RUN" ) )
|
|
|
{
|
|
|
PIOClear();
|
|
|
loggerPIO.E( "[Port] - 5 Sending Run Time Out" );
|
|
|
@@ -1326,7 +1357,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", true );
|
|
|
loggerPIO.I( "[Vehicle] Receive Complete On" );
|
|
|
|
|
|
- if ( !this.refObjects.IO.WaitChangeInputIO( true, 10000, "IN_PIO_SEND_COMPLITE" ) )
|
|
|
+ if ( !this.refObjects.IO.WaitChangeInputIO( true, 5000, "IN_PIO_SEND_COMPLITE" ) )
|
|
|
{
|
|
|
this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false );
|
|
|
loggerPIO.E( "[Port] IN_PIO_SEND_COMPLITE On Time Out" );
|
|
|
@@ -1445,6 +1476,8 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
Thread.Sleep( 1000 );
|
|
|
this.OnLoadComplete?.Invoke();
|
|
|
#else
|
|
|
+ loggerPIO.I( $"Start Load PIO - [{targetName}]" );
|
|
|
+
|
|
|
this.PIOSensorOn();
|
|
|
LockUtils.Wait( 500 );
|
|
|
|
|
|
@@ -1461,24 +1494,34 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
if ( this.refObjects.Conveyor.IsInverterError() )
|
|
|
return 16;
|
|
|
|
|
|
- if ( !this.refObjects.Conveyor.IsLifterPositinCheck() )
|
|
|
- return 14;
|
|
|
+ if ( !this.refObjects.IO.WaitChangeInputIO( true, 20 * ConstUtils.ONE_SECOND, "IN_LIFTER_POSITION_DETECT" ) )
|
|
|
+ {
|
|
|
+ loggerPIO.E( "[Port] - Lift Position Check Error" );
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
|
|
|
+ return 0; //14
|
|
|
+ }
|
|
|
|
|
|
- //Todo: Sensor Setting 이 후 주석 풀기.
|
|
|
- //if ( !this.IsLifterDuplication() )
|
|
|
- //{
|
|
|
- // this.OnFailReport?.Invoke( eFailCode.Load_PortHasNotCarrier );
|
|
|
- // return 0;
|
|
|
- //}
|
|
|
+ //if ( !this.refObjects.Conveyor.IsLifterPositinCheck() )
|
|
|
+ //{
|
|
|
+ // loggerPIO.E( "[Port] - Lift Position Check Error" );
|
|
|
+ // this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
|
|
|
+ // return 0; //14
|
|
|
+ //}
|
|
|
|
|
|
- if ( this.refObjects.Conveyor.IsDetectedCenter() )
|
|
|
+ //Todo: Sensor Setting 이 후 주석 풀기.
|
|
|
+ //if ( !this.IsLifterDuplication() )
|
|
|
+ //{
|
|
|
+ // this.OnFailReport?.Invoke( eFailCode.Load_PortHasNotCarrier );
|
|
|
+ // return 0;
|
|
|
+ //}
|
|
|
+
|
|
|
+ if ( this.refObjects.Conveyor.IsDetectedCenter() )
|
|
|
{
|
|
|
this.OnFailReport?.Invoke( eFailCode.Load_VehicleHasCarrier );
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
PIOClear();
|
|
|
- loggerPIO.I( $"Start Load PIO - [{targetName}]" );
|
|
|
this.OnPIOStart?.Invoke( true );
|
|
|
|
|
|
this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECEIVABLE", true );
|
|
|
@@ -1601,6 +1644,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
Thread.Sleep( 1000 );
|
|
|
this.OnUnloadComplete?.Invoke();
|
|
|
#else
|
|
|
+ loggerPIO.E( $"Start Unload PIO -[{targetName}]" );
|
|
|
this.PIOSensorOn();
|
|
|
LockUtils.Wait( 500 );
|
|
|
|
|
|
@@ -1623,11 +1667,21 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- if ( !this.refObjects.Conveyor.IsLifterPositinCheck() )
|
|
|
- return 13;
|
|
|
+ if ( !this.refObjects.IO.WaitChangeInputIO( true, 20 * ConstUtils.ONE_SECOND, "IN_LIFTER_POSITION_DETECT" ) )
|
|
|
+ {
|
|
|
+ loggerPIO.E( "[Port] - Lift Position Check Error" );
|
|
|
+ this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //if ( !this.refObjects.Conveyor.IsLifterPositinCheck() )
|
|
|
+ //{
|
|
|
+ // loggerPIO.E( "[Port] - Lift Position Check Error" );
|
|
|
+ // this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout ); //Unloading Fail Code 를 Time Out 으로 하자. 정의 된 코드 없음.
|
|
|
+ // return 0; //13 -> Alarm Code 보고 없음. 경알람 상태 이므로 한번 보고 후 정상 동작
|
|
|
+ //}
|
|
|
|
|
|
PIOClear();
|
|
|
- loggerPIO.I( $"Start Unload PIO - [{targetName}]" );
|
|
|
this.OnPIOStart?.Invoke( false );
|
|
|
|
|
|
if ( !this.refObjects.IO.IsOn( "IN_PIO_READY" ) )
|
|
|
@@ -1867,8 +1921,15 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
if ( obj.Value == null /*|| obj.Value <= 0 */)
|
|
|
return;
|
|
|
this.BatteryChargeTime = (double)obj.Value;
|
|
|
- if ( this.BatteryChargeTime > 0 )
|
|
|
- this.VehicleStateProperty = eVehicleState.Charge;
|
|
|
+
|
|
|
+ //if ( this.BatteryChargeTime > 0 )
|
|
|
+ //{
|
|
|
+ // //this.OnCharging?.Invoke();
|
|
|
+ // //this.VehicleStateProperty = eVehicleState.Charge;
|
|
|
+ //}
|
|
|
+ //else
|
|
|
+ // //this.OnChargingFull?.Invoke();
|
|
|
+
|
|
|
break;
|
|
|
case eDataKind.DisChargeCompleteTime:
|
|
|
if ( obj.Value == null || obj.Value <= 0 )
|
|
|
@@ -1877,7 +1938,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
break;
|
|
|
case eDataKind.SOC:
|
|
|
this.BatteryStateOfCharge = (double)obj.Value;
|
|
|
- if ( this.BatteryStateOfCharge >= 80 )
|
|
|
+ if ( this.BatteryStateOfCharge >= 78 )
|
|
|
{
|
|
|
if ( this.autoManager.AutoModeStateProperty != eAutoModeState.Run )
|
|
|
return;
|