|
|
@@ -53,8 +53,8 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
/// <summary>
|
|
|
/// Tag 위치
|
|
|
/// </summary>
|
|
|
- private string currentTag = "0000";
|
|
|
- public string CurrentTag
|
|
|
+ private int currentTag = 0;
|
|
|
+ public int CurrentTag
|
|
|
{
|
|
|
get { return currentTag; }
|
|
|
set
|
|
|
@@ -62,7 +62,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
if ( SetField( ref this.currentTag, value ) )
|
|
|
{
|
|
|
var info = sql.VehicleInfoDAL.GetInfo();
|
|
|
- info.CurrentTag = value;
|
|
|
+ info.CurrentTag = value.ToString();
|
|
|
sql.VehicleInfoDAL.Update( info );
|
|
|
|
|
|
this.OnCurrentTagChanged?.Invoke( value );
|
|
|
@@ -211,7 +211,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
set { }
|
|
|
}
|
|
|
|
|
|
- public bool IsMoving { get; set; }
|
|
|
+ public bool IsMoving { get => this.drive.IsDriveMoving(); }
|
|
|
#region Battery Property
|
|
|
|
|
|
double batteryVoltage;
|
|
|
@@ -316,7 +316,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
public event Action OnLoadComplete;
|
|
|
public event Action OnUnloadComplete;
|
|
|
|
|
|
- public event Action<string> OnCurrentTagChanged;
|
|
|
+ public event Action<int> OnCurrentTagChanged;
|
|
|
|
|
|
public event Action OnManualMove;
|
|
|
public event Action OnManualLoad;
|
|
|
@@ -374,7 +374,6 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.eventAggregator.GetEvent<ObstacleControlPubSubEvent>().Subscribe( ObstacleReceiveEvent );
|
|
|
}
|
|
|
|
|
|
-
|
|
|
private void ObstacleReceiveEvent( ObstacleControlEventArgs obj )
|
|
|
{
|
|
|
if ( this.autoManager.OperationModeProperty != eOperatationMode.ManualMode )
|
|
|
@@ -590,7 +589,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
VehicleInfo state = new VehicleInfo();
|
|
|
state.CurrentPosition = this.CurrentPosition;
|
|
|
state.CurrentSpeed = this.CurrentSpeed;
|
|
|
- state.CurrentTag = this.CurrentTag;
|
|
|
+ state.CurrentTag = this.CurrentTag.ToString();
|
|
|
state.CurrentTorque = this.CurrentTorque;
|
|
|
|
|
|
var msg = new DriveControlEventArgs();
|
|
|
@@ -819,7 +818,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
{
|
|
|
//Move 시작 시 충전 중이면 충전 중지 실행.
|
|
|
int result = 0;
|
|
|
- if ( this.IsCharging() )
|
|
|
+ if ( this.IsCharging() || this.VehicleStateProperty == eVehicleState.Charge )
|
|
|
{
|
|
|
result = this.StopBatteryCharge();
|
|
|
if ( result != 0 )
|
|
|
@@ -838,10 +837,10 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
bool MoveTo( string pointID )
|
|
|
{
|
|
|
- //this.BuzzerOnOff(true, eBuzzerKind.StartWarn);
|
|
|
+ //this.BuzzerOnOff( true, eBuzzerKind.StartWarn );
|
|
|
////TimerUtils.Once(3000, BuzzerOnOff, false, eBuzzerKind.StartWarn );
|
|
|
- //Thread.Sleep(3000);
|
|
|
- //this.BuzzerOnOff(false);
|
|
|
+ //Thread.Sleep( 3000 );
|
|
|
+ //this.BuzzerOnOff( false );
|
|
|
|
|
|
if ( this.VehicleStateProperty == eVehicleState.Idle )
|
|
|
{
|
|
|
@@ -854,7 +853,6 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
}
|
|
|
|
|
|
this.OnMoving?.Invoke();
|
|
|
- this.IsMoving = true;
|
|
|
|
|
|
//이전에 있던 작업들 종료 및 삭제
|
|
|
this.taskMoveCancel.Cancel();
|
|
|
@@ -862,7 +860,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
this.taskMoveCancel.Add( CheckCrossPoint() );
|
|
|
|
|
|
- PhysicalCheckupLogger.Instance.SetPLCStartDrive();
|
|
|
+ //PhysicalCheckupLogger.Instance.SetPLCStartDrive();
|
|
|
this.VehicleStateProperty = eVehicleState.Move;
|
|
|
//this.BuzzerOnOff(true, eBuzzerKind.Moving);
|
|
|
this.drive.MoveToPoint( pointID, 100 );
|
|
|
@@ -874,23 +872,21 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.taskMoveCancel.WaitAll();
|
|
|
|
|
|
//Drive 에서 정지 확인 후 상태 변경
|
|
|
- if ( drive.IsStop )
|
|
|
+ if ( drive.IsDriveStop() )
|
|
|
{
|
|
|
- this.IsMoving = false;
|
|
|
this.OnMoveFinish?.Invoke();
|
|
|
|
|
|
- PhysicalCheckupLogger.Instance.ResetPLCStartDrive();
|
|
|
+ //PhysicalCheckupLogger.Instance.ResetPLCStartDrive();
|
|
|
this.VehicleStateProperty = eVehicleState.Idle;
|
|
|
+ logger.D( "Move Finish" );
|
|
|
}
|
|
|
|
|
|
- //PhysicalCheckupLogger.Instance.UploadPhysicalCheckupLog();
|
|
|
-
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
bool Wait4MoveDone()
|
|
|
{
|
|
|
- int waitTime = 9000; //설정 할 수있게.
|
|
|
+ int waitTime = 60000; //설정 할 수있게.
|
|
|
long st = SwUtils.CurrentTimeMillis;
|
|
|
|
|
|
//Todo: 이동시 확인 사항들.
|
|
|
@@ -898,11 +894,12 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
{
|
|
|
Thread.Sleep( 5 );
|
|
|
|
|
|
- if ( SwUtils.Gt( st, waitTime ) )
|
|
|
- {
|
|
|
- //Todo: 이동시간 초과 시 동작들.
|
|
|
- break;
|
|
|
- }
|
|
|
+ //if ( SwUtils.Gt( st, waitTime ) )
|
|
|
+ //{
|
|
|
+ // //Todo: 이동시간 초과 시 동작들.
|
|
|
+ // logger.D( "Wait4MoveDone Time Over" );
|
|
|
+ // break;
|
|
|
+ //}
|
|
|
|
|
|
//Todo: 이동중 명령이 삭제 되면 처리 할일들.
|
|
|
//이동중 메인 명력이 없어진다면 정지 후
|
|
|
@@ -923,6 +920,9 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if ( this.drive.IsDriveStop() )
|
|
|
+ break;
|
|
|
+
|
|
|
//PhysicalCheckupLogger.Instance.DriveStateLog( this.drive.CurrentSpeed.ToString(), this.drive.CurrentTorque.ToString(), "12315", "100", "1234" );
|
|
|
//PhysicalCheckupLogger.Instance.DriveStateLog( this.drive.CurrentSpeed.ToString(), this.drive.CurrentTorque.ToString(), "12315", "100", "1234", false );
|
|
|
|
|
|
@@ -970,11 +970,11 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
var route = sql.RouteDal.GetRoute( sub.TargetID );
|
|
|
|
|
|
- if ( !CorrectPosition( route, this.CurrentPosition ) )
|
|
|
- {
|
|
|
- this.OccurVehicleAlarm( 20 );
|
|
|
- return false; //Alarm
|
|
|
- }
|
|
|
+ //if ( !CorrectPosition( route, this.CurrentPosition ) )
|
|
|
+ //{
|
|
|
+ // this.OccurVehicleAlarm( 20 );
|
|
|
+ // return false; //Alarm
|
|
|
+ //}
|
|
|
|
|
|
//PIO 내부로 이동.
|
|
|
//int result = this.clamp.Unlock_Sync();
|
|
|
@@ -1016,14 +1016,20 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
{
|
|
|
this.VehicleStateProperty = eVehicleState.Unload;
|
|
|
|
|
|
- var route = sql.RouteDal.GetRoute( sub.TargetID );
|
|
|
-
|
|
|
- if ( !CorrectPosition( route, this.CurrentPosition ) )
|
|
|
+ if ( !this.CurrentTag.ToString().Equals( sub.TargetID ) )
|
|
|
{
|
|
|
this.OccurVehicleAlarm( 21 );
|
|
|
return false; //Alarm
|
|
|
}
|
|
|
|
|
|
+ //var route = sql.RouteDal.GetRoute( sub.TargetID );
|
|
|
+
|
|
|
+ //if ( !CorrectPosition( route, this.CurrentPosition ) )
|
|
|
+ //{
|
|
|
+ // this.OccurVehicleAlarm( 21 );
|
|
|
+ // return false; //Alarm
|
|
|
+ //}
|
|
|
+
|
|
|
//PIO 내부로 이동.
|
|
|
//int result = this.clamp.Unlock_Sync();
|
|
|
//if ( result != 0 )
|
|
|
@@ -1055,15 +1061,11 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
public void BatteryCharge( SubCmd subCmd )
|
|
|
{
|
|
|
- this.VehicleStateProperty = eVehicleState.Charge;
|
|
|
-
|
|
|
int result = 0;
|
|
|
result = this.StartBatteryCharge();
|
|
|
|
|
|
sql.CommandDAL.UpdateState( subCmd.CmdID, eCommandState.Complete );
|
|
|
sql.SubCmdDAL.Delete( subCmd );
|
|
|
-
|
|
|
- this.VehicleStateProperty = eVehicleState.Idle;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -1142,6 +1144,45 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
public int StartBatteryCharge()
|
|
|
{
|
|
|
+#if SIMULATION
|
|
|
+ this.PIOSensorOn();
|
|
|
+
|
|
|
+ var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
|
|
|
+
|
|
|
+ PIOClear();
|
|
|
+ loggerPIO.I( $"Start Battery Charge PIO" );
|
|
|
+
|
|
|
+ //if ( !this.iO.WaitChangeInputIO( true, pioTimeout, "IN_PIO_SENDABLE" ) )
|
|
|
+ //{
|
|
|
+ // PIOClear();
|
|
|
+ // loggerPIO.E( "[Port] - 4 Ready Time Out" );
|
|
|
+ // return 34;
|
|
|
+ //}
|
|
|
+ Thread.Sleep( 1000 );
|
|
|
+ loggerPIO.E( "[Port] - 4 Ready On" );
|
|
|
+
|
|
|
+ this.iO.WriteOutputIO( "OUT_PIO_RECEIVABLE", true );
|
|
|
+ loggerPIO.I( "[Vehicle] - 4 Receivable" );
|
|
|
+
|
|
|
+ //if ( !this.iO.WaitChangeInputIO( true, 20000, "IN_PIO_SEND_RUN" ) )
|
|
|
+ //{
|
|
|
+ // PIOClear();
|
|
|
+ // loggerPIO.E( "[Port] - 5 Sending Run Time Out" );
|
|
|
+ // return 35;
|
|
|
+ //}
|
|
|
+ Thread.Sleep( 1000 );
|
|
|
+ loggerPIO.I( "[Port] - 5 Sending Run On" );
|
|
|
+
|
|
|
+ this.iO.WriteOutputIO( "OUT_PIO_RECEIVE_RUN", true );
|
|
|
+ loggerPIO.I( "[Vehicle] - 5 Receive Run On" );
|
|
|
+
|
|
|
+ this.VehicleStateProperty = eVehicleState.Charge;
|
|
|
+ this.OnChargingStart?.Invoke();
|
|
|
+ Thread.Sleep( 1000 );
|
|
|
+ this.OnCharging?.Invoke();
|
|
|
+
|
|
|
+ return 0;
|
|
|
+#else
|
|
|
this.PIOSensorOn();
|
|
|
|
|
|
var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
|
|
|
@@ -1174,10 +1215,42 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.VehicleStateProperty = eVehicleState.Charge;
|
|
|
|
|
|
return 0;
|
|
|
+#endif
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public int StopBatteryCharge()
|
|
|
{
|
|
|
+#if SIMULATION
|
|
|
+ loggerPIO.I( $"Stop Battery Charge PIO" );
|
|
|
+
|
|
|
+ var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
|
|
|
+
|
|
|
+ this.PIOClear();
|
|
|
+
|
|
|
+ this.iO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", true );
|
|
|
+ loggerPIO.I( "[Vehicle] Receive Complete On" );
|
|
|
+
|
|
|
+ //if ( !this.iO.WaitChangeInputIO( true, 20000, "IN_PIO_SEND_COMPLITE" ) )
|
|
|
+ //{
|
|
|
+ // this.iO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false );
|
|
|
+ // loggerPIO.E( "[Port] IN_PIO_SEND_COMPLITE On Time Out" );
|
|
|
+ // return 36;
|
|
|
+ //}
|
|
|
+ Thread.Sleep( 1000 );
|
|
|
+ loggerPIO.I( "[Port] Send Complete On" );
|
|
|
+
|
|
|
+ Thread.Sleep( 1000 );
|
|
|
+ this.iO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false );
|
|
|
+
|
|
|
+ this.OnChargingFull?.Invoke();
|
|
|
+
|
|
|
+ this.PIOSensorOff();
|
|
|
+
|
|
|
+ this.VehicleStateProperty = eVehicleState.Idle;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+#else
|
|
|
loggerPIO.I( $"Stop Battery Charge PIO" );
|
|
|
|
|
|
var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
|
|
|
@@ -1203,11 +1276,12 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.VehicleStateProperty = eVehicleState.Idle;
|
|
|
|
|
|
return 0;
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
|
|
|
- #region Check Method
|
|
|
+#region Check Method
|
|
|
bool CheckObstacle()
|
|
|
{
|
|
|
if ( this.iO.IsOn( "IN_OBSTRUCTION_DETECT_SAFETY" ) || this.iO.IsOn( "IN_OBSTRUCTION_DETECT_ERROR" ) )
|
|
|
@@ -1245,11 +1319,11 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
//if ( !this.iO.IsOn( "IN_MC_ON" ) ) this.OccurVehicleAlarm( 29 );
|
|
|
}
|
|
|
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
|
|
|
- #region Mechanical Method
|
|
|
+#region Mechanical Method
|
|
|
|
|
|
- #region IO
|
|
|
+#region IO
|
|
|
/// <summary>
|
|
|
/// Out Put 을 On 이면 Sensor Off
|
|
|
/// </summary>
|
|
|
@@ -1265,14 +1339,14 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
public bool IsCharging() => this.iO.IsOn( "IN_PIO_SEND_RUN" ) && this.iO.IsOn( "IN_PIO_SENDABLE" );
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
|
|
|
- #region Drive
|
|
|
+#region Drive
|
|
|
//public void DriveServoOff() => this.drive.ServoOff();
|
|
|
//public void DriveServoOn() => this.drive.ServoOn();
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
|
|
|
- #region Conveyor
|
|
|
+#region Conveyor
|
|
|
public void ConveyorOff() => this.conveyor.OnOffConveyor( false );
|
|
|
public int ConveyorLoad() => this.conveyor.ConveyorLoad();
|
|
|
|
|
|
@@ -1306,20 +1380,21 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
this.OnLoadComplete?.Invoke();
|
|
|
#else
|
|
|
|
|
|
- int result = this.clamp.Unlock_Sync();
|
|
|
+ int result = 0;
|
|
|
+ var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
|
|
|
+
|
|
|
+ result = this.clamp.Unlock_Sync();
|
|
|
if ( result != 0 )
|
|
|
{
|
|
|
this.OccurVehicleAlarm( result );
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
|
|
|
-
|
|
|
if ( this.conveyor.IsInverterError() )
|
|
|
return 16;
|
|
|
|
|
|
- //if ( !this.conveyor.IsLifterPositinCheck() )
|
|
|
- // return 14;
|
|
|
+ if ( !this.conveyor.IsLifterPositinCheck() )
|
|
|
+ return 14;
|
|
|
|
|
|
//Todo: Sensor Setting 이 후 주석 풀기.
|
|
|
//if ( !this.IsLifterDuplication() )
|
|
|
@@ -1350,6 +1425,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
}
|
|
|
loggerPIO.E( "[Port] - 4 Ready On" );
|
|
|
|
|
|
+
|
|
|
//this.conveyor.SetConveyorSpeed( true );
|
|
|
this.conveyor.OnOffConveyor( true, true );
|
|
|
this.iO.WriteOutputIO( "OUT_PIO_RECEIVE_RUN", true, 1000 ); //1Sec 이후 On
|
|
|
@@ -1459,13 +1535,7 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
Thread.Sleep( 1000 );
|
|
|
this.OnUnloadComplete?.Invoke();
|
|
|
#else
|
|
|
-
|
|
|
- int result = this.clamp.Unlock_Sync();
|
|
|
- if ( result != 0 )
|
|
|
- {
|
|
|
- this.OccurVehicleAlarm( result );
|
|
|
- return result;
|
|
|
- }
|
|
|
+ int result = 0;
|
|
|
|
|
|
var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
|
|
|
|
|
|
@@ -1510,6 +1580,13 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
}
|
|
|
loggerPIO.E( "[Port] - 2 Receive CV Run On" );
|
|
|
|
|
|
+ result = this.clamp.Unlock_Sync();
|
|
|
+ if ( result != 0 )
|
|
|
+ {
|
|
|
+ this.OccurVehicleAlarm( result );
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
this.iO.WriteOutputIO( "OUT_PIO_SENDING_RUN", true );
|
|
|
loggerPIO.I( "[Vehicle] - 2 Send Run On" );
|
|
|
|
|
|
@@ -1569,11 +1646,11 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
pio.FwEach( x => { this.iO.OutputOff( x ); } );
|
|
|
}
|
|
|
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
|
|
|
- #region Hardware Create Method
|
|
|
+#region Hardware Create Method
|
|
|
void CreateSteering()
|
|
|
{
|
|
|
this.steering = new Steering( this.iO, this.sql, this.eventAggregator );
|
|
|
@@ -1672,9 +1749,9 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
|
|
|
- #region Help Method
|
|
|
+#region Help Method
|
|
|
/// <summary>
|
|
|
/// 현재 좌표 값이 등록된 Route 에 맞는 위치인지 확인한다.
|
|
|
/// 판단 기준은 Route 에 Tolerance 범위를 사용.
|
|
|
@@ -1764,9 +1841,9 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
else
|
|
|
return;
|
|
|
}
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
|
|
|
- #region Event Subscribe
|
|
|
+#region Event Subscribe
|
|
|
private void AutoManager_OnOperationModeChanged( eOperatationMode obj )
|
|
|
{
|
|
|
this.drive.SetDriveOperationMode( obj );
|
|
|
@@ -1787,7 +1864,8 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
break;
|
|
|
case "CurrentTag":
|
|
|
{
|
|
|
- var v = CastTo<string>.From<object>( newValue );
|
|
|
+ var v = CastTo<int>.From<object>( newValue );
|
|
|
+ logger.D( $"{this.CurrentTag} -> {v}" );
|
|
|
this.CurrentTag = v;
|
|
|
}
|
|
|
break;
|
|
|
@@ -1933,6 +2011,6 @@ namespace VehicleControlSystem.ControlLayer
|
|
|
|
|
|
}
|
|
|
|
|
|
- #endregion
|
|
|
+#endregion
|
|
|
}
|
|
|
}
|