Jelajahi Sumber

Merge branch 'master' of http://unque781.synology.me:3000/GSI/OHV

# Conflicts:
#	Dev/OHV/Assambly/OHVConnector.dll
#	Dev/OHV/Assambly/OHVConnector.pdb
ys-hwang 6 tahun lalu
induk
melakukan
b9119b91a2
36 mengubah file dengan 574 tambahan dan 226 penghapusan
  1. 13 6
      Dev/Connection/OHVProtocolServer/OHVConnector/Manager.cs
  2. 10 1
      Dev/Connection/OHVProtocolServer/OHVConnector/OCSMessage.cs
  3. TEMPAT SAMPAH
      Dev/OHV/Assambly/OHVConnector.dll
  4. TEMPAT SAMPAH
      Dev/OHV/Assambly/OHVConnector.pdb
  5. 2 0
      Dev/OHV/OHV.Common/Shareds/SharedEnumType.cs
  6. 1 0
      Dev/OHV/OHV.Module.Interactivity/NotificatioinView.xaml
  7. 1 1
      Dev/OHV/OHV.Module.Interactivity/PopUp/BatteryConfigView.xaml
  8. 13 5
      Dev/OHV/OHV.Module.Interactivity/PopUp/BatteryConfigViewModel.cs
  9. 1 0
      Dev/OHV/OHV.Module.Interactivity/PopUp/ConfigView.xaml
  10. 19 1
      Dev/OHV/OHV.SqliteDAL/DAL/AbstractDAL.cs
  11. 1 1
      Dev/OHV/OHV.SqliteDAL/SqliteManager.cs
  12. 25 4
      Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs
  13. TEMPAT SAMPAH
      Dev/OHV/OHV.Vehicle/Config/AlarmDefind.xlsx
  14. TEMPAT SAMPAH
      Dev/OHV/OHV.Vehicle/Config/IO.xlsx
  15. 7 4
      Dev/OHV/OHV.Vehicle/Config/log4net.xml
  16. 1 3
      Dev/OHV/VehicleControlSystem/ControlLayer/Clamp.cs
  17. 1 5
      Dev/OHV/VehicleControlSystem/ControlLayer/ControlObjectBase.cs
  18. 0 4
      Dev/OHV/VehicleControlSystem/ControlLayer/IO/EzIO.cs
  19. 52 39
      Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs
  20. 12 4
      Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs
  21. 1 1
      Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/BMUManager.cs
  22. 11 3
      Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/Peak/Peak.cs
  23. 20 13
      Dev/OHV/VehicleControlSystem/ControlLayer/Serial/DataModel/ReceivedData.cs
  24. 4 3
      Dev/OHV/VehicleControlSystem/ControlLayer/Steering.cs
  25. 222 66
      Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs
  26. 6 1
      Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs
  27. 50 10
      Dev/OHV/VehicleControlSystem/Managers/HostManager.cs
  28. 55 28
      Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs
  29. 12 0
      Dev/OHV/VehicleControlSystem/VCSystem.cs.rej
  30. TEMPAT SAMPAH
      Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide
  31. TEMPAT SAMPAH
      Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide-shm
  32. TEMPAT SAMPAH
      Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide-wal
  33. 2 2
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/App.config
  34. 20 17
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/Config/log4net.xml
  35. 11 3
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FormMain.cs
  36. 1 1
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger.csproj

+ 13 - 6
Dev/Connection/OHVProtocolServer/OHVConnector/Manager.cs

@@ -167,7 +167,7 @@ namespace OHVConnector
             }
 
             qQ.Enqueue( new QoTimeout { Arg0 = msg } );
-            //_OnLog("T3 TIMEOUT {0}".format(msg.LogHeader));
+            _OnLog($"T3 TIMEOUT {msg.LogFormat()}");
         }
 
         #region Thread Method
@@ -328,6 +328,7 @@ namespace OHVConnector
             do
             {
                 stx = h.ReadByte(); //STX
+                //logger.D( $"[OCS] - {stx}" );
             }
             while ( stx != STX );
 
@@ -358,11 +359,11 @@ namespace OHVConnector
                 ocsMeg.Tag = h.ReadAscii( 4 );
                 ocsMeg.SubCode = h.ReadAscii( 3 );
                 var viaCount = Convert.ToInt16( h.ReadAscii( 4 ) ); //4byte
-                for(int i = 0; i < viaCount; i++ )
+                for ( int i = 0; i < viaCount; i++ )
                 {
                     ocsMeg.ViaRouteList.Add( h.ReadAscii( 4 ) );
                 }
-                ocsMeg.CheckSum = h.ReadAscii(1);
+                ocsMeg.CheckSum = h.ReadAscii( 1 );
                 h.ReadUntil( ETX );
             }
             else
@@ -372,7 +373,7 @@ namespace OHVConnector
                 ocsMeg.SubCode = h.ReadAscii( 3 );
 
                 //CheckSum 을 해야 하나??
-                ocsMeg.CheckSum = h.ReadAscii(1);
+                ocsMeg.CheckSum = h.ReadAscii( 1 );
                 h.ReadUntil( ETX );
             }
 
@@ -413,6 +414,12 @@ namespace OHVConnector
                 return;
             }
 
+            if ( recd.Kind == eKind.M && !ModeActive ) //M Code 응답은 없음 
+            {
+                this.qQ.Enqueue( new QoRecd { Arg0 = recd } );
+                return;
+            }
+
             //Send 한 Message 의 Reply 로 판단.
             if ( this.quzT3.HasId( recd.CheckSum ) )
             {
@@ -440,9 +447,8 @@ namespace OHVConnector
         #region Write Method
         void TcpWriteMsg( OCSMessage msg )
         {
-            qQ.Enqueue( new QoSent { Arg0 = msg } );
-
             this.h.WriteFlush( msg.ToMemoryBuffer().ToBytes );
+            qQ.Enqueue( new QoSent { Arg0 = msg } );
         }
 
         void TcpWriteNormalMsg( OCSMessage nm )
@@ -510,6 +516,7 @@ namespace OHVConnector
             }
 
             var checkSum = Convert.ToString( msg.GetCheckSum(), 16 ).ToLower();
+            //logger.D( checkSum );
 
             if ( this.quzT3.HasId( checkSum ) )
             {

+ 10 - 1
Dev/Connection/OHVProtocolServer/OHVConnector/OCSMessage.cs

@@ -26,6 +26,7 @@ namespace OHVConnector
         R,
         H,
         Z,
+        G, //MTL 이동 명령
     }
 
     public class OCSMessage
@@ -56,7 +57,15 @@ namespace OHVConnector
 
         public string LogFormat()
         {
-            return $"{this.Id} - {this.RevID} <- {this.SendID} : kind [{this.Kind.ToString()}] / Tag [{this.Tag}] / SubCode [{this.SubCode}] / CheckSum [{this.CheckSum}]";
+            if ( this.ViaRouteList.Count <= 0 )
+                return $"{this.Id} - {this.RevID} <- {this.SendID} : kind [{this.Kind.ToString()}] / Tag [{this.Tag}] / SubCode [{this.SubCode}] / CheckSum [{this.CheckSum}] / {this.ViaRouteList.Count}";
+            else
+            {
+                StringBuilder viaList = new StringBuilder();
+                var ll = this.ViaRouteList.ToList();
+                ll.ForEach( x => { viaList.Append( x ); viaList.Append( ";" ); } ); 
+                return $"{this.Id} - {this.RevID} <- {this.SendID} : kind [{this.Kind.ToString()}] / Tag [{this.Tag}] / SubCode [{this.SubCode}] / CheckSum [{this.CheckSum}] / {this.ViaRouteList.Count} / {viaList}";
+            }
         }
 
         public int SubCodeToInt()

TEMPAT SAMPAH
Dev/OHV/Assambly/OHVConnector.dll


TEMPAT SAMPAH
Dev/OHV/Assambly/OHVConnector.pdb


+ 2 - 0
Dev/OHV/OHV.Common/Shareds/SharedEnumType.cs

@@ -119,6 +119,7 @@
 		MoveNLoad,
 		MoveNUnload,
 		Charging,
+		Cancel,
 	}
 
 	public enum eCommandState
@@ -143,6 +144,7 @@
 		Load,
 		Unload,
 		Charge,
+		Cancel,
 	}
 
 	#endregion

+ 1 - 0
Dev/OHV/OHV.Module.Interactivity/NotificatioinView.xaml

@@ -12,6 +12,7 @@
 
     <prism:Dialog.WindowStyle>
         <Style TargetType="Window">
+            <Setter Property="Topmost" Value="True"/>
             <Setter Property="prism:Dialog.WindowStartupLocation" Value="CenterScreen" />
             <Setter Property="Background" Value="Transparent"/>
             <Setter Property="AllowsTransparency" Value="True"/>

+ 1 - 1
Dev/OHV/OHV.Module.Interactivity/PopUp/BatteryConfigView.xaml

@@ -130,7 +130,7 @@
                                VerticalAlignment="Center"
                                HorizontalAlignment="Center"
                                Foreground="Orange" FontSize="20">
-                                <Run Text="{Binding BatteryState, StringFormat={}{0:0}, FallbackValue=0x0}"/>
+                                <Run Text="{Binding BatteryState}"/>
                             </TextBlock>
                         </Border>
 

+ 13 - 5
Dev/OHV/OHV.Module.Interactivity/PopUp/BatteryConfigViewModel.cs

@@ -14,6 +14,7 @@ using System.Threading.Tasks;
 using System.Windows.Input;
 using System.Windows.Media;
 using VehicleControlSystem;
+using VehicleControlSystem.ControlLayer.Serial.DataModel;
 
 namespace OHV.Module.Interactivity.PopUp
 {
@@ -47,11 +48,17 @@ namespace OHV.Module.Interactivity.PopUp
             set { this.SetProperty( ref this.current , value ); }
         }
 
-        double batteryState;
-        public double BatteryState
+        //double batteryState;
+        //public double BatteryState
+        //{
+        //    get { return this.batteryState; }
+        //    set { this.SetProperty( ref this.batteryState , value ); }
+        //}
+        string batteryState = string.Empty;
+        public string BatteryState
         {
             get { return this.batteryState; }
-            set { this.SetProperty( ref this.batteryState , value ); }
+            set { this.SetProperty( ref this.batteryState, value ); }
         }
 
         double averageTimeToFull;
@@ -142,7 +149,8 @@ namespace OHV.Module.Interactivity.PopUp
                             this.Current = CastTo<double>.From<object>( obj.Args );
                             break;
                         case "BatteryState":
-                            this.BatteryState = CastTo<double>.From<object>( obj.Args );
+                            var bms = CastTo<double>.From<object>( obj.Args );
+                            this.BatteryState = Convert.ToString((eBatteryState)bms);
                             break;
                         case "BatteryChargeTime":
                             this.AverageTimeToFull = CastTo<double>.From<object>( obj.Args );
@@ -198,7 +206,7 @@ namespace OHV.Module.Interactivity.PopUp
             this.SOC = args.SOC;
             this.SOH = args.SOH;
             this.Temperature = args.Temperature;
-            this.BatteryState = args.State;
+            this.BatteryState = args.State.ToString();
             this.Capacity = args.Capacity;
 
             if(args.IsConnect)

+ 1 - 0
Dev/OHV/OHV.Module.Interactivity/PopUp/ConfigView.xaml

@@ -13,6 +13,7 @@
 
     <prism:Dialog.WindowStyle>
         <Style TargetType="Window">
+            <Setter Property="Topmost" Value="True"/>
             <Setter Property="prism:Dialog.WindowStartupLocation" Value="CenterScreen" />
             <Setter Property="Background" Value="Transparent"/>
             <Setter Property="AllowsTransparency" Value="True"/>

+ 19 - 1
Dev/OHV/OHV.SqliteDAL/DAL/AbstractDAL.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Data.Entity;
 using System.Data.Entity.Core.Objects;
+using System.Data.Entity.Infrastructure;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Text;
@@ -198,6 +199,12 @@ namespace OHV.SqliteDAL.DAL
         {
             lock ( this.lockObj )
             {
+                if ( obj == null )
+                {
+                    logger.E( $"[DataBase] - Update obj is Null {this.table.GetType().Name}" );
+                    return;
+                }
+
                 table.Attach( obj );
                 _context.Entry( obj ).State = EntityState.Modified;
                 this.Save();
@@ -238,7 +245,18 @@ namespace OHV.SqliteDAL.DAL
         }
         public void Save()
         {
-            _context.SaveChanges();
+            try
+            {
+                _context.SaveChanges();
+
+            }
+            catch ( DbUpdateConcurrencyException ex )
+            {
+                ex.Entries.Single().Reload();
+                logger.E( $"[DataBase] - DbUpdateConcurrencyException {this.table.GetType().Name}" );
+                return;
+            }
+
             this.OnChangeTable?.BeginInvoke( null, null );
         }
     }

+ 1 - 1
Dev/OHV/OHV.SqliteDAL/SqliteManager.cs

@@ -35,7 +35,7 @@ namespace OHV.SqliteDAL
             this.AxisConfigDAL = new GenericRepository<AxisConfig>();
             this.AxisPositionDataDAL = new GenericRepository<AxisPositionData>();
             this.AxisVelocityDataDAL = new GenericRepository<AxisVelocityData>();
-            this.AlarmDAL = new GenericRepository<Alarm>() ;
+            this.AlarmDAL = new GenericRepository<Alarm>();
             this.VehicleInfoDAL = new GenericRepository<VehicleInfo>();
             this.HisAlarmDAL = new GenericRepository<HisAlarm>();
             this.RouteDal = new GenericRepository<Route>();

+ 25 - 4
Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs

@@ -427,14 +427,14 @@ namespace OHV.Vehicle.Concept
             {
                 this.StartEnable = false;
                 this.StopEnable = true;
-                //this.IsManualMode = false;
-                //regionManager.RequestNavigate( RegionNames.MainView, "AutoView" );
+                this.IsManualMode = false;
+                regionManager.RequestNavigate( RegionNames.MainView, "AutoView" );
             }
             else
             {
                 this.StartEnable = true;
                 this.StopEnable = false;
-                //this.IsManualMode = true;
+                this.IsManualMode = true;
             }
         }
 
@@ -542,40 +542,61 @@ namespace OHV.Vehicle.Concept
                                 this.IsVehicleAlarm = false; 
                         }
                         break;
+
                     case "IsErrorProcessing":
                         {
                             var ll = CastTo<bool>.From<object>( args.Args );
                         }
                         break;
+
                     case "MachineMode":
                         this.MachineMode = CastTo<eMachineMode>.From<object>( args.Args );
                         break;
+
                     case "BatteryIsConnect":
                         this.RspBatteryConnected( args );
                         break;
+
                     case "BatteryStateOfCharge":
                         this.SOC = CastTo<double>.From<object>( args.Args );
                         break;
+
                     case "BatteryChargeTime":
                         {
                             var cTime = CastTo<double>.From<object>( args.Args );
-                            if ( cTime > 0 )
+                            //if ( cTime > 0 )
+                            //    this.BatteryState = eBatteryState.Charge;
+                            //else
+                            //    this.BatteryState = eBatteryState.Connect;
+                        }
+                        break;
+                        
+                    case "BatteryChargeState":
+                        {
+                            var isCharge = CastTo<bool>.From<object>( args.Args );
+                            if ( isCharge )
                                 this.BatteryState = eBatteryState.Charge;
                             else
                                 this.BatteryState = eBatteryState.Connect;
                         }
                         break;
+
                     case "BatteryDisChargeTime":
                         {
                             var dTime = CastTo<double>.From<object>( args.Args );
                         }
                         break;
+
                     case "CurrentTag":
                         {
                             this.CurrentTag = CastTo<int>.From<object>( args.Args );
                         }
                         break;
+
+                    default:
+                        break;
                 }
+
             }
         }
 

TEMPAT SAMPAH
Dev/OHV/OHV.Vehicle/Config/AlarmDefind.xlsx


TEMPAT SAMPAH
Dev/OHV/OHV.Vehicle/Config/IO.xlsx


+ 7 - 4
Dev/OHV/OHV.Vehicle/Config/log4net.xml

@@ -4,7 +4,7 @@
 		<level value="ALL" />
 		<appender-ref ref="FileAppender" />
 		<appender-ref ref="WarnFileAppender" />
-		<appender-ref ref="ConsoleAppender" />
+		<!--<appender-ref ref="ConsoleAppender" />-->
 		<appender-ref ref="DebugFileAppender" />
 		<appender-ref ref="remotingAppender" />
 		<!--<appender-ref ref="MongoAppender" />-->
@@ -110,10 +110,10 @@
 	</appender>
 
 	<appender name="DebugFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<filter type="log4net.Filter.LevelRangeFilter">
+		<!--<filter type="log4net.Filter.LevelRangeFilter">
 			<param name="LevelMin" value="DEBUG"></param>
 			<param name="LevelMax" value="DEBUG"></param>
-		</filter>
+		</filter>-->
 		<threshold value="DEBUG"/>
 		<file value="C:\LOG\OHV\DEBUG\Vehicle_DEBUG.log" />
 		<appendToFile value="true" />
@@ -126,7 +126,10 @@
 	</appender>
 
 	<appender name="WarnFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<threshold value="WARN"/>
+		<filter type="log4net.Filter.LevelRangeFilter">
+			<param name="LevelMin" value="WARN"></param>
+			<param name="LevelMax" value="OFF"></param>
+		</filter>
 		<file value="C:\LOG\OHV\Vehicle\Vehicle_WARN.log" />
 		<appendToFile value="true" />
 		<rollingStyle value="Date" />

+ 1 - 3
Dev/OHV/VehicleControlSystem/ControlLayer/Clamp.cs

@@ -1,7 +1,5 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Linq;
-using System.Security.Cryptography.X509Certificates;
 using System.Threading;
 using System.Threading.Tasks;
 using FluentResults;

+ 1 - 5
Dev/OHV/VehicleControlSystem/ControlLayer/ControlObjectBase.cs

@@ -1,10 +1,6 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.ComponentModel;
-using System.Linq;
 using System.Runtime.CompilerServices;
-using System.Text;
-using System.Threading.Tasks;
 
 namespace VehicleControlSystem.ControlLayer
 {

+ 0 - 4
Dev/OHV/VehicleControlSystem/ControlLayer/IO/EzIO.cs

@@ -737,7 +737,6 @@ namespace VehicleControlSystem.ControlLayer.IO
             {
                 if ( disposing )
                 {
-                    // TODO: 관리되는 상태(관리되는 개체)를 삭제합니다.
                     if ( this.pullThread != null )
                     {
                         this.IsThreadAlive = false;
@@ -753,9 +752,6 @@ namespace VehicleControlSystem.ControlLayer.IO
                     Terminate(); //Board Close 
                 }
 
-                // TODO: 관리되지 않는 리소스(관리되지 않는 개체)를 해제하고 아래의 종료자를 재정의합니다.
-                // TODO: 큰 필드를 null로 설정합니다.
-
                 disposedValue = true;
             }
         }

+ 52 - 39
Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs

@@ -1,26 +1,27 @@
 using GSG.NET.Concurrent;
 using GSG.NET.Extensions;
 using GSG.NET.Logging;
-using GSG.NET.ObjectBase;
 using NetMQ;
 using NetMQ.Monitoring;
 using NetMQ.Sockets;
 using OHV.Common.Model;
 using OHV.Common.Shareds;
-using StackExchange.Redis.Extensions.Core.Extensions;
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
-using System.Diagnostics;
 using System.Linq;
-using System.Runtime.InteropServices.WindowsRuntime;
-using System.Text;
-using System.Threading.Tasks;
 using VehicleControlSystem.ControlLayer.Serial.BatteryTabos;
 using VehicleControlSystem.ControlLayer.Serial.DataModel;
 using VehicleControlSystem.Managers;
 
 namespace VehicleControlSystem.ControlLayer.MQ
 {
+    public class ZmqMessage
+    {
+        public string Key { get; set; }
+        public string Message { get; set; }
+    }
+
     public class ZmqManager : ControlObjectBase, IDisposable
     {
         Logger logger = Logger.GetLogger();
@@ -39,6 +40,8 @@ namespace VehicleControlSystem.ControlLayer.MQ
 
         ThreadCancel threadCancel = new ThreadCancel();
 
+        BlockingCollection<ZmqMessage> sendQueue = new BlockingCollection<ZmqMessage>(new ConcurrentQueue<ZmqMessage>());
+
         private bool isReqConnected = false;
         public bool IsReqConnected
         {
@@ -61,9 +64,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
             set
             {
                 if ( SetField( ref isDriveMoving, value ) )
-                {
-                    pub.SendMoreFrame( "DriveStart" ).SendFrame( value.ToString() );
-                }
+                    Publish( "DriveStart", value.ToString() );
             }
         }
 
@@ -81,7 +82,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
             set
             {
                 if ( SetField( ref this.currentPointNo, value ) )
-                    pub.SendMoreFrame( "CurrentPoint" ).SendFrame( value.ToString() );
+                    Publish( "CurrentPoint", value.ToString() );
             }
         }
 
@@ -97,7 +98,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
                     if ( segment == null )
                         return;
 
-                    this.pub.SendMoreFrame( "CurrentRailFrom" ).SendFrame( segment.route_type );
+                    Publish( "CurrentRailFrom", segment.route_type );
                 }
             }
         }
@@ -139,7 +140,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
             {
                 if ( SetField( ref this.currentMCR, value ) )
                 {
-                    this.pub.SendMoreFrame( "MCRValue" ).SendFrame( value.ToString() );
+                    Publish( "MCRValue", value.ToString() );
                 }
             }
         }
@@ -178,6 +179,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 CurrentPointNo = GetCurrentPointNo();
                 SetCurrentSteeringState( this.steering.GetSteeringState() );
             };
+
             this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
             this.monitor.StartAsync();
 
@@ -194,30 +196,38 @@ namespace VehicleControlSystem.ControlLayer.MQ
 
         private void BMUManager_OnChangedReceivedData( Serial.DataModel.ReceivedData obj )
         {
-            var kind = CastTo<eDataKind>.From<Enum>( obj.DataKind );
-            switch ( kind )
+            try
             {
-                case eDataKind.Current:
-                    this.pub.SendMoreFrame( "BatteryCurrent" ).SendFrame( obj.Value.ToString() ); 
-                    break;
-                case eDataKind.Voltage:
-                    this.pub.SendMoreFrame( "BatteryVoltage" ).SendFrame( obj.Value.ToString() ); 
-                    break;
-                case eDataKind.BatteryState:
-                case eDataKind.ChargeCompleteTime:
-                case eDataKind.DisChargeCompleteTime:
-                    break;
-                case eDataKind.SOC:
-                    this.pub.SendMoreFrame( "BatterySOC" ).SendFrame( obj.Value.ToString() ); 
-                    break;
-                case eDataKind.SOH:
-                case eDataKind.ResidualCapacity:
-                case eDataKind.ResidualEnergy:
-                case eDataKind.Temperature:
-                    break;
-                default:
-                    break;
+                var kind = CastTo<eDataKind>.From<Enum>( obj.DataKind );
+                switch ( kind )
+                {
+                    case eDataKind.Current:
+                        this.pub.SendMoreFrame( "BatteryCurrent" ).SendFrame( obj.Value.ToString() );
+                        break;
+                    case eDataKind.Voltage:
+                        this.pub.SendMoreFrame( "BatteryVoltage" ).SendFrame( obj.Value.ToString() );
+                        break;
+                    case eDataKind.BatteryState:
+                    case eDataKind.ChargeCompleteTime:
+                    case eDataKind.DisChargeCompleteTime:
+                        break;
+                    case eDataKind.SOC:
+                        this.pub.SendMoreFrame( "BatterySOC" ).SendFrame( obj.Value.ToString() );
+                        break;
+                    case eDataKind.SOH:
+                    case eDataKind.ResidualCapacity:
+                    case eDataKind.ResidualEnergy:
+                    case eDataKind.Temperature:
+                        break;
+                    default:
+                        break;
+                }
+
             }
+            catch ( Exception ex )
+            {
+                logger.E( ex );
+            }   
         }
 
         public void Dispose()
@@ -237,9 +247,11 @@ namespace VehicleControlSystem.ControlLayer.MQ
             this.req.Dispose();
         }
 
+        object lockPulish = new object();
         public void Publish(string key, string val) 
         {
-            this.pub.SendMoreFrame( key ).SendFrame( val );
+            lock(lockPulish)
+                this.pub.SendMoreFrame( key ).SendFrame( val );
         }
 
         private void Rep_ReceiveReady( object sender, NetMQSocketEventArgs e )
@@ -254,6 +266,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
                     var v = ret[1].Split( '/' );
 
                     rep.SendMoreFrame( "setm" ).SendFrame( $"ok/{v[0]}" ); //응답처리 부터 하자.
+
                     switch ( v[0] )
                     {
                         case "3050":
@@ -305,6 +318,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
                                 this.SegmentID = iV;
                             }
                             break;
+
                         default:
                             break;
                     }
@@ -466,11 +480,10 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 catch ( Exception e )
                 {
                     logger.E( e );
-                    this.req.Dispose();
+                    this.req.Disconnect( "tcp://127.0.0.1:5567" );
                     //this.monitor.Stop();
                     //this.monitor.Dispose();
 
-                    req = new RequestSocket();
                     //this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
                     //this.monitor.Connected += ( s, a ) => { this.IsReqConnected = true; CurrentPointNo = GetCurrentPointNo(); };
                     //this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
@@ -506,11 +519,10 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 catch ( Exception e )
                 {
                     logger.E( e );
-                    this.req.Dispose();
+                    this.req.Disconnect( "tcp://127.0.0.1:5567" );
                     //this.monitor.Stop();
                     //this.monitor.Dispose();
 
-                    req = new RequestSocket();
                     //this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
                     //this.monitor.Connected += ( s, a ) => { this.IsReqConnected = true; CurrentPointNo = GetCurrentPointNo(); };
                     //this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
@@ -521,6 +533,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
                     return false;
                 }
             }
+
             return true;
         }
 

+ 12 - 4
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs

@@ -80,8 +80,8 @@ namespace VehicleControlSystem.ControlLayer.Drive
 
         public void Init()
         {
-            this.threadCancel.AddGo( Thread_DriveStateChcker );
-            this.threadCancel.AddGo( Thread_Logger );
+            //this.threadCancel.AddGo( Thread_DriveStateChcker );
+            //this.threadCancel.AddGo( Thread_Logger );
 
             zmq.PropertyChanged += Zmq_PropertyChanged;
 
@@ -227,11 +227,14 @@ namespace VehicleControlSystem.ControlLayer.Drive
             if ( IsDriveFault() )
                 return 34;
 
-            //ToDo: 이동 명령 실행.
             int result = ConstInt.EXECUTE_SUCCESS;
 
+            var steeringState = steering.GetSteeringState();
+            if (steeringState == eSteeringState.None ) //현재 가 None 이면 기다렸다가 다시 확인 필요.
+                LockUtils.Wait( 500 );
+
             zmq.SetCurrentSteeringState( steering.GetSteeringState() );
-            LockUtils.Wait( 100 );
+            LockUtils.Wait( 200 );
 
             StringBuilder sb = new StringBuilder();
             if ( sub.TargetList.Count <= 0 )
@@ -282,6 +285,11 @@ namespace VehicleControlSystem.ControlLayer.Drive
             return ConstInt.EXECUTE_SUCCESS;
         }
 
+        public void CancelCommand(SubCmd subCmd)
+        {
+
+        }
+
         /// <summary>
         /// 급정시 사용.
         /// </summary>

+ 1 - 1
Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/BMUManager.cs

@@ -189,7 +189,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
             } );
 
             //다음 timer 기동 시 까지 잠시 대기
-            polling.Once( _OnTimePoll, 100 );
+            polling.Once( _OnTimePoll, 300 );
         }
 
         void _OnTimePoll()

+ 11 - 3
Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/Peak/Peak.cs

@@ -113,7 +113,6 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
                 this.IsConnected = this.GetStatus();
         }
 
-        //Todo:Dll 에서 상태 가져오기
         bool isConnected = false;
         public bool IsConnected
         {
@@ -298,7 +297,10 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
                 if ( stsResult == TPCANStatus.PCAN_ERROR_OK && canMsg.ID == 0x460 )
                     this.PeackCANRecv( canMsg );
                 else if ( canMsg.ID != 0x460 )
-                    this.isConnected = this.GetStatus();
+                {
+                    this.IsConnected = this.GetStatus();
+                    return stsResult = TPCANStatus.PCAN_ERROR_UNKNOWN;
+                }
             }
 
             return stsResult;
@@ -307,6 +309,12 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
         void PeackCANRecv(TPCANMsg recv)
         {
             var mb = new MemoryBuffer( recv.DATA );
+            
+            if ( mb.Length < 8 )
+            {
+                logger.E( $" - [Battery Recv Length Error] - {mb.Length} -" );
+                return;
+            }
 
             mb.Read1Byte();
             var index =  ( eCanRecvCase )mb.Read1Byte();
@@ -318,7 +326,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
                 case eCanRecvCase.CASE1:
                     this.manager.ReceivedDataDic[ eDataKind.Voltage ].Value = mb.ReadLeShort();
                     this.manager.ReceivedDataDic[eDataKind.Current].Value = mb.ReadLeShort();
-                    this.manager.ReceivedDataDic[ eDataKind.BatteryState ].Value = mb.ReadLeShort();
+                    this.manager.ReceivedDataDic[eDataKind.BatteryState].Value = mb.ReadLeShort();
                     break;
                 case eCanRecvCase.CASE2:
                     this.manager.ReceivedDataDic[ eDataKind.ChargeCompleteTime ].Value = mb.ReadLeShort();

+ 20 - 13
Dev/OHV/VehicleControlSystem/ControlLayer/Serial/DataModel/ReceivedData.cs

@@ -24,6 +24,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.DataModel
 
     public enum eBatteryState
     {
+        None = 0,
         OverVolte,
         LowVolte,
         OverChargeCurrent,
@@ -40,21 +41,22 @@ namespace VehicleControlSystem.ControlLayer.Serial.DataModel
 
         public string Orgvalue { get; set; }
 
-        public double? Value { 
+        public double Value { 
             get 
-            { 
-                if ( this.DataKind != eDataKind.BatteryState )
-                {
-                    double dOrg = 0d;
-                    double.TryParse( this.Orgvalue, out dOrg );
+            {
+                double dOrg = 0d;
+                double.TryParse( this.Orgvalue, out dOrg );
 
-                    return dOrg;
-                }
-                else
-                {
-                    return null;
-                }
-            } 
+                return dOrg;
+
+                //if ( this.DataKind != eDataKind.BatteryState )
+                //{
+                //    double dOrg = 0d;
+                //    double.TryParse( this.Orgvalue, out dOrg );
+
+                //    return dOrg;
+                //}
+            }
             set
             {
                 if(Value != (double)value)
@@ -68,6 +70,11 @@ namespace VehicleControlSystem.ControlLayer.Serial.DataModel
                         var val = (eBatteryState)value;
                         this.Orgvalue = value.ToString();
                     }
+                    //else if (DataKind == eDataKind.BatteryState)
+                    //{
+                    //    var bms = (eBatteryState)value;
+                    //    this.Orgvalue = bms.ToString();
+                    //}
                     else
                         this.Orgvalue = ( value * Scale ).ToString();
 

+ 4 - 3
Dev/OHV/VehicleControlSystem/ControlLayer/Steering.cs

@@ -131,7 +131,7 @@ namespace VehicleControlSystem.ControlLayer
                  {
                      LockUtils.Wait( 5 );
 
-                     if ( SwUtils.Gt( sTime , 3 * ConstUtils.ONE_SECOND ) ) //Wait 20Sec
+                     if ( SwUtils.Gt( sTime , 3 * ConstUtils.ONE_SECOND ) ) //Wait 3Sec
                          return false;
 
                      if ( isLeft )
@@ -153,6 +153,7 @@ namespace VehicleControlSystem.ControlLayer
                       else
                           this.OnSteeringError?.BeginInvoke( this , 0 , null , null );
 
+                      LockUtils.Wait( 200 );
                       GetSteeringState();
                       this.isExecuteSteering = false;
                   } );
@@ -164,8 +165,8 @@ namespace VehicleControlSystem.ControlLayer
         {
             this.iO.WriteOutputIO( "OUT_F_STEERING_DA" , true );
             this.iO.WriteOutputIO( "OUT_R_STEERING_DA" , true );
-            this.iO.WriteOutputIO( "OUT_F_STEERING_DA" , false , 800 );
-            this.iO.WriteOutputIO( "OUT_R_STEERING_DA" , false , 800 );
+            this.iO.WriteOutputIO( "OUT_F_STEERING_DA" , false , 400 );
+            this.iO.WriteOutputIO( "OUT_R_STEERING_DA" , false , 700 );
         }
 
         bool IsFrontLeft( ) => this.iO.IsOn( "IN_F_STEERING_DETECT_LEFT" );

+ 222 - 66
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -2,7 +2,6 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
-using System.Security.Cryptography.X509Certificates;
 using System.Threading;
 using System.Threading.Tasks;
 using FluentResults;
@@ -222,6 +221,27 @@ namespace VehicleControlSystem.ControlLayer
 
         public bool IsMoving { get => this.refObjects.Drive.IsDriveMoving(); }
 
+        private bool batteryChargeState;
+
+        public bool BatteryChargeState
+        {
+            get { return batteryChargeState; }
+            set
+            {
+                if ( SetField( ref batteryChargeState, value ) )
+                {
+                    if ( value )
+                    {
+                        this.OnChargingStart?.Invoke();
+                        LockUtils.Wait( 200 );
+                        this.OnCharging?.Invoke();
+                    }
+                    //else
+                    //    this.OnChargingFull?.Invoke();
+                }
+            }
+        }
+
         #region Battery Property
 
         double batteryVoltage;
@@ -268,14 +288,17 @@ namespace VehicleControlSystem.ControlLayer
         public double BatteryStateOfCharge
         {
             get { return this.batteryStateOfCharge; }
-            set { this.SetField( ref this.batteryStateOfCharge, value ); }
+            set { if ( this.SetField( ref this.batteryStateOfCharge, value ) ) { this.BatteryChargeStateLED( value ); } }
         }
 
         double batteryStateOfHealth;
         public double BatteryStateOfHealth
         {
             get { return this.batteryStateOfHealth; }
-            set { this.SetField( ref this.batteryStateOfHealth, value ); }
+            set 
+            {
+                if ( this.SetField( ref this.batteryStateOfHealth, value ) ) { }
+            }
         }
 
         double batteryCapacity;
@@ -373,6 +396,7 @@ namespace VehicleControlSystem.ControlLayer
             get { return this.rearTorque; }
             set { SetField( ref this.rearTorque, value ); }
         }
+
         #endregion
 
         #region Event 
@@ -783,7 +807,7 @@ namespace VehicleControlSystem.ControlLayer
 
             this.DriveControlEventPublish( msg );
         }
-        #endregion
+        #endregion 
 
         #region Thread
         void ThreadStart()
@@ -869,6 +893,10 @@ namespace VehicleControlSystem.ControlLayer
                             this.CurrentSubCommand = subCmd;
                             this.BatteryCharge( subCmd );
                             break;
+                        case eSubCommandType.Cancel:
+                            this.CurrentSubCommand = subCmd;
+                            CancelCommand( subCmd );
+                            break;
                         default:
                             break;
                     }
@@ -885,6 +913,18 @@ namespace VehicleControlSystem.ControlLayer
             logger.D( "Vehicle - _ThSubCmdWorker Dispose" );
         }
 
+        private void CancelCommand( SubCmd subCmd )
+        {
+            this.refObjects.Drive.CancelCommand( subCmd );
+
+            var cmd = sql.CommandDAL.GetById( subCmd.CmdID );
+            cmd.State = eCommandState.Complete;
+            sql.CommandDAL.Update( cmd );
+            sql.SubCmdDAL.Clean();
+
+            logger.D( $"[Cancel Command] {cmd.TargetID} / {cmd.Type}" );
+        }
+
         #endregion
 
         #region Control Action Method
@@ -903,7 +943,7 @@ namespace VehicleControlSystem.ControlLayer
         {
             //Move 시작 시 충전 중이면 충전 중지 실행.
             int result = 0;
-            if ( this.IsCharging() || this.VehicleStateProperty == eVehicleState.Charge )
+            if ( this.CheckBatteryCharge() || this.VehicleStateProperty == eVehicleState.Charge || this.BatteryChargeState)
             {
                 result = this.StopBatteryCharge();
                 if ( result != 0 )
@@ -923,10 +963,12 @@ namespace VehicleControlSystem.ControlLayer
                 }
             }
 
+            sql.SubCmdDAL.Clean();
+
             this.taskMoveCancel.Cancel();
             this.taskMoveCancel.WaitAll();
 
-            sql.SubCmdDAL.Clean();
+            logger.D( $"[Move Command Complete] {sub.TargetID}" );
         }
 
         int MoveTo( SubCmd sub )
@@ -982,7 +1024,6 @@ namespace VehicleControlSystem.ControlLayer
 
                 if ( SwUtils.Gt( st, waitTime ) )
                 {
-                    //Todo: 이동시간 초과 시 동작들.
                     logger.D( "Wait4MoveDone Time Over" );
                     return 39;
                 }
@@ -1057,13 +1098,18 @@ namespace VehicleControlSystem.ControlLayer
             this.PIOSensorOff();
 
             //Load, Unload 가 끝나면 메인 Command 를 완료 했다고 판단.
-            var cmd = sql.CommandDAL.GetById( sub.CmdID );
-            cmd.State = eCommandState.Complete;
-            sql.CommandDAL.Update( cmd );
             sql.SubCmdDAL.Clean();
+            var cmd = sql.CommandDAL.GetById( sub.CmdID );
+            if ( cmd != null )
+            {
+                cmd.State = eCommandState.Complete;
+                sql.CommandDAL.Update( cmd );
+            }
 
-            LockUtils.Wait( 1000 );
-            this.OnLoadComplete?.Invoke(); //일찍 주면 다음 명령을 500ms 안에 주는 현상 있음. 그러니까 천천히 주자 
+            TimerUtils.Once( 1000, this.OnLoadComplete );
+
+            //LockUtils.Wait( 1000 );
+            //this.OnLoadComplete?.Invoke(); //일찍 주면 다음 명령을 500ms 안에 주는 현상 있음. 그러니까 천천히 주자 
             this.VehicleStateProperty = eVehicleState.Idle;
 
             return true;
@@ -1107,13 +1153,18 @@ namespace VehicleControlSystem.ControlLayer
 
             this.PIOSensorOff();
 
-            var cmd = sql.CommandDAL.GetById( sub.CmdID );
-            cmd.State = eCommandState.Complete;
-            sql.CommandDAL.Update( cmd );
             sql.SubCmdDAL.Clean();
+            var cmd = sql.CommandDAL.GetById( sub.CmdID );
+            if ( cmd != null )
+            {
+                cmd.State = eCommandState.Complete;
+                sql.CommandDAL.Update( cmd );
+            }
+
+            TimerUtils.Once( 1000, this.OnUnloadComplete );
 
-            LockUtils.Wait( 1000 );
-            this.OnUnloadComplete?.Invoke(); //일찍 주면 다음 명령을 500ms 안에 주는 현상 있음. 그러니까 천천히 주자 
+            //LockUtils.Wait( 1000 );
+            //this.OnUnloadComplete?.Invoke(); //일찍 주면 다음 명령을 500ms 안에 주는 현상 있음. 그러니까 천천히 주자 
             this.VehicleStateProperty = eVehicleState.Idle;
 
             logger.D( $"[Unloading End]--------------------------------------" );
@@ -1128,10 +1179,14 @@ namespace VehicleControlSystem.ControlLayer
             if ( result != ConstInt.EXECUTE_SUCCESS )
                 this.OccurVehicleAlarm( result );
 
+            sql.SubCmdDAL.Clean();
+
             var cmd = sql.CommandDAL.GetById( subCmd.CmdID );
+            if ( cmd == null )
+                return;
+
             cmd.State = eCommandState.Complete;
             sql.CommandDAL.Update( cmd );
-            sql.SubCmdDAL.Clean();
         }
 
         /// <summary>
@@ -1250,6 +1305,7 @@ namespace VehicleControlSystem.ControlLayer
             return 0;
 #else
             this.PIOSensorOn();
+            LockUtils.Wait( 500 );
 
             var pioTimeout = Convert.ToInt32( sql.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
 
@@ -1267,7 +1323,7 @@ namespace VehicleControlSystem.ControlLayer
             this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECEIVABLE", true );
             loggerPIO.I( "[Vehicle] - 4 Receivable" );
 
-            if ( !this.refObjects.IO.WaitChangeInputIO( true, 20000, "IN_PIO_SEND_RUN" ) )
+            if ( !this.refObjects.IO.WaitChangeInputIO( true, 5000, "IN_PIO_SEND_RUN" ) )
             {
                 PIOClear();
                 loggerPIO.E( "[Port] - 5 Sending Run Time Out" );
@@ -1326,7 +1382,7 @@ namespace VehicleControlSystem.ControlLayer
             this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", true );
             loggerPIO.I( "[Vehicle] Receive Complete On" );
 
-            if ( !this.refObjects.IO.WaitChangeInputIO( true, 10000, "IN_PIO_SEND_COMPLITE" ) )
+            if ( !this.refObjects.IO.WaitChangeInputIO( true, 5000, "IN_PIO_SEND_COMPLITE" ) )
             {
                 this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false );
                 loggerPIO.E( "[Port]  IN_PIO_SEND_COMPLITE On Time Out" );
@@ -1339,6 +1395,7 @@ namespace VehicleControlSystem.ControlLayer
 
             this.PIOSensorOff();
 
+            this.OnChargingFull?.Invoke();
             this.VehicleStateProperty = eVehicleState.Idle;
 
             return 0;
@@ -1353,7 +1410,7 @@ namespace VehicleControlSystem.ControlLayer
             if ( this.refObjects.IO.IsOff( "IN_OBSTRUCTION_DETECT_SAFETY" ) || this.refObjects.IO.IsOff( "IN_OBSTRUCTION_DETECT_ERROR" ) )
             {
                 this.ObstacleStateProperty = eObstacleState.Abnormal;
-                this.OccurVehicleAlarm( 9999 );
+                this.OccurVehicleAlarm( 42 );
             }
             else if ( this.refObjects.IO.IsOff( "IN_OBSTRUCTION_DETECT_STOP" ) )
             {
@@ -1368,7 +1425,7 @@ namespace VehicleControlSystem.ControlLayer
                 this.ObstacleStateProperty = eObstacleState.Normal;
             }
 
-            this.refObjects.Drive.SetObstacleState( this.ObstacleStateProperty );
+            //this.refObjects.Drive.SetObstacleState( this.ObstacleStateProperty );
 
             return false;
         }
@@ -1405,7 +1462,25 @@ namespace VehicleControlSystem.ControlLayer
         /// 이걸 보고 판단 하자. 충전 단자 전진 상태임.
         /// </summary>
         /// <returns></returns>
-        public bool IsCharging() => this.refObjects.IO.IsOn( "IN_PIO_SEND_RUN" ) && this.refObjects.IO.IsOn( "IN_PIO_SENDABLE" );
+        public bool CheckBatteryCharge()
+        {
+            this.PIOSensorOn();
+            LockUtils.Wait( 500 );
+
+            if ( this.BatteryChargeState || this.VehicleStateProperty == eVehicleState.Charge )
+            {
+
+            }
+
+            //var ret = this.refObjects.IO.IsOn( "OUT_PIO_RECEIVABLE", false ) 
+            //    && this.refObjects.IO.IsOn( "OUT_PIO_RECEIVE_RUN", false ) 
+            //    && this.refObjects.IO.IsOn( "IN_PIO_SEND_RUN" );
+
+            var ret = this.refObjects.IO.IsOn( "IN_PIO_SEND_RUN" );
+            //this.PIOSensorOff();
+
+            return ret;
+        }
         #endregion
 
         #region Drive
@@ -1445,6 +1520,8 @@ namespace VehicleControlSystem.ControlLayer
             Thread.Sleep( 1000 );
             this.OnLoadComplete?.Invoke();
 #else
+            loggerPIO.I( $"Start Load PIO - [{targetName}]" );
+
             this.PIOSensorOn();
             LockUtils.Wait( 500 );
 
@@ -1461,8 +1538,26 @@ namespace VehicleControlSystem.ControlLayer
             if ( this.refObjects.Conveyor.IsInverterError() )
                 return 16;
 
-            if ( !this.refObjects.Conveyor.IsLifterPositinCheck() )
-                return 14;
+            if ( this.refObjects.Conveyor.IsDetectedCenter() )
+            {
+                this.OnFailReport?.Invoke( eFailCode.Load_VehicleHasCarrier );
+                return 0;
+            }
+
+            if ( !this.refObjects.IO.WaitChangeInputIO( true, 40 * ConstUtils.ONE_SECOND, "IN_LIFTER_POSITION_DETECT" ) )
+            {
+                loggerPIO.E( "[Port] - Lift Position Check Error" );
+                TimerUtils.Once( 1000, this.OnFailReport, eFailCode.LoadPIOInterlockTimeout );
+                //this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
+                return 0; //14
+            }
+
+            //if ( !this.refObjects.Conveyor.IsLifterPositinCheck() )
+            //{
+            //    loggerPIO.E( "[Port] - Lift Position Check Error" );
+            //    this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
+            //    return 0; //14
+            //}
 
             //Todo: Sensor Setting 이 후 주석 풀기.
             //if ( !this.IsLifterDuplication() )
@@ -1471,24 +1566,18 @@ namespace VehicleControlSystem.ControlLayer
             //    return 0;
             //}
 
-            if ( this.refObjects.Conveyor.IsDetectedCenter() )
-            {
-                this.OnFailReport?.Invoke( eFailCode.Load_VehicleHasCarrier );
-                return 0;
-            }
-
             PIOClear();
-            loggerPIO.I( $"Start Load PIO - [{targetName}]" );
             this.OnPIOStart?.Invoke( true );
 
             this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECEIVABLE", true );
             loggerPIO.I( "[Vehicle] - 4 Receivable" );
 
-            if ( !this.refObjects.IO.WaitChangeInputIO( true, pioTimeout, "IN_PIO_SENDABLE" ) )
+            if ( !this.refObjects.IO.WaitChangeInputIO( true, 20 * ConstUtils.ONE_SECOND, "IN_PIO_SENDABLE" ) )
             {
                 PIOClear();
                 loggerPIO.E( "[Port] - 4 Ready Time Out" );
-                this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
+                TimerUtils.Once( 1000, this.OnFailReport, eFailCode.LoadPIOInterlockTimeout );
+                //this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
                 return 0;
             }
             loggerPIO.E( "[Port] - 4 Ready On" );
@@ -1505,7 +1594,8 @@ namespace VehicleControlSystem.ControlLayer
                 this.refObjects.Conveyor.OnOffConveyor( false, true );
                 PIOClear();
                 loggerPIO.E( "[Port] - 5 Sending Run Time Out" );
-                this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
+                TimerUtils.Once( 1000, this.OnFailReport, eFailCode.LoadPIOInterlockTimeout );
+                //this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
                 return 0;
             }
             loggerPIO.I( "[Port] - 5 Sending Run On" );
@@ -1521,7 +1611,8 @@ namespace VehicleControlSystem.ControlLayer
                     PIOClear();
                     this.refObjects.Conveyor.OnOffConveyor( false, true );
                     loggerPIO.E( "[Vehicle] Conveyor Wait Time Out" );
-                    this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
+                    TimerUtils.Once( 1000, this.OnFailReport, eFailCode.LoadPIOInterlockTimeout );
+                    //this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
 
                     if ( this.refObjects.Conveyor.IsDetectedLoadStart() ) // 감지가 시작 되었으면 이동중 Error 로 판단 설비를 정지 상태로
                         return 10; //Conveyor Moving Timeout
@@ -1601,6 +1692,7 @@ namespace VehicleControlSystem.ControlLayer
             Thread.Sleep( 1000 );
             this.OnUnloadComplete?.Invoke();
 #else
+            loggerPIO.E( $"Start Unload PIO -[{targetName}]" );
             this.PIOSensorOn();
             LockUtils.Wait( 500 );
 
@@ -1619,32 +1711,46 @@ namespace VehicleControlSystem.ControlLayer
 
             if ( !this.refObjects.Conveyor.IsDetectedCenter() )
             {
-                this.OnFailReport?.Invoke( eFailCode.Unload_VehicleHasNotCarrier );
+                TimerUtils.Once( 1000, this.OnFailReport, eFailCode.Unload_VehicleHasNotCarrier );
+                //this.OnFailReport?.Invoke( eFailCode.Unload_VehicleHasNotCarrier );
                 return 0;
             }
 
-            if ( !this.refObjects.Conveyor.IsLifterPositinCheck() )
-                return 13;
+            if ( !this.refObjects.IO.WaitChangeInputIO( true, 40 * ConstUtils.ONE_SECOND, "IN_LIFTER_POSITION_DETECT" ) )
+            {
+                loggerPIO.E( "[Port] - Lift Position Check Error" );
+                TimerUtils.Once( 1000, this.OnFailReport, eFailCode.UnlaodPIOInterlockTimeout );
+                //this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
+                return 0;
+            }
+
+            //if ( !this.refObjects.Conveyor.IsLifterPositinCheck() )
+            //{
+            //    loggerPIO.E( "[Port] - Lift Position Check Error" );
+            //    this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout ); //Unloading Fail Code 를 Time Out 으로 하자. 정의 된 코드 없음.
+            //    return 0; //13 -> Alarm Code 보고 없음. 경알람 상태 이므로 한번 보고 후 정상 동작
+            //}
 
             PIOClear();
-            loggerPIO.I( $"Start Unload PIO - [{targetName}]" );
             this.OnPIOStart?.Invoke( false );
 
-            if ( !this.refObjects.IO.IsOn( "IN_PIO_READY" ) )
+            if ( !this.refObjects.IO.WaitChangeInputIO( true, 20 * ConstUtils.ONE_SECOND, "IN_PIO_READY" ) )
             {
                 loggerPIO.E( "[Port] - 1 Ready not On" );
-                this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
+                TimerUtils.Once( 1000, this.OnFailReport, eFailCode.UnlaodPIOInterlockTimeout );
+                //this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
                 return 0;
             }
 
             this.refObjects.IO.WriteOutputIO( "OUT_PIO_READY", true );
             loggerPIO.I( "[Vehicle] - 1 Ready On" );
 
-            if ( !this.refObjects.IO.WaitChangeInputIO( true, pioTimeout, "IN_PIO_RECEIVE_RUN" ) )
+            if ( !this.refObjects.IO.WaitChangeInputIO( true, 10 * ConstUtils.ONE_SECOND, "IN_PIO_RECEIVE_RUN" ) )
             {
                 PIOClear();
                 loggerPIO.E( "[Port] - 2 Receive CV Run Timeout" );
-                this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
+                TimerUtils.Once( 1000, this.OnFailReport, eFailCode.UnlaodPIOInterlockTimeout );
+                //this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
                 return 0;
             }
             loggerPIO.E( "[Port] - 2 Receive CV Run On" );
@@ -1671,12 +1777,25 @@ namespace VehicleControlSystem.ControlLayer
                     PIOClear();
                     this.refObjects.Conveyor.OnOffConveyor( false, true );
                     loggerPIO.E( "[Port] Conveyor Wait Time Out" );
-                    this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
+                    TimerUtils.Once( 1000, this.OnFailReport, eFailCode.UnlaodPIOInterlockTimeout );
+                    //this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
 
                     if ( this.refObjects.Conveyor.IsDetectedLoadStart() || this.refObjects.Conveyor.IsDetectedCenter() ) //중간에 걸려 있다고 생각해서 알람 처리.
                         return 12; //Conveyor Moving Timeout
                     else
-                        return 0;
+                    {
+                        if ( this.refObjects.Conveyor.IsDetectedCenter() ) //Time Out 후 아직 Tray 가 있으면 다시 Clamp Lock.
+                        {
+                            result = this.refObjects.Clamp.Unlock_Sync();
+                            if ( result != 0 )
+                            {
+                                this.OccurVehicleAlarm( result );
+                                return result;
+                            }
+                        }
+                        else 
+                            return 0;
+                    }
                 }
 
 
@@ -1718,6 +1837,37 @@ namespace VehicleControlSystem.ControlLayer
         #endregion
 
         #region Help Method
+        void BatteryChargeStateLED(double percent )
+        {
+            if ( percent > 65 )
+            {
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_00", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_01", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_02", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_03", true );
+            }
+            else if ( percent > 50 )
+            {
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_00", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_01", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_02", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_03", false );
+            }
+            else if ( percent > 40 )
+            {
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_00", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_01", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_02", false );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_03", false );
+            }
+            else
+            {
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_00", true );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_01", false );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_02", false );
+                this.refObjects.IO.WriteOutputIO( "OUT_BATTERY_LED_03", false );
+            }
+        }
 
         /// <summary>
         /// 현재 Point 가 변경될때 장애물 감지 센서의 패턴을 변경한다.
@@ -1855,54 +2005,60 @@ namespace VehicleControlSystem.ControlLayer
                 case eDataKind.Voltage:
                     this.BatteryVoltage = (double)obj.Value;
                     break;
+
                 case eDataKind.Current:
                     this.BatteryCurrent = (double)obj.Value;
+                    if ( BatteryCurrent > 0 )
+                        this.BatteryChargeState = true;
+                    else
+                        this.BatteryChargeState = false;
+
                     break;
                 case eDataKind.BatteryState:
-                    if ( obj.Value == null )
-                        return;
                     this.BatteryState = (double)obj.Value;
                     break;
+
                 case eDataKind.ChargeCompleteTime:
-                    if ( obj.Value == null /*|| obj.Value <= 0 */)
-                        return;
                     this.BatteryChargeTime = (double)obj.Value;
-                    if ( this.BatteryChargeTime > 0 )
-                        this.VehicleStateProperty = eVehicleState.Charge;
                     break;
+
                 case eDataKind.DisChargeCompleteTime:
-                    if ( obj.Value == null || obj.Value <= 0 )
-                        return;
                     this.BatteryDisChargeTime = (double)obj.Value;
                     break;
+
                 case eDataKind.SOC:
                     this.BatteryStateOfCharge = (double)obj.Value;
-                    if ( this.BatteryStateOfCharge >= 80 )
-                    {
-                        if ( this.autoManager.AutoModeStateProperty != eAutoModeState.Run )
-                            return;
+                    //if ( this.BatteryStateOfCharge >= 78 )
+                    //{
+                    //    if ( this.autoManager.AutoModeStateProperty != eAutoModeState.Run )
+                    //        return;
 
-                        if ( this.VehicleStateProperty == eVehicleState.Charge || this.IsCharging() )
-                        {
-                            int result = ConstInt.EXECUTE_SUCCESS;
-                            result = this.StopBatteryCharge();
-                            if ( result != ConstInt.EXECUTE_SUCCESS )
-                                this.OccurVehicleAlarm( result );
-                        }
-                    }
+                    //    if ( this.VehicleStateProperty == eVehicleState.Charge || this.CheckBatteryCharge() || this.BatteryChargeState )
+                    //    {
+                    //        int result = ConstInt.EXECUTE_SUCCESS;
+                    //        result = this.StopBatteryCharge();
+                    //        if ( result != ConstInt.EXECUTE_SUCCESS )
+                    //            this.OccurVehicleAlarm( result );
+                    //    }
+                    //}
                     break;
+
                 case eDataKind.SOH:
                     this.BatteryStateOfHealth = (double)obj.Value;
                     break;
+
                 case eDataKind.ResidualCapacity:
                     this.BatteryCapacity = (double)obj.Value;
                     break;
+
                 case eDataKind.ResidualEnergy:
                     this.BatteryEnergy = (double)obj.Value;
                     break;
+
                 case eDataKind.Temperature:
                     this.BatteryTemperature = (double)obj.Value;
                     break;
+
                 default:
                     break;
             }

+ 6 - 1
Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs

@@ -142,7 +142,10 @@ namespace VehicleControlSystem.Managers
         #region Vehicle Events
         private void Vehicle_OnChargingFull()
         {
-            LampStateChange( eLampState.AutoRunNChargingFull );
+            if ( this.OperationModeProperty == eOperatationMode.AutoMode )
+                LampStateChange( eLampState.AutoRunNChargingFull );
+            else
+                LampStateChange( eLampState.Alarm );
         }
 
         private void Vehicle_OnCharging()
@@ -304,6 +307,8 @@ namespace VehicleControlSystem.Managers
                 alarm = new Alarm();
                 alarm.AlarmId = alarmID;
                 alarm.Text = "Not Define Alarm";
+
+                logger.E( $"[{this.GetType().Name}] - Not Defiine Alarm No {alarmID}" );
             }
             else
             {

+ 50 - 10
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -9,8 +9,6 @@ using VehicleControlSystem.ControlLayer;
 using GSG.NET.Extensions;
 using OHV.Common.Model;
 using GSG.NET.Quartz;
-using System.Text;
-using GSG.NET.LINQ;
 using System.Linq;
 using System.Collections.Generic;
 
@@ -79,7 +77,7 @@ namespace VehicleControlSystem.Managers
             msg.Tag = obj.ToString("0000");
             msg.IsSubCode1 = vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
-            msg.IsSubCode3 = true;
+            msg.IsSubCode3 = false;
             this.manager.Send( msg );
         }
 
@@ -90,7 +88,7 @@ namespace VehicleControlSystem.Managers
             msg.Tag = obj.ToString("0000");
             msg.IsSubCode1 = vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
-            msg.IsSubCode3 = false;
+            msg.IsSubCode3 = true;
             this.manager.Send( msg );
         }
 
@@ -385,12 +383,43 @@ namespace VehicleControlSystem.Managers
                     break;
                 case OHVConnector.eKind.Z:
                     break;
+                case eKind.G:
+                    ReceiveGCommand( msg );
+                    break;
                 default:
                     break;
             }
 
         }
 
+        private void ReceiveGCommand( OCSMessage msg )
+        {
+            this.Reply( msg );
+
+            var cmd = new Command();
+
+            var info = sql.VehicleInfoDAL.GetAll().FirstOrDefault();
+            if ( info.MachineMode == eMachineMode.LocalMode )
+            {
+                loggerHost.E( $"[OCS] Cmd - Current Mode Local Mode " );
+                return;
+            }
+
+            if ( this.sql.CommandDAL.Count > 0 )
+            {
+                logger.W( $"[{this.GetType().Name}] - Has Command / Target {cmd.TargetID} / Type {cmd.Type}" );
+                return;
+            }
+
+            cmd.TargetID = msg.Tag;
+            cmd.Type = eCommandType.Move;
+            cmd.ByWho = eCommandByWho.Host;
+            cmd.TargetList = new List<string>( msg.ViaRouteList );
+
+            this.sql.CommandDAL.Insert( cmd );
+            logger.I( $"[Command] - Add Host : Target {cmd.TargetID} / Type {cmd.Type}" );
+        }
+
         void Reply( OCSMessage recieve )
         {
             var reply = new OCSMessage();
@@ -446,16 +475,20 @@ namespace VehicleControlSystem.Managers
                         case "003": //Move and Charge
                             cmd.Type = eCommandType.Charging;
                             break;
+                        case "004": //Cancel
+                            cmd.Type = eCommandType.Cancel;
+                            break;
                         default:
                             return;
                     }
+
                     cmd.ByWho = eCommandByWho.HostOverWrite;
                     cmd.TargetList = new List<string>( msg.ViaRouteList );
 
                     cmd.TargetID = msg.Tag;
 
                     this.sql.CommandDAL.Insert( cmd );
-                    logger.I( $"[Command] - Add Host : Target {cmd.TargetID} / Type {cmd.Type}" );
+                    logger.I( $"[Command] - Add HostOverWrite : Target {cmd.TargetID} / Type {cmd.Type}" );
 
                     sql.CommandDAL.Delete( hasCommand.CommandID );
                 }
@@ -480,13 +513,14 @@ namespace VehicleControlSystem.Managers
                     case "002": //Move and Unload
                         cmd.Type = eCommandType.MoveNUnload;
                         break;
-                    case "003": //Move and Charge
+                    case "003": //Cancel
                         cmd.Type = eCommandType.Charging;
                         break;
                     default:
                         return;
                 }
                 cmd.ByWho = eCommandByWho.Host;
+                cmd.TargetList = new List<string>( msg.ViaRouteList );
 
                 this.sql.CommandDAL.Insert( cmd );
                 logger.I( $"[Command] - Add Host : Target {cmd.TargetID} / Type {cmd.Type}" );
@@ -538,7 +572,12 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.S;
-            msg.Tag = this.vehicle.CurrentTag.ToString("0000");
+
+            if ( this.vehicle.CurrentTag < 0 )
+                msg.Tag = 0.ToString( "0000" );
+            else
+                msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
+
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
@@ -552,9 +591,10 @@ namespace VehicleControlSystem.Managers
             msg.Kind = eKind.B;
             var bData = volt;
             msg.Tag = bData.ToString( "00.00" ).Replace( ".", "" );
-            msg.IsSubCode1 = this.vehicle.IsContain;
-            msg.IsSubCode2 = vehicle.IsMoving;
-            msg.IsSubCode3 = vehicle.IsError;
+            msg.SubCode = this.vehicle.BatteryStateOfCharge.ToString( "000" );
+            //msg.IsSubCode1 = this.vehicle.IsContain;
+            //msg.IsSubCode2 = vehicle.IsMoving;
+            //msg.IsSubCode3 = vehicle.IsError;
 
             this.manager.Send( msg );
         }

+ 55 - 28
Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs

@@ -160,53 +160,72 @@ namespace VehicleControlSystem.Managers
 
 
         int copyTarget = 0;
-
+        bool isSTK = false;
         void DryRunTest()
         {
             if ( !IsCreateDryRunCommand )
                 return;
 
-            if ( this.bMUManager.ReceivedDataDic[eDataKind.SOC].Value <= 10 )
+            if ( this.bMUManager.ReceivedDataDic[eDataKind.SOC].Value <= 30 )
             {
-                //var targetPoint = "2";
-                //Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Charging };
-                //cmd.ByWho = eCommandByWho.LocalSystem;
+                var chargePoint = "2";
+                Command chageCmd = new Command() { TargetID = chargePoint, Type = eCommandType.Charging };
+                chageCmd.ByWho = eCommandByWho.LocalSystem;
 
-                //this.AddCommand( cmd );
+                this.AddCommand( chageCmd );
 
                 this.IsCreateDryRunCommand = false;
                 return;
             }
 
-            var ram = NumUtils.Random( 0, RouteManager.Instance.Equipments.Count - 1 );
-            if ( ram == this.copyTarget )
-                return;
+            string targetPoint = string.Empty;
+            if ( isSTK )
+            {
+                targetPoint = RouteManager.Instance.Equipments.Where( x => x.Name.Equals( "CAN_STATION_IP01" ) ).SingleOrDefault().pointID.ToString();
+                isSTK = false;
+            }
             else
             {
-                var target = RouteManager.Instance.Equipments[ram];
-                this.copyTarget = ram;
+                targetPoint = RouteManager.Instance.Equipments.Where( x => x.Name.Equals( "STOKER_LIFT_IP01" ) ).SingleOrDefault().pointID.ToString();
+                isSTK = true;
+            }
 
-                var targetPoint = target.pointID.ToString();
-                Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Move };
-                cmd.ByWho = eCommandByWho.LocalSystem;
+            Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Move };
+            cmd.ByWho = eCommandByWho.LocalSystem;
 
-                this.AddCommand( cmd );
-                LockUtils.Wait( 2500 );
+            this.AddCommand( cmd );
+            LockUtils.Wait( 2500 );
 
-                //if ( ( target.Name.Equals( "CHARGING_02" ) ) || ( target.Name.Equals( "STOKER_LIFT_IP01" ) ) ||
-                //    ( target.Name.Equals( "STOKER_LIFT_OP01" ) ) || ( target.Name.Equals( "WORK_STATION_IP01" ) ) ||
-                //    ( target.Name.Equals( "WORK_STATION_OP01" ) ) )
-                //{
-                //    this.copyTarget = ram;
 
-                //    var targetPoint = target.pointID.ToString();
-                //    Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Move };
-                //    cmd.ByWho = eCommandByWho.LocalSystem;
+            //var ram = NumUtils.Random( 0, RouteManager.Instance.Equipments.Count - 1 );
+            //if ( ram == this.copyTarget )
+            //    return;
+            //else
+            //{
+            //    var target = RouteManager.Instance.Equipments[ram];
+            //    this.copyTarget = ram;
 
-                //    this.AddCommand( cmd );
-                //    LockUtils.Wait( 2000 );
-                //}
-            }
+            //    var targetPoint = target.pointID.ToString();
+            //    Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Move };
+            //    cmd.ByWho = eCommandByWho.LocalSystem;
+
+            //    this.AddCommand( cmd );
+            //    LockUtils.Wait( 2500 );
+
+            //    //if ( ( target.Name.Equals( "CHARGING_02" ) ) || ( target.Name.Equals( "STOKER_LIFT_IP01" ) ) ||
+            //    //    ( target.Name.Equals( "STOKER_LIFT_OP01" ) ) || ( target.Name.Equals( "WORK_STATION_IP01" ) ) ||
+            //    //    ( target.Name.Equals( "WORK_STATION_OP01" ) ) )
+            //    //{
+            //    //    this.copyTarget = ram;
+
+            //    //    var targetPoint = target.pointID.ToString();
+            //    //    Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Move };
+            //    //    cmd.ByWho = eCommandByWho.LocalSystem;
+
+            //    //    this.AddCommand( cmd );
+            //    //    LockUtils.Wait( 2000 );
+            //    //}
+            //}
         }
 
         private void DoWork( Command cmd )
@@ -222,6 +241,7 @@ namespace VehicleControlSystem.Managers
                             case OHV.Common.Shareds.eCommandType.MoveNLoad:
                             case OHV.Common.Shareds.eCommandType.MoveNUnload:
                             case OHV.Common.Shareds.eCommandType.Charging:
+                            case eCommandType.Cancel:
                                 CreateSubCommand( cmd, eSubCommandType.Move );
                                 break;
                             default:
@@ -291,6 +311,11 @@ namespace VehicleControlSystem.Managers
             }
         }
 
+        private void CommandCancel( Command cmd )
+        {
+            
+        }
+
         private bool CreateSubCommand( Command cmd, eSubCommandType type )
         {
             //명령을 만들기 전에 Vehicle 의 상태를 확인하여 만들자.
@@ -304,6 +329,8 @@ namespace VehicleControlSystem.Managers
                     break;
                 case eSubCommandType.Charge:
                     break;
+                case eSubCommandType.Cancel:
+                    break;
                 default:
                     break;
             }

+ 12 - 0
Dev/OHV/VehicleControlSystem/VCSystem.cs.rej

@@ -0,0 +1,12 @@
+diff a/Dev/OHV/VehicleControlSystem/VCSystem.cs b/Dev/OHV/VehicleControlSystem/VCSystem.cs	(rejected hunks)
+@@ -120,6 +120,10 @@
+ <<<<<<< HEAD
+             this.autoManager = new AutoManager( this.IO, this.eventAggregator, this.sql );
+             this.scheduler = new Scheduler( eventAggregator, this.autoManager, this.sql, this.bMUManager );
++=======
++            this.autoManager = new AutoManager( this.IO, this.eventAggregator, this.sql, this.Alarms );
++            this.scheduler = new Scheduler( eventAggregator, this.autoManager, this.sql );
++>>>>>>> 40833c20f413059976af5288d531c63e4acb93d8
+ 
+             this.vehicle = new Vehicle( refObject, this.IO, this.sql, this.eventAggregator, this.autoManager );
+             this.vehicle.PropertyChanged += Vehicle_PropertyChanged;

TEMPAT SAMPAH
Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide


TEMPAT SAMPAH
Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide-shm


TEMPAT SAMPAH
Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide-wal


+ 2 - 2
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/App.config

@@ -5,8 +5,8 @@
     </startup>
 
 	<appSettings>
-		<add key="VehicleID" value="V01"/>
-		<add key="FTPUploadIP" value="192.168.127.123"/>
+		<add key="VehicleID" value="V02"/>
+		<add key="FTPUploadIP" value="192.168.127.200"/>
 		<add key="PLC_IP" value="192.168.0.20"/>
 		<add key="PLC_PORT" value="5000"/>
 	</appSettings>

+ 20 - 17
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/Config/log4net.xml

@@ -3,7 +3,7 @@
 	<root name="root">
 		<level value="ALL" />
 		<appender-ref ref="FileAppender" />
-    <!--<appender-ref ref="remotingAppender"/>-->
+		<!--<appender-ref ref="remotingAppender"/>-->
 	</root>
 
 	<logger name="PhysicalCheckup_Front" additivity="false">
@@ -24,27 +24,28 @@
 	•FATAL  •FATAL  •FATAL  •FATAL  •FATAL  •FATAL
 	•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF
 	-->
-  <appender name="remotingAppender" type="log4net.Appender.RemotingAppender">
-    <!-- The remoting URL to the remoting server object -->
-    <sink value="tcp://172.20.0.198:8085/Log4netRemotingServerService"/>
-    <!-- Send all events, do not discard events when the buffer is full -->
-    <lossy value="false"/>
-    <!-- The number of events to buffer before sending -->
-    <bufferSize value="10"/>
-    <!-- Do not store event data that is slow to generate -->
-    <onlyFixPartialEventData value="true"/>
-    <!-- Specify an evaluator to send the events immediately under certain conditions, e.g. when an error event ocurrs -->
-    <!--<evaluator type="log4net.Core.LevelEvaluator">
+	<appender name="remotingAppender" type="log4net.Appender.RemotingAppender">
+		<!-- The remoting URL to the remoting server object -->
+		<sink value="tcp://172.20.0.198:8085/Log4netRemotingServerService"/>
+		<!-- Send all events, do not discard events when the buffer is full -->
+		<lossy value="false"/>
+		<!-- The number of events to buffer before sending -->
+		<bufferSize value="10"/>
+		<!-- Do not store event data that is slow to generate -->
+		<onlyFixPartialEventData value="true"/>
+		<!-- Specify an evaluator to send the events immediately under certain conditions, e.g. when an error event ocurrs -->
+		<!--<evaluator type="log4net.Core.LevelEvaluator">
 			<threshold value="WARN"/>
 		</evaluator>-->
-  </appender>
+	</appender>
 
-  <appender name="Front_BufferingForwarder" type="log4net.Appender.BufferingForwardingAppender">
+	<appender name="Front_BufferingForwarder" type="log4net.Appender.BufferingForwardingAppender">
 		<bufferSize value="512"/>
 		<lossy value="false"/>
 		<Fix value ="268"/>
 		<appender-ref ref="PhysicalCheckupFileAppender_Front"/>
 	</appender>
+
 	<appender name="Rear_BufferingForwarder" type="log4net.Appender.BufferingForwardingAppender">
 		<bufferSize value="512"/>
 		<lossy value="false"/>
@@ -95,10 +96,11 @@
 	</appender>
 
 	<appender name="DebugFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<filter type="log4net.Filter.LevelRangeFilter">
+		<threshold value="DEBUG"/>
+		<!--<filter type="log4net.Filter.LevelRangeFilter">
 			<param name="LevelMin" value="DEBUG"></param>
 			<param name="LevelMax" value="DEBUG"></param>
-		</filter>
+		</filter>-->
 		<threshold value="DEBUG"/>
 		<file value="C:\LOG\OHV\DEBUG\Vehicle_DEBUG.log" />
 		<appendToFile value="true" />
@@ -111,7 +113,8 @@
 	</appender>
 
 	<appender name="WarnFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<threshold value="WARN"/>
+		<param name="LevelMin" value="WARN"></param>
+		<param name="LevelMax" value="FATAL"></param>
 		<file value="C:\LOG\OHV\Vehicle\Vehicle_WARN.log" />
 		<appendToFile value="true" />
 		<rollingStyle value="Date" />

+ 11 - 3
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FormMain.cs

@@ -117,10 +117,18 @@ namespace OHVDriveLogger
         {
             while ( !this.threadCancel.Canceled )
             {
-                LockUtils.Wait( 20 );
+                try
+                {
+                    LockUtils.Wait( 100 );
+
+                    if ( this.zmq.IsDriveMoving )
+                        this.LoggingStart();
 
-                if ( this.zmq.IsDriveMoving )
-                    this.LoggingStart();
+                }
+                catch ( Exception ex )
+                {
+                    logger.E( ex.StackTrace );
+                }
             }
         }
 

+ 1 - 1
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger.csproj

@@ -43,7 +43,7 @@
     <Prefer32Bit>true</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'RRmode|AnyCPU'">
-    <OutputPath>\\192.168.127.10\DriveLogger\</OutputPath>
+    <OutputPath>\\192.168.127.20\DriveLogger\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
     <DebugType>pdbonly</DebugType>