SK.Kang 6 gadi atpakaļ
vecāks
revīzija
38daeec0ee

+ 49 - 0
Dev/Connection/OHVProtocolServer/OHVProtocolClient/MainWindow.xaml.cs

@@ -86,6 +86,55 @@ namespace OHVProtocolClient
         private void Cn_OnRecd(OCSMessage msg)
         {
             logger.I("[Received] : " + msg.LogFormat());
+
+            switch ( msg.Kind )
+            {
+                case eKind.Unknown:
+                    break;
+                case eKind.E:
+                    break;
+
+                case eKind.S:
+                case eKind.B:
+                case eKind.H:
+                case eKind.F:
+                    ReplyMessage( msg );
+                    break;
+
+                case eKind.T:
+                    break;
+                case eKind.C:
+                    break;
+                case eKind.P:
+                    break;
+                case eKind.I:
+                    break;
+                case eKind.O:
+                    break;
+                case eKind.A:
+                    break;
+                case eKind.L:
+                    break;
+                case eKind.U:
+                    break;
+                case eKind.M:
+                    break;
+                case eKind.R:
+                    break;
+                case eKind.Z:
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        void ReplyMessage(OCSMessage msg )
+        {
+            var reply = new OCSMessage();
+            reply.Kind = msg.Kind;
+            reply.Tag = msg.Tag;
+            reply.SubCode = msg.SubCode;
+            this.manager.Reply( reply );
         }
 
         void RequestScode()

+ 4 - 0
Dev/OHV/OHV.Common/Shareds/ConstString.cs

@@ -8,10 +8,14 @@ namespace OHV.Common.Shareds
 {
     public class ConstString
     {
+        //Config
         public const string Addr = "OCSADDRESS";
         public const string PortNo = "OCSPORTNO";
         public const string VehicleID = "VEHICLEID";
         public const string OCSID = "OCSID";
+        public const string BuzzerStartReadyTime = "BUZZEER_START_READY";
+        public const string PIOInterLockTimeout = "PIO_INTERLOCK_TIMEOUT";
+        public const string PIOTimeOut = "PIO_TIMEOUT";
 
         //Axis Name
         public const string AXIS_CARRIER_LOCK_LEFT = "Axis_CarrierLock_Left";

+ 4 - 22
Dev/OHV/OHV.SqliteDAL/DAL/ConfigDAL.cs

@@ -7,21 +7,8 @@ using OHV.Common.Model;
 
 namespace OHV.SqliteDAL.DAL
 {
-    public class ConfigDAL
+    public class ConfigDAL : GenericDAL<Config>
     {
-        public ConfigDAL()
-        {
-        }
-
-        public void Add(Config config)
-        {
-            using (var db = new OHVDbContext("OHVDb"))
-            {
-                db.Set<Config>().Add(config);
-                db.SaveChanges();
-            }
-        }
-
         public Config GetK(string ID)
         {
             Config config = null;
@@ -34,15 +21,10 @@ namespace OHV.SqliteDAL.DAL
             return config;
         }
 
-        public int Count()
+        public int GetValueToInt(string id )
         {
-            int count = 0;
-            using (var db = new OHVDbContext("OHVDb"))
-            {
-                count = db.Set<Config>().Count();
-            }
-
-            return count;
+            var v = GetK( id );
+            return Convert.ToInt32( v.Value );
         }
     }
 }

+ 26 - 2
Dev/OHV/OHV.SqliteDAL/OHVDbInitializer.cs

@@ -47,11 +47,35 @@ namespace OHV.SqliteDAL
                 {
                     ID = ConstString.OCSID,
                     Name = ConstString.OCSID,
-                    Value = "SO",
+                    Value = "S0",
                     Desc = "OCS ID",
                     EditTime = DateTime.Now
                 },
-            } );
+                new Config
+                {
+                    ID = ConstString.BuzzerStartReadyTime,
+                    Name = ConstString.BuzzerStartReadyTime,
+                    Value = "3000",
+                    Desc = "BeforeMoveBuzzer",
+                    EditTime = DateTime.Now
+                },
+                new Config
+                {
+                    ID = ConstString.PIOInterLockTimeout,
+                    Name= ConstString.PIOInterLockTimeout,
+                    Value = "30000",
+                    Desc = "PIO InterLock Time Out",
+                    EditTime = DateTime.Now,
+                },
+                new Config
+                {
+                    ID = ConstString.PIOTimeOut,
+                    Name= ConstString.PIOTimeOut,
+                    Value = "1000",
+                    Desc = "PIO Time Out",
+                    EditTime = DateTime.Now,
+                },
+            } ) ;
 
             context.Set<AxisPositionData>().AddRange( new List<AxisPositionData>()
             {

+ 2 - 0
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIMotion.cs

@@ -14,6 +14,8 @@ namespace VehicleControlSystem.ControlLayer.Motion
         public bool IsStop { get; set; }
         public double CurrentPos { get; set; }
 
+        public bool IsErrorOn { get; set; }
+
         public GSIMotion()
         {
 

+ 255 - 221
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -40,15 +40,24 @@ namespace VehicleControlSystem.ControlLayer
         }
 
         static Logger logger = Logger.GetLogger();
-        static Logger loggerPIO = Logger.GetLogger("PIO");
+        static Logger loggerPIO = Logger.GetLogger( "PIO" );
 
         #region Properties
         private double currentPosition;
 
+        /// <summary>
+        /// Tag 위치
+        /// </summary>
         public double CurrentPosition
         {
             get { return currentPosition; }
-            set { currentPosition = value; }
+            set
+            {
+                if ( this.currentPosition == value ) return;
+
+                this.currentPosition = value;
+                this.OnCurrentPotisionChanged?.Invoke( (int)value );
+            }
         }
 
         //이동
@@ -115,7 +124,7 @@ namespace VehicleControlSystem.ControlLayer
         public eObstacleState ObstacleStateProperty
         {
             get { return obstacleState; }
-            set { SetField(ref this.obstacleState, value); }
+            set { SetField( ref this.obstacleState, value ); }
         }
 
         private eVehicleState vehicleState;
@@ -123,50 +132,50 @@ namespace VehicleControlSystem.ControlLayer
         public eVehicleState VehicleStateProperty
         {
             get { return vehicleState; }
-            set { SetField(ref this.vehicleState, value); }
+            set { SetField( ref this.vehicleState, value ); }
         }
 
         IEventAggregator eventAggregator;
 
-        public Vehicle(IIO io, SqliteManager sqliteManager, IEventAggregator ea, AutoManager auto)
+        public Vehicle( IIO io, SqliteManager sqliteManager, IEventAggregator ea, AutoManager auto )
         {
             this.iO = io;
             this.motion = new GSIMotion();
             this.sql = sqliteManager;
             this.autoManager = auto;
 
-            this.obstacleBitList.AddRange(new string[]
+            this.obstacleBitList.AddRange( new string[]
             {
                 "OUT_OBSTRUCTION_PATTERN_00",
                 "OUT_OBSTRUCTION_PATTERN_01",
                 "OUT_OBSTRUCTION_PATTERN_02",
                 "OUT_OBSTRUCTION_PATTERN_03",
                 "OUT_OBSTRUCTION_PATTERN_04",
-            });
+            } );
 
             this.eventAggregator = ea;
 
-            this.eventAggregator.GetEvent<DirveControlPubSubEvent>().Unsubscribe(ReceiveDriveControlEvent);
-            this.eventAggregator.GetEvent<DirveControlPubSubEvent>().Subscribe(ReceiveDriveControlEvent);
+            this.eventAggregator.GetEvent<DirveControlPubSubEvent>().Unsubscribe( ReceiveDriveControlEvent );
+            this.eventAggregator.GetEvent<DirveControlPubSubEvent>().Subscribe( ReceiveDriveControlEvent );
         }
 
-        private void ReceiveDriveControlEvent(DriveControlEventArgs obj)
+        private void ReceiveDriveControlEvent( DriveControlEventArgs obj )
         {
-            if (this.autoManager.OperationModeProperty != eOperatationMode.ManualMode)
+            if ( this.autoManager.OperationModeProperty != eOperatationMode.ManualMode )
                 return;
 
             var msg = obj;
-            if (msg.EventDir == DriveControlEventArgs.eEventDir.ToBack)
+            if ( msg.EventDir == DriveControlEventArgs.eEventDir.ToBack )
             {
-                switch (msg.ControlKind)
+                switch ( msg.ControlKind )
                 {
                     case DriveControlEventArgs.eControlKind.MOVE:
                         break;
                     case DriveControlEventArgs.eControlKind.STOP:
                         break;
                     case DriveControlEventArgs.eControlKind.Steering:
-                        if (msg.MoveDir == DriveControlEventArgs.eMoveDir.LEFT)
-                            this.steering.ControlSteering(true);
+                        if ( msg.MoveDir == DriveControlEventArgs.eMoveDir.LEFT )
+                            this.steering.ControlSteering( true );
                         else
                             this.steering.ControlSteering();
                         break;
@@ -174,11 +183,11 @@ namespace VehicleControlSystem.ControlLayer
                         {
                             DriveControlEventArgs reply = new DriveControlEventArgs();
                             reply.ControlKind = DriveControlEventArgs.eControlKind.SteeringState;
-                            if (this.steering.IsLeft())
-                                reply.Result = FluentResults.Results.Ok<DriveControlEventArgs.eMoveDir>(DriveControlEventArgs.eMoveDir.LEFT);
+                            if ( this.steering.IsLeft() )
+                                reply.Result = FluentResults.Results.Ok<DriveControlEventArgs.eMoveDir>( DriveControlEventArgs.eMoveDir.LEFT );
                             else
-                                reply.Result = FluentResults.Results.Ok<DriveControlEventArgs.eMoveDir>(DriveControlEventArgs.eMoveDir.RIGHT);
-                            this.DriveControlEventPublish(reply);
+                                reply.Result = FluentResults.Results.Ok<DriveControlEventArgs.eMoveDir>( DriveControlEventArgs.eMoveDir.RIGHT );
+                            this.DriveControlEventPublish( reply );
                         }
                         break;
                     default:
@@ -187,10 +196,10 @@ namespace VehicleControlSystem.ControlLayer
             }
         }
 
-        private void DriveControlEventPublish(DriveControlEventArgs args)
+        private void DriveControlEventPublish( DriveControlEventArgs args )
         {
             args.EventDir = DriveControlEventArgs.eEventDir.ToFront;
-            this.eventAggregator.GetEvent<DirveControlPubSubEvent>().Publish(args);
+            this.eventAggregator.GetEvent<DirveControlPubSubEvent>().Publish( args );
         }
 
         public void Init()
@@ -201,6 +210,20 @@ namespace VehicleControlSystem.ControlLayer
             ThreadStart();
         }
 
+        public int InitializationVehicle()
+        {
+            int result = 0;
+            if ( this.IsDetectedCenter() ) //자제가 있으면 Lock
+                result = this.clamp.Lock_Sync();
+            else
+                result = this.clamp.Unlock_Sync();
+
+            if ( this.motion.IsErrorOn )
+                return 22;
+
+            return result;
+        }
+
         public void Dispose()
         {
             this.cancel.Cancel();
@@ -210,34 +233,34 @@ namespace VehicleControlSystem.ControlLayer
         #region Thread
         void ThreadStart()
         {
-            this.cancel.AddGo(new Action(this._ThSubCmdWorker));
-            this.cancel.AddGo(new Action(this._ThObstacleChecker));
+            this.cancel.AddGo( new Action( this._ThSubCmdWorker ) );
+            this.cancel.AddGo( new Action( this._ThObstacleChecker ) );
         }
 
         //장애물 감지 Thread
         //장애물 감지 패턴 변경도 여기 하자.
         private void _ThObstacleChecker()
         {
-            while (!this.cancel.Canceled)
+            while ( !this.cancel.Canceled )
             {
                 try
                 {
-                    if (this.autoManager.OperationModeProperty == eOperatationMode.AutoMode)
+                    if ( this.autoManager.OperationModeProperty == eOperatationMode.AutoMode )
                         this.CheckObstacle();
                 }
-                catch (ThreadInterruptedException threadInterruptedException)
+                catch ( ThreadInterruptedException threadInterruptedException )
                 {
                 }
-                catch (Exception exception)
+                catch ( Exception exception )
                 {
-                    logger.E(exception);
+                    logger.E( exception );
                 }
                 finally
                 {
-                    LockUtils.Wait(5);
+                    LockUtils.Wait( 5 );
                 }
             }
-            logger.D("Vehicle - _ThObstacleChecker Dispose");
+            logger.D( "Vehicle - _ThObstacleChecker Dispose" );
         }
 
         /// <summary>
@@ -245,103 +268,109 @@ namespace VehicleControlSystem.ControlLayer
         /// </summary>
         public void _ThSubCmdWorker()
         {
-            while (!this.cancel.Canceled)
+            while ( !this.cancel.Canceled )
             {
                 try
                 {
-                    if (this.ObstacleStateProperty != eObstacleState.Normal) //장애물 감지 상태 시 조그 동작만 가능하게.
+                    if ( this.ObstacleStateProperty != eObstacleState.Normal ) //장애물 감지 상태 시 조그 동작만 가능하게.
                         continue;
 
-                    if (this.autoManager.AutoModeStateProperty != eAutoModeState.Run) // 
+                    if ( this.autoManager.AutoModeStateProperty != eAutoModeState.Run ) // 
                         continue;
 
                     var subCmd = sql.SubCmdDAL.GetSubCmd();
-                    if (subCmd == null) continue;
+                    if ( subCmd == null ) continue;
 
-                    if (!sql.CommandDAL.All.Any(x => x.CommandID.Equals(subCmd.CmdID)))
+                    if ( !sql.CommandDAL.All.Any( x => x.CommandID.Equals( subCmd.CmdID ) ) )
                     {
-                        if (subCmd.CmdType == SubCmd.eCmdType.Auto) //자동 명령중 Main Command 가 없으면 삭제.
+                        if ( subCmd.CmdType == SubCmd.eCmdType.Auto ) //자동 명령중 Main Command 가 없으면 삭제.
                         {
-                            sql.SubCmdDAL.Delete(subCmd);
-                            logger.I($"SubCmd Deleted - ID={subCmd.ID}, CommandID={subCmd.CmdID}");
+                            sql.SubCmdDAL.Delete( subCmd );
+                            logger.I( $"SubCmd Deleted - ID={subCmd.ID}, CommandID={subCmd.CmdID}" );
                         }
                     }
 
-                    switch (subCmd.Type)
+                    switch ( subCmd.Type )
                     {
                         case SubCmd.eType.Move:
                             this.CurrentSubCommand = subCmd;
-                            this.Move(subCmd);
+                            this.Move( subCmd );
                             break;
 
                         case SubCmd.eType.Load:
                             this.CurrentSubCommand = subCmd;
-                            this.LoadCarrier(subCmd);
+                            this.LoadCarrier( subCmd );
                             break;
 
                         case SubCmd.eType.Unload:
                             this.CurrentSubCommand = subCmd;
-                            this.UnloadCarrier(subCmd);
+                            this.UnloadCarrier( subCmd );
                             break;
 
                         case SubCmd.eType.Charge:
                             this.CurrentSubCommand = subCmd;
-                            this.BatteryCharge(subCmd);
+                            this.BatteryCharge( subCmd );
                             break;
                         default:
                             break;
                     }
                 }
-                catch (ThreadInterruptedException threadInterruptedException)
+                catch ( ThreadInterruptedException threadInterruptedException )
                 {
                 }
-                catch (Exception exception)
+                catch ( Exception exception )
                 {
-                    logger.E(exception);
+                    logger.E( exception );
                 }
                 finally
                 {
-                    LockUtils.Wait(500);
+                    LockUtils.Wait( 500 );
                 }
             }
-            logger.D("Vehicle - _ThSubCmdWorker Dispose");
+            logger.D( "Vehicle - _ThSubCmdWorker Dispose" );
         }
         #endregion
 
         #region Control Action Method
 
-        void Move(SubCmd sub)
+        void Move( SubCmd sub )
         {
-            if (this.MoveTo(sub.TargetID))
+            if ( this.MoveTo( sub.TargetID ) )
             {
-                sql.SubCmdDAL.Delete(sub);
+                sql.SubCmdDAL.Delete( sub );
             }
             else
             {
+                if ( this.ObstacleStateProperty == eObstacleState.Blocked )
+                {
+                }
             }
         }
 
-        bool MoveTo(string pointID)
+        bool MoveTo( string pointID )
         {
-            ////ToDo: 부저를 울리는 시간을 설정에 넣자.
             //this.BuzzerOnOff(true, eBuzzerKind.StartWarn);
             ////TimerUtils.Once(3000, BuzzerOnOff, false, eBuzzerKind.StartWarn );
             //Thread.Sleep(3000);
             //this.BuzzerOnOff(false);
+
             this.OnMoveReady?.Invoke();
-            Thread.Sleep(3000);
+
+            var moveReadyBuzzerTime = sql.ConfigDal.GetValueToInt( ConstString.BuzzerStartReadyTime );
+            Thread.Sleep( moveReadyBuzzerTime );
+
             this.OnMoving?.Invoke();
             this.IsMoving = true;
 
             //this.BuzzerOnOff(true, eBuzzerKind.Moving);
-            this.motion.MoveToPoint(pointID, 100);
+            this.motion.MoveToPoint( pointID, 100 );
 
-            Wait4MoveDone();
+            bool result = Wait4MoveDone();
             this.IsMoving = false;
             //this.BuzzerOnOff(false);
             this.OnMoveFinish?.Invoke();
 
-            return true;
+            return result;
         }
 
         bool Wait4MoveDone()
@@ -350,90 +379,90 @@ namespace VehicleControlSystem.ControlLayer
             long st = SwUtils.CurrentTimeMillis;
 
             //Todo: 이동시 확인 사항들.
-            while (true)
+            while ( true )
             {
-                Thread.Sleep(5);
+                Thread.Sleep( 5 );
 
-                if (SwUtils.Gt(st, waitTime))
+                if ( SwUtils.Gt( st, waitTime ) )
                 {
                     //Todo: 이동시간 초과 시 동작들.
                     break;
                 }
 
-                if (this.ObstacleStateProperty == eObstacleState.Blocked)
+                if ( this.ObstacleStateProperty == eObstacleState.Blocked )
                     return false;
             }
             return true;
         }
 
-        public bool LoadCarrier(SubCmd sub)
+        public bool LoadCarrier( SubCmd sub )
         {
-            var route = sql.RouteDal.GetRoute(sub.TargetID);
+            var route = sql.RouteDal.GetRoute( sub.TargetID );
 
-            if (!CorrectPosition(route, this.CurrentPosition))
+            if ( !CorrectPosition( route, this.CurrentPosition ) )
             {
-                this.autoManager.ProcessAlarm(20);
+                this.autoManager.ProcessAlarm( 20 );
                 return false; //Alarm
             }
 
             int result = this.clamp.Unlock_Sync();
-            if (result != 0)
+            if ( result != 0 )
             {
-                this.autoManager.ProcessAlarm(result);
+                this.autoManager.ProcessAlarm( result );
                 return false;
             }
 
-            result = this.PIOAndLoad(sub.TargetID);
-            if (result != 0)
+            result = this.PIOAndLoad( sub.TargetID );
+            if ( result != 0 )
             {
-                this.autoManager.ProcessAlarm(result);
+                this.autoManager.ProcessAlarm( result );
                 return false;
             }
 
             result = this.clamp.Lock_Sync();
-            if (result != 0)
+            if ( result != 0 )
             {
-                this.autoManager.ProcessAlarm(result);
+                this.autoManager.ProcessAlarm( result );
                 return false;
             }
 
             sql.CommandDAL.UpdateState( sub.CmdID, eCommandState.Complete );
-            sql.SubCmdDAL.Delete(sub);
+            sql.SubCmdDAL.Delete( sub );
 
             return true;
         }
 
-        public bool UnloadCarrier(SubCmd sub)
+        public bool UnloadCarrier( SubCmd sub )
         {
-            var route = sql.RouteDal.GetRoute(sub.TargetID);
+            var route = sql.RouteDal.GetRoute( sub.TargetID );
 
-            if (!CorrectPosition(route, this.CurrentPosition))
+            if ( !CorrectPosition( route, this.CurrentPosition ) )
             {
-                this.autoManager.ProcessAlarm(21);
+                this.autoManager.ProcessAlarm( 21 );
                 return false; //Alarm
             }
 
             int result = this.clamp.Unlock_Sync();
-            if (result != 0)
+            if ( result != 0 )
             {
-                this.autoManager.ProcessAlarm(result);
+                this.autoManager.ProcessAlarm( result );
                 return false;
             }
 
-            result = this.PIOAndUnload(sub.TargetID);
-            if (result != 0)
+            result = this.PIOAndUnload( sub.TargetID );
+            if ( result != 0 )
             {
-                this.autoManager.ProcessAlarm(result);
+                this.autoManager.ProcessAlarm( result );
                 return false;
             }
 
-            sql.CommandDAL.UpdateState(sub.CmdID, eCommandState.Complete );
+            sql.CommandDAL.UpdateState( sub.CmdID, eCommandState.Complete );
             sql.SubCmdDAL.Delete( sub );
 
             return true;
         }
 
-        public bool BatteryCharge(SubCmd sub)
+        public bool BatteryCharge( SubCmd sub )
         {
 
             return true;
@@ -444,21 +473,21 @@ namespace VehicleControlSystem.ControlLayer
         #region Check Method
         bool CheckObstacle()
         {
-            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SAFETY") || this.iO.IsOn("IN_OBSTRUCTION_DETECT_ERROR"))
+            if ( this.iO.IsOn( "IN_OBSTRUCTION_DETECT_SAFETY" ) || this.iO.IsOn( "IN_OBSTRUCTION_DETECT_ERROR" ) )
             {
                 this.motion.Stop();
                 this.ObstacleStateProperty = eObstacleState.Abnormal;
                 return true;
             }
 
-            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_STOP"))
+            if ( this.iO.IsOn( "IN_OBSTRUCTION_DETECT_STOP" ) )
             {
                 this.motion.Stop();
                 this.ObstacleStateProperty = eObstacleState.Blocked;
                 return true;
             }
 
-            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SLOW"))
+            if ( this.iO.IsOn( "IN_OBSTRUCTION_DETECT_SLOW" ) )
             {
                 this.motion.SlowStop();
                 this.ObstacleStateProperty = eObstacleState.Decelerate;
@@ -475,67 +504,67 @@ namespace VehicleControlSystem.ControlLayer
         #region Machanical Method
 
         #region Conveyor
-        int OnOffConveyor(bool isOn, bool isCW = false)
+        int OnOffConveyor( bool isOn, bool isCW = false )
         {
-            if (IsInverterError())
+            if ( IsInverterError() )
                 return 16;
 
-            if (isCW)
-                this.iO.OutputOn("OUT_CV_CWCCW");
+            if ( isCW )
+                this.iO.OutputOn( "OUT_CV_CWCCW" );
             else
-                this.iO.OutputOff("OUT_CV_CWCCW");
+                this.iO.OutputOff( "OUT_CV_CWCCW" );
 
-            if (isOn)
-                this.iO.OutputOn("OUT_CV_RUN");
+            if ( isOn )
+                this.iO.OutputOn( "OUT_CV_RUN" );
             else
-                this.iO.OutputOff("OUT_CV_RUN");
+                this.iO.OutputOff( "OUT_CV_RUN" );
 
             return 0;
         }
 
-        void SetConveyorSpeed(bool IsHight)
+        void SetConveyorSpeed( bool IsHight )
         {
-            if (IsHight)
-                this.iO.WriteOutputIO("OUT_CV_DA", true);
+            if ( IsHight )
+                this.iO.WriteOutputIO( "OUT_CV_DA", true );
             else
-                this.iO.WriteOutputIO("OUT_CV_DA", false);
+                this.iO.WriteOutputIO( "OUT_CV_DA", false );
         }
 
         /// <summary>
         /// 입구 감지 로딩시 감속 사용
         /// </summary>
         /// <returns></returns>
-        bool IsDetectedLoadStart() => this.iO.IsOn("IN_CV_DETECT_00");
+        bool IsDetectedLoadStart() => this.iO.IsOn( "IN_CV_DETECT_00" );
 
         /// <summary>
         /// 실물 감지
         /// </summary>
         /// <returns></returns>
-        public bool IsDetectedCenter() => this.iO.IsOn("IN_CV_DETECT_01");
+        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");
+        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())
+            if ( IsDetectedCenter() )
                 return 9;
 
-            OnOffConveyor(true, true);
+            OnOffConveyor( true, true );
 
             long sTime = SwUtils.CurrentTimeMillis;
-            while (true)
+            while ( true )
             {
-                if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND)) //Wait 20Sec
+                if ( SwUtils.Gt( sTime, 20 * ConstUtils.ONE_SECOND ) ) //Wait 20Sec
                 {
-                    OnOffConveyor(false, true);
+                    OnOffConveyor( false, true );
                     return 10;
                 }
 
-                if (IsDetectedLoadStart())
+                if ( IsDetectedLoadStart() )
                     break;
             }
 
@@ -544,28 +573,28 @@ namespace VehicleControlSystem.ControlLayer
 
         int UnloadCarrier()
         {
-            if (!IsDetectedLoadStart())
+            if ( !IsDetectedLoadStart() )
                 return 11;
 
-            OnOffConveyor(true, true);
+            OnOffConveyor( true, true );
 
             long sTime = SwUtils.CurrentTimeMillis;
-            while (true)
+            while ( true )
             {
-                if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND)) //Wait 20Sec
+                if ( SwUtils.Gt( sTime, 20 * ConstUtils.ONE_SECOND ) ) //Wait 20Sec
                 {
-                    OnOffConveyor(false, true);
+                    OnOffConveyor( false, true );
                     return 12;
                 }
 
-                if (!IsDetectedLoadStart())
+                if ( !IsDetectedLoadStart() )
                     break;
             }
 
             return 0;
         }
 
-        public int PIOAndLoad(string targetName)
+        public int PIOAndLoad( string targetName )
         {
 #if SIMULATION
             PIOClear();
@@ -589,10 +618,12 @@ namespace VehicleControlSystem.ControlLayer
             Thread.Sleep(1000);
             this.OnConveyorStop?.Invoke(true);
 #else
-            if (this.IsInverterError())
+            var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
+
+            if ( this.IsInverterError() )
                 return 16;
 
-            if (this.IsLifterPositinCheck())
+            if ( this.IsLifterPositinCheck() )
                 return 14;
 
             if ( !this.IsLifterDuplication() )
@@ -608,45 +639,45 @@ namespace VehicleControlSystem.ControlLayer
             }
 
             PIOClear();
-            loggerPIO.I($"Start Load PIO - [{targetName}]");
-            this.OnPIOStart?.Invoke(true);
+            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");
+            this.iO.WriteOutputIO( "OUT_PIO_RECEIVE_RUN", true );
+            loggerPIO.I( "[Vehicle] - 4 Receive Run On" );
 
-            if (!this.iO.WaitChangeInputIO(true, 1000, "IN_PIO_SENDABLE"))
+            if ( !this.iO.WaitChangeInputIO( true, pioTimeout, "IN_PIO_SENDABLE" ) )
             {
                 PIOClear();
-                loggerPIO.E("[Port] - 4 Ready Time Out");
+                loggerPIO.E( "[Port] - 4 Ready Time Out" );
                 this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
                 return 0;
             }
-            loggerPIO.E("[Port] - 4 Ready On");
+            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);
+            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"))
+            if ( !this.iO.WaitChangeInputIO( true, pioTimeout, "IN_PIO_SEND_RUN" ) )
             {
-                this.OnOffConveyor(false, true);
+                this.OnOffConveyor( false, true );
                 PIOClear();
-                loggerPIO.E("[Port] - 5 Sending Run Time Out");
+                loggerPIO.E( "[Port] - 5 Sending Run Time Out" );
                 this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
                 return 0;
             }
 
             bool isStartDetected = false;
             var sTime = SwUtils.CurrentTimeMillis;
-            while (true)
+            while ( true )
             {
-                if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND))
+                if ( SwUtils.Gt( sTime, 20 * ConstUtils.ONE_SECOND ) )
                 {
                     PIOClear();
-                    this.OnOffConveyor(false, true);
-                    loggerPIO.E("[Vehicle] Conveyor Wait Time Out");
+                    this.OnOffConveyor( false, true );
+                    loggerPIO.E( "[Vehicle] Conveyor Wait Time Out" );
                     this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
 
                     if ( this.IsDetectedLoadStart() ) // 감지가 시작 되었으면 이동중 Error 로 판단 설비를 정지 상태로
@@ -655,32 +686,32 @@ namespace VehicleControlSystem.ControlLayer
                         return 0;
                 }
 
-                if (this.IsDetectedLoadStart() && !isStartDetected)
+                if ( this.IsDetectedLoadStart() && !isStartDetected )
                     isStartDetected = true;
 
-                if (!this.IsDetectedLoadStart() && isStartDetected)
-                    this.SetConveyorSpeed(false);
+                if ( !this.IsDetectedLoadStart() && isStartDetected )
+                    this.SetConveyorSpeed( false );
 
-                if (this.IsDetectedLoadStop()) break;
+                if ( this.IsDetectedLoadStop() ) break;
 
-                if (this.IsPIOInterLockOn())
+                if ( this.IsPIOInterLockOn() )
                 {
                     PIOClear();
-                    this.OnOffConveyor(false); //Stop
-                    loggerPIO.E("[Port] PIO InterLock On ");
+                    this.OnOffConveyor( false ); //Stop
+                    loggerPIO.E( "[Port] PIO InterLock On " );
                     return 19; //
                 }
             }
 
-            if (this.IsDetectedCenter())
-                this.OnCarrierDetected?.Invoke(true);
+            if ( this.IsDetectedCenter() )
+                this.OnCarrierDetected?.Invoke( true );
 
-            this.OnOffConveyor(false); //Stop
+            this.OnOffConveyor( false ); //Stop
             PIOClear();
-            this.OnConveyorStop?.Invoke(true);
+            this.OnConveyorStop?.Invoke( 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", true );
+            this.iO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false, 1000 );
 
             this.OnLoadComplete?.Invoke();
 #endif
@@ -688,7 +719,7 @@ namespace VehicleControlSystem.ControlLayer
             return 0;
         }
 
-        public int PIOAndUnload(string targetName)
+        public int PIOAndUnload( string targetName )
         {
 #if SIMULATION
             PIOClear();
@@ -710,7 +741,9 @@ namespace VehicleControlSystem.ControlLayer
 
             this.OnUnloadComplete?.Invoke();
 #else
-            if (this.IsInverterError())
+            var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
+
+            if ( this.IsInverterError() )
                 return 16;
 
             if ( this.IsLifterDuplication() )
@@ -725,66 +758,67 @@ namespace VehicleControlSystem.ControlLayer
                 return 0;
             }
 
-            if (this.IsLifterPositinCheck())
+            if ( this.IsLifterPositinCheck() )
                 return 13;
 
             PIOClear();
-            loggerPIO.I($"Start Unload PIO - [{targetName}]");
-            this.OnPIOStart?.Invoke(false);
+            loggerPIO.I( $"Start Unload PIO - [{targetName}]" );
+            this.OnPIOStart?.Invoke( false );
 
-            if (!this.iO.IsOn("IN_PIO_READY"))
+            if ( !this.iO.IsOn( "IN_PIO_READY" ) )
             {
-                loggerPIO.E("[Port] - 1 Ready not On");
-                this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout);
+                loggerPIO.E( "[Port] - 1 Ready not On" );
+                this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
                 return 0;
             }
 
-            this.iO.WriteOutputIO("OUT_PIO_READY", true);
-            loggerPIO.I("[Vehicle] - 1 Ready On");
+            this.iO.WriteOutputIO( "OUT_PIO_READY", true );
+            loggerPIO.I( "[Vehicle] - 1 Ready On" );
 
-            if (!this.iO.WaitChangeInputIO(true, 1000, "IN_PIO_RECEIVE_RUN"))
+            if ( !this.iO.WaitChangeInputIO( true, pioTimeout, "IN_PIO_RECEIVE_RUN" ) )
             {
                 PIOClear();
-                loggerPIO.E("[Port] - 2 Receive CV Run Timeout");
+                loggerPIO.E( "[Port] - 2 Receive CV Run Timeout" );
                 this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
                 return 0;
             }
 
-            this.iO.WriteOutputIO("", true);
-            loggerPIO.I("[Vehicle] - 2 Send Run On");
+            this.iO.WriteOutputIO( "OUT_PIO_SENDING_RUN", true );
+            loggerPIO.I( "[Vehicle] - 2 Send Run On" );
 
-            this.SetConveyorSpeed(true);
-            this.OnOffConveyor(true);
-            this.OnConveyorStart?.Invoke(false);
+            this.SetConveyorSpeed( true );
+            this.OnOffConveyor( true );
+            this.OnConveyorStart?.Invoke( false );
 
             var sTime = SwUtils.CurrentTimeMillis;
-            while (true)
+            while ( true )
             {
-                if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND))
+                if ( SwUtils.Gt( sTime, 20 * ConstUtils.ONE_SECOND ) )
                 {
                     PIOClear();
-                    this.OnOffConveyor(false, true);
-                    loggerPIO.E("[Port] Conveyor Wait Time Out");
+                    this.OnOffConveyor( false, true );
+                    loggerPIO.E( "[Port] Conveyor Wait Time Out" );
                     this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
-                    if ( IsDetectedLoadStart() || IsDetectedCenter()) //중간에 걸려 있다고 생각해서 알람 처리.
+
+                    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;
             }
 
-            if (!IsDetectedCenter())
-                this.OnCarrierDetected?.Invoke(false);
+            if ( !IsDetectedCenter() )
+                this.OnCarrierDetected?.Invoke( false );
 
-            this.OnOffConveyor(false); //Stop
-            this.OnConveyorStop?.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.iO.WriteOutputIO( "OUT_PIO_SEND_COMPLITE", true );
+            this.iO.WriteOutputIO( "OUT_PIO_SEND_COMPLITE", false, 1000 );
 
             this.OnUnloadComplete?.Invoke();
 #endif
@@ -795,29 +829,29 @@ namespace VehicleControlSystem.ControlLayer
         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); });
+            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);
+            this.steering = new Steering( this.iO, this.sql, this.eventAggregator );
             this.steering.OnSteeringError += Steering_OnSteeringError;
         }
 
         void CreateClamp()
         {
-            this.clamp = new Clamp(this.sql, this.eventAggregator);
+            this.clamp = new Clamp( this.sql, this.eventAggregator );
             this.clamp.Init();
         }
 
-#endregion
+        #endregion
 
-#region Help Method
+        #region Help Method
         /// <summary>
         /// 현재 좌표 값이 등록된 Route 에 맞는 위치인지 확인한다.
         /// 판단 기준은 Route 에 Tolerance 범위를 사용.
@@ -825,12 +859,12 @@ namespace VehicleControlSystem.ControlLayer
         /// <param name="route"></param>
         /// <param name="currentPosition"></param>
         /// <returns></returns>
-        bool CorrectPosition(Route route, double currentPosition)
+        bool CorrectPosition( Route route, double currentPosition )
         {
             var rScale = route.ScaleValue;
             var rTolerance = route.ScaleTolerance;
             var result = currentPosition - rScale;
-            if (rTolerance < Math.Abs(result))
+            if ( rTolerance < Math.Abs( result ) )
                 return false;
 
             return true;
@@ -842,19 +876,19 @@ namespace VehicleControlSystem.ControlLayer
         /// </summary>
         /// <param name="no"> 0 == Off Laser</param>
         /// <returns></returns>
-        bool ChgObstacleDetectPattern(int no)
+        bool ChgObstacleDetectPattern( int no )
         {
-            var bitArray = BitUtils.ChgBitArray(no);
+            var bitArray = BitUtils.ChgBitArray( no );
 
             int bitIndex = 0;
-            this.obstacleBitList.ForEach(b =>
-            {
-                if (bitArray[bitIndex])
-                    this.iO.OutputOff(b);
-                else
-                    this.iO.OutputOn(b);
-                bitIndex++;
-            });
+            this.obstacleBitList.ForEach( b =>
+             {
+                 if ( bitArray[bitIndex] )
+                     this.iO.OutputOff( b );
+                 else
+                     this.iO.OutputOn( b );
+                 bitIndex++;
+             } );
 
             return true;
         }
@@ -863,29 +897,29 @@ namespace VehicleControlSystem.ControlLayer
         {
             int bitIndex = 0;
 
-            BitArray bitArray = new BitArray(this.obstacleBitList.Count);
+            BitArray bitArray = new BitArray( this.obstacleBitList.Count );
 
-            this.obstacleBitList.ForEach(b =>
-            {
-                if (this.iO.IsOn(b))
-                    bitArray.Set(bitIndex, false);
-                else
-                    bitArray.Set(bitIndex, true);
-                bitIndex++;
-            });
+            this.obstacleBitList.ForEach( b =>
+             {
+                 if ( this.iO.IsOn( b ) )
+                     bitArray.Set( bitIndex, false );
+                 else
+                     bitArray.Set( bitIndex, true );
+                 bitIndex++;
+             } );
 
-            return BitUtils.ChgInt32(bitArray);
+            return BitUtils.ChgInt32( bitArray );
         }
 
-#endregion
+        #endregion
 
-#region Event
-        private void Steering_OnSteeringError(object sender, int e)
+        #region Event Subscribe 
+        private void Steering_OnSteeringError( object sender, int e )
         {
-            if (e != 0)
+            if ( e != 0 )
             {
-                logger.E($"[Steering] - Control Error {e}");
-                this.autoManager.ProcessAlarm(e);
+                logger.E( $"[Steering] - Control Error {e}" );
+                this.autoManager.ProcessAlarm( e );
             }
             else
             {
@@ -893,14 +927,14 @@ namespace VehicleControlSystem.ControlLayer
                 {
                     EventDir = DriveControlEventArgs.eEventDir.ToFront,
                     ControlKind = DriveControlEventArgs.eControlKind.Steering,
-                    Result = FluentResults.Results.Ok<DriveControlEventArgs.eMoveDir>(DriveControlEventArgs.eMoveDir.LEFT),
+                    Result = FluentResults.Results.Ok<DriveControlEventArgs.eMoveDir>( DriveControlEventArgs.eMoveDir.LEFT ),
                 };
 
-                this.eventAggregator.GetEvent<DirveControlPubSubEvent>().Publish(msg);
+                this.eventAggregator.GetEvent<DirveControlPubSubEvent>().Publish( msg );
             }
 
         }
-#endregion
+        #endregion
 
     }
 }

+ 16 - 2
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -12,6 +12,7 @@ using Prism.Events;
 using VehicleControlSystem.ControlLayer;
 using GSG.NET.Extensions;
 using OHV.Common.Model;
+using GSG.NET.Quartz;
 
 namespace VehicleControlSystem.Managers
 {
@@ -346,6 +347,7 @@ namespace VehicleControlSystem.Managers
                 default:
                     return;
             }
+            //Todo: 등록 되어 있는 경로 가 있는 지 확인 필요.
 
             this.sql.CommandDAL.Add( cmd );
 
@@ -365,16 +367,27 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new HostConnectedEventArgs(HostConnectedEventArgs.eConnectedState.Disconnected);
             this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Publish(msg);
+
+            QuartzUtils.StopSchedule( "BatteryReport" );
         }
 
         private void Manager_OnContd(string id)
         {
             var msg = new HostConnectedEventArgs(HostConnectedEventArgs.eConnectedState.Connected);
             this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Publish(msg);
+
+            QuartzUtils.Invoke( "BatteryReport", QuartzUtils.GetExpnMinute( 1 ), BatteryState_Report );
         }
 
         #endregion
 
+        #region Pooling Report
+        void BatteryState_Report()
+        {
+            Send_Bcmd( this.vehicle.BatteryVolt );
+        }
+        #endregion
+
         #region Send
         /// <summary>
         /// 현재 위치 보고 
@@ -428,11 +441,11 @@ namespace VehicleControlSystem.Managers
         }
 
 
-        public void Send_Ccmd()
+        public void Send_Ccmd(string crossPointID)
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.C;
-            msg.Tag = vehicle.CurrentPosition.ToString();
+            msg.Tag = crossPointID;
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
@@ -452,6 +465,7 @@ namespace VehicleControlSystem.Managers
             };
             this.manager.Send(msg);
         }
+
         public void Send_ManualLoad()
         {
             var msg = new OCSMessage()

+ 6 - 1
Dev/OHV/VehicleControlSystem/VCSystem.cs

@@ -122,7 +122,12 @@ namespace VehicleControlSystem
             GUIMessageEventArgs msg;
             if (isAutoMode)
             {
-                //ToDo: 자동 모드로 들어가기전 확인 할 점들.
+                int result = vehicle.InitializationVehicle();
+                if (result != 0 )
+                {
+                    this.autoManager.ProcessAlarm( result ); //Alarm 내용을 UI로 전달 해주니까 Reply 가 필요 없다.
+                    return;
+                }
 
                 this.autoManager.OperationModeProperty = OHV.Common.Shareds.eOperatationMode.AutoMode;
                 this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.StartRun;