Bladeren bron

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 jaren geleden
bovenliggende
commit
b095619c0f

+ 0 - 3
Dev/Connection/OHVProtocolServer/OHVConnector/OCSMessage.cs

@@ -46,7 +46,6 @@ namespace OHVConnector
         public string Tag { get; set; }
         public string SubCode { get; set; }
         public string CheckSum { get; set; }
-        string checkSum = string.Empty;
 
         public IList<string> ViaRouteList { get; set; }
 
@@ -132,8 +131,6 @@ namespace OHVConnector
             mb.AppendAscii( this.Tag );
             mb.AppendAscii( MakeSubcode() );
 
-            //string checkSum = Convert.ToString( GetCheckSum( mb.ToBytes ), 16 ).ToLower();
-
             return GetCheckSum( mb.ToBytes );
         }
 

BIN
Dev/OHV/Assambly/OHVConnector.dll


BIN
Dev/OHV/Assambly/OHVConnector.pdb


+ 2 - 2
Dev/OHV/OHV.Module.Interactivity/PopUp/ConfigView.xaml

@@ -9,7 +9,7 @@
              prism:ViewModelLocator.AutoWireViewModel="True"
              xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
 
-             d:DesignHeight="350" d:DesignWidth="450" Foreground="White" Width="500" Height="400">
+             d:DesignHeight="350" d:DesignWidth="450" Foreground="White" Width="700" Height="500">
 
     <prism:Dialog.WindowStyle>
         <Style TargetType="Window">
@@ -54,7 +54,7 @@
                     </Style>
                 </DataGrid.Resources>
                 <DataGrid.Columns>
-                    <materialDesign:DataGridTextColumn Header="Name" Binding="{Binding Name}" EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnPopupEditingStyle}" IsReadOnly="True"></materialDesign:DataGridTextColumn>
+                    <materialDesign:DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="300" EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnPopupEditingStyle}" IsReadOnly="True"></materialDesign:DataGridTextColumn>
                     <materialDesign:DataGridTextColumn Header="Value" Binding="{Binding Value}" EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnPopupEditingStyle}"></materialDesign:DataGridTextColumn>
                 </DataGrid.Columns>
             </DataGrid>

+ 13 - 0
Dev/OHV/OHV.SqliteDAL/OHVDbInitializer.cs

@@ -173,6 +173,7 @@ namespace OHV.SqliteDAL
                 new Alarm { AlarmId = 6, Kind = eAlarmKind.Axis,  Name = "LeftClampServo", Text="Is Not Origin Return",                    Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 7, Kind = eAlarmKind.Axis,  Name = "RightClamServo", Text="Origin Return Fail",                      Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 8, Kind = eAlarmKind.Axis,  Name = "LeftClampServo", Text="Origin Return Fail",                      Solution="", Description="", Level = eAlarmLevel.Falut, },
+
                 new Alarm { AlarmId = 9, Kind = eAlarmKind.Axis,  Name = "Conveyor",       Text="Already Exist Carrier",                   Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 10, Kind = eAlarmKind.Axis, Name = "Conveyor",       Text="Loading Time Over",                       Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 11, Kind = eAlarmKind.Axis, Name = "Conveyor",       Text="Not Exist Carrier",                       Solution="", Description="", Level = eAlarmLevel.Falut, },
@@ -181,23 +182,35 @@ namespace OHV.SqliteDAL
                 new Alarm { AlarmId = 14, Kind = eAlarmKind.Axis, Name = "Conveyor",       Text="Lifter Not Loading Position",             Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 15, Kind = eAlarmKind.Axis, Name = "Conveyor",       Text="Lifter have not Carrier",                 Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 16, Kind = eAlarmKind.Axis, Name = "Conveyor",       Text="Inverter Error",                          Solution="", Description="", Level = eAlarmLevel.Falut, },
+
                 new Alarm { AlarmId = 17, Kind = eAlarmKind.Axis, Name = "PIO",            Text="Port PIO Ready Off",                      Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 18, Kind = eAlarmKind.Axis, Name = "PIO",            Text="Port PIO Time Out",                       Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 19, Kind = eAlarmKind.Axis, Name = "PIO",            Text="Port PIO InterLock On",                   Solution="", Description="", Level = eAlarmLevel.Falut, },
+
                 new Alarm { AlarmId = 20, Kind = eAlarmKind.Axis, Name = "Conveyor",       Text="Loading Position Wrong",                  Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 21, Kind = eAlarmKind.Axis, Name = "Conveyor",       Text="Unloading Position Wrong",                Solution="", Description="", Level = eAlarmLevel.Falut, },
+
                 new Alarm { AlarmId = 22, Kind = eAlarmKind.Axis, Name = "Init",           Text="Vehicle Drive Error",                     Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 23, Kind = eAlarmKind.Axis, Name = "EStop",          Text="EStop",                                   Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 24, Kind = eAlarmKind.Axis, Name = "Vehicle Move Error", Text="while Vehicle Move Obstacle Detected",Solution="", Description="", Level = eAlarmLevel.Falut, },
+
                 new Alarm { AlarmId = 25, Kind = eAlarmKind.Axis, Name = "Charge", Text="Charge Point Not Ready",                          Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 26, Kind = eAlarmKind.Axis, Name = "Charge", Text="Charge Point PIO Error",                          Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 27, Kind = eAlarmKind.Axis, Name = "Charge", Text="while Vehicle Move Obstacle Detected",Solution="", Description="", Level = eAlarmLevel.Falut, },
+
                 new Alarm { AlarmId = 28, Kind = eAlarmKind.Axis, Name = "System", Text="E - Stop Switch On",Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 29, Kind = eAlarmKind.Axis, Name = "System", Text="MC Off",Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 30, Kind = eAlarmKind.Axis, Name = "System", Text="CP Off 24V",Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 31, Kind = eAlarmKind.Axis, Name = "System", Text="CP Off Safety",Solution="", Description="", Level = eAlarmLevel.Falut, },
+
                 new Alarm { AlarmId = 32, Kind = eAlarmKind.Axis, Name = "BMS", Text="Battery Manage System Disconnected",Solution="", Description="", Level = eAlarmLevel.Falut, },
                 new Alarm { AlarmId = 33, Kind = eAlarmKind.Axis, Name = "Steering", Text="Steering State Abnormal",Solution="", Description="", Level = eAlarmLevel.Falut, },
+
+                new Alarm { AlarmId = 34, Kind = eAlarmKind.Drive, Name = "PIO", Text="Battery Charge PIO Not Ready On",Solution="", Description="", Level = eAlarmLevel.Falut, },
+                new Alarm { AlarmId = 35, Kind = eAlarmKind.Drive, Name = "PIO", Text="Battery Charge PIO Not SEND_RUN On TimeOver",Solution="", Description="", Level = eAlarmLevel.Falut, },
+                new Alarm { AlarmId = 36, Kind = eAlarmKind.Drive, Name = "PIO", Text="Battery Charge PIO Not SEND_COMPLETE On TimeOver",Solution="", Description="", Level = eAlarmLevel.Falut, },
+                new Alarm { AlarmId = 37, Kind = eAlarmKind.Drive, Name = "PIO", Text="Steering State Abnormal",Solution="", Description="", Level = eAlarmLevel.Falut, },
+                new Alarm { AlarmId = 38, Kind = eAlarmKind.Drive, Name = "PIO", Text="Steering State Abnormal",Solution="", Description="", Level = eAlarmLevel.Falut, },
             } );
 
             //context.Set<HisAlarm>().Add(new HisAlarm { AlarmId = 1, OccurTime = DateTime.Now.AddDays(-10) });

+ 60 - 40
Dev/OHV/OHV.Vehicle/Config/log4net.xml

@@ -17,15 +17,19 @@
 		<appender-ref ref="PIOAppender" />
 	</logger>
 
-  <logger name="RemoteLogger" additivity="false">
-    <appender-ref ref="remotingAppender" />
-  </logger>
+	<logger name="RemoteLogger" additivity="false">
+		<appender-ref ref="remotingAppender" />
+	</logger>
+
+	<logger name="PhysicalCheckup_Front" additivity="false">
+		<appender-ref ref="PhysicalCheckupFileAppender_Front" />
+	</logger>
 
-  <logger name="PhysicalCheckup" additivity="false">
-    <appender-ref ref="PhysicalCheckupFileAppender" />
-  </logger>
+	<logger name="PhysicalCheckup_Rear" additivity="false">
+		<appender-ref ref="PhysicalCheckupFileAppender_Rear" />
+	</logger>
 
-  <!--
+	<!--
 	ALL    DEBUG   INFO    WARN    ERROR   FATAL   OFF
 	•All
 	•DEBUG  •DEBUG
@@ -36,27 +40,43 @@
 	•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF
 	-->
 
-  <appender name="PhysicalCheckupFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-    <threshold value="INFO"/>
-    <file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\PhysicalCheckup.log" />
-    <appendToFile value="true" />
-    <rollingStyle value="Date" />
-    <backupDays value="20" />
-    <datePattern value="-MMdd_HH:mm'.log'" />
-    <layout type="log4net.Layout.PatternLayout">
-      <conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
-    </layout>
-  </appender>
-
-  <appender name="FileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
+	<appender name="PhysicalCheckupFileAppender_Front" type="GSG.NET.Logging.FileAppender, GSG.NET">
+		<threshold value="INFO"/>
+		<file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\PhysicalCheckup_Front.log" />
+		<staticLogFileName value="true"/>
+		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+		<appendToFile value="true" />
+		<rollingStyle value="Date" />
+		<backupDays value="10" />
+		<datePattern value="-MMdd'.log'" />
+		<layout type="log4net.Layout.PatternLayout">
+			<conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
+		</layout>
+	</appender>
+
+	<appender name="PhysicalCheckupFileAppender_Rear" type="GSG.NET.Logging.FileAppender, GSG.NET">
+		<threshold value="INFO"/>
+		<file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\PhysicalCheckup_Rear.log" />
+		<staticLogFileName value="true"/>
+		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+		<appendToFile value="true" />
+		<rollingStyle value="Date" />
+		<backupDays value="10" />
+		<datePattern value="-MMdd'.log'" />
+		<layout type="log4net.Layout.PatternLayout">
+			<conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
+		</layout>
+	</appender>
+
+	<appender name="FileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
 		<filter type="log4net.Filter.LevelRangeFilter">
 			<param name="LevelMin" value="INFO"></param>
 			<param name="LevelMax" value="OFF"></param>
 		</filter>
-    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
-    <file type="log4net.Util.PatternString">
-      <conversionPattern value="C:\LOG\OHV\Vehicle\Vehicle.log"  />
-    </file>
+		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+		<file type="log4net.Util.PatternString">
+			<conversionPattern value="C:\LOG\OHV\Vehicle\Vehicle.log"  />
+		</file>
 		<appendToFile value="true" />
 		<rollingStyle value="Date" />
 		<backupDays value="30" />
@@ -116,22 +136,22 @@
 		</layout>
 	</appender>
 
-  <appender name="remotingAppender" type="log4net.Appender.RemotingAppender">
-    <!-- The remoting URL to the remoting server object -->
-    <sink value="tcp://localhost: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="1"/>
-    <!-- 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 name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"   >
+	<appender name="remotingAppender" type="log4net.Appender.RemotingAppender">
+		<!-- The remoting URL to the remoting server object -->
+		<sink value="tcp://localhost: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="1"/>
+		<!-- 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 name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"   >
 		<layout type="log4net.Layout.PatternLayout">
 			<param name="ConversionPattern" value="%d %m%n" />
 		</layout>

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

@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
+using System.Threading;
 using GSG.NET.Logging;
 using GSG.NET.Utils;
 using VehicleControlSystem.ControlLayer.IO;
@@ -22,9 +17,6 @@ namespace VehicleControlSystem.ControlLayer
 
         public int OnOffConveyor( bool isOn, bool isLoad = false )
         {
-            if ( IsInverterError() )
-                return 16;
-
             if ( isLoad )
                 this.ezIO.OutputOn( "OUT_CV_CWCCW" );
             else

+ 150 - 6
Dev/OHV/VehicleControlSystem/ControlLayer/DB/Redis.cs

@@ -1,12 +1,11 @@
-using GSG.NET.ObjectBase;
+using GSG.NET.Extensions;
+using GSG.NET.ObjectBase;
+using OHV.Common.Shareds;
 using StackExchange.Redis;
 using StackExchange.Redis.Extensions.Core;
 using StackExchange.Redis.Extensions.Newtonsoft;
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Threading;
 
 namespace VehicleControlSystem.ControlLayer.DB
 {
@@ -37,5 +36,150 @@ namespace VehicleControlSystem.ControlLayer.DB
         public string GetValue( string key ) => database.StringGet( key );
         public int GetIntValue( string key ) => cacheClient.Get<int>( key );
 
-    }
+
+        #region GetLogData
+
+        /// <summary>
+        /// 0.1% 단위
+        /// 100% 1.9Nm
+        /// </summary>
+        /// <returns></returns>
+        public double TorqueFront()
+        {
+            return LoadFacterFront() * 1.9 / 100;
+        }
+
+        /// <summary>
+        /// 0.1% 단위 
+        /// </summary>
+        /// <returns></returns>
+        public double TorqueRear()
+        {
+            return LoadFacterRear() * 1.9 / 100;
+        }
+
+        public double LoadFacterFront()
+        {
+            var ret = database.HashGet( "7028", "7" );
+            return Math.Abs( CastTo<double>.From<RedisValue>( ret ) * 0.1 ); 
+        }
+
+        public double LoadFacterRear()
+        {
+            var ret = database.HashGet( "7028", "7" );
+            return Math.Abs( CastTo<double>.From<RedisValue>( ret ) * 0.1 );
+        }
+
+        public double ActualVelocityToFrontRPM()
+        {
+            var ret = database.HashGet( "7026", "7" );
+            return CastTo<double>.From<RedisValue>( ret ) * 60 * 10 / ( 2 * Math.PI ) / 0.06;
+        }
+        public double ActualVelocityToRearRPM()
+        {
+            var ret = database.HashGet( "7026", "8" );
+            return CastTo<double>.From<RedisValue>( ret ) * 60 * 10 / ( 2 * Math.PI ) / 0.06;
+        }
+        public double ActualVelocityToSpeed()
+        {
+            var ret = database.HashGet( "4034", "7" );
+            return CastTo<double>.From<RedisValue>( ret ) * 0.0001; //m/sec
+        }
+
+        public int CurrentBCRValue()
+        {
+            var ret = database.HashGet( "7121", "7" );
+            return CastTo<int>.From<RedisValue>( ret );
+        }
+
+        public bool GetDriveMove()
+        {
+            var ret = database.HashGet( "3011", "7" );
+            if ( ret == 0 )
+                return false;
+            else
+                return true;
+
+        }
+
+        #endregion
+
+        #region Event
+        /// <summary>
+        /// Jog 사용 시
+        /// </summary>
+        /// <param name="dir">1=Forward, -1=Backward, 0=Stop</param>
+        /// <returns></returns>
+        public bool SetManualOPCommand(int dir ) => database.HashSet( "4091", "7", dir.ToString() );
+
+        /// <summary>
+        ///  Servo Motor Control
+        /// </summary>
+        /// <param name="cmd">1=On, 2=Off, 3=Stop, -1=Fault Reset</param>
+        /// <returns></returns>
+        public bool SetServoCommand( int cmd ) => database.HashSet( "4092", "7", cmd.ToString() );
+
+        /// <summary>
+        /// System Operation Change
+        /// </summary>
+        /// <param name="op">-1=NoEvent, 0=open, 1=start, 2=goAutoOP, 3=goManualOP, 4=close, 5=finish</param>
+        /// <returns></returns>
+        public bool SetSystemOperation( int op ) => database.HashSet( "112", "7", op.ToString() );
+
+        public bool RouteMapMoveTo(string point )
+        {
+            database.HashSet( "3033", "7", point );
+            Thread.Sleep( 50 );
+            return database.HashSet( "3031", "7", 1 );
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Steering 뱡향 요청
+        /// </summary>
+        /// <returns>1=Left, -1=Right, 0=현상유지</returns>
+        public int GetSteering()
+        {
+            var ret = database.HashGet( "3050", "7" );
+            return CastTo<int>.From<RedisValue>(ret);
+        }
+
+        /// <summary>
+        /// Steering 뱡향 상태 쓰기
+        /// </summary>
+        /// <returns>1=Left, -1=Right, 0=Error</returns>
+        public bool SetActualSteeringPos( eSteeringState state )
+        {
+            int sV = 0;
+            switch ( state )
+            {
+                case eSteeringState.None:
+                    sV = 0;
+                    break;
+                case eSteeringState.Left:
+                    sV = 1;
+                    break;
+                case eSteeringState.Right:
+                    sV = -1;
+                    break;
+                default:
+                    break;
+            }
+            return database.HashSet( "3060", "7", sV );
+        }
+
+        /// <summary>
+        /// System State
+        /// </summary>
+        /// <returns>0=StartUp, 1=DeviceOpened, 2=DiviceOpenFailed, 3=ManualOP, 4=AutomaticOp, 5=DeviceCloseed, 6=Finished</returns>
+        public int GetSystemState()
+        {
+            var ret = database.HashGet( "111", "7" );
+            return CastTo<int>.From<RedisValue>(ret);
+        }
+
+
+
+}
 }

+ 108 - 136
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs

@@ -1,15 +1,10 @@
 using GSG.NET.Concurrent;
-using GSG.NET.Extensions;
 using GSG.NET.Logging;
 using OHV.Common.Shareds;
 using OHV.SqliteDAL;
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
+using VehicleControlSystem.ControlLayer.DB;
+using VehicleControlSystem.Managers;
 
 namespace VehicleControlSystem.ControlLayer.Drive
 {
@@ -25,73 +20,6 @@ namespace VehicleControlSystem.ControlLayer.Drive
             None,
         }
 
-
-        #region Dll Import
-        [DllImport( "OHVdrive.dll" )]
-        static extern void OHVdriveCreate();
-
-        [DllImport( "OHVdrive.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl )]
-        static extern void OHVdriveBegin();
-
-        [DllImport( "OHVdrive.dll" )]
-        static extern void OHVdriveEnd();
-
-        [DllImport( "OHVdrive.dll" )]
-        static extern void OHVdriveDelete();
-
-        //
-        [DllImport( "OHVdrive.dll" )]
-        static extern int OHVdriveGetTargetSteering();
-
-        // driving servo driver
-        // - servo_num = 1 = front, -1 = rear
-        // - return value
-        //   0 = wrong servo_num
-        //   1 = Servo On
-        //   2 = Servo Off
-        //   3 = Servo Stop
-        //   -1 = Servo Fault Reset
-        //   others = do nothing
-        [DllImport( "OHVdrive.dll" )]
-        static extern int OHVdriveGetServoState( int servo_num );
-
-        // driving servo driver
-        // - return value
-        //   1 = Servo On
-        //   2 = Servo Off
-        //   3 = Servo Stop
-        //  -1 = Servo Fault Reset
-        // others = do nothing
-        [DllImport( "OHVdrive.dll" )]
-        static extern void OHVdriveSetServoCommand( int command );
-
-        // command when manual operation
-        // 1 = go forward
-        // -1 = go backward
-        // 0 or others = stop
-        [DllImport( "OHVdrive.dll" )]
-        static extern void OHVdriveSetManualOperationCommand( int command );
-
-        // operation mode change (manual mode, automatic mode)
-        // 1 = change to automatic mode
-        // -1 = change to manual mode
-        // others = not change
-        [DllImport( "OHVdrive.dll" )]
-        static extern void OHVdriveSetOperationMode( int mode );
-
-        [DllImport( "OHVdrive.dll" )]
-        static extern int OHVdriveGetOperationMode();
-
-        // state of the laser scanner for detecting obstacles
-        // 0 = normal (no obstacles)
-        // 1 = field 1  (e-stop)
-        // 2 = field 2  (stop)
-        // 3 = filed 3  (slow)
-        [DllImport( "OHVdrive.dll" )]
-        static extern int OHVdriveSetLaserScannerField( int field );
-
-        #endregion
-
         Logger logger = Logger.GetLogger();
 
         public bool IsStop { get; set; }
@@ -133,28 +61,20 @@ namespace VehicleControlSystem.ControlLayer.Drive
 
         public void Init()
         {
-#if SIMULATION
-            return;
-#else
-            //OHVdriveCreate();
-            //OHVdriveBegin();
-
-            //this.threadCancel.AddGo( Thread_DriveStateChcker );
-#endif
+            Redis.Instance.Init();
+            this.threadCancel.AddGo( Thread_DriveStateChcker );
+            this.threadCancel.AddGo( Thread_Logger );
+
+            PhysicalCheckupLogger.Instance.Connecte();
         }
 
         public void Dispose()
         {
-#if SIMULATION
-            return;
-#else
-            //this.threadCancel.Cancel();
-            //LockUtils.Wait( 50 );
-            //this.threadCancel.StopWaitAll();
-
-            //OHVdriveEnd();
-            //OHVdriveDelete();
-#endif
+            Redis.Instance.Dispose();
+
+            this.threadCancel.Cancel();
+            LockUtils.Wait( 50 );
+            this.threadCancel.StopWaitAll();
         }
 
         void Thread_DriveStateChcker()
@@ -168,6 +88,10 @@ namespace VehicleControlSystem.ControlLayer.Drive
                     LockUtils.Wait( 10 );
                     this.GetReqSteeringState();
                     //this.GetServoState();
+                    //if (Redis.Instance.GetDriveMove() )
+                    //{
+                    //    this.LoggingState();
+                    //}
                 }
                 catch ( Exception e)
                 {
@@ -178,68 +102,117 @@ namespace VehicleControlSystem.ControlLayer.Drive
             logger.D( "[Drive] - Thread Drive State Checker Disposed" );
         }
 
+        bool isLoggingStart = false;
+        public bool IsloggingStart
+        {
+            get => this.isLoggingStart;
+            set
+            {
+                if ( SetField( ref this.isLoggingStart, value ) )
+                {
+                    if ( value )
+                        PhysicalCheckupLogger.Instance.SetPLCStartDrive();
+                    else
+                        PhysicalCheckupLogger.Instance.ResetPLCStartDrive();
+                }
+            }
+        }
+        void Thread_Logger()
+        {
+            while ( !this.threadCancel.Canceled )
+            {
+                try
+                {
+                    LockUtils.Wait( 10 );
+
+                    if ( Redis.Instance.GetDriveMove() )
+                    {
+                        this.IsloggingStart = true;
+                        this.LoggingState();
+                    }
+                    else
+                        this.IsloggingStart = false;
+                }
+                catch ( Exception e )
+                {
+                    logger.E( $"[Drive] - Error : [{e}]" );
+                }
+            }
+        }
+
+        void LoggingState()
+        {
+            var currentBCR = Redis.Instance.CurrentBCRValue();
+            var speed = Redis.Instance.ActualVelocityToSpeed();
+
+            var fTorque = Redis.Instance.TorqueFront();
+            var fRPM = Redis.Instance.ActualVelocityToFrontRPM();
+            var fLoadFacter = Redis.Instance.LoadFacterFront();
+            PhysicalCheckupLogger.Instance.FrontWheelLogging( speed.ToString(), fTorque.ToString(), fRPM.ToString(), fLoadFacter.ToString(), currentBCR.ToString() );
+
+            var rTorque = Redis.Instance.TorqueRear();
+            var rRPM = Redis.Instance.ActualVelocityToRearRPM();
+            var rLoadFacter = Redis.Instance.LoadFacterRear();
+            PhysicalCheckupLogger.Instance.RearWheelLoggging( speed.ToString(), rTorque.ToString(), rRPM.ToString(), rLoadFacter.ToString(), currentBCR.ToString() );
+        }
+
         void GetReqSteeringState()
         {
-            var gV = OHVdriveGetTargetSteering();
-            if ( gV == -1 )
-                this.ReqSteeringState = eSteeringState.Right;
-            else if ( gV == 1 )
+            var ret = Redis.Instance.GetSteering();
+            if ( ret == 1 )// Left
                 this.ReqSteeringState = eSteeringState.Left;
-            else { }
+            else if ( ret == -1 ) //Right
+                this.ReqSteeringState = eSteeringState.Right;
+            else if ( ret == 0 ) // Do Nothing
+                this.ReqSteeringState = eSteeringState.None;
+            else 
+            { }
         }
 
-        void GetServoState()
+        bool IsDriveFault()
         {
-            int fState = OHVdriveGetServoState( 1 );
-            int rState = OHVdriveGetServoState( -1 );
-
-            if ( fState == 1 && rState == 1 )
-                this.DriveServoState = eDriveServoState.ServoOn;
-            else if ( fState == 2 && rState == 2 )
-                this.DriveServoState = eDriveServoState.ServoOff;
-            else if ( fState == 3 && rState == 3 )
-                this.DriveServoState = eDriveServoState.ServoStop;
-            else if ( fState == -1 || rState == -1 )
-                this.DriveServoState = eDriveServoState.ServoFault;
-            else
-                this.DriveServoState = eDriveServoState.None;
+            var ret = Redis.Instance.GetSystemState();
+            return ret == 2 ? true : false;
         }
 
         public void SetDriveOperationMode( eOperatationMode mode )
         {
-#if SIMULATION
-#else
-            return;
 
             if ( mode == eOperatationMode.ManualMode )
-                OHVdriveSetOperationMode( -1 );
+                Redis.Instance.SetSystemOperation( 3 );
             else if ( mode == eOperatationMode.AutoMode )
-                OHVdriveSetOperationMode( 1 );
+                Redis.Instance.SetSystemOperation( 2 );
             else { }
-#endif
         }
 
         public eOperatationMode GetDriveOperationMode()
         {
-            eOperatationMode mode = eOperatationMode.InitialMode;
+            var ret = Redis.Instance.GetSystemState();
 
-            int result = OHVdriveGetOperationMode();
-            if ( result == 1 )
-                mode = eOperatationMode.AutoMode;
-            else if ( result == -1 )
-                mode = eOperatationMode.ManualMode;
-            else { }
-
-            return mode;
+            if ( ret == 3 )
+                return eOperatationMode.ManualMode;
+            else if ( ret == 4 )
+                return eOperatationMode.AutoMode;
+            else
+                return eOperatationMode.InitialMode;
         }
 
         public int MoveToPoint( string point, double velocity )
         {
-            if ( this.DriveServoState != eDriveServoState.ServoStop )
-                return 9999;
+            //if ( this.DriveServoState != eDriveServoState.ServoStop )
+            //    return 9999;
 
+            //Drive Fault 상태 확인
+            if ( IsDriveFault() )
+                return 34;
 
             //ToDo: 이동 명령 실행.
+            int result = 0;
+            if (! Redis.Instance.RouteMapMoveTo( point ) )
+            {
+                //Todo: Error 처리
+            }
+
 
             return 0;
         }
@@ -247,25 +220,25 @@ namespace VehicleControlSystem.ControlLayer.Drive
         /// <summary>
         /// 급정시 사용.
         /// </summary>
-        public void EStop() => OHVdriveSetServoCommand(3);
+        //public void EStop() => OHVdriveSetServoCommand(3);
 
         /// <summary>
         /// Manual 상태에서 가감속 Stop
         /// </summary>
         public void Stop()
         {
-            OHVdriveSetManualOperationCommand( 0 );
         }
 
-        public void JogForWard() => OHVdriveSetManualOperationCommand( 1 );
-        public void JogBackward() => OHVdriveSetManualOperationCommand( -1 );
-        public void ServoOn() => OHVdriveSetServoCommand( 1 );
-        public void ServoOff() => OHVdriveSetServoCommand( 2 );
-        public void AmpFaultReset() => OHVdriveSetServoCommand( -1 );
+        //public void JogForWard() => OHVdriveSetManualOperationCommand( 1 );
+        //public void JogBackward() => OHVdriveSetManualOperationCommand( -1 );
+        //public void ServoOn() => OHVdriveSetServoCommand( 1 );
+        //public void ServoOff() => OHVdriveSetServoCommand( 2 );
+        //public void AmpFaultReset() => OHVdriveSetServoCommand( -1 );
 
         public void SetObstacleState( eObstacleState state )
         {
             int field = 0;
+
             switch ( state )
             {
                 case eObstacleState.Normal:
@@ -283,7 +256,6 @@ namespace VehicleControlSystem.ControlLayer.Drive
                 default:
                     break;
             }
-            OHVdriveSetLaserScannerField( field );
         }
 
         public bool VelocityChainge( double velocity )

+ 10 - 7
Dev/OHV/VehicleControlSystem/ControlLayer/Steering.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Threading.Tasks;
+using GSG.NET.Concurrent;
 using GSG.NET.Logging;
 using GSG.NET.Utils;
 using OHV.Common.Shareds;
@@ -37,10 +38,11 @@ namespace VehicleControlSystem.ControlLayer
 
         private void IO_OnChangedIO( BitBlock bit )
         {
-            if ( bit.Tag.Equals( "IN_F_STEERING_DETECT_LEFT" ) || bit.Tag.Equals( "IN_F_STEERING_DETECT_RIGHT" ) )
-                this.GetSteeringState();
-            if ( bit.Tag.Equals( "IN_R_STEERING_DETECT_LEFT" ) || bit.Tag.Equals( "IN_R_STEERING_DETECT_RIGHT" ) )
-                this.GetSteeringState();
+            //if ( bit.Tag.Equals( "IN_F_STEERING_DETECT_LEFT" ) || bit.Tag.Equals( "IN_F_STEERING_DETECT_RIGHT" ) )
+            //    this.GetSteeringState();
+
+            //if ( bit.Tag.Equals( "IN_R_STEERING_DETECT_LEFT" ) || bit.Tag.Equals( "IN_R_STEERING_DETECT_RIGHT" ) )
+            //    this.GetSteeringState();
         }
 
         void GetSteeringState( )
@@ -75,7 +77,6 @@ namespace VehicleControlSystem.ControlLayer
                 this.SteeringState = eSteeringState.None;
         }
 
-        object lockObj = new object();
         bool isExecuteSteering = false;
         public int ControlSteering( bool isLeft = false )
         {
@@ -112,6 +113,8 @@ namespace VehicleControlSystem.ControlLayer
                  long sTime = SwUtils.CurrentTimeMillis;
                  while ( true )
                  {
+                     LockUtils.Wait( 5 );
+
                      if ( SwUtils.Gt( sTime , 5 * ConstUtils.ONE_SECOND ) ) //Wait 20Sec
                          return false;
 
@@ -145,8 +148,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 , 500 );
-            this.iO.WriteOutputIO( "OUT_R_STEERING_DA" , false , 500 );
+            this.iO.WriteOutputIO( "OUT_F_STEERING_DA" , false , 800 );
+            this.iO.WriteOutputIO( "OUT_R_STEERING_DA" , false , 800 );
         }
 
         bool IsFrontLeft( ) => this.iO.IsOn( "IN_F_STEERING_DETECT_LEFT" );

+ 63 - 16
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -17,6 +17,7 @@ using OHV.Common.Shareds;
 using OHV.SqliteDAL;
 using Prism.Events;
 using VehicleControlSystem.ControlLayer.Actuator.Cylinder;
+using VehicleControlSystem.ControlLayer.DB;
 using VehicleControlSystem.ControlLayer.Drive;
 using VehicleControlSystem.ControlLayer.IO;
 using VehicleControlSystem.ControlLayer.Serial.BatteryTabos;
@@ -116,7 +117,13 @@ namespace VehicleControlSystem.ControlLayer
         public eSteeringState SteeringState
         {
             get { return steeringState; }
-            set { SetField( ref this.steeringState, value ); }
+            set 
+            { 
+                if ( SetField( ref this.steeringState, value ) )
+                {
+                    Redis.Instance.SetActualSteeringPos( value );
+                }
+            }
         }
 
         private int _obstacleDrive;
@@ -421,14 +428,17 @@ namespace VehicleControlSystem.ControlLayer
                     case DriveControlEventArgs.eControlKind.MOVE:
                         this.ReqMoveToPos( _args );
                         break;
+
                     case DriveControlEventArgs.eControlKind.STOP:
                         break;
+
                     case DriveControlEventArgs.eControlKind.Steering:
                         if ( msg.MoveDir == DriveControlEventArgs.eMoveDir.LEFT )
                             this.steering.ControlSteering( true );
                         else
                             this.steering.ControlSteering();
                         break;
+
                     case DriveControlEventArgs.eControlKind.SteeringState:
                         {
                             var reply = new DriveControlEventArgs();
@@ -444,37 +454,47 @@ namespace VehicleControlSystem.ControlLayer
                                 reply.Result = FluentResults.Results.Ok();
                             }
                             else
-                                reply.Result = FluentResults.Results.Fail(new Error());
+                                reply.Result = FluentResults.Results.Fail( new Error() );
 
                             this.DriveControlEventPublish( reply );
                         }
                         break;
+
                     case DriveControlEventArgs.eControlKind.ReqCurrentPos:
                         //this.ReqCurrentPos();
                         break;
+
                     case DriveControlEventArgs.eControlKind.ReqStopCurrentPos:
                         //this.taskCancel.Cancel();
                         //this.taskCancel.WaitAll();
                         break;
+
                     case DriveControlEventArgs.eControlKind.FaultReset:
                         this.ReqFaultReset( _args );
                         break;
+
                     case DriveControlEventArgs.eControlKind.DriveON:
                         this.ReqDriveOn( _args );
                         break;
+
                     case DriveControlEventArgs.eControlKind.DriveOFF:
                         this.ReqDriveOff( _args );
                         break;
+
                     case DriveControlEventArgs.eControlKind.JOG:
                         this.ReqJog( _args );
                         break;
+
                     case DriveControlEventArgs.eControlKind.VehicleState:
                         ReqVehicleState( _args );
                         break;
+
                     case DriveControlEventArgs.eControlKind.NONE:
                         break;
+
                     case DriveControlEventArgs.eControlKind.Conveyor:
                         break;
+
                     default:
                         break;
                 }
@@ -603,11 +623,11 @@ namespace VehicleControlSystem.ControlLayer
         {
             if ( _args.JogDir == DriveControlEventArgs.eJogMoveDir.Positive )
             {
-                this.drive.JogForWard();
+                //this.drive.JogForWard();
             }
             else
             {
-                this.drive.JogBackward();
+                //this.drive.JogBackward();
             }
         }
 
@@ -773,7 +793,7 @@ namespace VehicleControlSystem.ControlLayer
             this.conveyor.OnOffConveyor( false );
             //Clamp EStop
             this.clamp.ClampEStop();
-            this.drive.EStop();
+            //this.drive.EStop();
 
             this.OccurVehicleAlarm( 23 );
         }
@@ -781,6 +801,18 @@ namespace VehicleControlSystem.ControlLayer
         #region For Moving
         void Move( SubCmd sub )
         {
+            //Move 시작 시 충전 중이면 충전 중지 실행.
+            int result = 0;
+            if ( this.IsCharging() )
+            {
+                result = this.StopBatteryCharge();
+                if ( result != 0 )
+                {
+                    OccurVehicleAlarm( result );
+                    return;
+                }
+            }
+
             if ( this.MoveTo( sub.TargetID ) )
             {
             }
@@ -875,7 +907,8 @@ namespace VehicleControlSystem.ControlLayer
                     }
                 }
 
-                PhysicalCheckupLogger.Instance.DriveStateLog( this.drive.CurrentSpeed.ToString(), this.drive.CurrentTorque.ToString() );
+                //PhysicalCheckupLogger.Instance.DriveStateLog( this.drive.CurrentSpeed.ToString(), this.drive.CurrentTorque.ToString(), "12315", "100", "1234" );
+                //PhysicalCheckupLogger.Instance.DriveStateLog( this.drive.CurrentSpeed.ToString(), this.drive.CurrentTorque.ToString(), "12315", "100", "1234", false );
 
                 //20.04.04 Kang Drive 측으로 상태만 알려주면 알아서 처리함.
                 //if ( this.ObstacleStateProperty != eObstacleState.Normal )
@@ -1104,7 +1137,7 @@ namespace VehicleControlSystem.ControlLayer
             {
                 PIOClear();
                 loggerPIO.E( "[Port] - 4 Ready Time Out" );
-                return 9999;
+                return 34;
             }
             loggerPIO.E( "[Port] - 4 Ready On" );
 
@@ -1115,11 +1148,11 @@ namespace VehicleControlSystem.ControlLayer
             {
                 PIOClear();
                 loggerPIO.E( "[Port] - 5 Sending Run Time Out" );
-                return 9999;
+                return 35;
             }
             loggerPIO.I( "[Port] - 5 Sending Run On" );
 
-            this.iO.WriteOutputIO( "OUT_PIO_RECEIVE_RUN", true ); 
+            this.iO.WriteOutputIO( "OUT_PIO_RECEIVE_RUN", true );
             loggerPIO.I( "[Vehicle] - 5 Receive Run On" );
 
             this.VehicleStateProperty = eVehicleState.Charge;
@@ -1142,7 +1175,7 @@ namespace VehicleControlSystem.ControlLayer
             {
                 this.iO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false );
                 loggerPIO.E( "[Port]  IN_PIO_SEND_COMPLITE On Time Out" );
-                return 9999;
+                return 36;
             }
             loggerPIO.I( "[Port] Send Complete On" );
 
@@ -1209,15 +1242,22 @@ namespace VehicleControlSystem.ControlLayer
         /// Out Put 을 Off 이면 Sensor On
         /// </summary>
         public void PIOSensorOff() => this.iO.OutputOn( "OUT_PIO_SENSOR_ONOFF" );
+
+        /// <summary>
+        /// 충전 중일때 MTL PIO Bit 가 살아 있다 
+        /// 이걸 보고 판단 하자. 충전 단자 전진 상태임.
+        /// </summary>
+        /// <returns></returns>
+        public bool IsCharging() => this.iO.IsOn( "IN_PIO_SEND_RUN" ) && this.iO.IsOn( "IN_PIO_SENDABLE" );
         #endregion
 
         #region Drive
-        public void DriveServoOff() => this.drive.ServoOff();
-        public void DriveServoOn() => this.drive.ServoOn();
+        //public void DriveServoOff() => this.drive.ServoOff();
+        //public void DriveServoOn() => this.drive.ServoOn();
         #endregion
 
         #region Conveyor
-
+        public void ConveyorOff() => this.conveyor.OnOffConveyor( false );
         public int ConveyorLoad() => this.conveyor.ConveyorLoad();
 
         public int ConveyorUnload() => this.conveyor.ConveyorUnload();
@@ -1680,10 +1720,16 @@ namespace VehicleControlSystem.ControlLayer
             return BitUtils.ChgInt32( bitArray );
         }
 
+        /// <summary>
+        /// Vehicle 이동 및 동작 중 Alarm 발생 시 처리
+        /// </summary>
+        /// <param name="alarmID"></param>
         void OccurVehicleAlarm( int alarmID )
         {
             this.MachineMode = eMachineMode.LocalMode;
             this.VehicleStateProperty = eVehicleState.Abnormal;
+            this.ConveyorOff();
+
             this.autoManager.ProcessAlarm( alarmID );
         }
 
@@ -1784,6 +1830,7 @@ namespace VehicleControlSystem.ControlLayer
             {
                 var v = CastTo<eSteeringState>.From<object>( newValue );
                 this.SteeringState = v;
+                logger.D( $"steering - {v}" );
             }
         }
 
@@ -1810,7 +1857,7 @@ namespace VehicleControlSystem.ControlLayer
                 case "IN_MC_ON":
                     if ( bit.IsBitOn )
                     {
-                        if (!this.iO.IsOn( "IN_EMS_SW" ) && this.iO.IsOn( "IN_CP_ON_SAFETY" ) && this.iO.IsOn( "IN_CP_ON_24V" ) )
+                        if ( !this.iO.IsOn( "IN_EMS_SW" ) && this.iO.IsOn( "IN_CP_ON_SAFETY" ) && this.iO.IsOn( "IN_CP_ON_24V" ) )
                             this.VehicleStateProperty = eVehicleState.Idle;
                     }
                     else
@@ -1818,12 +1865,12 @@ namespace VehicleControlSystem.ControlLayer
                     break;
 
                 case "IN_EMS_SW":
-                    if ( bit.IsBitOn)
+                    if ( bit.IsBitOn )
                         this.OccurVehicleAlarm( 28 );
                     break;
 
                 case "IN_CP_ON_SAFETY":
-                    if ( !bit.IsBitOn)
+                    if ( !bit.IsBitOn )
                         this.OccurVehicleAlarm( 31 );
                     break;
 

+ 0 - 1
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -426,7 +426,6 @@ namespace VehicleControlSystem.Managers
                     logger.E( $"[OCS] Cmd - {msg.Kind} Message Tag [{msg.Tag}] - Already Load/Unload " );
                     return;
                 }
-
             }
 
             var cmd = new Command();

+ 37 - 25
Dev/OHV/VehicleControlSystem/Managers/PhysicalCheckupLogger.cs

@@ -18,13 +18,16 @@ namespace VehicleControlSystem.Managers
     /// </summary>
     class PhysicalCheckupLogger : SingletonBase<PhysicalCheckupLogger>
     {
-        Logger logger = Logger.GetLogger( "PhysicalCheckup" );
+        Logger frontlogger = Logger.GetLogger( "PhysicalCheckup_Front" );
+        Logger rearlogger = Logger.GetLogger( "PhysicalCheckup_Rear" );
+        Logger logger = Logger.GetLogger();
+
 
         TcpConnector h = new TcpConnector();
         const byte CR = 0x0d;
 
-        public string PLCAddress { get; set; }
-        public int PLCPort { get; set; }
+        public string PLCAddress { get; set; } = "192.168.0.20";
+        public int PLCPort { get; set; } = 8501;
         public string PLCFolderName { get; set; }
         public string FTPFolderName { get; set; }
 
@@ -32,13 +35,8 @@ namespace VehicleControlSystem.Managers
         {
         }
 
-        public void DriveStateLog( string speed, string torque, bool isFront = true )
-        {
-            if ( isFront )
-                logger.I( $"[Front] - Speed : {speed} / Torque : {torque}" );
-            else
-                logger.I( $"[Rear] - Speed : {speed} / Torque : {torque}" );
-        }
+        public void FrontWheelLogging( string speed, string torque, string RPM, string LoadFactor, string MCR ) => frontlogger.I( $"Speed : {speed} / Torque : {torque} / RPM : {RPM} / LoadFactor : {LoadFactor} / MCR : {MCR}" );
+        public void RearWheelLoggging( string speed, string torque, string RPM, string LoadFactor, string MCR ) => rearlogger.I( $"Speed : {speed} / Torque : {torque} / RPM : {RPM} / LoadFactor : {LoadFactor} / MCR : {MCR}" );
 
         public async Task UploadPhysicalCheckupLogAsync()
         {
@@ -83,6 +81,16 @@ namespace VehicleControlSystem.Managers
             }
         }
 
+        public void Connecte()
+        {
+            h.Connect( new TcpComm
+            {
+                Active = true,
+                Ip = "192.168.0.20",
+                PortNo = 8501,
+            } );
+        }
+
         /// <summary>
         /// 주행 시작 시 진단 PLC Bit On
         /// </summary>
@@ -91,13 +99,15 @@ namespace VehicleControlSystem.Managers
         {
             try
             {
-                var h = new TcpConnector();
-                h.Connect( new TcpComm
+                if ( !h.Connected )
                 {
-                    Active = true,
-                    Ip = this.PLCAddress,
-                    PortNo = this.PLCPort,
-                } );
+                    h.Connect( new TcpComm
+                    {
+                        Active = true,
+                        Ip = "192.168.0.20",
+                        PortNo = 8501,
+                    } );
+                }
 
                 if ( !h.Connected )
                     return false;
@@ -107,9 +117,9 @@ namespace VehicleControlSystem.Managers
                 mb.Append( CR );
                 this.h.WriteFlush( mb.ToBytes );
 
-                h.CloseSocket();
+                //h.CloseSocket();
             }
-            catch ( Exception e)
+            catch ( Exception e )
             {
                 logger.E( $"[PLC] - Set Value Connection Error {e}" );
                 return false;
@@ -126,13 +136,15 @@ namespace VehicleControlSystem.Managers
         {
             try
             {
-                var h = new TcpConnector();
-                h.Connect( new TcpComm
+                if ( !h.Connected )
                 {
-                    Active = true,
-                    Ip = this.PLCAddress,
-                    PortNo = this.PLCPort,
-                } );
+                    h.Connect( new TcpComm
+                    {
+                        Active = true,
+                        Ip = "192.168.0.20",
+                        PortNo = 8501,
+                    } );
+                }
 
                 if ( !h.Connected )
                     return false;
@@ -142,7 +154,7 @@ namespace VehicleControlSystem.Managers
                 mb.Append( CR );
                 this.h.WriteFlush( mb.ToBytes );
 
-                h.CloseSocket();
+                //h.CloseSocket();
 
             }
             catch ( Exception e )

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

@@ -186,7 +186,6 @@ namespace VehicleControlSystem
             }
         }
 
-
         void ReqBatteryState()
         {
             BatteryInfo battery = new BatteryInfo();