SK.Kang 6 年 前
コミット
91c2e72f78

+ 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>

+ 74 - 10
Dev/OHV/VehicleControlSystem/ControlLayer/DB/Redis.cs

@@ -1,5 +1,6 @@
 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;
@@ -37,31 +38,70 @@ namespace VehicleControlSystem.ControlLayer.DB
 
 
         #region GetLogData
+
+        /// <summary>
+        /// 0.1% 단위
+        /// 100% 1.9Nm
+        /// </summary>
+        /// <returns></returns>
         public double TorqueFront()
         {
-            var ret = database.HashGet( "7026", "7" );
-            return CastTo<double>.From<RedisValue>( ret );
+            return LoadFacterFront() * 1.9 / 100;
         }
+
+        /// <summary>
+        /// 0.1% 단위 
+        /// </summary>
+        /// <returns></returns>
         public double TorqueRear()
         {
-            var ret = database.HashGet( "7026", "8" );
-            return CastTo<double>.From<RedisValue>( ret );
+            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( "7025", "8" );
-            return CastTo<double>.From<RedisValue>( ret );
+            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( "7025", "10" );
-            return CastTo<double>.From<RedisValue>( ret );
+            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 );
+            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
@@ -96,7 +136,7 @@ namespace VehicleControlSystem.ControlLayer.DB
         #endregion
 
         /// <summary>
-        /// Streering 뱡향 요청
+        /// Steering 뱡향 요청
         /// </summary>
         /// <returns>1=Left, -1=Right, 0=현상유지</returns>
         public int GetSteering()
@@ -105,6 +145,30 @@ namespace VehicleControlSystem.ControlLayer.DB
             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>

+ 63 - 1
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs

@@ -4,6 +4,7 @@ using OHV.Common.Shareds;
 using OHV.SqliteDAL;
 using System;
 using VehicleControlSystem.ControlLayer.DB;
+using VehicleControlSystem.Managers;
 
 namespace VehicleControlSystem.ControlLayer.Drive
 {
@@ -62,6 +63,9 @@ namespace VehicleControlSystem.ControlLayer.Drive
         {
             Redis.Instance.Init();
             this.threadCancel.AddGo( Thread_DriveStateChcker );
+            this.threadCancel.AddGo( Thread_Logger );
+
+            PhysicalCheckupLogger.Instance.Connecte();
         }
 
         public void Dispose()
@@ -84,6 +88,10 @@ namespace VehicleControlSystem.ControlLayer.Drive
                     LockUtils.Wait( 10 );
                     this.GetReqSteeringState();
                     //this.GetServoState();
+                    //if (Redis.Instance.GetDriveMove() )
+                    //{
+                    //    this.LoggingState();
+                    //}
                 }
                 catch ( Exception e)
                 {
@@ -94,6 +102,60 @@ 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 ret = Redis.Instance.GetSteering();
@@ -102,7 +164,7 @@ namespace VehicleControlSystem.ControlLayer.Drive
             else if ( ret == -1 ) //Right
                 this.ReqSteeringState = eSteeringState.Right;
             else if ( ret == 0 ) // Do Nothing
-            { }
+                this.ReqSteeringState = eSteeringState.None;
             else 
             { }
         }

+ 8 - 4
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( )
@@ -111,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;
 

+ 11 - 2
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;
@@ -900,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 )
@@ -1822,6 +1830,7 @@ namespace VehicleControlSystem.ControlLayer
             {
                 var v = CastTo<eSteeringState>.From<object>( newValue );
                 this.SteeringState = v;
+                logger.D( $"steering - {v}" );
             }
         }
 

+ 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 )