Procházet zdrojové kódy

OCS 통신 내용 추가.
Vehicle 상태 보고 추가.

SK.Kang před 6 roky
rodič
revize
52c448e88e

+ 6 - 2
Dev/OHV/OHV.Common/Events/MessageEventArgs.cs

@@ -21,11 +21,12 @@ namespace OHV.Common.Events
             RspIOMapList,
             RspCommandList,
             RspAutoModeChange,
-            RspManualmodeChange,
+            RspManualModeChange,
+            RspAlarmReset,
         }
 
         public eGUIMessageKind Kind { get; set; }
-        public int MessageKey { get; set; }
+        public string MessageKey { get; set; }
         public string MessageText { get; set; }
         public Command Command { get; set; }
         public Dictionary<string, object> Dic { get; set; }
@@ -46,11 +47,14 @@ namespace OHV.Common.Events
     {
         public enum eVCSMessageKind
         {
+            ModelPropertyChange,
+
             ReqIOObject,
             ReqIOMapList,
             ReqCommandList,
             ReqAutoModeChange,
             ReqManualModeChange,
+            ReqAlarmReset,
         }
 
         public eVCSMessageKind Kind { get; set; }

+ 1 - 0
Dev/OHV/OHV.Common/Model/Alarm.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 using System.Linq;
 using System.Text;

+ 2 - 2
Dev/OHV/OHV.Common/Model/HisAlarm.cs

@@ -14,9 +14,9 @@ namespace OHV.Common.Model
         public DateTime OccurTime { get; set; }
         public string Solution { get; set; }
 
-        public int? AlarmId { get; set; }
+        public int AlarmId { get; set; }
 
-        public virtual Alarm Alarm { get; set; }
+        //public virtual Alarm Alarm { get; set; }
 
         public HisAlarm()
         {

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

@@ -21,4 +21,9 @@ namespace OHV.Common.Shareds
         public const string TEACH_POSITION_LOCK = "Teach_Postion_Lock";
         public const string TEACH_POSITION_UNLOCK = "Teach_Postion_Unlock";
     }
+
+    public class MessageKey
+    {
+        public const string Alarm = "Alarm";
+    }
 }

+ 23 - 1
Dev/OHV/OHV.Common/Shareds/SharedEnumType.cs

@@ -42,10 +42,18 @@
 		Blocked,
 		Decelerate,
 	}
+
+	public enum eObstacleState
+	{
+		Normal,
+        Abnormal,
+        Blocked,
+        Decelerate,
+    }
     #endregion
 
     #region Opertation
-	public enum eOperatationMode
+    public enum eOperatationMode
 	{
 		ManualMode,
 		AutoMode,
@@ -101,4 +109,18 @@
 		Cylinder,
 		Drive,
 	}
+
+	public enum eBuzzerKind
+	{
+		Alarm,
+		StartWarn,
+		Moving,
+	}
+
+	public enum eLampState
+	{
+		Alarm,
+		Charging,
+		AutoRunNChargingFull, //충전 완료시에도 점등
+	}
 }

+ 73 - 52
Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs

@@ -1,5 +1,6 @@
 using CommonServiceLocator;
 using OHV.Common.Events;
+using OHV.Common.Model;
 using OHV.Common.Shareds;
 using OHV.Module.Interactivity;
 using Prism.Commands;
@@ -28,14 +29,14 @@ namespace OHV.Vehicle.Concept
         public string Title
         {
             get { return _title; }
-            set { SetProperty( ref _title , value ); }
+            set { SetProperty(ref _title, value); }
         }
 
         private double _cpu;
         public double CPU
         {
             get { return this._cpu; }
-            set { this.SetProperty( ref this._cpu , value ); }
+            set { this.SetProperty(ref this._cpu, value); }
         }
         private double _totalCPU;
         public double TotalCPU
@@ -44,7 +45,7 @@ namespace OHV.Vehicle.Concept
             set
             {
                 //this._totalCPU = dti.cpuResult.ToString();
-                this.SetProperty( ref this._totalCPU , value );
+                this.SetProperty(ref this._totalCPU, value);
             }
         }
         public int UsageCPU { get; set; }
@@ -53,14 +54,14 @@ namespace OHV.Vehicle.Concept
         public double RAM
         {
             get { return this._ram; }
-            set { this.SetProperty( ref this._ram , value ); }
+            set { this.SetProperty(ref this._ram, value); }
         }
 
         private double _cDrive;
         public double CDrive
         {
             get { return this._cDrive; }
-            set { this.SetProperty( ref this._cDrive , value ); }
+            set { this.SetProperty(ref this._cDrive, value); }
         }
 
         DateTime _dateTime;
@@ -69,7 +70,7 @@ namespace OHV.Vehicle.Concept
             get { return _dateTime; }
             set
             {
-                this.SetProperty( ref _dateTime , value );
+                this.SetProperty(ref _dateTime, value);
             }
         }
 
@@ -77,7 +78,7 @@ namespace OHV.Vehicle.Concept
         public string VehicleID
         {
             get { return this._vehicleID; }
-            set { this.SetProperty( ref this._vehicleID , value ); }
+            set { this.SetProperty(ref this._vehicleID, value); }
         }
 
         private Brush _ocsBrush;// = Brushes.Gray;
@@ -89,7 +90,7 @@ namespace OHV.Vehicle.Concept
             get { return _ocsBrush; }
             set
             {
-                SetProperty( ref _ocsBrush , value );
+                SetProperty(ref _ocsBrush, value);
             }
         }
         public Brush BatteryBrush
@@ -97,7 +98,7 @@ namespace OHV.Vehicle.Concept
             get { return _batteryBrush; }
             set
             {
-                SetProperty( ref _batteryBrush , value );
+                SetProperty(ref _batteryBrush, value);
             }
         }
         public Brush LaserBrush
@@ -105,7 +106,7 @@ namespace OHV.Vehicle.Concept
             get { return this._laserBrush; }
             set
             {
-                SetProperty( ref _laserBrush , value );
+                SetProperty(ref _laserBrush, value);
             }
         }
 
@@ -113,14 +114,14 @@ namespace OHV.Vehicle.Concept
         public string SwVersion
         {
             get { return this._swVersion; }
-            set { this.SetProperty( ref this._swVersion , value ); }
+            set { this.SetProperty(ref this._swVersion, value); }
         }
 
         private DateTime _lastBuildedTime;
         public DateTime LastBuildedTime
         {
             get { return this._lastBuildedTime; }
-            set { this.SetProperty( ref this._lastBuildedTime , value ); }
+            set { this.SetProperty(ref this._lastBuildedTime, value); }
         }
 
         IEventAggregator eventAggregator = null;
@@ -147,42 +148,42 @@ namespace OHV.Vehicle.Concept
             //LanguageHalper.LanguagesSelcter.ChangLanguage(LanguageHalper.eLanguageType.Chinese);
         }
 
-        public D_MainWindowViewModel( IEventAggregator ea , VCSystem cSystem , IRegionManager _regionManager , MessageController messageController )
+        public D_MainWindowViewModel(IEventAggregator ea, VCSystem cSystem, IRegionManager _regionManager, MessageController messageController)
         {
             this.regionManager = _regionManager;
 
             this.eventAggregator = ea;
-            this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Subscribe( UICallbackCommunication , ThreadOption.UIThread );
-            this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Subscribe( OcsConnectCallBack , ThreadOption.UIThread , false );
+            this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Subscribe(UICallbackCommunication, ThreadOption.UIThread);
+            this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Subscribe(OcsConnectCallBack, ThreadOption.UIThread, false);
             vcsMessagePublisher = this.eventAggregator.GetEvent<VCSMessagePubSubEvent>();
 
             this.VCSystem = cSystem;
             this.messageController = messageController;
 
             //this.TestCommand = new DelegateCommand( ExecuteTextCommand );
-            this.NavigateCommand = new DelegateCommand<object>( this.Navigate );
-            this.SystemOffCommand = new DelegateCommand( ExecuteSystemOffCommand );
+            this.NavigateCommand = new DelegateCommand<object>(this.Navigate);
+            this.SystemOffCommand = new DelegateCommand(ExecuteSystemOffCommand);
             this.ChangeLanguage = new DelegateCommand(Execte_ChangeLanguage);
             this.StartCommand = new DelegateCommand(ExecuteStartCommand);
             this.StopCommand = new DelegateCommand(ExecuteStopCommand);
 
             DispatcherTimer dateTimer = new DispatcherTimer();
-            dateTimer.Tick += ( object sender , EventArgs e ) =>
+            dateTimer.Tick += (object sender, EventArgs e) =>
             {
                 this.DateTime = DateTime.Now;
-                
+
             };
-            dateTimer.Interval = TimeSpan.FromMilliseconds( 500 );
+            dateTimer.Interval = TimeSpan.FromMilliseconds(500);
             dateTimer.Start();
 
             DispatcherTimer deskTopTimer = new DispatcherTimer();
-            deskTopTimer.Tick += ( object sender , EventArgs e ) =>
+            deskTopTimer.Tick += (object sender, EventArgs e) =>
             {
                 this.CPU = dti.GetCpuUsage();
-                this.UsageCPU = ( int )dti.GetCpuUsage();
+                this.UsageCPU = (int)dti.GetCpuUsage();
                 this.RAM = dti.GetRamUsage();
             };
-            deskTopTimer.Interval = TimeSpan.FromMilliseconds( 1000 );
+            deskTopTimer.Interval = TimeSpan.FromMilliseconds(1000);
             deskTopTimer.Start();
 
             this._totalCPU = dti.cpuResult;
@@ -194,29 +195,39 @@ namespace OHV.Vehicle.Concept
 
         private void ExecuteStopCommand()
         {
-            var msg = new VCSMessageEventArgs
+            this.messageController.ShowConfirmationPopupView("Request Vehicle Auto Mode ?", r =>
             {
-                Kind = VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange,
-            };
-
-            vcsMessagePublisher.Publish(msg);
+                if (r.Result == ButtonResult.OK)
+                {
+                    var msg = new VCSMessageEventArgs
+                    {
+                        Kind = VCSMessageEventArgs.eVCSMessageKind.ReqManualModeChange,
+                    };
+                    vcsMessagePublisher.Publish(msg);
+                }
+            });
         }
 
         private void ExecuteStartCommand()
         {
-            var msg = new VCSMessageEventArgs
+            this.messageController.ShowConfirmationPopupView("Request Vehicle Auto Mode ?", r =>
             {
-                Kind = VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange,
-            };
-
-            vcsMessagePublisher.Publish(msg);
+                if (r.Result == ButtonResult.OK)
+                {
+                    var msg = new VCSMessageEventArgs
+                    {
+                        Kind = VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange,
+                    };
+                    vcsMessagePublisher.Publish(msg);
+                }
+            });
         }
 
-        private void OcsConnectCallBack( HostConnectedEventArgs obj )
+        private void OcsConnectCallBack(HostConnectedEventArgs obj)
         {
             this.State = obj.State;
 
-            switch ( this.State )
+            switch (this.State)
             {
                 case HostConnectedEventArgs.eConnectedState.Disconnected:
                     this.OcsBrush = Brushes.Yellow;
@@ -227,27 +238,28 @@ namespace OHV.Vehicle.Concept
             }
         }
 
-        private void ExecuteSystemOffCommand( )
+        private void ExecuteSystemOffCommand()
         {
-            this.messageController.ShowConfirmationPopupView( "System ShutDown ?" , r =>
-            {
-                if ( r.Result == ButtonResult.OK )
-                    App.Current.Shutdown();
-            } );
+            this.messageController.ShowConfirmationPopupView("System ShutDown ?", r =>
+          {
+              if (r.Result == ButtonResult.OK)
+                  App.Current.Shutdown();
+          });
         }
 
-        private void Navigate( object obj )
+        private void Navigate(object obj)
         {
             var selectItem = obj.ToString();
-            if ( !string.IsNullOrEmpty(selectItem ))
-                regionManager.RequestNavigate( "MainView" , selectItem );
+            if (!string.IsNullOrEmpty(selectItem))
+                regionManager.RequestNavigate("MainView", selectItem);
         }
 
-        private void UICallbackCommunication( GUIMessageEventArgs obj )
+        private void UICallbackCommunication(GUIMessageEventArgs obj)
         {
             switch (obj.Kind)
             {
                 case GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange:
+                    this.UICallBackModelPropertyChange(obj);
                     break;
                 case GUIMessageEventArgs.eGUIMessageKind.RspIOObject:
                     break;
@@ -257,25 +269,34 @@ namespace OHV.Vehicle.Concept
                     break;
                 case GUIMessageEventArgs.eGUIMessageKind.RspAutoModeChange:
                     break;
-                case GUIMessageEventArgs.eGUIMessageKind.RspManualmodeChange:
+                case GUIMessageEventArgs.eGUIMessageKind.RspManualModeChange:
                     break;
                 default:
                     break;
             }
         }
 
-        private void ExecuteTextCommand( )
+        void UICallBackModelPropertyChange(GUIMessageEventArgs args)
+        {
+            if (args.MessageKey.Equals(MessageKey.Alarm))
+            {
+                var hisAlarm = args.Args as HisAlarm;
+                this.messageController.ShowNotificationView(args.MessageText);
+            }
+        }
+
+        private void ExecuteTextCommand()
         {
             var m = new VCSMessageEventArgs();
             m.MessageKey = 1234;
             m.MessageText = "Test Message";
-            m.Command = new Common.Model.Command() { CommandID = "TestCommand123" , Type = Common.Shareds.eCommandType.Move };
+            m.Command = new Common.Model.Command() { CommandID = "TestCommand123", Type = Common.Shareds.eCommandType.Move };
 
-            this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Publish( m );
+            this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Publish(m);
         }
 
 
-        public void InitViewModel( )
+        public void InitViewModel()
         {
             //VCSystem.Instance.Init();
             //var containerRegistry = ServiceLocator.Current.GetInstance<VCSystem>();
@@ -285,10 +306,10 @@ namespace OHV.Vehicle.Concept
             //}
             //var vsys = containerRegistry.GetContainer().Resolve<IContainerProvider>();
 
-            regionManager.RequestNavigate( RegionNames.MainView , "AutoView" );
+            regionManager.RequestNavigate(RegionNames.MainView, "AutoView");
         }
 
-        public void Dispose( )
+        public void Dispose()
         {
             //VCSystem.Instance.Dispose();
         }

+ 1 - 1
Dev/OHV/OHV.Vehicle/OHV.Vehicle.csproj

@@ -38,7 +38,7 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <OutputPath>..\OutRelese\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;SIMULATION</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <Prefer32Bit>true</Prefer32Bit>

+ 10 - 11
Dev/OHV/VehicleControlSystem/ControlLayer/Clamp.cs

@@ -323,7 +323,7 @@ namespace VehicleControlSystem.ControlLayer
         {
             int result = 0;
 
-            result = this.AllOriginReturn();
+            result = this.IsAllAxisOriginReturn();
             if (result != 0)
                 return result;
 
@@ -337,20 +337,19 @@ namespace VehicleControlSystem.ControlLayer
 
             result = left.StartMove(leftData.Value, 0);
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 1;
 
             result = right.StartMove(rightData.Value, 0);
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 3;
 
             result = left.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 1;
 
             result = right.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
-
+                return 1;
 
             return EziMOTIONPlusELib.FMM_OK;
         }
@@ -363,7 +362,7 @@ namespace VehicleControlSystem.ControlLayer
         {
             int result = 0;
 
-            result = this.AllOriginReturn();
+            result = this.IsAllAxisOriginReturn();
             if (result != 0)
                 return result;
 
@@ -377,19 +376,19 @@ namespace VehicleControlSystem.ControlLayer
 
             result = left.StartMove(leftData.Value, 0);
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 2;
 
             result = right.StartMove(rightData.Value, 0);
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 4;
 
             result = left.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 2;
 
             result = right.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 4;
 
 
             return EziMOTIONPlusELib.FMM_OK;

+ 2 - 1
Dev/OHV/VehicleControlSystem/ControlLayer/Conveyor.cs

@@ -56,7 +56,8 @@ namespace VehicleControlSystem.ControlLayer
         /// 실물 감지
         /// </summary>
         /// <returns></returns>
-        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");

+ 103 - 21
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -5,6 +5,7 @@ using System.Linq;
 using System.Threading;
 using GSG.NET.Concurrent;
 using GSG.NET.Logging;
+using GSG.NET.Quartz;
 using GSG.NET.Utils;
 using OHV.Common.Events;
 using OHV.Common.Model;
@@ -47,11 +48,36 @@ namespace VehicleControlSystem.ControlLayer
         public bool IsMoving { get; set; }
         public double BatteryVolt { get; set; }
         public bool IsError { get; set; }
-        public bool IsContain { get { return this.iO.IsOn("IN_Carrier_Detect"); } }
+        public bool IsContain { get { return this.conveyor.IsDetectedCenter(); } }
 
         public SubCmd CurrentSubCommand { get; private set; }
         #endregion
 
+        #region Event
+        public event Action OnMoveReady;
+        public event Action OnMoving;
+        public event Action OnMoveFinish;
+
+        public event Action OnChargingStart;
+        public event Action OnCharging;
+        public event Action OnChargingFull;
+        public event Action<double> OnBatteryVelueChanged;
+
+        public event Action<bool> OnPIOStart;
+        public event Action<bool> OnConveyorStart;
+        public event Action<bool> OnConveyorStop;
+        public event Action<bool> OnCarrierDetected;
+        public event Action OnLoadComplete;
+        public event Action OnUnloadComplete;
+
+        public event Action<int> OnCurrentPotisionChanged;
+
+        public event Action OnManualMove;
+        public event Action OnManualLoad;
+        public event Action OnManualUnload;
+        public event Action OnManualCharging;
+        #endregion
+
         IIO iO = null;
         GSIMotion motion = null;
         SqliteManager sql = null;
@@ -68,7 +94,14 @@ namespace VehicleControlSystem.ControlLayer
 
         ThreadCancel cancel = new ThreadCancel();
 
-        private eVehicleState vehicleState = eVehicleState.Idle;
+        private eObstacleState obstacleState = eObstacleState.Normal;
+        public eObstacleState ObstacleStateProperty
+        {
+            get { return obstacleState; }
+            set { SetField(ref this.obstacleState, value); }
+        }
+
+        private eVehicleState vehicleState;
 
         public eVehicleState VehicleStateProperty
         {
@@ -77,6 +110,7 @@ namespace VehicleControlSystem.ControlLayer
         }
 
         IEventAggregator eventAggregator;
+
         public Vehicle(IIO io, SqliteManager sqliteManager, IEventAggregator ea, AutoManager auto)
         {
             this.iO = io;
@@ -172,7 +206,7 @@ namespace VehicleControlSystem.ControlLayer
             {
                 try
                 {
-                    if ( this.autoManager.OperationModeProperty == eOperatationMode.AutoMode)
+                    if (this.autoManager.OperationModeProperty == eOperatationMode.AutoMode)
                         this.CheckObstacle();
                 }
                 catch (ThreadInterruptedException threadInterruptedException)
@@ -199,7 +233,10 @@ namespace VehicleControlSystem.ControlLayer
             {
                 try
                 {
-                    if (this.VehicleStateProperty != eVehicleState.Idle) //상태가 Idle 가 아니면 subcmd 를 가져 오지 않는다.
+                    if (this.ObstacleStateProperty != eObstacleState.Normal) //장애물 감지 상태 시 조그 동작만 가능하게.
+                        continue;
+
+                    if (this.autoManager.AutoModeStateProperty != eAutoModeState.Run) // 
                         continue;
 
                     var subCmd = sql.SubCmdDAL.GetSubCmd();
@@ -230,7 +267,10 @@ namespace VehicleControlSystem.ControlLayer
                             this.CurrentSubCommand = subCmd;
                             this.UnloadCarrier(subCmd);
                             break;
+
                         case SubCmd.eType.Charge:
+                            this.CurrentSubCommand = subCmd;
+                            this.BatteryCharge(subCmd);
                             break;
                         default:
                             break;
@@ -250,9 +290,7 @@ namespace VehicleControlSystem.ControlLayer
             }
             logger.D("Vehicle - _ThSubCmdWorker Dispose");
         }
-
-
-        #endregion        
+        #endregion
 
         #region Control Action Method
 
@@ -269,26 +307,44 @@ namespace VehicleControlSystem.ControlLayer
 
         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);
+            this.OnMoving?.Invoke();
+            this.IsMoving = true;
+
+            //this.BuzzerOnOff(true, eBuzzerKind.Moving);
             this.motion.MoveToPoint(pointID, 100);
 
-            return Wait4MoveDone();
+            Wait4MoveDone();
+            this.IsMoving = false;
+            //this.BuzzerOnOff(false);
+            this.OnMoveFinish?.Invoke();
+
+            return true;
         }
 
         bool Wait4MoveDone()
         {
-            int waitTime = 60000;
+            int waitTime = 6000; //설정 할 수있게.
             long st = SwUtils.CurrentTimeMillis;
 
             //Todo: 이동시 확인 사항들.
             while (true)
             {
+                Thread.Sleep(5);
+
                 if (SwUtils.Gt(st, waitTime))
                 {
                     //Todo: 이동시간 초과 시 동작들.
                     break;
                 }
 
-                if (this.VehicleStateProperty == eVehicleState.Blocked)
+                if (this.ObstacleStateProperty == eObstacleState.Blocked)
                     return false;
             }
             return true;
@@ -304,9 +360,26 @@ namespace VehicleControlSystem.ControlLayer
                 return false; //Alarm
             }
 
-            int result = this.conveyor.PIOAndLoad(sub.TargetID);
+            int result = this.clamp.Unlock_Sync();
             if (result != 0)
+            {
                 this.autoManager.ProcessAlarm(result);
+                return false;
+            }
+
+            result = this.conveyor.PIOAndLoad(sub.TargetID);
+            if (result != 0)
+            {
+                this.autoManager.ProcessAlarm(result);
+                return false;
+            }
+
+            result = this.clamp.Lock_Sync();
+            if (result != 0)
+            {
+                this.autoManager.ProcessAlarm(result);
+                return false;
+            }
 
             return true;
         }
@@ -321,10 +394,18 @@ namespace VehicleControlSystem.ControlLayer
                 return false; //Alarm
             }
 
-            int result = this.conveyor.PIOAndUnload(sub.TargetID);
+            int result = this.clamp.Unlock_Sync();
+            if (result != 0)
+            {
+                this.autoManager.ProcessAlarm(result);
+                return false;
+            }
+
+            result = this.conveyor.PIOAndUnload(sub.TargetID);
             if (result != 0)
             {
                 this.autoManager.ProcessAlarm(result);
+                return false;
             }
 
             return true;
@@ -341,27 +422,29 @@ namespace VehicleControlSystem.ControlLayer
         #region Check Method
         bool CheckObstacle()
         {
-            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SLOW"))
+            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SAFETY") || this.iO.IsOn("IN_OBSTRUCTION_DETECT_ERROR"))
             {
-                this.motion.SlowStop();
-                this.VehicleStateProperty = eVehicleState.Decelerate;
+                this.motion.Stop();
+                this.ObstacleStateProperty = eObstacleState.Abnormal;
                 return true;
             }
 
             if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_STOP"))
             {
                 this.motion.Stop();
-                this.VehicleStateProperty = eVehicleState.Blocked;
+                this.ObstacleStateProperty = eObstacleState.Blocked;
                 return true;
             }
 
-            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SAFETY") || this.iO.IsOn("IN_OBSTRUCTION_DETECT_ERROR"))
+            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SLOW"))
             {
-                this.motion.Stop();
-                this.VehicleStateProperty = eVehicleState.Abnormal;
+                this.motion.SlowStop();
+                this.ObstacleStateProperty = eObstacleState.Decelerate;
                 return true;
             }
 
+            this.ObstacleStateProperty = eObstacleState.Normal;
+
             return false;
         }
 
@@ -370,14 +453,13 @@ namespace VehicleControlSystem.ControlLayer
         #region Machanical Method
         #endregion
 
-        #region Hardware Method
+        #region Hardware Create Method
         void CreateSteering()
         {
             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);

+ 163 - 13
Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs

@@ -1,13 +1,14 @@
 using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Linq;
 using System.Threading;
-using System.Threading.Tasks;
 using GSG.NET.Concurrent;
 using GSG.NET.Logging;
 using OHV.Common.Shareds;
 using VehicleControlSystem.ControlLayer.IO;
+using Prism.Events;
+using OHV.SqliteDAL;
+using OHV.Common.Model;
+using OHV.Common.Events;
+using VehicleControlSystem.ControlLayer;
 
 namespace VehicleControlSystem.Managers
 {
@@ -22,39 +23,157 @@ namespace VehicleControlSystem.Managers
         bool isThreadAlive = false;
 
         IIO iO = null;
+        bool IsErrorProcessing = false;
+        IEventAggregator eventAggregator = null;
+        SqliteManager sql = null;
 
         private eOperatationMode operationMode;
-
         public eOperatationMode OperationModeProperty
         {
             get { return operationMode; }
-            set { operationMode = value; }
+            set
+            {
+                if (operationMode == value) return;
+
+                operationMode = value;
+                logger.D($"[AutoManager] OperationMode - {value}");
+            }
         }
 
         private eAutoModeState autoModeState;
-
         public eAutoModeState AutoModeStateProperty
         {
             get { return autoModeState; }
-            set { autoModeState = value; }
+            set
+            {
+                if (autoModeState == value) return;
+
+                autoModeState = value;
+                logger.D($"[AutoManager] AutoModeState - {value}");
+            }
         }
 
-        bool IsAutoModeStartByGUI = false;
+        private eLampState lampState;
+        public eLampState LampStateProperty
+        {
+            get { return lampState; }
+            set
+            {
+                if (lampState == value) return;
+
+                lampState = value;
+                this.LampStateChange(value);
+            }
+        }
 
-        public AutoManager( IIO io )
+        private eBuzzerKind buzzerState;
+        public eBuzzerKind BuzzerStateProperty
+        {
+            get { return buzzerState; }
+            set { buzzerState = value; }
+        }
+
+        public AutoManager(IIO io, IEventAggregator ea, SqliteManager sql)
         {
             this.iO = io;
+            this.eventAggregator = ea;
+            this.sql = sql;
+        }
+
+        #region Vehicle Events
+        private void Vehicle_OnChargingFull()
+        {
+            LampStateChange(eLampState.AutoRunNChargingFull);
+        }
+
+        private void Vehicle_OnCharging()
+        {
+            LampStateChange(eLampState.Charging);
         }
 
-        public void Init()
+        private void Vehicle_OnMoveFinish()
+        {
+            BuzzerOnOff(false);
+            logger.D("Vehicle Move Finish");
+        }
+
+        private void Vehicle_OnMoving()
+        {
+            BuzzerOnOff(true, eBuzzerKind.Moving);
+            logger.D("Vehicle Moving");
+        }
+
+        private void Vehicle_OnMoveReady()
+        {
+            BuzzerOnOff(true, eBuzzerKind.StartWarn);
+            logger.D("Vehicle Move Ready");
+        }
+        #endregion
+
+        public void Init(Vehicle vehicle)
         {
             this.OperationModeProperty = eOperatationMode.ManualMode;
             this.AutoModeStateProperty = eAutoModeState.Stop;
 
             this.isThreadAlive = true;
             this.threadWorker = ThreadUtils.Invoke(this.ThreadWork);
+
+            vehicle.OnMoveReady += Vehicle_OnMoveReady;
+            vehicle.OnMoving += Vehicle_OnMoving;
+            vehicle.OnMoveFinish += Vehicle_OnMoveFinish;
+            vehicle.OnCharging += Vehicle_OnCharging;
+            vehicle.OnChargingFull += Vehicle_OnChargingFull;
         }
 
+        #region Lamp & Buzzer
+        void LampStateChange(eLampState state)
+        {
+            this.iO.OutputOff("OUT_TOWER_LAMP_RED");
+            this.iO.OutputOff("OUT_TOWER_LAMP_GREEN");
+            this.iO.OutputOff("OUT_TOWER_LAMP_BLUE");
+
+            switch (state)
+            {
+                case eLampState.Alarm:
+                    this.iO.OutputOff("OUT_TOWER_LAMP_RED");
+                    break;
+                case eLampState.Charging:
+                    this.iO.OutputOff("OUT_TOWER_LAMP_GREEN");
+                    break;
+                case eLampState.AutoRunNChargingFull:
+                    this.iO.OutputOff("OUT_TOWER_LAMP_BLUE");
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        void BuzzerOnOff(bool isOn, eBuzzerKind kind = eBuzzerKind.Alarm)
+        {
+            this.iO.OutputOff("OUT_BUZZER_00");
+            this.iO.OutputOff("OUT_BUZZER_01");
+            this.iO.OutputOff("OUT_BUZZER_02");
+
+            if (!isOn)
+                return;
+
+            switch (kind)
+            {
+                case eBuzzerKind.Alarm:
+                    this.iO.OutputOn("OUT_BUZZER_00");
+                    break;
+                case eBuzzerKind.StartWarn:
+                    this.iO.OutputOn("OUT_BUZZER_01");
+                    break;
+                case eBuzzerKind.Moving:
+                    this.iO.OutputOn("OUT_BUZZER_02");
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion
+
         void ThreadWork()
         {
             while (this.isThreadAlive)
@@ -78,13 +197,14 @@ namespace VehicleControlSystem.Managers
             switch (this.OperationModeProperty)
             {
                 case eOperatationMode.ManualMode:
-
                     break;
                 case eOperatationMode.AutoMode:
                     switch (this.AutoModeStateProperty)
                     {
                         case eAutoModeState.ErrorStop:
-                            this.AutoModeStateProperty = eAutoModeState.WaitStop;
+                            if ( !IsErrorProcessing )
+                                this.AutoModeStateProperty = eAutoModeState.WaitStop;
+
                             break;
                         case eAutoModeState.WaitStop:
                             this.AutoModeStateProperty = eAutoModeState.Stop;
@@ -94,6 +214,7 @@ namespace VehicleControlSystem.Managers
                             break;
                         case eAutoModeState.StartRun:
                             this.AutoModeStateProperty = eAutoModeState.Run;
+                            this.LampStateProperty = eLampState.AutoRunNChargingFull;
                             break;
                         case eAutoModeState.Run:
                             break;
@@ -111,6 +232,35 @@ namespace VehicleControlSystem.Managers
         public void ProcessAlarm(int alarmID)
         {
             this.AutoModeStateProperty = eAutoModeState.ErrorStop;
+            this.LampStateProperty = eLampState.Alarm;
+
+            HisAlarm hisAlarm = new HisAlarm();
+            var alarm = sql.AlarmDAL.GetK(alarmID);
+            if (alarm == null)
+            {
+                hisAlarm.AlarmId = alarmID;
+                hisAlarm.Text = "Not Define Alarm";
+            }
+            else
+            {
+                hisAlarm.AlarmId = alarmID;
+                hisAlarm.Text = alarm.Text;
+                hisAlarm.Solution = alarm.Solution;
+                //hisAlarm.Alarm = alarm;
+            }
+            sql.HisAlarmDAL.Add(hisAlarm);
+
+            if (IsErrorProcessing)
+                return;
+
+            var msg = new GUIMessageEventArgs
+            {
+                Kind = GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange,
+                MessageKey = MessageKey.Alarm,
+                MessageText = hisAlarm.Text,
+                Args = hisAlarm,
+            };
+            this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(msg);
         }
 
         #region IDisposable Support

+ 245 - 5
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -51,8 +51,185 @@ namespace VehicleControlSystem.Managers
 
             //Vehicle Server.
             this.manager.Connect(false);
+
+            //Vehicle Event
+            vehicle.OnBatteryVelueChanged += Vehicle_OnBatteryVelueChanged;
+            vehicle.OnChargingStart += Vehicle_OnChargingStart;
+            vehicle.OnCharging += Vehicle_OnCharging;
+            vehicle.OnChargingFull += Vehicle_OnChargingFull;
+
+            vehicle.OnCurrentPotisionChanged += Vehicle_OnCurrentPotisionChanged;
+
+            vehicle.OnManualLoad += Vehicle_OnManualLoad;
+            vehicle.OnManualMove += Vehicle_OnManualMove;
+            vehicle.OnManualUnload += Vehicle_OnManualUnload;
+            vehicle.OnManualCharging += Vehicle_OnManualCharging;
+
+            vehicle.OnPIOStart += Vehicle_OnPIOStart;
+            vehicle.OnConveyorStart += Vehicle_OnConveyorStart;
+            vehicle.OnConveyorStop += Vehicle_OnConveyorStop;
+            vehicle.OnLoadComplete += Vehicle_OnLoadComplete;
+            vehicle.OnUnloadComplete += Vehicle_OnUnloadComplete;
+            vehicle.OnCarrierDetected += Vehicle_OnCarrierDetected;
+        }
+
+        private void Vehicle_OnChargingFull()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.H;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = false;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnCharging()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.H;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = false;
+            msg.IsSubCode2 = true;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnChargingStart()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.H;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnCarrierDetected(bool isLoad)
+        {
+            var msg = new OCSMessage();
+
+            if (isLoad)
+                msg.Kind = eKind.L;
+            else
+                msg.Kind = eKind.U;
+
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = true;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnUnloadComplete()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.U;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = true;
+            msg.IsSubCode3 = true;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnLoadComplete()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.L;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = true;
+            msg.IsSubCode3 = true;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnConveyorStop(bool isLoad)
+        {
+            var msg = new OCSMessage();
+
+            if (isLoad)
+                msg.Kind = eKind.L;
+            else
+                msg.Kind = eKind.U;
+
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = true;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnConveyorStart(bool isLoad)
+        {
+            var msg = new OCSMessage();
+
+            if (isLoad)
+                msg.Kind = eKind.L;
+            else
+                msg.Kind = eKind.U;
+
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
         }
 
+        private void Vehicle_OnPIOStart(bool isLoad)
+        {
+            var msg = new OCSMessage();
+
+            if (isLoad)
+                msg.Kind = eKind.L;
+            else
+                msg.Kind = eKind.U;
+
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = false;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnManualCharging()
+        {
+            this.Send_ManualCharging();
+        }
+
+        private void Vehicle_OnManualUnload()
+        {
+            this.Send_ManualUnlaod();
+        }
+
+        private void Vehicle_OnManualMove()
+        {
+            this.Send_ManualMove();
+        }
+
+        private void Vehicle_OnManualLoad()
+        {
+            this.Send_ManualLoad();
+        }
+
+        private void Vehicle_OnCurrentPotisionChanged(int point)
+        {
+            this.Send_Tcmd(point);
+        }
+
+        private void Vehicle_OnBatteryVelueChanged(double obj)
+        {
+            this.Send_Bcmd(obj);
+        }
 
         #region Event Method
         private void Manager_OnSent(OHVConnector.OCSMessage msg)
@@ -134,14 +311,23 @@ namespace VehicleControlSystem.Managers
         /// <summary>
         /// 현재 위치 보고 
         /// </summary>
-        public void Send_Scmd()
+        public void Send_Scmd(int point)
         {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.S;
+            msg.Tag = point.ToString("0000");
+            msg.IsSubCode1 = this.vehicle.IsContain;
+            msg.IsSubCode2 = vehicle.IsMoving;
+            msg.IsSubCode3 = vehicle.IsError;
+
+            this.manager.Send(msg);
         }
 
-        public void Send_Bcmd()
+        public void Send_Bcmd(double volt)
         {
             var msg = new OCSMessage();
-            var bData = this.vehicle.BatteryVolt;
+            msg.Kind = eKind.B;
+            var bData = volt;
             msg.Tag = bData.ToString("00.00").Replace(".", "");
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
@@ -161,10 +347,11 @@ namespace VehicleControlSystem.Managers
             this.manager.Send(msg);
         }
 
-        public void Send_Tcmd()
+        public void Send_Tcmd(int point)
         {
             var msg = new OCSMessage();
-            msg.Tag = vehicle.CurrentPosition.ToString();
+            msg.Kind = eKind.T;
+            msg.Tag = point.ToString();
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
@@ -172,9 +359,11 @@ namespace VehicleControlSystem.Managers
             this.manager.Send(msg);
         }
 
+
         public void Send_Ccmd()
         {
             var msg = new OCSMessage();
+            msg.Kind = eKind.C;
             msg.Tag = vehicle.CurrentPosition.ToString();
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
@@ -182,6 +371,57 @@ namespace VehicleControlSystem.Managers
 
             this.manager.Send(msg);
         }
+
+        public void Send_ManualMove()
+        {
+            var msg = new OCSMessage()
+            {
+                Kind = eKind.P,
+                Tag = this.vehicle.CurrentPosition.ToString(),
+                IsSubCode1 = false,
+                IsSubCode2 = false,
+                IsSubCode3 = true,
+            };
+            this.manager.Send(msg);
+        }
+        public void Send_ManualLoad()
+        {
+            var msg = new OCSMessage()
+            {
+                Kind = eKind.P,
+                Tag = this.vehicle.CurrentPosition.ToString(),
+                IsSubCode1 = false,
+                IsSubCode2 = true,
+                IsSubCode3 = false,
+            };
+            this.manager.Send(msg);
+        }
+
+        public void Send_ManualUnlaod()
+        {
+            var msg = new OCSMessage()
+            {
+                Kind = eKind.P,
+                Tag = this.vehicle.CurrentPosition.ToString(),
+                IsSubCode1 = true,
+                IsSubCode2 = false,
+                IsSubCode3 = false,
+            };
+            this.manager.Send(msg);
+
+        }
+        public void Send_ManualCharging()
+        {
+            var msg = new OCSMessage()
+            {
+                Kind = eKind.P,
+                Tag = this.vehicle.CurrentPosition.ToString(),
+                IsSubCode1 = true,
+                IsSubCode2 = true,
+                IsSubCode3 = true,
+            };
+            this.manager.Send(msg);
+        }
         #endregion
         public void Dispose()
         {

+ 5 - 5
Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs

@@ -194,11 +194,11 @@ namespace VehicleControlSystem.Managers
                                 sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete);
                             }
                         }
-
-                        if (subCmd.CmdID.Equals(cmd.CommandID)) //진행중 판단
-                            break;
-                        else //다른 아이디의 일을 하고 있을 경우 가 생길까??
-                        { }
+                        else
+                        {
+                            if (subCmd.CmdID.Equals(cmd.CommandID)) //진행중 판단
+                                break;
+                        }
                     }
                     sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete);
                     break;

+ 8 - 11
Dev/OHV/VehicleControlSystem/VCSystem.cs

@@ -58,17 +58,15 @@ namespace VehicleControlSystem
             ezIO.OnDiscontd += EzIO_OnDiscontd;
             ezIO.OnChangedIO += EzIO_OnChangedIO;
 
-            this.autoManager = new AutoManager(this.IO);
-            this.autoManager.Init();
-
+            this.autoManager = new AutoManager(this.IO, this.eventAggregator, this.sql);
             this.scheduler = new Scheduler(eventAggregator, this.autoManager, this.sql);
-            this.scheduler.Init();
-
             this.vehicle = new Vehicle(this.IO, this.sql, this.eventAggregator, this.autoManager);
-            this.vehicle.Init();
-
             this.hostManager = new HostManager(this.eventAggregator, this.vehicle, this.sql);
+
             this.hostManager.Init();
+            this.vehicle.Init();
+            this.scheduler.Init();
+            this.autoManager.Init(this.vehicle);
         }
 
         public void CleanHisAlarm()
@@ -130,15 +128,14 @@ namespace VehicleControlSystem
                 this.autoManager.OperationModeProperty = OHV.Common.Shareds.eOperatationMode.AutoMode;
                 this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.StartRun;
                 msg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspAutoModeChange, Result = FluentResults.Results.Ok() };
-
             }
             else
             {
-                this.autoManager.OperationModeProperty = OHV.Common.Shareds.eOperatationMode.ManualMode;
-                msg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspManualmodeChange, Result = FluentResults.Results.Ok() };
+                this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.WaitStop;
+                msg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspManualModeChange, Result = FluentResults.Results.Ok() };
             }
-            GUIMessageEventPublish(msg);
 
+            GUIMessageEventPublish(msg);
         }
         #endregion