SK.Kang 6 лет назад
Родитель
Сommit
56cf2f19c2

+ 15 - 1
Dev/Connection/OHVProtocolServer/OHVConnector/Manager.cs

@@ -382,7 +382,7 @@ namespace OHVConnector
         void _OnRecd(OCSMessage recd)
         void _OnRecd(OCSMessage recd)
         {
         {
             //Alive Check Reply
             //Alive Check Reply
-            if (recd.Kind == eKind.A && !ModeActive)
+            if (recd.Kind == eKind.A && !ModeActive) //자동으로 응답을 보낸다. OCS 가 Active 상태
             {
             {
                 var reply = new OCSMessage()
                 var reply = new OCSMessage()
                 {
                 {
@@ -397,6 +397,12 @@ namespace OHVConnector
                 return;
                 return;
             }
             }
 
 
+            if ( recd.Kind == eKind.C )
+            {
+                this.qQ.Enqueue( new QoRecd { Arg0 = recd } );
+                return;
+            }
+
             //Send 한 Message 의 Reply 로 판단.
             //Send 한 Message 의 Reply 로 판단.
             if (this.quzT3.HasId(recd.CheckSum))
             if (this.quzT3.HasId(recd.CheckSum))
             {
             {
@@ -486,6 +492,12 @@ namespace OHVConnector
             msg.RevID = Config.HostID;
             msg.RevID = Config.HostID;
             msg.SendID = Config.ID;
             msg.SendID = Config.ID;
 
 
+
+            if ( msg.Kind == eKind.C ) // Control Message 는 페어로 응답이 오지 않는다.
+            {
+                qqW.Enqueue( msg );
+            }
+
             if (this.quzT3.HasId(msg.GetCheckSum()))
             if (this.quzT3.HasId(msg.GetCheckSum()))
             {
             {
                 _OnLog("quzT3 Has ID" + msg.LogFormat());
                 _OnLog("quzT3 Has ID" + msg.LogFormat());
@@ -523,6 +535,8 @@ namespace OHVConnector
                 _OnLog("Reply fail not connected" + msg.LogFormat());
                 _OnLog("Reply fail not connected" + msg.LogFormat());
                 return;
                 return;
             }
             }
+            msg.RevID = Config.HostID;
+            msg.SendID = Config.ID;
 
 
             qqW.Enqueue(msg);
             qqW.Enqueue(msg);
         }
         }

+ 43 - 24
Dev/Connection/OHVProtocolServer/OHVConnector/OCSMessage.cs

@@ -56,18 +56,37 @@ namespace OHVConnector
             return $"{this.Id} - {this.RevID} <- {this.SendID} : kind [{this.Kind.ToString()}] / Tag [{this.Tag}] / SubCode [{this.SubCode}]";
             return $"{this.Id} - {this.RevID} <- {this.SendID} : kind [{this.Kind.ToString()}] / Tag [{this.Tag}] / SubCode [{this.SubCode}]";
         }
         }
 
 
+        public int SubCodeToInt()
+        {
+            int result = 0;
+
+            if ( string.IsNullOrEmpty( this.SubCode ) )
+            {
+                StringBuilder sb = new StringBuilder();
+                sb.Append( this.IsSubCode1 ? "1" : "0" );
+                sb.Append( this.IsSubCode2 ? "1" : "0" );
+                sb.Append( this.IsSubCode3 ? "1" : "0" );
+
+                int.TryParse( sb.ToString(), out result );
+            }
+            else
+                int.TryParse( this.SubCode, out result );
+
+            return result;
+        }
+
         string MakeSubcode()
         string MakeSubcode()
         {
         {
-            if ( this.Kind == eKind.A)
+            if ( !string.IsNullOrEmpty(this.SubCode) )
             {
             {
                 return this.SubCode;
                 return this.SubCode;
             }
             }
             else
             else
             {
             {
                 StringBuilder sb = new StringBuilder();
                 StringBuilder sb = new StringBuilder();
-                sb.Append(this.IsSubCode1 ? "1" : "0");
-                sb.Append(this.IsSubCode2 ? "1" : "0");
-                sb.Append(this.IsSubCode3 ? "1" : "0");
+                sb.Append( this.IsSubCode1 ? "1" : "0" );
+                sb.Append( this.IsSubCode2 ? "1" : "0" );
+                sb.Append( this.IsSubCode3 ? "1" : "0" );
 
 
                 return this.SubCode = sb.ToString();
                 return this.SubCode = sb.ToString();
             }
             }
@@ -76,39 +95,39 @@ namespace OHVConnector
         public MemoryBuffer ToMemoryBuffer()
         public MemoryBuffer ToMemoryBuffer()
         {
         {
             var mb = new MemoryBuffer();
             var mb = new MemoryBuffer();
-            mb.Append(STX);
-            mb.AppendAscii(RevID);
-            mb.AppendAscii(SendID);
-            mb.AppendAscii(this.Kind.ToString());
-            mb.AppendAscii(this.Tag);
-            mb.AppendAscii(MakeSubcode());
-            mb.Append(GetCheckSum(mb.ToBytes));
-            mb.Append(ETX);
+            mb.Append( STX );
+            mb.AppendAscii( RevID );
+            mb.AppendAscii( SendID );
+            mb.AppendAscii( this.Kind.ToString() );
+            mb.AppendAscii( this.Tag );
+            mb.AppendAscii( MakeSubcode() );
+            mb.Append( GetCheckSum( mb.ToBytes ) );
+            mb.Append( ETX );
 
 
             return mb;
             return mb;
         }
         }
 
 
         public byte GetCheckSum()
         public byte GetCheckSum()
         {
         {
-            var mb = new MemoryBuffer(18);
-            mb.Append(STX);
-            mb.AppendAscii(RevID);
-            mb.AppendAscii(SendID);
-            mb.AppendAscii(this.Kind.ToString());
-            mb.AppendAscii(this.Tag);
-            mb.AppendAscii(MakeSubcode());
-
-            return GetCheckSum(mb.ToBytes);
+            var mb = new MemoryBuffer( 18 );
+            mb.Append( STX );
+            mb.AppendAscii( RevID );
+            mb.AppendAscii( SendID );
+            mb.AppendAscii( this.Kind.ToString() );
+            mb.AppendAscii( this.Tag );
+            mb.AppendAscii( MakeSubcode() );
+
+            return GetCheckSum( mb.ToBytes );
         }
         }
 
 
-        byte GetCheckSum(byte[] bs)
+        byte GetCheckSum( byte[] bs )
         {
         {
             byte rb = 0;
             byte rb = 0;
-            foreach( var item in bs)
+            foreach ( var item in bs )
             {
             {
                 rb += item;
                 rb += item;
             }
             }
-            return (byte)(rb & 0xff);
+            return (byte)( rb & 0xff );
         }
         }
     }
     }
 }
 }

+ 16 - 3
Dev/Connection/OHVProtocolServer/OHVProtocolClient/MainWindow.xaml

@@ -1,13 +1,26 @@
-<Window x:Class="OHVProtocolClient.MainWindow"
+<Window
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:OHVProtocolClient"
         xmlns:local="clr-namespace:OHVProtocolClient"
+        xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:OHVConnector="clr-namespace:OHVConnector;assembly=OHVConnector" x:Class="OHVProtocolClient.MainWindow"
         mc:Ignorable="d"
         mc:Ignorable="d"
         Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
         Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
+    <Window.Resources>
+        <ObjectDataProvider x:Key="MessageKind" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
+            <ObjectDataProvider.MethodParameters>
+                <x:Type TypeName="OHVConnector:eKind"/>
+            </ObjectDataProvider.MethodParameters>
+        </ObjectDataProvider>
+    </Window.Resources>
     <Grid>
     <Grid>
-        <Label x:Name="lblState" Content="Connection State" Background="Gray" Height="25" Width="110" Margin="10,10,672,379"></Label>
-        <Button Content="Button" HorizontalAlignment="Left" Height="26" Margin="10,42,0,0" VerticalAlignment="Top" Width="110"/>
+        <Label x:Name="lblState" Content="Connection State" Background="Gray" Height="25" Width="110" Margin="10,10,672,379"/>
+        <Button x:Name="btnSend" Content="Alive" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="10,60,0,0" Click="btnSend_Click"/>
+        <TextBox x:Name="txtTag" HorizontalAlignment="Left" Height="22" Margin="139,88,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
+        <Button Content="Send" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="395,88,0,0" Click="Button_Click" Height="22"/>
+        <TextBox x:Name="txtSubCode" HorizontalAlignment="Left" Height="22" Margin="267,88,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
+        <ComboBox HorizontalAlignment="Left" Margin="10,88,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Source={StaticResource MessageKind}}" x:Name="comboMessageKind"/>
+
     </Grid>
     </Grid>
 </Window>
 </Window>

+ 67 - 9
Dev/Connection/OHVProtocolServer/OHVProtocolClient/MainWindow.xaml.cs

@@ -13,6 +13,7 @@ using System.Windows.Media.Imaging;
 using System.Windows.Navigation;
 using System.Windows.Navigation;
 using System.Windows.Shapes;
 using System.Windows.Shapes;
 using GSG.NET.Logging;
 using GSG.NET.Logging;
+using GSG.NET.Quartz;
 using OHVConnector;
 using OHVConnector;
 
 
 namespace OHVProtocolClient
 namespace OHVProtocolClient
@@ -24,6 +25,8 @@ namespace OHVProtocolClient
     {
     {
         static Logger logger = Logger.GetLogger("Client");
         static Logger logger = Logger.GetLogger("Client");
 
 
+        Manager manager = null;
+
         public MainWindow()
         public MainWindow()
         {
         {
             InitializeComponent();
             InitializeComponent();
@@ -34,16 +37,19 @@ namespace OHVProtocolClient
             string basePath = AppDomain.CurrentDomain.BaseDirectory;
             string basePath = AppDomain.CurrentDomain.BaseDirectory;
             LogUtils.Configure(basePath + "/log4net.xml");
             LogUtils.Configure(basePath + "/log4net.xml");
 
 
-            var cn = new Manager();
-            cn.Config = new Config() { ID = "V0001" };
-            cn.Connect(true);
+            QuartzUtils.Init( 10 );
+
+            manager = new Manager();
+            manager.Config = new Config() { ID = "S0", HostID="V0001" };
+            manager.Connect(true);
+
+            manager.OnRecd += Cn_OnRecd;
+            manager.OnContd += Cn_OnContd;
+            manager.OnDiscontd += Cn_OnDiscontd;
+            manager.OnLog += Cn_OnLog;
+            manager.OnT3Timeout += Cn_OnT3Timeout;
+            manager.OnSent += Cn_OnSent;
 
 
-            cn.OnRecd += Cn_OnRecd;
-            cn.OnContd += Cn_OnContd;
-            cn.OnDiscontd += Cn_OnDiscontd;
-            cn.OnLog += Cn_OnLog;
-            cn.OnT3Timeout += Cn_OnT3Timeout;
-            cn.OnSent += Cn_OnSent;
         }
         }
 
 
         private void Cn_OnSent(OCSMessage msg)
         private void Cn_OnSent(OCSMessage msg)
@@ -64,16 +70,68 @@ namespace OHVProtocolClient
         private void Cn_OnDiscontd(string id, Exception e)
         private void Cn_OnDiscontd(string id, Exception e)
         {
         {
             this.lblState.Background = Brushes.Gray;
             this.lblState.Background = Brushes.Gray;
+
+            QuartzUtils.StopSchedule( "Scode" );
         }
         }
 
 
         private void Cn_OnContd(string id)
         private void Cn_OnContd(string id)
         {
         {
            this.lblState.Background = Brushes.Green;
            this.lblState.Background = Brushes.Green;
+
+            QuartzUtils.Invoke( "Scode", QuartzUtils.GetExpnMinute( 3 ), RequestScode );
+
+            RequestBcode();
         }
         }
 
 
         private void Cn_OnRecd(OCSMessage msg)
         private void Cn_OnRecd(OCSMessage msg)
         {
         {
             logger.I("[Received] : " + msg.LogFormat());
             logger.I("[Received] : " + msg.LogFormat());
         }
         }
+
+        void RequestScode()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.R;
+            msg.Tag = "0000";
+            msg.SubCode = "100";
+
+            this.manager.Send( msg );
+        }
+
+        void RequestBcode()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.R;
+            msg.Tag = "0000";
+            msg.SubCode = "010";
+
+            this.manager.Send( msg );
+        }
+
+        private void btnSend_Click( object sender, RoutedEventArgs e )
+        {
+            var om = new OCSMessage();
+            om.Id = "S0";
+            om.Kind = eKind.A;
+            //om.RevID = "V0001";
+            //om.SendID = om.Id;
+            om.Tag = DateTime.Now.ToString( "mmss" );
+            om.SubCode = DateTime.Now.ToString( "fff" );
+
+            this.manager.Send( om );
+        }
+
+        private void Button_Click( object sender, RoutedEventArgs e )
+        {
+            OCSMessage meg = new OCSMessage();
+            meg.RevID = "V0001";
+            meg.SendID = "A0";
+            meg.Kind = (eKind)Enum.ToObject( typeof( eKind ), this.comboMessageKind.SelectedItem );
+            meg.Tag = this.txtTag.Text;
+            meg.SubCode = this.txtSubCode.Text;
+
+            this.manager.Send( meg );
+        }
+
     }
     }
 }
 }

+ 4 - 0
Dev/Connection/OHVProtocolServer/OHVProtocolClient/OHVProtocolClient.csproj

@@ -34,6 +34,10 @@
     <WarningLevel>4</WarningLevel>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
+    <Reference Include="Quartz, Version=1.0.3.2, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\OHV\Assambly\Quartz.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System" />
     <Reference Include="System.Data" />
     <Reference Include="System.Data" />
     <Reference Include="System.Xml" />
     <Reference Include="System.Xml" />

+ 1 - 1
Dev/Connection/OHVProtocolServer/OHVProtocolClient/log4net.xml

@@ -54,7 +54,7 @@
 	</appender>-->
 	</appender>-->
 
 
 	<appender name="ClientAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
 	<appender name="ClientAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<file value="D:\LOG\OHV\Vehicle\Client.log" />
+		<file value="D:\LOG\OHV\OCS_Simulation\Client.log" />
 		<appendToFile value="true" />
 		<appendToFile value="true" />
 		<rollingStyle value="Date" />
 		<rollingStyle value="Date" />
 		<backupDays value="180" />
 		<backupDays value="180" />

BIN
Dev/OHV/Assambly/OHVConnector.dll


BIN
Dev/OHV/Assambly/OHVConnector.pdb


+ 2 - 1
Dev/OHV/OHV.Common/Model/Command.cs

@@ -19,7 +19,8 @@ namespace OHV.Common.Model
         /// <summary>
         /// <summary>
         /// 두번째 명령을 주었음을 확인 위해.
         /// 두번째 명령을 주었음을 확인 위해.
         /// </summary>
         /// </summary>
-        public virtual bool IsSecondCommanded { get; set; }
+        public bool IsSecondCommanded { get; set; }
+
         public virtual bool IsSelected { get; set; }
         public virtual bool IsSelected { get; set; }
 
 
         public Command()
         public Command()

+ 4 - 0
Dev/OHV/OHV.Common/Model/Route.cs

@@ -37,6 +37,10 @@ namespace OHV.Common.Model
         public double ScaleValue { get; set; }
         public double ScaleValue { get; set; }
         public double ScaleTolerance { get; set; }
         public double ScaleTolerance { get; set; }
         public bool UsePIO { get; set; }
         public bool UsePIO { get; set; }
+        /// <summary>
+        /// OCS 와 매칭 아이디.
+        /// </summary>
+        public string OCSMatchID { get; set; }
         public virtual bool IsSelected { get; set; }
         public virtual bool IsSelected { get; set; }
 
 
     }
     }

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

@@ -108,6 +108,7 @@
 		Axis,
 		Axis,
 		Cylinder,
 		Cylinder,
 		Drive,
 		Drive,
+		IO,
 	}
 	}
 
 
 	public enum eBuzzerKind
 	public enum eBuzzerKind

+ 4 - 0
Dev/OHV/OHV.Module.ListViews/OHV.Module.ListViews.csproj

@@ -126,6 +126,10 @@
       <Project>{0d1f7fbc-bfb0-4ee4-852d-e2a8d62c5708}</Project>
       <Project>{0d1f7fbc-bfb0-4ee4-852d-e2a8d62c5708}</Project>
       <Name>OHV.Common</Name>
       <Name>OHV.Common</Name>
     </ProjectReference>
     </ProjectReference>
+    <ProjectReference Include="..\OHV.Module.Interactivity\OHV.Module.Interactivity.csproj">
+      <Project>{d6402d97-2206-4d55-8097-8da9a01568cb}</Project>
+      <Name>OHV.Module.Interactivity</Name>
+    </ProjectReference>
     <ProjectReference Include="..\OHV.SqliteDAL\OHV.SqliteDAL.csproj">
     <ProjectReference Include="..\OHV.SqliteDAL\OHV.SqliteDAL.csproj">
       <Project>{122d81c8-9ab9-4ced-80d2-9c4f2f9deb4c}</Project>
       <Project>{122d81c8-9ab9-4ced-80d2-9c4f2f9deb4c}</Project>
       <Name>OHV.SqliteDAL</Name>
       <Name>OHV.SqliteDAL</Name>

+ 10 - 2
Dev/OHV/OHV.Module.ListViews/Views/CommandListViewModel.cs

@@ -9,6 +9,7 @@ using System.Windows.Input;
 using OHV.Common.Events;
 using OHV.Common.Events;
 using OHV.Common.Model;
 using OHV.Common.Model;
 using OHV.Common.Shareds;
 using OHV.Common.Shareds;
+using OHV.Module.Interactivity;
 using OHV.SqliteDAL;
 using OHV.SqliteDAL;
 using Prism.Commands;
 using Prism.Commands;
 using Prism.Events;
 using Prism.Events;
@@ -55,10 +56,12 @@ namespace OHV.Module.ListViews.Views
 
 
         IEventAggregator eventAggregator;
         IEventAggregator eventAggregator;
         SqliteManager sql;
         SqliteManager sql;
+        MessageController messageController;
 
 
-        public CommandListViewModel(IEventAggregator ea, SqliteManager sql)
+        public CommandListViewModel(IEventAggregator ea, SqliteManager sql, MessageController msgController )
         {
         {
             this.eventAggregator = ea;
             this.eventAggregator = ea;
+            this.messageController = msgController;
             this.sql = sql;
             this.sql = sql;
             this.sql.CommandDAL.ChangedProperty += this.RefreshCommandLIst;
             this.sql.CommandDAL.ChangedProperty += this.RefreshCommandLIst;
 
 
@@ -97,7 +100,12 @@ namespace OHV.Module.ListViews.Views
         private void ExecuteSaveCommand()
         private void ExecuteSaveCommand()
         {
         {
             Command cmd = new Command() { TargetID = TargetID, Type = SelectedCommandType };
             Command cmd = new Command() { TargetID = TargetID, Type = SelectedCommandType };
-            sql.CommandDAL.Add(cmd);
+
+            var route = sql.RouteDal.GetRoute( TargetID );
+            if (route ==null )
+                messageController.ShowNotificationView( "Not Found TargetID" );
+            else
+                sql.CommandDAL.Add(cmd);
 
 
             this.TargetID = "None";
             this.TargetID = "None";
             this.SelectedCommandType = eCommandType.Move;
             this.SelectedCommandType = eCommandType.Move;

+ 24 - 14
Dev/OHV/OHV.SqliteDAL/OHVDbInitializer.cs

@@ -9,15 +9,15 @@ namespace OHV.SqliteDAL
 {
 {
     public class OHVDbInitializer : SqliteDropCreateDatabaseWhenModelChanges<OHVDbContext>
     public class OHVDbInitializer : SqliteDropCreateDatabaseWhenModelChanges<OHVDbContext>
     {
     {
-        public OHVDbInitializer(DbModelBuilder modelBuilder) : base(modelBuilder, typeof(CustomHistory))
+        public OHVDbInitializer( DbModelBuilder modelBuilder ) : base( modelBuilder, typeof( CustomHistory ) )
         {
         {
         }
         }
 
 
-        protected override void Seed(OHVDbContext context)
+        protected override void Seed( OHVDbContext context )
         {
         {
             //base.Seed( context );
             //base.Seed( context );
             // Here you can seed your core data if you have any.
             // Here you can seed your core data if you have any.
-            context.Set<Config>().AddRange(new List<Config>()
+            context.Set<Config>().AddRange( new List<Config>()
             {
             {
                 new Config
                 new Config
                 {
                 {
@@ -51,12 +51,12 @@ namespace OHV.SqliteDAL
                     Desc = "OCS ID",
                     Desc = "OCS ID",
                     EditTime = DateTime.Now
                     EditTime = DateTime.Now
                 },
                 },
-            });
+            } );
 
 
-            context.Set<AxisPositionData>().AddRange(new List<AxisPositionData>()
-            { 
+            context.Set<AxisPositionData>().AddRange( new List<AxisPositionData>()
+            {
                 new AxisPositionData
                 new AxisPositionData
-                { 
+                {
                     AxisName = ConstString.AXIS_CARRIER_LOCK_LEFT,
                     AxisName = ConstString.AXIS_CARRIER_LOCK_LEFT,
                     Name = ConstString.TEACH_POSITION_LOCK,
                     Name = ConstString.TEACH_POSITION_LOCK,
                 },
                 },
@@ -75,9 +75,9 @@ namespace OHV.SqliteDAL
                     AxisName = ConstString.AXIS_CARRIER_LOCK_RIGHT,
                     AxisName = ConstString.AXIS_CARRIER_LOCK_RIGHT,
                     Name = ConstString.TEACH_POSITION_UNLOCK,
                     Name = ConstString.TEACH_POSITION_UNLOCK,
                 },
                 },
-            });
+            } );
 
 
-            context.Set<AxisVelocityData>().AddRange(new List<AxisVelocityData>()
+            context.Set<AxisVelocityData>().AddRange( new List<AxisVelocityData>()
             {
             {
                 new AxisVelocityData
                 new AxisVelocityData
                 {
                 {
@@ -102,9 +102,9 @@ namespace OHV.SqliteDAL
                     JogSlow = 2,
                     JogSlow = 2,
                     Tolerance = 1,
                     Tolerance = 1,
                 },
                 },
-            });
+            } );
 
 
-            context.Set<AxisConfig>().AddRange(new List<AxisConfig>()
+            context.Set<AxisConfig>().AddRange( new List<AxisConfig>()
             {
             {
                 new AxisConfig
                 new AxisConfig
                 {
                 {
@@ -118,12 +118,22 @@ namespace OHV.SqliteDAL
                     Scale = 0.001,
                     Scale = 0.001,
                     Address = "100.100.100.21",
                     Address = "100.100.100.21",
                 }
                 }
-            });
+            } );
 
 
-            context.Set<Alarm>().Add(new Alarm { AlarmId = 1, Kind = eAlarmKind.Axis, Name = "adfsdfds", Level = eAlarmLevel.Falut, });
+            context.Set<Alarm>().Add( new Alarm { AlarmId = 1, Kind = eAlarmKind.Axis, Name = "adfsdfds", Level = eAlarmLevel.Falut, } );
 
 
             //context.Set<HisAlarm>().Add(new HisAlarm { AlarmId = 1, OccurTime = DateTime.Now.AddDays(-10) });
             //context.Set<HisAlarm>().Add(new HisAlarm { AlarmId = 1, OccurTime = DateTime.Now.AddDays(-10) });
-            context.Set<Route>().Add(new Route { Id = 1, Name = "P01", PrePoint = "P00", NextPoint = "P02", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, UsePIO = true });
+            context.Set<Route>().Add( new Route { Id = 1, Name = "P01", PrePoint = "P11", NextPoint = "P02", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1000", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 2, Name = "P02", PrePoint = "P01", NextPoint = "P03", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1001", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 3, Name = "P03", PrePoint = "P02", NextPoint = "P04", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1002", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 4, Name = "P04", PrePoint = "P03", NextPoint = "P05", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1003", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 5, Name = "P05", PrePoint = "P04", NextPoint = "P06", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1004", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 6, Name = "P06", PrePoint = "P05", NextPoint = "P07", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1005", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 7, Name = "P07", PrePoint = "P06", NextPoint = "P08", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1006", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 8, Name = "P08", PrePoint = "P07", NextPoint = "P09", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1007", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 9, Name = "P09", PrePoint = "P08", NextPoint = "P10", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1008", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 10, Name = "P10", PrePoint = "P09", NextPoint = "P11", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1009", UsePIO = true } );
+            context.Set<Route>().Add( new Route { Id = 11, Name = "P11", PrePoint = "P10", NextPoint = "P01", ScaleTolerance = 0.5, Form = eRoadForm.Straight, ScaleValue = 0.0, Type = ePointType.LoadPort, OCSMatchID = "1010", UsePIO = true } );
         }
         }
     }
     }
 }
 }

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

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

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

@@ -1,6 +1,7 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using FluentResults;
 using FluentResults;
 using GSG.NET.Concurrent;
 using GSG.NET.Concurrent;
@@ -321,6 +322,9 @@ namespace VehicleControlSystem.ControlLayer
         /// <returns></returns>
         /// <returns></returns>
         public int Lock_Sync()
         public int Lock_Sync()
         {
         {
+#if SIMULATION
+            Thread.Sleep(2000);
+#else
             int result = 0;
             int result = 0;
 
 
             result = this.IsAllAxisOriginReturn();
             result = this.IsAllAxisOriginReturn();
@@ -350,6 +354,7 @@ namespace VehicleControlSystem.ControlLayer
             result = right.Wait4Done();
             result = right.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
             if (result != EziMOTIONPlusELib.FMM_OK)
                 return 1;
                 return 1;
+#endif
 
 
             return EziMOTIONPlusELib.FMM_OK;
             return EziMOTIONPlusELib.FMM_OK;
         }
         }
@@ -360,6 +365,9 @@ namespace VehicleControlSystem.ControlLayer
         /// <returns></returns>
         /// <returns></returns>
         public int Unlock_Sync()
         public int Unlock_Sync()
         {
         {
+#if SIMULATION
+            Thread.Sleep(2000);
+#else
             int result = 0;
             int result = 0;
 
 
             result = this.IsAllAxisOriginReturn();
             result = this.IsAllAxisOriginReturn();
@@ -389,7 +397,7 @@ namespace VehicleControlSystem.ControlLayer
             result = right.Wait4Done();
             result = right.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
             if (result != EziMOTIONPlusELib.FMM_OK)
                 return 4;
                 return 4;
-
+#endif
 
 
             return EziMOTIONPlusELib.FMM_OK;
             return EziMOTIONPlusELib.FMM_OK;
         }
         }

+ 0 - 258
Dev/OHV/VehicleControlSystem/ControlLayer/Conveyor.cs

@@ -1,258 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using GSG.NET.Logging;
-using GSG.NET.Utils;
-using GSG.NET.LINQ;
-using VehicleControlSystem.ControlLayer.IO;
-
-namespace VehicleControlSystem.ControlLayer
-{
-    public class Conveyor :ControlObjectBase
-    {
-        static Logger loggerPIO = Logger.GetLogger("PIO");
-        IIO iO = null;
-        Vehicle vehicle = null;
-
-        public Conveyor(IIO io, Vehicle vehicle)
-        {
-            this.iO = io;
-            this.vehicle = vehicle;
-        }
-
-        int OnOffConveyor(bool isOn, bool isCW = false)
-        {
-            if (IsInverterError())
-                return 16;
-
-            if (isCW)
-                this.iO.OutputOn("OUT_CV_CWCCW");
-            else
-                this.iO.OutputOff("OUT_CV_CWCCW");
-
-            if (isOn)
-                this.iO.OutputOn("OUT_CV_RUN");
-            else
-                this.iO.OutputOff("OUT_CV_RUN");
-
-            return 0;
-        }
-
-        void SetConveyorSpeed(bool IsHight)
-        {
-            if (IsHight)
-                this.iO.WriteOutputIO("OUT_CV_DA", true);
-            else
-                this.iO.WriteOutputIO("OUT_CV_DA", false);
-        }
-
-        /// <summary>
-        /// 입구 감지 로딩시 감속 사용
-        /// </summary>
-        /// <returns></returns>
-        bool IsDetectedLoadStart() => this.iO.IsOn("IN_CV_DETECT_00");
-
-        /// <summary>
-        /// 실물 감지
-        /// </summary>
-        /// <returns></returns>
-        public bool IsDetectedCenter() => this.iO.IsOn("IN_CV_DETECT_01");
-        
-        bool IsDetectedLoadStop() => this.iO.IsOn("IN_CV_DETECT_02");
-        bool IsInverterError() => this.iO.IsOn("IN_CV_ERROR");
-        bool IsLifterPositinCheck() => this.iO.IsOn("IN_LIFTER_POSITION_DETECT");
-        bool IsLifterDuplication() => this.iO.IsOn("IN_LIFTER_DUPLICATION_DETECT");
-        bool IsPIOInterLockOn() => this.iO.IsOn("OUT_PIO_INTERLOCK");
-
-        int Load_Carrier()
-        {
-            if (IsDetectedCenter())
-                return 9;
-
-            OnOffConveyor(true, true);
-
-            long sTime = SwUtils.CurrentTimeMillis;
-            while (true)
-            {
-                if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND)) //Wait 20Sec
-                {
-                    OnOffConveyor(false, true);
-                    return 10;
-                }
-
-                if (IsDetectedLoadStart())
-                    break;
-            }
-
-            return 0;
-        }
-
-        int UnloadCarrier()
-        {
-            if (!IsDetectedLoadStart())
-                return 11;
-
-            OnOffConveyor(true, true);
-
-            long sTime = SwUtils.CurrentTimeMillis;
-            while (true)
-            {
-                if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND)) //Wait 20Sec
-                {
-                    OnOffConveyor(false, true);
-                    return 12;
-                }
-
-                if (!IsDetectedLoadStart())
-                    break;
-            }
-
-            return 0;
-        }
-
-        public int PIOAndLoad(string targetName)
-        {
-            if (this.IsInverterError())
-                return 16;
-
-            if (this.IsLifterPositinCheck())
-                return 14;
-
-            if (this.IsLifterDuplication())
-                return 11;
-
-            PIOClear();
-            loggerPIO.I($"Start Load PIO - [{targetName}]");
-
-            this.iO.WriteOutputIO("OUT_PIO_RECEIVE_RUN", true);
-            loggerPIO.I("[Vehicle] - 4 Receive Run On");
-
-            if ( !this.iO.WaitChangeInputIO(true, 1000, "IN_PIO_SENDABLE"))
-            {
-                PIOClear();
-                loggerPIO.E("[Port] - 4 Ready Time Out");
-                return 10;
-            }
-            loggerPIO.E("[Port] - 4 Ready On");
-
-            this.SetConveyorSpeed(true);
-            this.OnOffConveyor(true, true);
-            this.iO.WriteOutputIO("OUT_PIO_RECEIVE_RUN", true);
-            loggerPIO.I("[Vehicle] - Conveyor Run");
-
-            if ( !this.iO.WaitChangeInputIO(true, 1000, "IN_PIO_SEND_RUN"))
-            {
-                this.OnOffConveyor(false, true);
-                PIOClear();
-                loggerPIO.E("[Port] - 5 Sending Run Time Out");
-                return 10;
-            }
-
-            bool isStartDetected = false;
-            var sTime = SwUtils.CurrentTimeMillis;
-            while (true)
-            {
-                if ( SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND))
-                {
-                    PIOClear();
-                    this.OnOffConveyor(false, true);
-                    loggerPIO.E("[Vehicle] Conveyor Wait Time Out");
-                    return 10; //Conveyor Moving Timeout
-                }
-
-                if (this.IsDetectedLoadStart() && !isStartDetected)
-                    isStartDetected = true;
-
-                if (!this.IsDetectedLoadStart() && isStartDetected)
-                    this.SetConveyorSpeed(false);
-
-                if (this.IsDetectedLoadStop()) break;
-
-                if (this.IsPIOInterLockOn())
-                {
-                    PIOClear();
-                    this.OnOffConveyor(false); //Stop
-                    loggerPIO.E("[Port] PIO InterLock On ");
-                    return 19; //Conveyor Moving Timeout
-                }
-            }
-
-            this.OnOffConveyor(false); //Stop
-            PIOClear();
-
-            this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", true);
-            this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", false, 1000);
-
-            return 0;
-        }
-
-        public int PIOAndUnload(string targetName)
-        {
-            if (this.IsInverterError())
-                return 16;
-
-            if (this.IsLifterDuplication())
-                return 15;
-
-            if (this.IsLifterPositinCheck())
-                return 13;
-
-            PIOClear();
-            loggerPIO.I($"Start Unload PIO - [{targetName}]");
-
-            if (!this.iO.IsOn("IN_PIO_READY"))
-            {
-                loggerPIO.E("[Port] - 1 Ready not On");
-                return 12;
-            }
-
-            this.iO.WriteOutputIO("OUT_PIO_READY", true);
-            loggerPIO.I("[Vehicle] - 1 Ready On");
-
-            if ( !this.iO.WaitChangeInputIO(true, 1000, "IN_PIO_RECEIVE_RUN"))
-            {
-                PIOClear();
-                loggerPIO.E("[Port] - 2 Receive CV Run Timeout");
-                return 12;
-            }
-
-            this.iO.WriteOutputIO("", true);
-            loggerPIO.I("[Vehicle] - 2 Send Run On");
-
-            this.SetConveyorSpeed(true);
-            this.OnOffConveyor(true);
-
-            var sTime = SwUtils.CurrentTimeMillis;
-            while (true)
-            {
-                if (SwUtils.Gt(sTime, 20 * ConstUtils.ONE_SECOND))
-                {
-                    PIOClear();
-                    this.OnOffConveyor(false, true);
-                    loggerPIO.E("[Port] Conveyor Wait Time Out");
-                    return 12; //Conveyor Moving Timeout
-                }
-
-                if (this.iO.IsOn("IN_PIO_RECEIVE_COMPLITE"))
-                    break;
-            }
-
-            this.OnOffConveyor(false); //Stop
-            PIOClear();
-
-            this.iO.WriteOutputIO("OUT_PIO_SEND_COMPLITE", true);
-            this.iO.WriteOutputIO("OUT_PIO_SEND_COMPLITE", false, 1000);
-
-            return 0;
-        }
-
-        void PIOClear()
-        {
-            string[] pio = { "OUT_PIO_READY", "OUT_PIO_SENDING_RUN", "OUT_PIO_SEND_COMPLITE", "OUT_PIO_RECEIVABLE", "OUT_PIO_RECEIVE_RUN", "OUT_PIO_RECIVE_COMPLITE", "OUT_PIO_INTERLOCK" };
-            pio.FwEach(x => { this.iO.OutputOff(x); });
-        }
-
-    }
-}

+ 120 - 22
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -25,6 +25,20 @@ namespace VehicleControlSystem.ControlLayer
     /// </summary>
     /// </summary>
     public class Vehicle : ControlObjectBase, IDisposable
     public class Vehicle : ControlObjectBase, IDisposable
     {
     {
+        /// <summary>
+        /// OCS Report Code
+        /// 목적지에 도착해서 Load, Unload 시 발생하는 Alarm
+        /// </summary>
+        public enum eFailCode
+        {
+            Load_PortHasNotCarrier = 1,
+            Load_VehicleHasCarrier,
+            Unload_PortHasCarrier,
+            Unload_VehicleHasNotCarrier,
+            LoadPIOInterlockTimeout,
+            UnlaodPIOInterlockTimeout,
+        }
+
         static Logger logger = Logger.GetLogger();
         static Logger logger = Logger.GetLogger();
         static Logger loggerPIO = Logger.GetLogger("PIO");
         static Logger loggerPIO = Logger.GetLogger("PIO");
 
 
@@ -50,7 +64,7 @@ namespace VehicleControlSystem.ControlLayer
         public bool IsMoving { get; set; }
         public bool IsMoving { get; set; }
         public double BatteryVolt { get; set; }
         public double BatteryVolt { get; set; }
         public bool IsError { get; set; }
         public bool IsError { get; set; }
-        public bool IsContain { get { return this.conveyor.IsDetectedCenter(); } }
+        public bool IsContain { get { return this.IsDetectedCenter(); } }
 
 
         public SubCmd CurrentSubCommand { get; private set; }
         public SubCmd CurrentSubCommand { get; private set; }
         #endregion
         #endregion
@@ -78,13 +92,14 @@ namespace VehicleControlSystem.ControlLayer
         public event Action OnManualLoad;
         public event Action OnManualLoad;
         public event Action OnManualUnload;
         public event Action OnManualUnload;
         public event Action OnManualCharging;
         public event Action OnManualCharging;
+
+        public event Action<eFailCode> OnFailReport;
         #endregion
         #endregion
 
 
         IIO iO = null;
         IIO iO = null;
         GSIMotion motion = null;
         GSIMotion motion = null;
         SqliteManager sql = null;
         SqliteManager sql = null;
         Clamp clamp = null;
         Clamp clamp = null;
-        Conveyor conveyor = null;
         Steering steering = null;
         Steering steering = null;
         AutoManager autoManager = null;
         AutoManager autoManager = null;
 
 
@@ -382,6 +397,9 @@ namespace VehicleControlSystem.ControlLayer
                 return false;
                 return false;
             }
             }
 
 
+            sql.CommandDAL.UpdateState( sub.CmdID, eCommandState.Complete );
+            sql.SubCmdDAL.Delete(sub);
+
             return true;
             return true;
         }
         }
 
 
@@ -409,6 +427,9 @@ namespace VehicleControlSystem.ControlLayer
                 return false;
                 return false;
             }
             }
 
 
+            sql.CommandDAL.UpdateState(sub.CmdID, eCommandState.Complete );
+            sql.SubCmdDAL.Delete( sub );
+
             return true;
             return true;
         }
         }
 
 
@@ -546,14 +567,45 @@ namespace VehicleControlSystem.ControlLayer
 
 
         public int PIOAndLoad(string targetName)
         public int PIOAndLoad(string targetName)
         {
         {
+#if SIMULATION
+            PIOClear();
+            loggerPIO.I($"Start Load PIO - [{targetName}]");
+            this.OnPIOStart?.Invoke(true);
+            
+            this.iO.WriteOutputIO("OUT_PIO_RECEIVE_RUN", true);
+            loggerPIO.I("[Vehicle] - 4 Receive Run On");
+
+            Thread.Sleep(1000);//상대 IO 기다린다 생각.
+            loggerPIO.E("[Port] - 4 Ready On");
+
+            //Conveyor Start
+            loggerPIO.I("[Vehicle] - Conveyor Run");
+            this.OnConveyorStart?.Invoke(true);
+
+            Thread.Sleep(10000);//Conveyor 구동
+            this.OnCarrierDetected?.Invoke(true);
+
+            PIOClear();
+            Thread.Sleep(1000);
+            this.OnConveyorStop?.Invoke(true);
+#else
             if (this.IsInverterError())
             if (this.IsInverterError())
                 return 16;
                 return 16;
 
 
             if (this.IsLifterPositinCheck())
             if (this.IsLifterPositinCheck())
                 return 14;
                 return 14;
 
 
-            if (this.IsLifterDuplication())
-                return 11;
+            if ( !this.IsLifterDuplication() )
+            {
+                this.OnFailReport?.Invoke( eFailCode.Load_PortHasNotCarrier );
+                return 0;
+            }
+
+            if ( this.IsDetectedCenter() )
+            {
+                this.OnFailReport?.Invoke( eFailCode.Load_VehicleHasCarrier );
+                return 0;
+            }
 
 
             PIOClear();
             PIOClear();
             loggerPIO.I($"Start Load PIO - [{targetName}]");
             loggerPIO.I($"Start Load PIO - [{targetName}]");
@@ -566,7 +618,8 @@ namespace VehicleControlSystem.ControlLayer
             {
             {
                 PIOClear();
                 PIOClear();
                 loggerPIO.E("[Port] - 4 Ready Time Out");
                 loggerPIO.E("[Port] - 4 Ready Time Out");
-                return 10;
+                this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
+                return 0;
             }
             }
             loggerPIO.E("[Port] - 4 Ready On");
             loggerPIO.E("[Port] - 4 Ready On");
 
 
@@ -581,7 +634,8 @@ namespace VehicleControlSystem.ControlLayer
                 this.OnOffConveyor(false, true);
                 this.OnOffConveyor(false, true);
                 PIOClear();
                 PIOClear();
                 loggerPIO.E("[Port] - 5 Sending Run Time Out");
                 loggerPIO.E("[Port] - 5 Sending Run Time Out");
-                return 10;
+                this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
+                return 0;
             }
             }
 
 
             bool isStartDetected = false;
             bool isStartDetected = false;
@@ -593,7 +647,12 @@ namespace VehicleControlSystem.ControlLayer
                     PIOClear();
                     PIOClear();
                     this.OnOffConveyor(false, true);
                     this.OnOffConveyor(false, true);
                     loggerPIO.E("[Vehicle] Conveyor Wait Time Out");
                     loggerPIO.E("[Vehicle] Conveyor Wait Time Out");
-                    return 10; //Conveyor Moving Timeout
+                    this.OnFailReport?.Invoke( eFailCode.LoadPIOInterlockTimeout );
+
+                    if ( this.IsDetectedLoadStart() ) // 감지가 시작 되었으면 이동중 Error 로 판단 설비를 정지 상태로
+                        return 10; //Conveyor Moving Timeout
+                    else
+                        return 0;
                 }
                 }
 
 
                 if (this.IsDetectedLoadStart() && !isStartDetected)
                 if (this.IsDetectedLoadStart() && !isStartDetected)
@@ -609,7 +668,7 @@ namespace VehicleControlSystem.ControlLayer
                     PIOClear();
                     PIOClear();
                     this.OnOffConveyor(false); //Stop
                     this.OnOffConveyor(false); //Stop
                     loggerPIO.E("[Port] PIO InterLock On ");
                     loggerPIO.E("[Port] PIO InterLock On ");
-                    return 19; //Conveyor Moving Timeout
+                    return 19; //
                 }
                 }
             }
             }
 
 
@@ -623,16 +682,48 @@ namespace VehicleControlSystem.ControlLayer
             this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", true);
             this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", true);
             this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", false, 1000);
             this.iO.WriteOutputIO("OUT_PIO_RECIVE_COMPLITE", false, 1000);
 
 
+            this.OnLoadComplete?.Invoke();
+#endif
+
             return 0;
             return 0;
         }
         }
 
 
         public int PIOAndUnload(string targetName)
         public int PIOAndUnload(string targetName)
         {
         {
+#if SIMULATION
+            PIOClear();
+            loggerPIO.I($"Start Unload PIO - [{targetName}]");
+            this.OnPIOStart?.Invoke(false);
+
+            Thread.Sleep(1000);
+
+            this.iO.WriteOutputIO("OUT_PIO_READY", true);
+            loggerPIO.I("[Vehicle] - 1 Ready On");
+
+            Thread.Sleep(1000);
+            this.OnConveyorStart?.Invoke(false);
+
+            Thread.Sleep(10000);
+            this.OnOffConveyor(false); //Stop
+            this.OnConveyorStop?.Invoke(false);
+            PIOClear();
+
+            this.OnUnloadComplete?.Invoke();
+#else
             if (this.IsInverterError())
             if (this.IsInverterError())
                 return 16;
                 return 16;
 
 
-            if (this.IsLifterDuplication())
-                return 15;
+            if ( this.IsLifterDuplication() )
+            {
+                this.OnFailReport?.Invoke( eFailCode.Unload_PortHasCarrier );
+                return 0;
+            }
+
+            if ( !this.IsDetectedCenter() )
+            {
+                this.OnFailReport?.Invoke( eFailCode.Unload_VehicleHasNotCarrier );
+                return 0;
+            }
 
 
             if (this.IsLifterPositinCheck())
             if (this.IsLifterPositinCheck())
                 return 13;
                 return 13;
@@ -644,7 +735,8 @@ namespace VehicleControlSystem.ControlLayer
             if (!this.iO.IsOn("IN_PIO_READY"))
             if (!this.iO.IsOn("IN_PIO_READY"))
             {
             {
                 loggerPIO.E("[Port] - 1 Ready not On");
                 loggerPIO.E("[Port] - 1 Ready not On");
-                return 12;
+                this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout);
+                return 0;
             }
             }
 
 
             this.iO.WriteOutputIO("OUT_PIO_READY", true);
             this.iO.WriteOutputIO("OUT_PIO_READY", true);
@@ -654,7 +746,8 @@ namespace VehicleControlSystem.ControlLayer
             {
             {
                 PIOClear();
                 PIOClear();
                 loggerPIO.E("[Port] - 2 Receive CV Run Timeout");
                 loggerPIO.E("[Port] - 2 Receive CV Run Timeout");
-                return 12;
+                this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
+                return 0;
             }
             }
 
 
             this.iO.WriteOutputIO("", true);
             this.iO.WriteOutputIO("", true);
@@ -672,14 +765,18 @@ namespace VehicleControlSystem.ControlLayer
                     PIOClear();
                     PIOClear();
                     this.OnOffConveyor(false, true);
                     this.OnOffConveyor(false, true);
                     loggerPIO.E("[Port] Conveyor Wait Time Out");
                     loggerPIO.E("[Port] Conveyor Wait Time Out");
-                    return 12; //Conveyor Moving Timeout
+                    this.OnFailReport?.Invoke( eFailCode.UnlaodPIOInterlockTimeout );
+                    if ( IsDetectedLoadStart() || IsDetectedCenter()) //중간에 걸려 있다고 생각해서 알람 처리.
+                        return 12; //Conveyor Moving Timeout
+                    else
+                        return 0;
                 }
                 }
 
 
                 if (this.iO.IsOn("IN_PIO_RECEIVE_COMPLITE"))
                 if (this.iO.IsOn("IN_PIO_RECEIVE_COMPLITE"))
                     break;
                     break;
             }
             }
 
 
-            if ( !IsDetectedCenter() )
+            if (!IsDetectedCenter())
                 this.OnCarrierDetected?.Invoke(false);
                 this.OnCarrierDetected?.Invoke(false);
 
 
             this.OnOffConveyor(false); //Stop
             this.OnOffConveyor(false); //Stop
@@ -690,6 +787,7 @@ namespace VehicleControlSystem.ControlLayer
             this.iO.WriteOutputIO("OUT_PIO_SEND_COMPLITE", false, 1000);
             this.iO.WriteOutputIO("OUT_PIO_SEND_COMPLITE", false, 1000);
 
 
             this.OnUnloadComplete?.Invoke();
             this.OnUnloadComplete?.Invoke();
+#endif
 
 
             return 0;
             return 0;
         }
         }
@@ -700,11 +798,11 @@ namespace VehicleControlSystem.ControlLayer
             pio.FwEach(x => { this.iO.OutputOff(x); });
             pio.FwEach(x => { this.iO.OutputOff(x); });
         }
         }
 
 
-        #endregion
+#endregion
 
 
-        #endregion
+#endregion
 
 
-        #region Hardware Create Method
+#region Hardware Create Method
         void CreateSteering()
         void CreateSteering()
         {
         {
             this.steering = new Steering(this.iO, this.sql, this.eventAggregator);
             this.steering = new Steering(this.iO, this.sql, this.eventAggregator);
@@ -717,9 +815,9 @@ namespace VehicleControlSystem.ControlLayer
             this.clamp.Init();
             this.clamp.Init();
         }
         }
 
 
-        #endregion
+#endregion
 
 
-        #region Help Method
+#region Help Method
         /// <summary>
         /// <summary>
         /// 현재 좌표 값이 등록된 Route 에 맞는 위치인지 확인한다.
         /// 현재 좌표 값이 등록된 Route 에 맞는 위치인지 확인한다.
         /// 판단 기준은 Route 에 Tolerance 범위를 사용.
         /// 판단 기준은 Route 에 Tolerance 범위를 사용.
@@ -779,9 +877,9 @@ namespace VehicleControlSystem.ControlLayer
             return BitUtils.ChgInt32(bitArray);
             return BitUtils.ChgInt32(bitArray);
         }
         }
 
 
-        #endregion
+#endregion
 
 
-        #region Event
+#region Event
         private void Steering_OnSteeringError(object sender, int e)
         private void Steering_OnSteeringError(object sender, int e)
         {
         {
             if (e != 0)
             if (e != 0)
@@ -802,7 +900,7 @@ namespace VehicleControlSystem.ControlLayer
             }
             }
 
 
         }
         }
-        #endregion
+#endregion
 
 
     }
     }
 }
 }

+ 3 - 0
Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs

@@ -234,6 +234,9 @@ namespace VehicleControlSystem.Managers
             this.AutoModeStateProperty = eAutoModeState.ErrorStop;
             this.AutoModeStateProperty = eAutoModeState.ErrorStop;
             this.LampStateProperty = eLampState.Alarm;
             this.LampStateProperty = eLampState.Alarm;
 
 
+            this.sql.CommandDAL.Clean();
+            this.sql.SubCmdDAL.Clean();
+
             HisAlarm hisAlarm = new HisAlarm();
             HisAlarm hisAlarm = new HisAlarm();
             var alarm = sql.AlarmDAL.GetK(alarmID);
             var alarm = sql.AlarmDAL.GetK(alarmID);
             if (alarm == null)
             if (alarm == null)

+ 71 - 3
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -10,6 +10,8 @@ using OHV.SqliteDAL;
 using OHVConnector;
 using OHVConnector;
 using Prism.Events;
 using Prism.Events;
 using VehicleControlSystem.ControlLayer;
 using VehicleControlSystem.ControlLayer;
+using GSG.NET.Extensions;
+using OHV.Common.Model;
 
 
 namespace VehicleControlSystem.Managers
 namespace VehicleControlSystem.Managers
 {
 {
@@ -34,7 +36,7 @@ namespace VehicleControlSystem.Managers
 
 
         public void Init()
         public void Init()
         {
         {
-            this.manager.Config = new Config
+            this.manager.Config = new OHVConnector.Config
             {
             {
                 ID = sql.ConfigDal.GetK(ConstString.VehicleID).Value,
                 ID = sql.ConfigDal.GetK(ConstString.VehicleID).Value,
                 IpAddress = sql.ConfigDal.GetK(ConstString.Addr).Value,
                 IpAddress = sql.ConfigDal.GetK(ConstString.Addr).Value,
@@ -71,6 +73,18 @@ namespace VehicleControlSystem.Managers
             vehicle.OnLoadComplete += Vehicle_OnLoadComplete;
             vehicle.OnLoadComplete += Vehicle_OnLoadComplete;
             vehicle.OnUnloadComplete += Vehicle_OnUnloadComplete;
             vehicle.OnUnloadComplete += Vehicle_OnUnloadComplete;
             vehicle.OnCarrierDetected += Vehicle_OnCarrierDetected;
             vehicle.OnCarrierDetected += Vehicle_OnCarrierDetected;
+
+            vehicle.OnFailReport += Vehicle_OnFailReport;
+        }
+
+        private void Vehicle_OnFailReport( Vehicle.eFailCode obj )
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.F;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.SubCode = CastTo<int>.From( obj ).ToString( "000" );
+
+            this.manager.Send( msg );
         }
         }
 
 
         private void Vehicle_OnChargingFull()
         private void Vehicle_OnChargingFull()
@@ -270,8 +284,10 @@ namespace VehicleControlSystem.Managers
                 case OHVConnector.eKind.F:
                 case OHVConnector.eKind.F:
                     break;
                     break;
                 case OHVConnector.eKind.M:
                 case OHVConnector.eKind.M:
+                    ReceiveMCommand( msg );
                     break;
                     break;
                 case OHVConnector.eKind.R:
                 case OHVConnector.eKind.R:
+                    ReceiveRCommand( msg );
                     break;
                     break;
                 case OHVConnector.eKind.H:
                 case OHVConnector.eKind.H:
                     break;
                     break;
@@ -283,6 +299,58 @@ namespace VehicleControlSystem.Managers
 
 
         }
         }
 
 
+        void Reply(OCSMessage recieve)
+        {
+            var reply = new OCSMessage();
+            reply.Kind = recieve.Kind;
+            reply.Tag = recieve.Tag;
+            reply.SubCode = recieve.SubCode;
+            this.manager.Reply( reply );
+        }
+
+        private void ReceiveRCommand( OCSMessage msg )
+        {
+            this.Reply(msg);
+
+            if ( msg.SubCode.Equals("100") )
+            {
+                Send_Scmd( (int)this.vehicle.CurrentPosition );
+            }
+            if ( msg.SubCode.Equals( "010" ) )
+            {
+                Send_Bcmd(this.vehicle.BatteryVolt);
+            }
+        }
+
+        private void ReceiveMCommand( OCSMessage msg )
+        {
+            this.Reply( msg );
+
+            var cmd = new Command();
+            cmd.TargetID = msg.Tag;
+
+            switch ( msg.SubCode )
+            {
+                case "000": //Move
+                    cmd.Type = eCommandType.Move;
+                    break;
+                case "001": //Move and Load
+                    cmd.Type = eCommandType.MoveNLoad;
+                    break;
+                case "002": //Move and Unload
+                    cmd.Type = eCommandType.MoveNUnload;
+                    break;
+                case "003": //Move and Charge
+                    cmd.Type = eCommandType.Charging;
+                    break;
+                default:
+                    return;
+            }
+
+            this.sql.CommandDAL.Add( cmd );
+
+        }
+
         private void Manager_OnT3Timeout(OHVConnector.OCSMessage msg)
         private void Manager_OnT3Timeout(OHVConnector.OCSMessage msg)
         {
         {
             logger.E("[TimeOut] : " + msg.LogFormat());
             logger.E("[TimeOut] : " + msg.LogFormat());
@@ -339,7 +407,7 @@ namespace VehicleControlSystem.Managers
         public void Send_Ecmd()
         public void Send_Ecmd()
         {
         {
             var msg = new OCSMessage();
             var msg = new OCSMessage();
-            msg.Tag = vehicle.CurrentPosition.ToString();
+            msg.Tag = vehicle.CurrentPosition.ToString("0000");
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
             msg.IsSubCode3 = vehicle.IsError;
@@ -351,7 +419,7 @@ namespace VehicleControlSystem.Managers
         {
         {
             var msg = new OCSMessage();
             var msg = new OCSMessage();
             msg.Kind = eKind.T;
             msg.Kind = eKind.T;
-            msg.Tag = point.ToString();
+            msg.Tag = point.ToString("0000");
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
             msg.IsSubCode3 = vehicle.IsError;

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

@@ -34,79 +34,79 @@ namespace VehicleControlSystem.Managers
         AutoManager autoManager;
         AutoManager autoManager;
         SqliteManager sql = null;
         SqliteManager sql = null;
 
 
-        public Scheduler(IEventAggregator ea, AutoManager autoManager, SqliteManager sqlite)
+        public Scheduler( IEventAggregator ea, AutoManager autoManager, SqliteManager sqlite )
         {
         {
             this.CommandsList = new List<Command>();
             this.CommandsList = new List<Command>();
             eventAggregator = ea;// CommonServiceLocator.ServiceLocator.Current.GetInstance<IEventAggregator>();
             eventAggregator = ea;// CommonServiceLocator.ServiceLocator.Current.GetInstance<IEventAggregator>();
-            eventAggregator.GetEvent<VCSMessagePubSubEvent>().Subscribe(OnReceivedMessageEvent);
+            eventAggregator.GetEvent<VCSMessagePubSubEvent>().Subscribe( OnReceivedMessageEvent );
 
 
             this.autoManager = autoManager;
             this.autoManager = autoManager;
             this.sql = sqlite;
             this.sql = sqlite;
         }
         }
 
 
-        private void OnReceivedMessageEvent(VCSMessageEventArgs obj)
+        private void OnReceivedMessageEvent( VCSMessageEventArgs obj )
         {
         {
-            this.AddCommand(obj.Command);
+            this.AddCommand( obj.Command );
 
 
             //var m = new GUIMessageEventArgs() { MessageText = obj.MessageText, MessageKey = obj.MessageKey };
             //var m = new GUIMessageEventArgs() { MessageText = obj.MessageText, MessageKey = obj.MessageKey };
             //m.Command = ObjectCopyUtils.DeepClone(obj.Command);
             //m.Command = ObjectCopyUtils.DeepClone(obj.Command);
             //GUIMessagePublish(m);
             //GUIMessagePublish(m);
         }
         }
 
 
-        void GUIMessagePublish(GUIMessageEventArgs args)
+        void GUIMessagePublish( GUIMessageEventArgs args )
         {
         {
-            eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(args);
+            eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish( args );
         }
         }
 
 
         public void Init()
         public void Init()
         {
         {
             this.isThreadAlive = true;
             this.isThreadAlive = true;
-            this.thread = ThreadUtils.Invoke(this.ExcuteCommand);
+            this.thread = ThreadUtils.Invoke( this.ExcuteCommand );
         }
         }
 
 
-        public bool AddCommand(Command cmd)
+        public bool AddCommand( Command cmd )
         {
         {
-            if (this.CommandsList == null) return false;
+            if ( this.CommandsList == null ) return false;
             try
             try
             {
             {
-	            this.CommandsList.Add(cmd);
+                this.CommandsList.Add( cmd );
             }
             }
-            catch (Exception ex)
+            catch ( Exception ex )
             {
             {
-                logger.E(ex);
+                logger.E( ex );
                 return false;
                 return false;
             }
             }
 
 
             return true;
             return true;
         }
         }
 
 
-        bool RemoveCommand(Command cmd)
+        bool RemoveCommand( Command cmd )
         {
         {
-            if (!this.CommandsList.Remove(cmd))
+            if ( !this.CommandsList.Remove( cmd ) )
             {
             {
-                logger.D($"Scheduler - [Command] : RemoveCommand fail ID-{cmd.CommandID} / Result-{cmd.Result} ");
+                logger.D( $"Scheduler - [Command] : RemoveCommand fail ID-{cmd.CommandID} / Result-{cmd.Result} " );
                 return false;
                 return false;
             }
             }
 
 
-            logger.D($"Scheduler - [Command] : RemoveCommand OK ID-{cmd.CommandID} / Result-{cmd.Result} ");
+            logger.D( $"Scheduler - [Command] : RemoveCommand OK ID-{cmd.CommandID} / Result-{cmd.Result} " );
             return true;
             return true;
         }
         }
 
 
         void ExcuteCommand()
         void ExcuteCommand()
         {
         {
-            while (isThreadAlive)
+            while ( isThreadAlive )
             {
             {
-                Thread.Sleep(500);
+                Thread.Sleep( 500 );
                 try
                 try
                 {
                 {
                     var state = this.autoManager.OperationModeProperty;
                     var state = this.autoManager.OperationModeProperty;
-                    switch (state)
+                    switch ( state )
                     {
                     {
                         case OHV.Common.Shareds.eOperatationMode.ManualMode:
                         case OHV.Common.Shareds.eOperatationMode.ManualMode:
                             break;
                             break;
                         case OHV.Common.Shareds.eOperatationMode.AutoMode:
                         case OHV.Common.Shareds.eOperatationMode.AutoMode:
                             {
                             {
-                                switch (this.autoManager.AutoModeStateProperty)
+                                switch ( this.autoManager.AutoModeStateProperty )
                                 {
                                 {
                                     case OHV.Common.Shareds.eAutoModeState.ErrorStop:
                                     case OHV.Common.Shareds.eAutoModeState.ErrorStop:
                                         break;
                                         break;
@@ -114,8 +114,8 @@ namespace VehicleControlSystem.Managers
                                         break;
                                         break;
                                     case OHV.Common.Shareds.eAutoModeState.Run:
                                     case OHV.Common.Shareds.eAutoModeState.Run:
                                         Command cmd = sql.CommandDAL.GetCmd();
                                         Command cmd = sql.CommandDAL.GetCmd();
-                                        if (cmd == null) continue;
-                                        DoWork(cmd);
+                                        if ( cmd == null ) continue;
+                                        DoWork( cmd );
                                         break;
                                         break;
                                     case OHV.Common.Shareds.eAutoModeState.Stop:
                                     case OHV.Common.Shareds.eAutoModeState.Stop:
                                         break;
                                         break;
@@ -130,91 +130,91 @@ namespace VehicleControlSystem.Managers
                             break;
                             break;
                     }
                     }
                 }
                 }
-                catch (Exception ex)
+                catch ( Exception ex )
                 {
                 {
-                    logger.E(ex);
+                    logger.E( ex );
                 }
                 }
             }
             }
         }
         }
 
 
-        private void DoWork(Command cmd)
+        private void DoWork( Command cmd )
         {
         {
-            switch (cmd.State)
+            switch ( cmd.State )
             {
             {
                 case OHV.Common.Shareds.eCommandState.Queued:
                 case OHV.Common.Shareds.eCommandState.Queued:
-                    if (sql.SubCmdDAL.Count <= 0) //
+                    if ( sql.SubCmdDAL.Count <= 0 ) //
                     {
                     {
-                        switch (cmd.Type)
+                        switch ( cmd.Type )
                         {
                         {
                             case OHV.Common.Shareds.eCommandType.Move:
                             case OHV.Common.Shareds.eCommandType.Move:
                             case OHV.Common.Shareds.eCommandType.MoveNLoad:
                             case OHV.Common.Shareds.eCommandType.MoveNLoad:
                             case OHV.Common.Shareds.eCommandType.MoveNUnload:
                             case OHV.Common.Shareds.eCommandType.MoveNUnload:
-                                CreateSubCommand(cmd, SubCmd.eType.Move);
+                                CreateSubCommand( cmd, SubCmd.eType.Move );
                                 break;
                                 break;
                             case OHV.Common.Shareds.eCommandType.Charging:
                             case OHV.Common.Shareds.eCommandType.Charging:
                                 break;
                                 break;
                             default:
                             default:
                                 break;
                                 break;
                         }
                         }
-                        this.sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Processing);
+                        this.sql.CommandDAL.UpdateState( cmd.CommandID, OHV.Common.Shareds.eCommandState.Processing );
                     }
                     }
                     break;
                     break;
 
 
                 case OHV.Common.Shareds.eCommandState.Processing:
                 case OHV.Common.Shareds.eCommandState.Processing:
                     {
                     {
                         var subCmd = sql.SubCmdDAL.GetSubCmd();
                         var subCmd = sql.SubCmdDAL.GetSubCmd();
-                        if (subCmd == null) // Move 명령을 수행 완료 했다고 판단.
+                        if ( subCmd == null ) // Move 명령을 수행 완료 했다고 판단.
                         {
                         {
-                            if ( cmd.IsSecondCommanded)
+                            if ( cmd.IsSecondCommanded )
                             {
                             {
-                                sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete);
+                                sql.CommandDAL.UpdateState( cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete );
                                 break;
                                 break;
                             }
                             }
 
 
-                            if (cmd.Type == OHV.Common.Shareds.eCommandType.MoveNLoad )
+                            if ( cmd.Type == OHV.Common.Shareds.eCommandType.MoveNLoad )
                             {
                             {
-                                if (this.CreateSubCommand(cmd, SubCmd.eType.Load))
+                                if ( this.CreateSubCommand( cmd, SubCmd.eType.Load ) )
                                     cmd.IsSecondCommanded = true;
                                     cmd.IsSecondCommanded = true;
                                 break;
                                 break;
                             }
                             }
-                            else if(cmd.Type == OHV.Common.Shareds.eCommandType.MoveNUnload)
+                            else if ( cmd.Type == OHV.Common.Shareds.eCommandType.MoveNUnload )
                             {
                             {
-                                if (this.CreateSubCommand(cmd, SubCmd.eType.Unload))
+                                if ( this.CreateSubCommand( cmd, SubCmd.eType.Unload ) )
                                     cmd.IsSecondCommanded = true;
                                     cmd.IsSecondCommanded = true;
                                 break;
                                 break;
                             }
                             }
-                            else if ( cmd.Type == OHV.Common.Shareds.eCommandType.Charging)
+                            else if ( cmd.Type == OHV.Common.Shareds.eCommandType.Charging )
                             {
                             {
-                                if ( this.CreateSubCommand(cmd, SubCmd.eType.Charge))
+                                if ( this.CreateSubCommand( cmd, SubCmd.eType.Charge ) )
                                     cmd.IsSecondCommanded = true;
                                     cmd.IsSecondCommanded = true;
                                 break;
                                 break;
                             }
                             }
                             else //Move Command complete
                             else //Move Command complete
                             {
                             {
-                                sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete);
+                                sql.CommandDAL.UpdateState( cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete );
+                                break;
                             }
                             }
                         }
                         }
                         else
                         else
                         {
                         {
-                            if (subCmd.CmdID.Equals(cmd.CommandID)) //진행중 판단
+                            if ( subCmd.CmdID.Equals( cmd.CommandID ) ) //진행중 판단
                                 break;
                                 break;
                         }
                         }
                     }
                     }
-                    sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete);
                     break;
                     break;
 
 
                 case OHV.Common.Shareds.eCommandState.Complete:
                 case OHV.Common.Shareds.eCommandState.Complete:
-                    sql.CommandDAL.Delete(cmd);
+                    sql.CommandDAL.Delete( cmd );
                     break;
                     break;
                 default:
                 default:
                     break;
                     break;
             }
             }
         }
         }
 
 
-        private bool CreateSubCommand(Command cmd, SubCmd.eType type)
+        private bool CreateSubCommand( Command cmd, SubCmd.eType type )
         {
         {
             //명령을 만들기 전에 Vehicle 의 상태를 확인하여 만들자.
             //명령을 만들기 전에 Vehicle 의 상태를 확인하여 만들자.
-            switch (type)
+            switch ( type )
             {
             {
                 case SubCmd.eType.Move:
                 case SubCmd.eType.Move:
                     break;
                     break;
@@ -235,8 +235,8 @@ namespace VehicleControlSystem.Managers
                 TargetID = cmd.TargetID,
                 TargetID = cmd.TargetID,
                 CmdID = cmd.CommandID,
                 CmdID = cmd.CommandID,
             };
             };
-            sql.SubCmdDAL.Add(sub);
-            logger.I($"{sub.ID} Sub Command Create - Type={sub.Type}, TargetID={sub.TargetID}, CommandID={sub.CmdID}");
+            sql.SubCmdDAL.Add( sub );
+            logger.I( $"{sub.ID} Sub Command Create - Type={sub.Type}, TargetID={sub.TargetID}, CommandID={sub.CmdID}" );
 
 
             return true;
             return true;
         }
         }
@@ -247,24 +247,24 @@ namespace VehicleControlSystem.Managers
             {
             {
             };
             };
 
 
-            sql.CommandDAL.Add(cmd);
-            logger.I($"{cmd.CommandID} Command Create - Type={cmd.Type}, TargetID={cmd.TargetID}");
+            sql.CommandDAL.Add( cmd );
+            logger.I( $"{cmd.CommandID} Command Create - Type={cmd.Type}, TargetID={cmd.TargetID}" );
             return true;
             return true;
         }
         }
 
 
         #region IDisposable Support
         #region IDisposable Support
         private bool disposedValue = false; // 중복 호출을 검색하려면
         private bool disposedValue = false; // 중복 호출을 검색하려면
 
 
-        protected virtual void Dispose(bool disposing)
+        protected virtual void Dispose( bool disposing )
         {
         {
-            if (!disposedValue)
+            if ( !disposedValue )
             {
             {
-                if (disposing)
+                if ( disposing )
                 {
                 {
                     // TODO: 관리되는 상태(관리되는 개체)를 삭제합니다.
                     // TODO: 관리되는 상태(관리되는 개체)를 삭제합니다.
                     this.isThreadAlive = false;
                     this.isThreadAlive = false;
-                    if ( !this.thread.Join(3000) )
-                        ThreadUtils.Kill(this.thread);
+                    if ( !this.thread.Join( 3000 ) )
+                        ThreadUtils.Kill( this.thread );
                 }
                 }
 
 
                 // TODO: 관리되지 않는 리소스(관리되지 않는 개체)를 해제하고 아래의 종료자를 재정의합니다.
                 // TODO: 관리되지 않는 리소스(관리되지 않는 개체)를 해제하고 아래의 종료자를 재정의합니다.
@@ -285,7 +285,7 @@ namespace VehicleControlSystem.Managers
         public void Dispose()
         public void Dispose()
         {
         {
             // 이 코드를 변경하지 마세요. 위의 Dispose(bool disposing)에 정리 코드를 입력하세요.
             // 이 코드를 변경하지 마세요. 위의 Dispose(bool disposing)에 정리 코드를 입력하세요.
-            Dispose(true);
+            Dispose( true );
             // TODO: 위의 종료자가 재정의된 경우 다음 코드 줄의 주석 처리를 제거합니다.
             // TODO: 위의 종료자가 재정의된 경우 다음 코드 줄의 주석 처리를 제거합니다.
             // GC.SuppressFinalize(this);
             // GC.SuppressFinalize(this);
         }
         }

+ 1 - 2
Dev/OHV/VehicleControlSystem/VehicleControlSystem.csproj

@@ -18,7 +18,7 @@
     <DebugType>full</DebugType>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <Optimize>false</Optimize>
     <OutputPath>bin\Debug\</OutputPath>
     <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   </PropertyGroup>
@@ -94,7 +94,6 @@
     <Compile Include="ControlLayer\Axis\IAxis.cs" />
     <Compile Include="ControlLayer\Axis\IAxis.cs" />
     <Compile Include="ControlLayer\Clamp.cs" />
     <Compile Include="ControlLayer\Clamp.cs" />
     <Compile Include="ControlLayer\ControlObjectBase.cs" />
     <Compile Include="ControlLayer\ControlObjectBase.cs" />
-    <Compile Include="ControlLayer\Conveyor.cs" />
     <Compile Include="ControlLayer\IO\BitBlock.cs" />
     <Compile Include="ControlLayer\IO\BitBlock.cs" />
     <Compile Include="ControlLayer\IO\Delegates.cs" />
     <Compile Include="ControlLayer\IO\Delegates.cs" />
     <Compile Include="ControlLayer\IO\EzBoard.cs" />
     <Compile Include="ControlLayer\IO\EzBoard.cs" />