Explorar o código

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

# Conflicts:
#	Dev/OHV/Assambly/OHVConnector.dll
#	Dev/OHV/Assambly/OHVConnector.pdb
#	Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs
ys-hwang %!s(int64=6) %!d(string=hai) anos
pai
achega
dc16f47b8d
Modificáronse 29 ficheiros con 393 adicións e 208 borrados
  1. 1 1
      Dev/OHV/Assambly/GSG.NET.XML
  2. BIN=BIN
      Dev/OHV/Assambly/GSG.NET.dll
  3. BIN=BIN
      Dev/OHV/Assambly/GSG.NET.pdb
  4. BIN=BIN
      Dev/OHV/Assambly/OHVConnector.dll
  5. BIN=BIN
      Dev/OHV/Assambly/OHVConnector.pdb
  6. 2 0
      Dev/OHV/OHV.Common/Model/Command.cs
  7. 2 0
      Dev/OHV/OHV.Common/Model/SubCmd.cs
  8. 1 0
      Dev/OHV/OHV.Common/Shareds/SharedEnumType.cs
  9. 17 32
      Dev/OHV/OHV.Module.Interactivity/PopUp/LockServoView.xaml
  10. 3 0
      Dev/OHV/OHV.SqliteDAL/DAL/AbstractDAL.cs
  11. 0 21
      Dev/OHV/OHV.Vehicle/Config/AlarmDefind..csv
  12. BIN=BIN
      Dev/OHV/OHV.Vehicle/Config/AlarmDefind.xlsx
  13. 3 0
      Dev/OHV/OHV.Vehicle/OHV.Vehicle.csproj
  14. 4 4
      Dev/OHV/VehicleControlSystem/ControlLayer/Clamp.cs
  15. 35 3
      Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs
  16. 30 8
      Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs
  17. 1 1
      Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/BMUManager.cs
  18. 30 16
      Dev/OHV/VehicleControlSystem/ControlLayer/Steering.cs
  19. 67 44
      Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs
  20. 6 4
      Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs
  21. 56 31
      Dev/OHV/VehicleControlSystem/Managers/HostManager.cs
  22. 41 29
      Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs
  23. 22 2
      Dev/OHV/VehicleControlSystem/VCSystem.cs
  24. BIN=BIN
      Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide
  25. 5 2
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/App.config
  26. 7 4
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FTPLogger.cs
  27. 15 6
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FormMain.cs
  28. 6 0
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger.csproj
  29. 39 0
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/ZmqManager.cs

+ 1 - 1
Dev/OHV/Assambly/GSG.NET.XML

@@ -1805,7 +1805,7 @@
             </summary>
         </member>
         <member name="M:GSG.NET.OSView.Mgnt.MemVirtualKB">
-            <summary>
+            <summary>   
             <para>Virtual Memory Size KB 단위 추출</para>
             </summary>
         </member>

BIN=BIN
Dev/OHV/Assambly/GSG.NET.dll


BIN=BIN
Dev/OHV/Assambly/GSG.NET.pdb


BIN=BIN
Dev/OHV/Assambly/OHVConnector.dll


BIN=BIN
Dev/OHV/Assambly/OHVConnector.pdb


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

@@ -24,6 +24,7 @@ namespace OHV.Common.Model
         public bool IsSecondCommanded { get; set; }
 
         public virtual bool IsSelected { get; set; }
+        public List<string> TargetList { get; set; }
 
         public Command()
         {
@@ -33,6 +34,7 @@ namespace OHV.Common.Model
             State = eCommandState.Queued;
             Result = eCommandResult.Completed;
             this.IsSecondCommanded = false;
+            this.TargetList = new List<string>();
         }
     }
 }

+ 2 - 0
Dev/OHV/OHV.Common/Model/SubCmd.cs

@@ -29,6 +29,7 @@ namespace OHV.Common.Model
         {
             ID = $"{Guid.NewGuid()}_{DateTime.Now.ToString("HHmmssfff")}";
             this.CreateTime = DateTime.Now;
+            this.TargetList = new List<string>();
         }
 
         public string ID { get; set; }
@@ -43,6 +44,7 @@ namespace OHV.Common.Model
         public DateTime CreateTime { get; set; }
 
         public virtual bool IsSelected { get; set; }
+        public List<string> TargetList { get; set; }
 
     }
 }

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

@@ -155,6 +155,7 @@
 
 	public enum eAlarmKind
 	{
+		None,
 		Axis,
 		Cylinder,
 		Drive,

+ 17 - 32
Dev/OHV/OHV.Module.Interactivity/PopUp/LockServoView.xaml

@@ -98,7 +98,7 @@
                         <Button Background="{x:Null}" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            >
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Axis" FontSize="20"/></TextBlock>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Select" FontSize="20"/></TextBlock>
@@ -109,7 +109,7 @@
                         <Button Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            >
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Target" FontSize="20"/></TextBlock>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Pos" FontSize="20"/></TextBlock>
@@ -120,7 +120,7 @@
                         <Button Grid.Column="0" Grid.Row="2" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            >
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Current" FontSize="18"/></TextBlock>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Pos" FontSize="20"/></TextBlock>
@@ -130,7 +130,7 @@
                         <Button Grid.Column="0" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            >
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Difference" FontSize="14"/></TextBlock>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Pos" FontSize="20"/></TextBlock>
@@ -142,7 +142,6 @@
                         <Button Grid.Column="1" Grid.Row="0" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners"
                             Command="{Binding SelectAxisCommand}"
                             CommandParameter="Axis_CarrierLock_Left"
                             BorderBrush="{Binding LeftAxisBrush}"
@@ -158,8 +157,7 @@
 
                         <Button Background="{x:Null}" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10">
                             <Button.InputBindings>
                                 <MouseBinding Gesture="LeftClick" Command="{Binding KeyInTargetPosCommand}" CommandParameter="Left"/>
                             </Button.InputBindings>
@@ -168,15 +166,13 @@
 
                         <Button Background="{x:Null}" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10">
                             <TextBlock><Run Text="{Binding CurrentLockLeft, StringFormat=0.000, FallbackValue=0.000}" FontSize="20"/></TextBlock>
                         </Button>
 
                         <Button Background="{x:Null}" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10">
                             <TextBlock><Run Text="{Binding DifferenceLockLeft, StringFormat=0.000, FallbackValue=0.000}" FontSize="20"/></TextBlock>
                         </Button>
 
@@ -184,7 +180,6 @@
                         <Button Grid.Column="2" Grid.Row="0" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners"
                             Command="{Binding SelectAxisCommand}"
                             CommandParameter="Axis_CarrierLock_Right"
                             BorderBrush="{Binding RightAxisBrush}"
@@ -200,8 +195,7 @@
 
                         <Button Background="{x:Null}" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10">
                             <Button.InputBindings>
                                 <MouseBinding Gesture="LeftClick" Command="{Binding KeyInTargetPosCommand}" CommandParameter="Right"/>
                             </Button.InputBindings>
@@ -210,15 +204,13 @@
 
                         <Button Background="{x:Null}" Grid.Column="2" Grid.Row="2" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10">
                             <TextBlock><Run Text="{Binding CurrentLockRight, StringFormat=0.000, FallbackValue=0.000}" FontSize="20"/></TextBlock>
                         </Button>
 
                         <Button Background="{x:Null}" Grid.Column="2" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                            Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10">
                             <TextBlock><Run Text="{Binding DifferenceLockRight, StringFormat=0.000, FallbackValue=0.000}" FontSize="20"/></TextBlock>
                         </Button>
 
@@ -227,14 +219,12 @@
 
                         <Button Background="{x:Null}" Grid.Column="3" Grid.Row="0" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                            Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10">
                             <TextBlock><Run Text="Left Axis" FontSize="20"/></TextBlock>
                         </Button>
                         <Button Background="{x:Null}" Grid.Column="4" Grid.Row="0" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                            Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10">
                             <TextBlock><Run Text="Right Axis" FontSize="18"/></TextBlock>
                         </Button>
 
@@ -248,16 +238,14 @@
                         </Button>
                         <Button Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsLeftServoOriginReturn ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsLeftServoOriginReturn ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}">
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center" TextWrapping="Wrap"><Run Text="Origin Return"/></TextBlock>
                             </StackPanel>
                         </Button>
                         <Button Grid.Column="3" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsLeftServoFault ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsLeftServoFault ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}">
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center" TextWrapping="Wrap"><Run Text="Servo Fault"/></TextBlock>
                             </StackPanel>
@@ -276,24 +264,21 @@
                         </Border>
                         <Button Grid.Column="4" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsRightServoOn ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsRightServoOn ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}">
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center"><Run Text="Servo On"/></TextBlock>
                             </StackPanel>
                         </Button>
                         <Button Grid.Column="4" Grid.Row="2" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsRightServoOriginReturn ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsRightServoOriginReturn ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}">
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center" TextWrapping="Wrap"><Run Text="Origin Return"/></TextBlock>
                             </StackPanel>
                         </Button>
                         <Button Grid.Column="4" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
-                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsRightServoFault ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}"
-                            ToolTip="MaterialDesignRaisedButton with Round Corners">
+                            materialDesign:ButtonAssist.CornerRadius="10" Background="{c:Binding 'IsRightServoFault ? media:Brushes.DodgerBlue : media:Brushes.Transparent'}">
                             <StackPanel>
                                 <TextBlock HorizontalAlignment="Center" TextWrapping="Wrap"><Run Text="Servo Fault"/></TextBlock>
                             </StackPanel>

+ 3 - 0
Dev/OHV/OHV.SqliteDAL/DAL/AbstractDAL.cs

@@ -208,6 +208,9 @@ namespace OHV.SqliteDAL.DAL
             lock ( this.lockObj )
             {
                 T existing = table.Find( id );
+                if ( existing == null )
+                    return;
+
                 table.Remove( existing );
                 this.Save();
             }

+ 0 - 21
Dev/OHV/OHV.Vehicle/Config/AlarmDefind..csv

@@ -1,21 +0,0 @@
-1,LeftClampServoError,Left Clamp Lock Motion Error,,,1,0
-2,LeftClampServoError,Left Clamp Unlock Motion Error,,,1,0
-3,RightClamServoError,Right Clamp Lock Motion Error,,,1,0
-4,RightClamServoError,Right Clamp Unlock Motion Error,,,1,0
-5,RightClamServoError,Is Not Origin Return,,,1,0
-6,LeftClampServoError,Is Not Origin Return,,,1,0
-7,RightClamServoError,Origin Return Fail,,,1,0
-8,LeftClampServoError,Origin Return Fail,,,1,0
-9,Conveyor,Already Exist Carrier,,,1,0
-10,Conveyor,Loading Time Over,,,1,0
-11,Conveyor,Not Exist Carrier,,,1,0
-12,Conveyor,Unloading Time Over,,,1,0
-13,Conveyor,Lifter Not Unloading Position,,,1,0
-14,Conveyor,Lifter Not Loading Position,,,1,0
-15,Conveyor,Lifter have not Carrier,,,1,0
-16,Conveyor,Inverter Error,,,1,0
-17,PIO,Port PIO Ready Off,,,1,0
-18,PIO,Port PIO Time Out,,,1,0
-19,PIO,Port PIO InterLock On,,,1,0
-20,Conveyor,Loading Position Wrong,,,1,0
-21,Conveyor,Loading Position Wrong,,,1,0

BIN=BIN
Dev/OHV/OHV.Vehicle/Config/AlarmDefind.xlsx


+ 3 - 0
Dev/OHV/OHV.Vehicle/OHV.Vehicle.csproj

@@ -237,6 +237,9 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
+    <None Include="Config\AlarmDefind.xlsx">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Include="Config\IO.xlsx">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>

+ 4 - 4
Dev/OHV/VehicleControlSystem/ControlLayer/Clamp.cs

@@ -530,7 +530,7 @@ namespace VehicleControlSystem.ControlLayer
         public int MoveToLockPosition( string axisName )
         {
             var servo = this.axes.Where( x => x.Config.AxisName.Equals( axisName ) ).Single();
-            var axisPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.Name.Equals( axisName )).ToList();
+            var axisPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.AxisName.Equals( axisName )).ToList();
             var data = axisPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_LOCK ) ).Single();
 
             int result = servo.Move( data.Value );
@@ -541,7 +541,7 @@ namespace VehicleControlSystem.ControlLayer
         public int MoveToUnlockPosition( string axisName )
         {
             var servo = this.axes.Where( x => x.Config.AxisName.Equals( axisName ) ).Single();
-            var axisPositionDatas = sql.AxisPositionDataDAL.Get( x => x.Name.Equals( axisName ) ).ToList();
+            var axisPositionDatas = sql.AxisPositionDataDAL.Get( x => x.AxisName.Equals( axisName ) ).ToList();
             var data = axisPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_UNLOCK ) ).Single();
 
             int result = servo.Move( data.Value );
@@ -564,11 +564,11 @@ namespace VehicleControlSystem.ControlLayer
             if ( result != 0 )
                 return result;
 
-            var leftPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.Name.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT) ).ToList();
+            var leftPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT) ).ToList();
             var leftData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_LOCK ) ).Single();
             var left = this.axes.Where( x => x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
 
-            var rightPositionDatas = sql.AxisPositionDataDAL.Get( x => x.Name.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).ToList();
+            var rightPositionDatas = sql.AxisPositionDataDAL.Get( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).ToList();
             var rightData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_LOCK ) ).Single();
             var right = this.axes.Where( x => x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
 

+ 35 - 3
Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs

@@ -198,13 +198,18 @@ namespace VehicleControlSystem.ControlLayer.MQ
             switch ( kind )
             {
                 case eDataKind.Current:
-                    this.pub.SendMoreFrame( "BatteryCurrent" ).SendFrame( obj.Value.ToString() ); ;
+                    this.pub.SendMoreFrame( "BatteryCurrent" ).SendFrame( obj.Value.ToString() ); 
                     break;
                 case eDataKind.Voltage:
+                    this.pub.SendMoreFrame( "BatteryVoltage" ).SendFrame( obj.Value.ToString() ); 
+                    break;
                 case eDataKind.BatteryState:
                 case eDataKind.ChargeCompleteTime:
                 case eDataKind.DisChargeCompleteTime:
+                    break;
                 case eDataKind.SOC:
+                    this.pub.SendMoreFrame( "BatterySOC" ).SendFrame( obj.Value.ToString() ); 
+                    break;
                 case eDataKind.SOH:
                 case eDataKind.ResidualCapacity:
                 case eDataKind.ResidualEnergy:
@@ -232,6 +237,11 @@ namespace VehicleControlSystem.ControlLayer.MQ
             this.req.Dispose();
         }
 
+        public void Publish(string key, string val) 
+        {
+            this.pub.SendMoreFrame( key ).SendFrame( val );
+        }
+
         private void Rep_ReceiveReady( object sender, NetMQSocketEventArgs e )
         {
             var ret = e.Socket.ReceiveMultipartStrings();
@@ -248,6 +258,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
                     {
                         case "3050":
                             {
+                                logger.D( $"[Steering_Rep] - 3050/{v[0]}" );
                                 switch ( v[1] )
                                 {
                                     case "1":
@@ -278,6 +289,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
                             break;
 
                         case "4012":
+
                             if ( v[1].Equals( "3" ) )
                                 IsDriveMoving = true;
                             else
@@ -592,9 +604,15 @@ namespace VehicleControlSystem.ControlLayer.MQ
         #endregion
 
         #region Set Request Method
-        internal int SetStartMove()
+        internal int SetStartMove( bool isArrayCommand = false )
         {
-            if ( !SetRequest( "3031", "2" ) )
+            string cmd = string.Empty;
+            if ( isArrayCommand )
+                cmd = "3";
+            else
+                cmd = "2";
+
+            if ( !SetRequest( "3031", cmd ) )
             {
                 logger.E( $"[Set Start Move] - Response Time Out" );
                 return 38;
@@ -613,6 +631,17 @@ namespace VehicleControlSystem.ControlLayer.MQ
             return ConstInt.EXECUTE_SUCCESS;
         }
 
+        internal int SetTargetPointArray(string point )
+        {
+            if ( !SetRequest( "3034", point ) )
+            {
+                logger.E( $"[Set TargetPoint] - Response Time Out" );
+                return 38;
+            }
+
+            return ConstInt.EXECUTE_SUCCESS;
+        }
+
         internal void SetObstruction( eObstacleState state )
         {
             string outStr = string.Empty;
@@ -637,6 +666,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
             }
             if ( !this.SetRequest( "5001", val ) )
                 logger.E( $"[Set Obstruction] - Response Time Out" );
+
         }
 
         internal void SetOperationState( eOperatationMode mode )
@@ -690,6 +720,8 @@ namespace VehicleControlSystem.ControlLayer.MQ
             }
             if ( !this.SetRequest( "3060", val ) )
                 logger.E( $"[Set Current Steering] - Response Time Out" );
+
+            logger.D( $"[Steering_Req] - 3060/{val}" );
         }
         #endregion
     }

+ 30 - 8
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs

@@ -6,6 +6,7 @@ using OHV.Common.Model;
 using OHV.Common.Shareds;
 using OHV.SqliteDAL;
 using System;
+using System.Text;
 using VehicleControlSystem.ControlLayer.MQ;
 using VehicleControlSystem.Managers;
 
@@ -217,7 +218,7 @@ namespace VehicleControlSystem.ControlLayer.Drive
             return eOperatationMode.InitialMode;
         }
 
-        public int MoveToPoint( string point, double velocity )
+        public int MoveToPoint( SubCmd sub, double velocity )
         {
             //if ( this.DriveServoState != eDriveServoState.ServoStop )
             //    return 9999;
@@ -231,15 +232,36 @@ namespace VehicleControlSystem.ControlLayer.Drive
 
             zmq.SetCurrentSteeringState( steering.GetSteeringState() );
             LockUtils.Wait( 100 );
-            result = zmq.SetTargetPoint( point );
-            if ( result != ConstInt.EXECUTE_SUCCESS )
-                return result;
 
-            LockUtils.Wait( 100 );
+            StringBuilder sb = new StringBuilder();
+            if ( sub.TargetList.Count <= 0 )
+            {
+                sb.Append( sub.TargetID );
+                result = zmq.SetTargetPoint( sb.ToString() );
+                LockUtils.Wait( 100 );
+                if ( result != ConstInt.EXECUTE_SUCCESS )
+                    return result;
+
+                result = zmq.SetStartMove();
+                if ( result != ConstInt.EXECUTE_SUCCESS )
+                    return result;
+            }
+            else
+            {
+                sub.TargetList.ForEach( x => { sb.Append( x ); sb.Append( ";" ); } );
+                result = zmq.SetTargetPointArray( sb.ToString() );
+                LockUtils.Wait( 100 );
+                if ( result != ConstInt.EXECUTE_SUCCESS )
+                    return result;
+
+                result = zmq.SetStartMove(true);
+                if ( result != ConstInt.EXECUTE_SUCCESS )
+                    return result;
+            }
 
-            result = zmq.SetStartMove();
-            if ( result != ConstInt.EXECUTE_SUCCESS )
-                return result;
+            //result = zmq.SetStartMove();
+            //if ( result != ConstInt.EXECUTE_SUCCESS )
+            //    return result;
 
             int waitTime = 10000;
             long st = SwUtils.CurrentTimeMillis;

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

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

+ 30 - 16
Dev/OHV/VehicleControlSystem/ControlLayer/Steering.cs

@@ -48,26 +48,40 @@ namespace VehicleControlSystem.ControlLayer
         public eSteeringState GetSteeringState( )
         {
             eSteeringState frontState = eSteeringState.None;
-            if ( this.IsFrontLeft() && this.IsFrontRight() )
-                frontState = eSteeringState.None;
-            if ( !this.IsFrontLeft() && !this.IsFrontRight() )
-                frontState = eSteeringState.None;
-
-            if ( this.IsFrontLeft() && !this.IsFrontRight() )
+            //if ( this.IsFrontLeft() && this.IsFrontRight() )
+            //    frontState = eSteeringState.None;
+            //else if ( !this.IsFrontLeft() && !this.IsFrontRight() )
+            //    frontState = eSteeringState.None;
+            //else
+            //{
+            //    this.SteeringState = eSteeringState.None;
+            //    return this.SteeringState;
+            //}
+
+            if ( !this.IsFrontRight() )
                 frontState = eSteeringState.Left;
-            if ( !this.IsFrontLeft() && this.IsFrontRight() )
+            else if ( !this.IsFrontLeft() )
                 frontState = eSteeringState.Right;
+            else
+                frontState = eSteeringState.None;
 
             eSteeringState rearState = eSteeringState.None;
-            if ( this.IsRearLeft() && this.IsRearRight() )
-                rearState = eSteeringState.None;
-            if ( !this.IsRearLeft() && !this.IsRearRight() )
-                rearState = eSteeringState.None;
-
-            if ( this.IsRearLeft() && !this.IsRearRight() )
+            //if ( this.IsRearLeft() && this.IsRearRight() )
+            //    rearState = eSteeringState.None;
+            //else if ( !this.IsRearLeft() && !this.IsRearRight() )
+            //    rearState = eSteeringState.None;
+            //else
+            //{
+            //    this.SteeringState = eSteeringState.None;
+            //    return this.SteeringState;
+            //}
+
+            if ( !this.IsRearRight() )
                 rearState = eSteeringState.Left;
-            if ( !this.IsRearLeft() && this.IsRearRight() )
+            else if ( !this.IsRearLeft() )
                 rearState = eSteeringState.Right;
+            else
+                rearState = eSteeringState.None;
 
             if ( frontState == eSteeringState.Left && rearState == eSteeringState.Left )
                 this.SteeringState = eSteeringState.Left;
@@ -122,12 +136,12 @@ namespace VehicleControlSystem.ControlLayer
 
                      if ( isLeft )
                      {
-                         if ( this.IsFrontLeft() && this.IsRearLeft() )
+                         if ( this.IsLeft())
                              break;
                      }
                      else
                      {
-                         if ( this.IsFrontRight() && this.IsRearRight() )
+                         if ( this.IsRight() )
                              break;
                      }
                  }

+ 67 - 44
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -210,7 +210,6 @@ namespace VehicleControlSystem.ControlLayer
             set { SetField( ref this.rearDriveState, value ); }
         }
 
-
         //이동
         public bool Busy
         {
@@ -697,7 +696,10 @@ namespace VehicleControlSystem.ControlLayer
                 return;
             }
 
-            this.MoveTo( route.Name );
+            var subCommand = new SubCmd();
+            subCommand.TargetID = route.Name;
+
+            this.MoveTo( subCommand );
             reply.Result = Results.Ok( "Position Move" );
             this.DriveControlEventPublish( reply );
         }
@@ -911,10 +913,14 @@ namespace VehicleControlSystem.ControlLayer
                 }
             }
 
-            result = this.MoveTo( sub.TargetID );
-            if ( result != ConstInt.EXECUTE_SUCCESS )
+            var iTarget = Convert.ToInt32( sub.TargetID );
+            if ( iTarget != CurrentTag ) //하나의 목표 위치로 왔을때 현재 위치와 동일 하면 이동안함.
             {
-                OccurVehicleAlarm( result );
+                result = this.MoveTo( sub );
+                if ( result != ConstInt.EXECUTE_SUCCESS )
+                {
+                    OccurVehicleAlarm( result );
+                }
             }
 
             this.taskMoveCancel.Cancel();
@@ -923,7 +929,7 @@ namespace VehicleControlSystem.ControlLayer
             sql.SubCmdDAL.Clean();
         }
 
-        int MoveTo( string pointID )
+        int MoveTo( SubCmd sub )
         {
             if ( this.VehicleStateProperty == eVehicleState.Idle )
             {
@@ -944,7 +950,7 @@ namespace VehicleControlSystem.ControlLayer
 
             this.VehicleStateProperty = eVehicleState.Move;
 
-            int result = this.refObjects.Drive.MoveToPoint( pointID, 100 );
+            int result = this.refObjects.Drive.MoveToPoint( sub, 100 );
             if ( result != ConstInt.EXECUTE_SUCCESS )
                 return result;
 
@@ -995,8 +1001,8 @@ namespace VehicleControlSystem.ControlLayer
                     }
                     else
                     {
-                        logger.D( "[Wait Move Done] - Main Command not Exist Motion command 없음" );
-                        return 41;
+                        logger.D( "[Wait Move Done] - Main Command not Exist Motion command, New Command Exist" );
+                        break;
                     }
                 }
 
@@ -1053,7 +1059,7 @@ namespace VehicleControlSystem.ControlLayer
             //Load, Unload 가 끝나면 메인 Command 를 완료 했다고 판단.
             var cmd = sql.CommandDAL.GetById( sub.CmdID );
             cmd.State = eCommandState.Complete;
-            sql.CommandDAL.Update(cmd);
+            sql.CommandDAL.Update( cmd );
             sql.SubCmdDAL.Clean();
 
             LockUtils.Wait( 1000 );
@@ -1103,13 +1109,15 @@ namespace VehicleControlSystem.ControlLayer
 
             var cmd = sql.CommandDAL.GetById( sub.CmdID );
             cmd.State = eCommandState.Complete;
-            sql.CommandDAL.Update(cmd);
+            sql.CommandDAL.Update( cmd );
             sql.SubCmdDAL.Clean();
 
             LockUtils.Wait( 1000 );
             this.OnUnloadComplete?.Invoke(); //일찍 주면 다음 명령을 500ms 안에 주는 현상 있음. 그러니까 천천히 주자 
             this.VehicleStateProperty = eVehicleState.Idle;
 
+            logger.D( $"[Unloading End]--------------------------------------" );
+
             return true;
         }
 
@@ -1117,6 +1125,8 @@ namespace VehicleControlSystem.ControlLayer
         {
             int result = 0;
             result = this.StartBatteryCharge();
+            if ( result != ConstInt.EXECUTE_SUCCESS )
+                this.OccurVehicleAlarm( result );
 
             var cmd = sql.CommandDAL.GetById( subCmd.CmdID );
             cmd.State = eCommandState.Complete;
@@ -1316,7 +1326,7 @@ namespace VehicleControlSystem.ControlLayer
             this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", true );
             loggerPIO.I( "[Vehicle] Receive Complete On" );
 
-            if ( !this.refObjects.IO.WaitChangeInputIO( true, 20000, "IN_PIO_SEND_COMPLITE" ) )
+            if ( !this.refObjects.IO.WaitChangeInputIO( true, 10000, "IN_PIO_SEND_COMPLITE" ) )
             {
                 this.refObjects.IO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false );
                 loggerPIO.E( "[Port]  IN_PIO_SEND_COMPLITE On Time Out" );
@@ -1843,7 +1853,6 @@ namespace VehicleControlSystem.ControlLayer
             switch ( kind )
             {
                 case eDataKind.Voltage:
-                    //this.BatteryVoltage = (double)obj.Value * obj.Scale;
                     this.BatteryVoltage = (double)obj.Value;
                     break;
                 case eDataKind.Current:
@@ -1857,17 +1866,30 @@ namespace VehicleControlSystem.ControlLayer
                 case eDataKind.ChargeCompleteTime:
                     if ( obj.Value == null /*|| obj.Value <= 0 */)
                         return;
-                    //this.BatteryChargeTime = (double)obj.Value / obj.Scale;
                     this.BatteryChargeTime = (double)obj.Value;
+                    if ( this.BatteryChargeTime > 0 )
+                        this.VehicleStateProperty = eVehicleState.Charge;
                     break;
                 case eDataKind.DisChargeCompleteTime:
                     if ( obj.Value == null || obj.Value <= 0 )
                         return;
-                    //this.BatteryDisChargeTime = (double)obj.Value / obj.Scale;
                     this.BatteryDisChargeTime = (double)obj.Value;
                     break;
                 case eDataKind.SOC:
                     this.BatteryStateOfCharge = (double)obj.Value;
+                    if ( this.BatteryStateOfCharge >= 80 )
+                    {
+                        if ( this.autoManager.AutoModeStateProperty != eAutoModeState.Run )
+                            return;
+
+                        if ( this.VehicleStateProperty == eVehicleState.Charge || this.IsCharging() )
+                        {
+                            int result = ConstInt.EXECUTE_SUCCESS;
+                            result = this.StopBatteryCharge();
+                            if ( result != ConstInt.EXECUTE_SUCCESS )
+                                this.OccurVehicleAlarm( result );
+                        }
+                    }
                     break;
                 case eDataKind.SOH:
                     this.BatteryStateOfHealth = (double)obj.Value;
@@ -2052,37 +2074,37 @@ namespace VehicleControlSystem.ControlLayer
                     }
                     break;
 
-                //case "FrontLoadFactor":
-                //    {
-                //        var v = CastTo<double>.From<object>( newValue );
-                //        this.FrontLoadFactor = v;
-                //        this.FrontTorque = Math.Truncate( ( ( v * 1.9 ) / 1000 ) * 100 ) / 100;
-                //    }
-                //    break;
-                //case "FrontRpm":
-                //    {
-                //        var v = CastTo<double>.From<object>( newValue );
-                //        this.FrontRpm = v;
+                    //case "FrontLoadFactor":
+                    //    {
+                    //        var v = CastTo<double>.From<object>( newValue );
+                    //        this.FrontLoadFactor = v;
+                    //        this.FrontTorque = Math.Truncate( ( ( v * 1.9 ) / 1000 ) * 100 ) / 100;
+                    //    }
+                    //    break;
+                    //case "FrontRpm":
+                    //    {
+                    //        var v = CastTo<double>.From<object>( newValue );
+                    //        this.FrontRpm = v;
 
-                //        var ll = ( ( ( ( v / 60 ) * ( 2 * Math.PI ) ) * 0.06 ) / 10 );
-                //        this.FrontSpeed = Math.Truncate( ll * 100 ) / 100;
-                //    }
-                //    break;
-                //case "RearLoadFactor":
-                //    {
-                //        var v = CastTo<double>.From<object>( newValue );
-                //        this.RearLoadFactor = v;
-                //        this.RearTorque = Math.Truncate( ( ( v * 1.9 ) / 1000 ) * 100 ) / 100;
-                //    }
-                //    break;
-                //case "RearRpm":
-                //    {
-                //        var v = CastTo<double>.From<object>( newValue );
-                //        this.RearRpm = v;
+                    //        var ll = ( ( ( ( v / 60 ) * ( 2 * Math.PI ) ) * 0.06 ) / 10 );
+                    //        this.FrontSpeed = Math.Truncate( ll * 100 ) / 100;
+                    //    }
+                    //    break;
+                    //case "RearLoadFactor":
+                    //    {
+                    //        var v = CastTo<double>.From<object>( newValue );
+                    //        this.RearLoadFactor = v;
+                    //        this.RearTorque = Math.Truncate( ( ( v * 1.9 ) / 1000 ) * 100 ) / 100;
+                    //    }
+                    //    break;
+                    //case "RearRpm":
+                    //    {
+                    //        var v = CastTo<double>.From<object>( newValue );
+                    //        this.RearRpm = v;
 
-                //        var ll = ( ( ( ( v / 60 ) * ( 2 * Math.PI ) ) * 0.06 ) / 10 );
-                //        this.RearSpeed = Math.Truncate( ll * 100 ) / 100;
-                //    }
+                    //        var ll = ( ( ( ( v / 60 ) * ( 2 * Math.PI ) ) * 0.06 ) / 10 );
+                    //        this.RearSpeed = Math.Truncate( ll * 100 ) / 100;
+                    //    }
                     break;
                 default:
                     break;
@@ -2122,6 +2144,7 @@ namespace VehicleControlSystem.ControlLayer
             {
                 case "IN_CV_DETECT_01":
                     this.IsContain = bit.IsBitOn;
+                    this.refObjects.ZmqManager.Publish( "Contain", this.IsContain.ToString() );
                     break;
 
                 case "IN_MC_ON":

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

@@ -10,6 +10,8 @@ using OHV.Common.Model;
 using OHV.Common.Events;
 using VehicleControlSystem.ControlLayer;
 using GSG.NET.Utils;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace VehicleControlSystem.Managers
 {
@@ -50,6 +52,7 @@ namespace VehicleControlSystem.Managers
         public event Action<int> OnOccurAlarm;
         public event Action<int> OnClearAlarm;
         Alarm activeAlarm = null;
+        List<Alarm> Alarms { get; set; }
 
         IEventAggregator eventAggregator = null;
         SqliteManager sql = null;
@@ -128,11 +131,12 @@ namespace VehicleControlSystem.Managers
             set { buzzerState = value; }
         }
 
-        public AutoManager( IIO io, IEventAggregator ea, SqliteManager sql )
+        public AutoManager( IIO io, IEventAggregator ea, SqliteManager sql, List<Alarm> al )
         {
             this.iO = io;
             this.eventAggregator = ea;
             this.sql = sql;
+            this.Alarms = al;
         }
 
         #region Vehicle Events
@@ -282,10 +286,8 @@ namespace VehicleControlSystem.Managers
                 default:
                     break;
             }
-
         }
 
-
         public void ProcessAlarm( int alarmID )
         {
             this.AutoModeStateProperty = eAutoModeState.ErrorStop;
@@ -293,7 +295,7 @@ namespace VehicleControlSystem.Managers
             this.BuzzerStateProperty = eBuzzerKind.Alarm;
 
             HisAlarm hisAlarm = new HisAlarm();
-            var alarm = sql.AlarmDAL.GetById( alarmID );
+            var alarm = this.Alarms.Where( x => x.AlarmId == alarmID ).FirstOrDefault();
             if ( alarm == null )
             {
                 hisAlarm.AlarmId = alarmID;

+ 56 - 31
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -12,6 +12,7 @@ using GSG.NET.Quartz;
 using System.Text;
 using GSG.NET.LINQ;
 using System.Linq;
+using System.Collections.Generic;
 
 namespace VehicleControlSystem.Managers
 {
@@ -76,7 +77,9 @@ namespace VehicleControlSystem.Managers
             var msg = new OCSMessage();
             msg.Kind = eKind.E;
             msg.Tag = obj.ToString("0000");
-            msg.SubCode = "100";
+            msg.IsSubCode1 = vehicle.IsContain;
+            msg.IsSubCode2 = vehicle.IsMoving;
+            msg.IsSubCode3 = true;
             this.manager.Send( msg );
         }
 
@@ -85,7 +88,9 @@ namespace VehicleControlSystem.Managers
             var msg = new OCSMessage();
             msg.Kind = eKind.E;
             msg.Tag = obj.ToString("0000");
-            msg.SubCode = "101";
+            msg.IsSubCode1 = vehicle.IsContain;
+            msg.IsSubCode2 = vehicle.IsMoving;
+            msg.IsSubCode3 = false;
             this.manager.Send( msg );
         }
 
@@ -426,48 +431,68 @@ namespace VehicleControlSystem.Managers
             if ( hasCommand != null )
             {
                 if ( !hasCommand.IsSecondCommanded )
+                {
+                    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;
+                    }
+                    cmd.ByWho = eCommandByWho.HostOverWrite;
+                    cmd.TargetList = new List<string>( msg.ViaRouteList );
+
+                    cmd.TargetID = msg.Tag;
+
+                    this.sql.CommandDAL.Insert( cmd );
+                    logger.I( $"[Command] - Add Host : Target {cmd.TargetID} / Type {cmd.Type}" );
+
                     sql.CommandDAL.Delete( hasCommand.CommandID );
+                }
                 else
                 {
                     loggerHost.E( $"[OCS] Cmd - {msg.Kind} Message Tag [{msg.Tag}] - Already Load/Unload " );
                     return;
                 }
-                cmd.ByWho = eCommandByWho.HostOverWrite;
             }
             else
+            {
+                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;
+                }
                 cmd.ByWho = eCommandByWho.Host;
 
+                this.sql.CommandDAL.Insert( cmd );
+                logger.I( $"[Command] - Add Host : Target {cmd.TargetID} / Type {cmd.Type}" );
 
-            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;
             }
 
-            //Todo: 등록 되어 있는 경로 가 있는 지 확인 필요.
-            //var route = this.sql.RouteDal.GetRouteFromOCSMatchID( msg.Tag );
-            //if ( route == null )
-            //{
-            //    loggerHost.E( $"[OCS] Message Tag [{msg.Tag}] - not found route" );
-            //    return;
-            //}
-
-            cmd.TargetID = msg.Tag;
-
-            this.sql.CommandDAL.Insert( cmd );
-            logger.I( $"[Command] - Add Host : Target {cmd.TargetID} / Type {cmd.Type}" );
         }
 
         private void Manager_OnT3Timeout( OHVConnector.OCSMessage msg )

+ 41 - 29
Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs

@@ -13,6 +13,8 @@ using OHV.Common.Model;
 using OHV.Common.Shareds;
 using OHV.SqliteDAL;
 using Prism.Events;
+using VehicleControlSystem.ControlLayer.Serial.BatteryTabos;
+using VehicleControlSystem.ControlLayer.Serial.DataModel;
 
 namespace VehicleControlSystem.Managers
 {
@@ -34,12 +36,13 @@ namespace VehicleControlSystem.Managers
         IEventAggregator eventAggregator;
         AutoManager autoManager;
         SqliteManager sql = null;
+        BMUManager bMUManager = null;
 
         public event Action<Command> OnMaualAddedCommand;
 
         public bool IsCreateDryRunCommand { get; set; } = false;
 
-        public Scheduler( IEventAggregator ea, AutoManager autoManager, SqliteManager sqlite )
+        public Scheduler( IEventAggregator ea, AutoManager autoManager, SqliteManager sqlite, BMUManager bMU )
         {
             this.CommandsList = new List<Command>();
             eventAggregator = ea;// CommonServiceLocator.ServiceLocator.Current.GetInstance<IEventAggregator>();
@@ -47,6 +50,7 @@ namespace VehicleControlSystem.Managers
 
             this.autoManager = autoManager;
             this.sql = sqlite;
+            this.bMUManager = bMU;
         }
 
         private void OnReceivedMessageEvent( VCSMessageEventArgs obj )
@@ -130,7 +134,7 @@ namespace VehicleControlSystem.Managers
                                             this.DryRunTest();
                                             continue;
                                         }
-                                            
+
                                         DoWork( cmd );
                                         break;
                                     case OHV.Common.Shareds.eAutoModeState.Stop:
@@ -151,51 +155,57 @@ namespace VehicleControlSystem.Managers
                     logger.E( ex );
                 }
             }
-            logger.D("[Scheduler] - Command Thread Dispose");
+            logger.D( "[Scheduler] - Command Thread Dispose" );
         }
 
-        int copyTarget = 0, copyPoint = 0;
+
+        int copyTarget = 0;
 
         void DryRunTest()
         {
             if ( !IsCreateDryRunCommand )
                 return;
 
-            var ram = NumUtils.Random( 0 , RouteManager.Instance.Equipments.Count - 1 );
+            if ( this.bMUManager.ReceivedDataDic[eDataKind.SOC].Value <= 10 )
+            {
+                //var targetPoint = "2";
+                //Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Charging };
+                //cmd.ByWho = eCommandByWho.LocalSystem;
+
+                //this.AddCommand( cmd );
+
+                this.IsCreateDryRunCommand = false;
+                return;
+            }
+
+            var ram = NumUtils.Random( 0, RouteManager.Instance.Equipments.Count - 1 );
             if ( ram == this.copyTarget )
                 return;
             else
             {
+                var target = RouteManager.Instance.Equipments[ram];
                 this.copyTarget = ram;
 
-                var target = RouteManager.Instance.Equipments[ ram ];
+                var targetPoint = target.pointID.ToString();
+                Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Move };
+                cmd.ByWho = eCommandByWho.LocalSystem;
 
-                //if ( target.Name.Equals( "CHARGING_01" ) || target.pointID == 17 )
-                //    return;
+                this.AddCommand( cmd );
+                LockUtils.Wait( 2500 );
 
-                if ( copyPoint == target.pointID )
-                    return;
-                else
-                {
-                    if ( ( target.Name.Equals( "CHARGING_02" ) ) || ( target.Name.Equals( "STOKER_LIFT_IP01" ) ) ||
-                    ( target.Name.Equals( "STOKER_LIFT_OP01" ) ) || ( target.Name.Equals( "WORK_STATION_IP01" ) ) ||
-                    ( target.Name.Equals( "WORK_STATION_OP01" ) ) )
-                    {
-                        copyPoint = target.pointID;
-
-                        var targetPoint = target.pointID.ToString();
-                        Command cmd = new Command() { TargetID = targetPoint , Type = eCommandType.Move };
-                        cmd.ByWho = eCommandByWho.LocalSystem;
+                //if ( ( target.Name.Equals( "CHARGING_02" ) ) || ( target.Name.Equals( "STOKER_LIFT_IP01" ) ) ||
+                //    ( target.Name.Equals( "STOKER_LIFT_OP01" ) ) || ( target.Name.Equals( "WORK_STATION_IP01" ) ) ||
+                //    ( target.Name.Equals( "WORK_STATION_OP01" ) ) )
+                //{
+                //    this.copyTarget = ram;
 
-                        this.AddCommand( cmd );
-                    }
-                }
+                //    var targetPoint = target.pointID.ToString();
+                //    Command cmd = new Command() { TargetID = targetPoint, Type = eCommandType.Move };
+                //    cmd.ByWho = eCommandByWho.LocalSystem;
 
-                //var targetPoint = target.pointID.ToString();
-                //Command cmd = new Command() { TargetID = targetPoint , Type = eCommandType.Move };
-                //cmd.ByWho = eCommandByWho.LocalSystem;
-
-                //this.AddCommand( cmd );
+                //    this.AddCommand( cmd );
+                //    LockUtils.Wait( 2000 );
+                //}
             }
         }
 
@@ -304,7 +314,9 @@ namespace VehicleControlSystem.Managers
                 Type = type,
                 TargetID = cmd.TargetID,
                 CmdID = cmd.CommandID,
+                TargetList = new List<string>( cmd.TargetList ),
             };
+
             sql.SubCmdDAL.Insert( sub );
             logger.I( $"{sub.ID} Sub Command Create - Type={sub.Type}, TargetID={sub.TargetID}, CommandID={sub.CmdID}" );
 

+ 22 - 2
Dev/OHV/VehicleControlSystem/VCSystem.cs

@@ -1,6 +1,10 @@
 using System;
+using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using System.Threading;
+using GSG.NET.Concurrent;
+using GSG.NET.Excel;
 using GSG.NET.Extensions;
 using GSG.NET.Logging;
 using GSG.NET.Quartz;
@@ -43,6 +47,8 @@ namespace VehicleControlSystem
 
         public RouteManager RouteManager { get; set; }
 
+        public List<Alarm> Alarms { get; set; }
+
         public VCSystem( IEventAggregator ea, SqliteManager sql )
         {
             this.sql = sql;
@@ -59,6 +65,8 @@ namespace VehicleControlSystem
         {
             QuartzUtils.Invoke( "HIS_ALARM", QuartzUtils.GetExpnHour( 5 ), this.CleanHisAlarm );
 
+            this.Alarms = new ExcelMapper( Path.Combine( System.Environment.CurrentDirectory ) + @"\Config\AlarmDefind.xlsx" ).Fetch<Alarm>( ).ToList();
+
             this.RouteManager = RouteManager.Instance;
             RouteManager.Instance.Init( this.sql );
 
@@ -109,8 +117,8 @@ namespace VehicleControlSystem
             refObject.ZmqManager = this.zmqManager;
 
             //Process
-            this.autoManager = new AutoManager( this.IO, this.eventAggregator, this.sql );
-            this.scheduler = new Scheduler( eventAggregator, this.autoManager, this.sql );
+            this.autoManager = new AutoManager( this.IO, this.eventAggregator, this.sql, this.Alarms );
+            this.scheduler = new Scheduler( eventAggregator, this.autoManager, this.sql, this.bMUManager );
 
             this.vehicle = new Vehicle( refObject, this.IO, this.sql, this.eventAggregator, this.autoManager );
             this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
@@ -121,6 +129,18 @@ namespace VehicleControlSystem
             this.vehicle.Init();
             this.scheduler.Init();
             this.autoManager.Init( this.vehicle );
+
+            //Command cmd = new Command();
+            //cmd.TargetList = new List<string>();
+            //cmd.TargetList.Add( "1" );
+            //cmd.TargetList.Add( "2" );
+            //cmd.TargetList.Add( "3" );
+            //cmd.TargetList.Add( "4" );
+            //cmd.TargetList.Add( "5" );
+
+            //this.sql.CommandDAL.Insert( cmd );
+
+            //var cll = this.sql.CommandDAL.GetAll();
         }
 
 

BIN=BIN
Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide


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

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

+ 7 - 4
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FTPLogger.cs

@@ -12,11 +12,14 @@ namespace OHVDriveLogger
 {
     public class FTPLogger : SingletonBase<FTPLogger>
     {
+        public string UploadIP { get; set; } = string.Empty;
+        public string PLCAddress { get; set; }
+
         private FTPLogger() { }
 
         public void FTPUpload()
         {
-            using ( var ftp = new FtpClient( "192.168.127.123" ) )
+            using ( var ftp = new FtpClient( UploadIP ) )
             {
                 ftp.Connect();
                 ftp.UploadDirectory( @"C:\LOG\FTP\", @"\LOG\", FtpFolderSyncMode.Update );
@@ -31,7 +34,7 @@ namespace OHVDriveLogger
 
         public void FTPDriveLogUplaod()
         {
-            using ( var ftp = new FtpClient( "192.168.127.123" ) )
+            using ( var ftp = new FtpClient( UploadIP ) )
             {
                 ftp.Connect();
                 ftp.UploadDirectory( @"C:\LOG\OHV\DriveLogger\PhysicalCheckup\", @"\LOG\", FtpFolderSyncMode.Update );
@@ -43,7 +46,7 @@ namespace OHVDriveLogger
 
         public void FTPDownload()
         {
-            using ( var ftp = new FtpClient( "192.168.0.20", "KV", "1234" ) )
+            using ( var ftp = new FtpClient( PLCAddress, "KV", "1234" ) )
             {
                 ftp.Connect();
 
@@ -65,7 +68,7 @@ namespace OHVDriveLogger
         async Task DeleteDirectoryAsync()
         {
             var token = new CancellationToken();
-            using ( var conn = new FtpClient( "192.168.0.20", "KV", "1234" ) )
+            using ( var conn = new FtpClient( PLCAddress, "KV", "1234" ) )
             {
                 await conn.ConnectAsync( token );
 

+ 15 - 6
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FormMain.cs

@@ -25,6 +25,9 @@ namespace OHVDriveLogger
         const string rearPreFix = @"C:\LOG\OHV\DriveLogger\PhysicalCheckup\Rear_Wheel";
 
         string vehicleID = string.Empty;
+        string UploadIP = string.Empty;
+        string PLCAddress = string.Empty;
+        int PLCPort = 0;
 
         public FormMain()
         {
@@ -34,6 +37,12 @@ namespace OHVDriveLogger
             this.FormClosing += FormMain_FormClosing;
 
             this.vehicleID = ConfigurationManager.AppSettings["VehicleID"];
+            this.UploadIP = ConfigurationManager.AppSettings["FTPUploadIP"];
+            this.PLCAddress = ConfigurationManager.AppSettings["PLC_IP"];
+            this.PLCPort = Convert.ToInt16( ConfigurationManager.AppSettings["PLC_PORT"] );
+
+            FTPLogger.Instance.UploadIP = this.UploadIP;
+            FTPLogger.Instance.PLCAddress = this.PLCAddress;
         }
 
         private void FormMain_FormClosing( object sender, FormClosingEventArgs e )
@@ -47,8 +56,8 @@ namespace OHVDriveLogger
         private void FormMain_Load( object sender, EventArgs e )
         {
             this.plc.Config.Id = "KV8000";
-            this.plc.Config.IpAddress = "192.168.0.20";
-            this.plc.Config.Port = 5000; //5000
+            this.plc.Config.IpAddress = this.PLCAddress;
+            this.plc.Config.Port = this.PLCPort; //5000
             this.plc.Config.MonitorInterval = 500;
 
             var grpB = new KncGroup { Device = KncDevice.MR, Name = "MR" };
@@ -121,8 +130,8 @@ namespace OHVDriveLogger
 
             long st = SwUtils.CurrentTimeMillis;
 
-            frontlogger.I( $"/ Speed / Torque / RPM / LoadFactor / Battery Current / Current Point / CurrentRailForm / CurrentMCR" );
-            rearlogger.I( $" / Speed / Torque / RPM / LoadFactor / Battery Current / Current Point / CurrentRailForm / CurrentMCR" );
+            frontlogger.I( $"/ Speed / Torque / RPM / LoadFactor / Battery Current / Battery Voltage / BatterySOC / Contain / Current Point / CurrentRailForm / CurrentMCR" );
+            rearlogger.I( $" / Speed / Torque / RPM / LoadFactor / Battery Current / Battery Voltage / BatterySOC / Contain / Current Point / CurrentRailForm / CurrentMCR" );
 
             while ( this.zmq.IsDriveMoving )
             {
@@ -139,8 +148,8 @@ namespace OHVDriveLogger
                 var rearSpeed = ( ( ( ( zmq.RearRPM / 60 ) * ( 2 * Math.PI ) ) * 0.06 ) / 10 );
                 var rearTorque = ( zmq.RearLoadFacter * 1.9 ) / 100;
 
-                frontlogger.I( $"/ {frontSpeed} / {frontTorque} / {zmq.FrontRPM} / {zmq.FrontLoadFacter} / {zmq.BatteryCurrent} / {zmq.CurrentPoint} / {zmq.CurrentRailForm} / {zmq.CurrentMCR}" );
-                rearlogger.I( $"/ {rearSpeed} / {rearTorque} / {zmq.RearRPM} / {zmq.RearLoadFacter} / {zmq.BatteryCurrent} / {zmq.CurrentPoint} / {zmq.CurrentRailForm} / {zmq.CurrentMCR}" );
+                frontlogger.I( $"/ {frontSpeed} / {frontTorque} / {zmq.FrontRPM} / {zmq.FrontLoadFacter} / {zmq.BatteryCurrent} / {zmq.BatteryVoltage} / {zmq.BatterySOC} / {zmq.IsContain} / {zmq.CurrentPoint} / {zmq.CurrentRailForm} / {zmq.CurrentMCR}" );
+                rearlogger.I( $"/ {rearSpeed} / {rearTorque} / {zmq.RearRPM} / {zmq.RearLoadFacter} / {zmq.BatteryCurrent} / {zmq.BatteryVoltage} / {zmq.BatterySOC} / {zmq.IsContain} / {zmq.CurrentPoint} / {zmq.CurrentRailForm} / {zmq.CurrentMCR}" );
 
                 if ( SwUtils.Gt( st, ConstUtils.ONE_MINUTE * 5 ) ) //5분동안 주행이 계속 되면 문제 발생으로 인식, 파일 정리 후 다음 이벤트 대기.
                 {

+ 6 - 0
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger.csproj

@@ -53,6 +53,9 @@
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
     <Prefer32Bit>true</Prefer32Bit>
   </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>DataLogger.ico</ApplicationIcon>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="FluentFTP">
       <HintPath>..\..\..\OHV\Assambly\FluentFTP.dll</HintPath>
@@ -140,5 +143,8 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="DataLogger.ico" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>

+ 39 - 0
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/ZmqManager.cs

@@ -89,6 +89,33 @@ namespace OHVDriveLogger
             set { currentMCR = value; }
         }
 
+        private string isContain;
+
+        public string IsContain
+        {
+            get { return isContain; }
+            set { isContain = value; }
+        }
+
+        private string batteryVoltage;
+
+        public string BatteryVoltage
+        {
+            get { return batteryVoltage; }
+            set { batteryVoltage = value; }
+        }
+
+        private string batterySOC;
+
+        public string BatterySOC 
+        {
+            get { return batterySOC; }
+            set { batterySOC = value; }
+        }
+
+
+
+
         public ZmqManager()
         {
             NetMQ.NetMQConfig.Cleanup();
@@ -138,10 +165,22 @@ namespace OHVDriveLogger
                         this.CurrentMCR = v[0];
                         break;
 
+                    case "Contain":
+                        this.IsContain = v[0];
+                        break;
+
                     case "BatteryCurrent":
                         this.BatteryCurrent = Convert.ToDouble( v[0] );
                         break;
 
+                    case "BatteryVoltage":
+                        this.BatteryVoltage = v[0];
+                        break;
+
+                    case "BatterySOC":
+                        this.BatterySOC = v[0];
+                        break;
+
                     case "DriveStart":
                         if ( v[0].Equals( "True" ) )
                             this.IsDriveMoving = true;