Просмотр исходного кода

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

# Conflicts:
#	Dev/OHV/VehicleControlSystem/ControlLayer/IO/EzIO.cs
DESKTOP-Kang 6 лет назад
Родитель
Сommit
a4bb8e0452

+ 7 - 0
Dev/OHV/OHV.Common/Events/MessageEventArgs.cs

@@ -29,6 +29,9 @@ namespace OHV.Common.Events
             RspMachineModeChg,
 
             RspAddCommand,
+
+            RspConveyorLoad,
+            RspConveyorUnload,
         }
 
         //Property 이름임.
@@ -69,6 +72,9 @@ namespace OHV.Common.Events
             ReqMachineModeChg,
 
             ReqAddCommand,
+            ReqTest,
+            ReqConveyorLoad,
+            ReqConveyorUnload,
         }
 
         public eVCSMessageKind Kind { get; set; }
@@ -124,6 +130,7 @@ namespace OHV.Common.Events
         public eEventDir Dir { get; set; }
         public eAxisControlKind Kind { get; set; }
         public eJogMoveDir JogDir { get; set; }
+        public int JogVelocity { get; set; }
         public string AxisName { get; set; }
         public double CurrentPosition { get; set; }
 

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

@@ -141,7 +141,7 @@
                                VerticalAlignment="Center"
                                HorizontalAlignment="Center"
                                Foreground="Orange" FontSize="20">
-                                <Run Text="{Binding AvereageTimeToFull,StringFormat={}{0:0.00}, FallbackValue=min}"/>
+                                <Run Text="{Binding AvereageTimeToFull,StringFormat={}{0:0.0}H, FallbackValue=H}"/>
                         </TextBlock>
                     </Border>
 
@@ -154,7 +154,7 @@
                                VerticalAlignment="Center"
                                HorizontalAlignment="Center"
                                Foreground="Orange" FontSize="20">
-                                <Run Text="{Binding AverageTimeToEmpty, StringFormat={}{0:0.00},FallbackValue=min}"/>
+                                <Run Text="{Binding AverageTimeToEmpty, StringFormat={}{0:0.0}H,FallbackValue=H}"/>
                         </TextBlock>
                     </Border>
 

+ 90 - 39
Dev/OHV/OHV.Module.Interactivity/PopUp/ConveyorControlView.xaml

@@ -58,43 +58,43 @@
                                 Orientation="Vertical"
                                 HorizontalAlignment="Center"
                                 VerticalAlignment="Center">
-                        
-                        <Button Background="{x:Null}">
+
+                        <Button Background="{x:Null}" HorizontalContentAlignment="Left">
                             <StackPanel Orientation="Horizontal">
                                 <Ellipse Margin="0,0,16,0" Width="20" Height="20" Fill="{Binding CvError, FallbackValue=Gray}"/>
-                                <TextBlock Text="CV ERROR"/>
+                                <TextBlock Text="CV ERROR" />
                             </StackPanel>
                         </Button>
 
-                        <Button Background="{x:Null}">
+                        <Button Background="{x:Null}" HorizontalContentAlignment="Left">
                             <StackPanel Orientation="Horizontal">
                                 <Ellipse Margin="0,0,38,0" Width="20" Height="20" Fill="{Binding CvCW, FallbackValue=Gray}"/>
-                                <TextBlock Text="CV CW"/>
+                                <TextBlock Text="CV CW" />
                             </StackPanel>
                         </Button>
 
-                        <Button Background="{x:Null}">
+                        <Button Background="{x:Null}" HorizontalContentAlignment="Left">
                             <StackPanel Orientation="Horizontal">
                                 <Ellipse Margin="0,0,30,0" Width="20" Height="20" Fill="{Binding CvCCW, FallbackValue=Gray}"/>
                                 <TextBlock Text="CV CCW"/>
                             </StackPanel>
                         </Button>
 
-                        <Button Background="{x:Null}">
-                            <StackPanel Orientation="Horizontal">
-                                <Ellipse Margin="0,0,16,0" Width="20" Height="20" Fill="{Binding CvEntryIn, FallbackValue=Gray}"/>
+                        <Button Background="{x:Null}" HorizontalContentAlignment="Left">
+                            <StackPanel Orientation="Horizontal" >
+                                <Ellipse Margin="0,0,16,0" Width="20" Height="20" Fill="{Binding CvEntryIn, FallbackValue=Gray}" />
                                 <TextBlock Text="CV EntryIn"/>
                             </StackPanel>
                         </Button>
 
-                        <Button Background="{x:Null}">
-                            <StackPanel Orientation="Horizontal">
+                        <Button Background="{x:Null}" HorizontalContentAlignment="Left">
+                            <StackPanel Orientation="Horizontal" >
                                 <Ellipse Margin="0,0,16,0" Width="20" Height="20" Fill="{Binding CvSlowStop, FallbackValue=Gray}"/>
                                 <TextBlock Text="CV Slow-S"/>
                             </StackPanel>
                         </Button>
 
-                        <Button Background="{x:Null}">
+                        <Button Background="{x:Null}" HorizontalContentAlignment="Left">
                             <StackPanel Orientation="Horizontal">
                                 <Ellipse Margin="0,0,30,0" Width="20" Height="20" Fill="{Binding CvStop, FallbackValue=Gray}"/>
                                 <TextBlock Text="CV Stop"/>
@@ -102,59 +102,95 @@
                         </Button>
 
                     </StackPanel>
-                    
-                    <StackPanel Orientation="Horizontal"
+
+                    <Grid Grid.Column="1">
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="*"/>
+                            <RowDefinition Height="*"/>
+                            <RowDefinition Height="*"/>
+                        </Grid.RowDefinitions>
+
+                        <StackPanel Orientation="Horizontal"
                                 HorizontalAlignment="Center"
                                 VerticalAlignment="Top"
-                                Grid.Column="1" Margin="20">
-                        <Button Content="Conveyor Control" Foreground="Orange" Background="{x:Null}" FontSize="20"
+                                Grid.Row="0" Margin="20">
+                            <Button Content="Conveyor Control" Foreground="Orange" Background="{x:Null}" FontSize="20"
                             VerticalAlignment="Top" HorizontalAlignment="Left"
                             Width="Auto" Height="50"/>
-                    </StackPanel>
-                    
-                    <StackPanel Orientation="Horizontal"
+                        </StackPanel>
+
+                        <StackPanel Orientation="Horizontal"
                                 HorizontalAlignment="Center"
-                                Grid.Column="1">
+                                Grid.Row="1">
 
-                        <Button HorizontalAlignment="Stretch"
+                            <Button HorizontalAlignment="Stretch"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
                             Command="{Binding ConveyorRunCommand}"
                             CommandParameter="CW"
                             Height="80" Width="80"
                             Margin="10">
-                            <StackPanel>
-                                <materialDesign:PackIcon Kind="TransferUp" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
-                                <TextBlock Text="CW" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
-                            </StackPanel>
-                        </Button>
+                                <StackPanel>
+                                    <materialDesign:PackIcon Kind="TransferUp" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
+                                    <TextBlock Text="CW" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
+                                </StackPanel>
+                            </Button>
 
-                        <Button 
+                            <Button 
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
                             Height="80" Width="80"
                             Margin="10"
                             Command="{Binding ConveyorRunCommand}"
                             CommandParameter="CCW">
-                            <StackPanel>
-                                <materialDesign:PackIcon Kind="TransferDown" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
-                                <TextBlock Text="CCW" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
-                            </StackPanel>
-                        </Button>
+                                <StackPanel>
+                                    <materialDesign:PackIcon Kind="TransferDown" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
+                                    <TextBlock Text="CCW" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
+                                </StackPanel>
+                            </Button>
 
-                        <Button HorizontalAlignment="Stretch"
+                            <Button HorizontalAlignment="Stretch"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
                             Command="{Binding ConveyorRunCommand}"
                             CommandParameter="STOP"
                             Height="80" Width="80"
                             Margin="10">
-                            <StackPanel>
-                                <materialDesign:PackIcon Kind="StopCircleOutline" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
-                                <TextBlock Text="Stop" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
-                            </StackPanel>
-                        </Button>
-                    </StackPanel>
+                                <StackPanel>
+                                    <materialDesign:PackIcon Kind="StopCircleOutline" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
+                                    <TextBlock Text="Stop" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
+                                </StackPanel>
+                            </Button>
+                        </StackPanel>
+                        <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center">
+
+                            <Button HorizontalAlignment="Stretch"
+                            Style="{StaticResource MaterialDesignRaisedButton}"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Command="{Binding LoadUnloadCommand}"
+                            CommandParameter="Load"
+                            Height="80" Width="80"
+                            Margin="10">
+                                <StackPanel>
+                                    <materialDesign:PackIcon Kind="ArrowCollapseDown" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
+                                    <TextBlock Text="Load" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
+                                </StackPanel>
+                            </Button>
+
+                            <Button 
+                            Style="{StaticResource MaterialDesignRaisedButton}"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Height="80" Width="80"
+                            Margin="10"
+                            Command="{Binding LoadUnloadCommand}"
+                            CommandParameter="Unload">
+                                <StackPanel>
+                                    <materialDesign:PackIcon Kind="ArrowExpandUp" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
+                                    <TextBlock Text="Unlaod" VerticalAlignment="Stretch" HorizontalAlignment="Center" />
+                                </StackPanel>
+                            </Button>
+                        </StackPanel>
+                    </Grid>
                 </Grid>
 
                 <Grid Grid.Row="1">
@@ -167,6 +203,14 @@
                     <Grid Grid.Column="0">
                         <StackPanel VerticalAlignment="Center"
                                     HorizontalAlignment="Center">
+
+                            <Button Background="{x:Null}">
+                                <StackPanel Orientation="Horizontal">
+                                    <Ellipse Margin="0,0,8,0" Width="20" Height="20" Fill="{Binding AxisLeftIsServoOn, FallbackValue=Gray}"/>
+                                    <TextBlock Text="Axis-L ServoON"/>
+                                </StackPanel>
+                            </Button>
+
                             <Button Background="{x:Null}">
                                 <StackPanel Orientation="Horizontal">
                                     <Ellipse Margin="0,0,18,0" Width="20" Height="20" Fill="{Binding AxisLeftIsOrg, FallbackValue=Gray}"/>
@@ -181,6 +225,13 @@
                                 </StackPanel>
                             </Button>
 
+                            <Button Background="{x:Null}" Margin="0,10,0,0">
+                                <StackPanel Orientation="Horizontal">
+                                    <Ellipse Margin="0,0,8,0" Width="20" Height="20" Fill="{Binding AxisRightIsServoOn, FallbackValue=Gray}"/>
+                                    <TextBlock Text="Axis-R ServoON"/>
+                                </StackPanel>
+                            </Button>
+
                             <Button Background="{x:Null}">
                                 <StackPanel Orientation="Horizontal">
                                     <Ellipse Margin="0,0,16,0" Width="20" Height="20" Fill="{Binding AxisRightIsOrg, FallbackValue=Gray}"/>

+ 58 - 2
Dev/OHV/OHV.Module.Interactivity/PopUp/ConveyorControlViewModel.cs

@@ -61,10 +61,21 @@ namespace OHV.Module.Interactivity.PopUp
 
         private Brush _axisLeftIsOrg = Brushes.Red;
         private Brush _axisLeftAmpFault = Brushes.Gray;
+        private Brush _axisLeftIsServoOn = Brushes.Gray;
 
+        private Brush _axisRightIsServoOn = Brushes.Gray;
         private Brush _axisRightIsOrg = Brushes.Red;
         private Brush _axisRightAmpFault = Brushes.Gray;
 
+        public Brush AxisLeftIsServoOn
+        {
+            get { return this._axisLeftIsServoOn; }
+            set
+            {
+                this.SetProperty( ref this._axisLeftIsServoOn , value );
+            }
+        }
+
         public Brush AxisLeftIsOrg
         {
             get { return _axisLeftIsOrg; }
@@ -81,6 +92,16 @@ namespace OHV.Module.Interactivity.PopUp
                 SetProperty( ref _axisLeftAmpFault , value );
             }
         }
+
+        public Brush AxisRightIsServoOn
+        {
+            get { return this._axisRightIsServoOn; }
+            set
+            {
+                this.SetProperty( ref this._axisRightIsServoOn, value );
+            }
+        }
+
         public Brush AxisRightIsOrg
         {
             get { return _axisRightIsOrg; }
@@ -102,6 +123,7 @@ namespace OHV.Module.Interactivity.PopUp
 
         public ICommand ConveyorRunCommand { get; set; }
         public ICommand PosMoveCommand { get; set; }
+        public ICommand LoadUnloadCommand { get; set; }
 
         IEventAggregator eventAggregator;
         MessageController messageController;
@@ -134,6 +156,28 @@ namespace OHV.Module.Interactivity.PopUp
 
             this.ConveyorRunCommand = new DelegateCommand<object>( ExecuteCvCommand );
             this.PosMoveCommand = new DelegateCommand<object>( ExecutePosMoveCommand );
+            this.LoadUnloadCommand = new DelegateCommand<string>( ExecuteLoadUnloadCommand );
+
+        }
+
+        private void ExecuteLoadUnloadCommand( string obj )
+        {
+            if ( obj.ToString().Equals( "Load" ) )
+            {
+                var msg = new VCSMessageEventArgs()
+                {
+                    Kind = VCSMessageEventArgs.eVCSMessageKind.ReqConveyorLoad,
+                };
+                this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Publish( msg );
+            }
+            else
+            {
+                var msg = new VCSMessageEventArgs()
+                {
+                    Kind = VCSMessageEventArgs.eVCSMessageKind.ReqConveyorUnload,
+                };
+                this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Publish( msg );
+            }
         }
 
         private void GetSensorState( EzIO _iO )
@@ -325,20 +369,32 @@ namespace OHV.Module.Interactivity.PopUp
             var left = args.Args[ "Left" ] as AxisState;
             var right = args.Args[ "Right" ] as AxisState;
 
+            /*Left*/
+            if ( left.IsServoOn )
+                this.AxisLeftIsServoOn = Brushes.LimeGreen;
+            else
+                this.AxisLeftIsServoOn = Brushes.Gray;
+
             if ( left.IsOriginReturn )
                 this.AxisLeftIsOrg = Brushes.LimeGreen;
             else
-                this.AxisLeftIsOrg = Brushes.Red;
+                this.AxisLeftIsOrg = Brushes.Gray;
 
             if ( left.IsAmpFault )
                 this.AxisLeftAmpFault = Brushes.Red;
             else
                 this.AxisLeftAmpFault = Brushes.Gray;
 
+            /*Right*/
+            if ( right.IsServoOn )
+                this.AxisRightIsServoOn = Brushes.LimeGreen;
+            else
+                this.AxisRightIsServoOn = Brushes.Gray;
+
             if ( right.IsOriginReturn )
                 this.AxisRightIsOrg = Brushes.LimeGreen;
             else
-                this.AxisRightIsOrg = Brushes.Red;
+                this.AxisRightIsOrg = Brushes.Gray;
 
             if ( right.IsAmpFault )
                 this.AxisRightAmpFault = Brushes.Red;

+ 4 - 3
Dev/OHV/OHV.Module.Interactivity/PopUp/DriveServoView.xaml

@@ -227,19 +227,20 @@
 
 
                 <!--Jog Button-->
-                <RepeatButton
+                <Button
                             Margin="5"
                             Grid.Row="0" 
                             Grid.Column="2"
                             HorizontalAlignment="Right"
                             Width="120"
                             Height="auto"
-                            Command="{Binding JogCommand}" CommandParameter="-">
+                            Command="{Binding JogCommand}" CommandParameter="-"
+                            >
                     <StackPanel>
                         <materialDesign:PackIcon Kind="MinusBoxOutline" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="30" Width="auto"/>
                         <TextBlock><Run Text="Jog(-)"/></TextBlock>
                     </StackPanel>
-                </RepeatButton>
+                </Button>
 
                 <Button
                             Margin="5"

+ 9 - 0
Dev/OHV/OHV.Module.Interactivity/PopUp/DriveServoView.xaml.cs

@@ -24,5 +24,14 @@ namespace OHV.Module.Interactivity.PopUp
         {
             InitializeComponent();
         }
+
+        private void Button_PreviewMouseDown( object sender , MouseButtonEventArgs e )
+        {  
+        }
+
+        private void Button_PreviewMouseUp( object sender , MouseButtonEventArgs e )
+        {
+
+        }
     }
 }

+ 6 - 6
Dev/OHV/OHV.Module.Interactivity/PopUp/LockServoView.xaml

@@ -281,7 +281,7 @@
                     </Grid.ColumnDefinitions>
                     <StackPanel Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
                         <StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center" >
-                            <Button
+                            <!--<Button
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
                             ToolTip="MaterialDesignRaisedButton with Round Corners"
@@ -293,9 +293,9 @@
                                 <StackPanel>
                                     <TextBlock><Run Text="Limit(-)"/></TextBlock>
                                 </StackPanel>
-                            </Button>
+                            </Button>-->
 
-                            <Button
+                            <!--<Button
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
                             ToolTip="MaterialDesignRaisedButton with Round Corners"
@@ -307,9 +307,9 @@
                                 <StackPanel>
                                     <TextBlock><Run Text="Origin"/></TextBlock>
                                 </StackPanel>
-                            </Button>
+                            </Button>-->
 
-                            <Button
+                            <!--<Button
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
                             ToolTip="MaterialDesignRaisedButton with Round Corners"
@@ -320,7 +320,7 @@
                                 <StackPanel>
                                     <TextBlock><Run Text="Limit(+)"/></TextBlock>
                                 </StackPanel>
-                            </Button>
+                            </Button>-->
                         </StackPanel>
 
                         <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Center"

+ 131 - 77
Dev/OHV/OHV.Module.Interactivity/PopUp/LockServoViewModel.cs

@@ -49,7 +49,7 @@ namespace OHV.Module.Interactivity.PopUp
             }
         }
 
-        double _jogVelocity;
+        double _jogVelocity = 5;
         public double JogVelocity
         {
             get { return this._jogVelocity; }
@@ -278,41 +278,65 @@ namespace OHV.Module.Interactivity.PopUp
             {
                 if ( r.Result == ButtonResult.OK )
                 {
-                    if ( this.SelectAxis == ConstString.AXIS_CARRIER_LOCK_LEFT )
+                    switch ( this.SelectedPosition )
                     {
-                        switch ( this.SelectedPosition )
-                        {
-                            case ConstString.TEACH_POSITION_LOCK:
-                                dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
-                                break;
-                            case ConstString.TEACH_POSITION_UNLOCK:
-                                dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
-                                break;
-                        }
-
-                        var sqlAxisLeft = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
-                        //sqlAxisLeft.Value = this.CurrentLockLeft;
-                        sqlAxisLeft.Value = this.TargetPosLockLeft;
-                        sql.AxisPositionDataDAL.Update( sqlAxisLeft );
+                        case ConstString.TEACH_POSITION_LOCK:
+                            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
+                            break;
+                        case ConstString.TEACH_POSITION_UNLOCK:
+                            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
+                            break;
                     }
-                    else if ( this.SelectAxis == ConstString.AXIS_CARRIER_LOCK_RIGHT )
-                    {
-                        switch ( this.SelectedPosition )
-                        {
-                            case ConstString.TEACH_POSITION_LOCK:
-                                dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
-                                break;
-                            case ConstString.TEACH_POSITION_UNLOCK:
-                                dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
-                                break;
-                        }
-                        var sqlAxisRight = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
-                        //sqlAxisRight.Value = this.CurrentLockRight;
-                        sqlAxisRight.Value = this.TargetPosLockRight;
-                        sql.AxisPositionDataDAL.Update( sqlAxisRight );
-                    }
-                    else
-                    { }
+
+                    var sqlAxisLeft = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
+                    //sqlAxisLeft.Value = this.CurrentLockLeft;
+                    sqlAxisLeft.Value = this.TargetPosLockLeft;
+                    sql.AxisPositionDataDAL.Update( sqlAxisLeft );
+
+                    var sqlAxisRight = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
+                    //sqlAxisRight.Value = this.CurrentLockRight;
+                    sqlAxisRight.Value = this.TargetPosLockRight;
+                    sql.AxisPositionDataDAL.Update( sqlAxisRight );
+                    //if ( this.SelectAxis == ConstString.AXIS_CARRIER_LOCK_LEFT )
+                    //{
+                    //    switch ( this.SelectedPosition )
+                    //    {
+                    //        case ConstString.TEACH_POSITION_LOCK:
+                    //            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
+                    //            break;
+                    //        case ConstString.TEACH_POSITION_UNLOCK:
+                    //            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
+                    //            break;
+                    //    }
+
+                    //    var sqlAxisLeft = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
+                    //    //sqlAxisLeft.Value = this.CurrentLockLeft;
+                    //    sqlAxisLeft.Value = this.TargetPosLockLeft;
+                    //    sql.AxisPositionDataDAL.Update( sqlAxisLeft );
+
+                    //    var sqlAxisRight = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
+                    //    //sqlAxisRight.Value = this.CurrentLockRight;
+                    //    sqlAxisRight.Value = this.TargetPosLockRight;
+                    //    sql.AxisPositionDataDAL.Update( sqlAxisRight );
+                    //}
+                    //else if ( this.SelectAxis == ConstString.AXIS_CARRIER_LOCK_RIGHT )
+                    //{
+                    //    switch ( this.SelectedPosition )
+                    //    {
+                    //        case ConstString.TEACH_POSITION_LOCK:
+                    //            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
+                    //            break;
+                    //        case ConstString.TEACH_POSITION_UNLOCK:
+                    //            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
+                    //            break;
+                    //    }
+                    //    var sqlAxisRight = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
+                    //    //sqlAxisRight.Value = this.CurrentLockRight;
+                    //    sqlAxisRight.Value = this.TargetPosLockRight;
+                    //    sql.AxisPositionDataDAL.Update( sqlAxisRight );
+                    //}
+                    //else
+                    //{ }
                 }
             } );
         }
@@ -327,9 +351,10 @@ namespace OHV.Module.Interactivity.PopUp
 
             var msg = new AxisControlEventArgs
             {
-                Dir = AxisControlEventArgs.eEventDir.ToBack ,
-                Kind = AxisControlEventArgs.eAxisControlKind.Jog ,
-                AxisName = this.SelectAxis ,
+                Dir = AxisControlEventArgs.eEventDir.ToBack,
+                Kind = AxisControlEventArgs.eAxisControlKind.Jog,
+                AxisName = this.SelectAxis,
+                JogVelocity = Convert.ToInt32( this.JogVelocity ),
             };
 
             if ( obj.ToString().Equals( "+" ) )
@@ -515,26 +540,39 @@ namespace OHV.Module.Interactivity.PopUp
 
         private void ExecuteMoveToCommand( )
         {
-            this.messageController.ShowConfirmationPopupView( $"Clamp Move To {this.SelectedPosition}" , r =>
-              {
-                  if ( r.Result == ButtonResult.OK )
-                  {
-                      var msg = new AxisControlEventArgs();
-                      msg.Kind = AxisControlEventArgs.eAxisControlKind.Move;
+            var error = string.Empty;
 
-                      if ( SelectedPosition.Equals( ConstString.TEACH_POSITION_LOCK ) )
-                          msg.PosDir = AxisControlEventArgs.ePosDir.Lock;
-                      else
-                          msg.PosDir = AxisControlEventArgs.ePosDir.UnLock;
+            if ( this.IsLeftServoFault || this.IsRightServoFault )
+                error = "Is Servo Fault";
+            else if ( !this.IsLeftServoOn || !this.IsRightServoOn )
+                error = "Is Servo OFF";
 
-                      this.PublishEvent( msg );
-                  }
-              } );
+            if ( error != string.Empty )
+                this.messageController.ShowNotificationView( error );
+            else
+            {
+                this.messageController.ShowConfirmationPopupView( $"Clamp Move To {this.SelectedPosition}" , r =>
+                {
+                    if ( r.Result == ButtonResult.OK )
+                    {
+                        var msg = new AxisControlEventArgs();
+                        msg.Kind = AxisControlEventArgs.eAxisControlKind.Move;
+                        msg.AxisName = this.SelectAxis;
+
+                        if ( SelectedPosition.Equals( ConstString.TEACH_POSITION_LOCK ) )
+                            msg.PosDir = AxisControlEventArgs.ePosDir.Lock;
+                        else
+                            msg.PosDir = AxisControlEventArgs.ePosDir.UnLock;
+
+                        this.PublishEvent( msg );
+                    }
+                } );
+            }
         }
 
         private void ExecuteSelectPosCommand( object obj )
         {
-            List<Common.Model.AxisPositionData> dataList = null;
+            List<Common.Model.AxisPositionData> positionList = null;
             this.SelectedPosition = obj.ToString();
 
             if ( obj.Equals( ConstString.TEACH_POSITION_LOCK ) )
@@ -548,34 +586,50 @@ namespace OHV.Module.Interactivity.PopUp
                 this.PosUnlockBrush = Brushes.Orange;
             }
 
-            if ( this.SelectAxis == ConstString.AXIS_CARRIER_LOCK_LEFT )
-            {
-                switch ( this.SelectedPosition )
-                {
-                    case ConstString.TEACH_POSITION_LOCK:
-                        dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
-                        break;
-                    case ConstString.TEACH_POSITION_UNLOCK:
-                        dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
-                        break;
-                }
-                var sqlAxisLeft = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
-                this.TargetPosLockLeft = sqlAxisLeft.Value;
-            }
-            else
+
+            switch ( this.SelectedPosition )
             {
-                switch ( this.SelectedPosition )
-                {
-                    case ConstString.TEACH_POSITION_LOCK:
-                        dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
-                        break;
-                    case ConstString.TEACH_POSITION_UNLOCK:
-                        dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
-                        break;
-                }
-                var sqlAxisRight = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
-                this.TargetPosLockRight = sqlAxisRight.Value;
+                case ConstString.TEACH_POSITION_LOCK:
+                    positionList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
+                    break;
+                case ConstString.TEACH_POSITION_UNLOCK:
+                    positionList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
+                    break;
             }
+            var sqlAxisLeft = positionList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
+            this.TargetPosLockLeft = sqlAxisLeft.Value;
+
+            var sqlAxisRight = positionList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
+            this.TargetPosLockRight = sqlAxisRight.Value;
+
+            //if ( this.SelectAxis == ConstString.AXIS_CARRIER_LOCK_LEFT )
+            //{
+            //    switch ( this.SelectedPosition )
+            //    {
+            //        case ConstString.TEACH_POSITION_LOCK:
+            //            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
+            //            break;
+            //        case ConstString.TEACH_POSITION_UNLOCK:
+            //            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
+            //            break;
+            //    }
+            //    var sqlAxisLeft = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
+            //    this.TargetPosLockLeft = sqlAxisLeft.Value;
+            //}
+            //else
+            //{
+            //    switch ( this.SelectedPosition )
+            //    {
+            //        case ConstString.TEACH_POSITION_LOCK:
+            //            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_LOCK );
+            //            break;
+            //        case ConstString.TEACH_POSITION_UNLOCK:
+            //            dataList = sql.AxisPositionDataDAL.GetKFromPostion( ConstString.TEACH_POSITION_UNLOCK );
+            //            break;
+            //    }
+            //    var sqlAxisRight = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
+            //    this.TargetPosLockRight = sqlAxisRight.Value;
+            //}
         }
 
         private void ExecuteSelectAxisCommand( object obj )

+ 3 - 0
Dev/OHV/OHV.Vehicle/Concept/D_MainWindow.xaml.cs

@@ -55,6 +55,9 @@ namespace OHV.Vehicle.Concept
 
             App.splashScreen.AddMessage("Done !");
             App.splashScreen.LoadComplete();
+
+            var model = this.DataContext as D_MainWindowViewModel;
+            model.InitViewModel();
         }
 
         private void Button_Click(object sender, RoutedEventArgs e)

+ 9 - 6
Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs

@@ -227,7 +227,7 @@ namespace OHV.Vehicle.Concept
             //this.VehicleIP = sql.ConfigDal.GetK( ConstString.Addr ).Value;
             this.OcsIP = sql.ConfigDal.GetK( ConstString.Addr ).Value;
 
-            //this.TestCommand = new DelegateCommand( ExecuteTextCommand );
+            this.TestCommand = new DelegateCommand( ExecuteTextCommand );
             this.NavigateCommand = new DelegateCommand<object>(this.Navigate);
             this.SystemOffCommand = new DelegateCommand(ExecuteSystemOffCommand);
             this.ChangeLanguage = new DelegateCommand(Execte_ChangeLanguage);
@@ -288,6 +288,8 @@ namespace OHV.Vehicle.Concept
                 Kind = VCSMessageEventArgs.eVCSMessageKind.ReqBuzzerStop ,
             };
             vcsMessagePublisher.Publish( msg );
+
+            this.ExecuteTextCommand();
         }
 
         private void Execte_ChangeLanguage()
@@ -495,12 +497,13 @@ namespace OHV.Vehicle.Concept
 
         private void ExecuteTextCommand()
         {
-            //var m = new VCSMessageEventArgs();
-            //m.MessageKey = 1234;
-            //m.MessageText = "Test Message";
-            //m.Command = new Common.Model.Command() { CommandID = "TestCommand123", Type = Common.Shareds.eCommandType.Move };
+            var m = new VCSMessageEventArgs();
+            m.MessageKey = "";
+            m.MessageText = "Test Message";
+            m.Kind = VCSMessageEventArgs.eVCSMessageKind.ReqTest;
+            m.Command = new Common.Model.Command() { CommandID = "TestCommand123", Type = Common.Shareds.eCommandType.Move };
 
-            //this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Publish(m);
+            this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Publish( m );
         }
 
         public void InitViewModel()

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

@@ -54,7 +54,7 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Remote|AnyCPU'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>\\Ohv_001\VCS\</OutputPath>
+    <OutputPath>\\192.168.127.10\VCS\</OutputPath>
     <DefineConstants>TRACE;DEBUG</DefineConstants>
     <DebugType>full</DebugType>
     <PlatformTarget>AnyCPU</PlatformTarget>

+ 0 - 1
Dev/OHV/VehicleControlSystem/ControlLayer/Axis/EzAxis.cs

@@ -255,7 +255,6 @@ namespace VehicleControlSystem.ControlLayer.Axis
             else
                 uiVelocity = (uint)Convert.ToInt32( dVelocity / this.Config.Scale );
 
-            uiVelocity = 50;
             if( dir == E_JogMoveDir.Positive )
                 return EziMOTIONPlusELib.FAS_MoveVelocity( Config.AxisNo, uiVelocity, EziSERVO2PlusE.DIR_INC );
             else

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

@@ -294,10 +294,11 @@ namespace VehicleControlSystem.ControlLayer
 
         void ReqJog(AxisControlEventArgs arg)
         {
+            var velocity = arg.JogVelocity;
             if (arg.JogDir == AxisControlEventArgs.eJogMoveDir.Positive)
-                this.JogMove(arg.AxisName, E_JogMoveDir.Positive, 0);
+                this.JogMove(arg.AxisName, E_JogMoveDir.Positive, velocity);
             else
-                this.JogMove(arg.AxisName, E_JogMoveDir.Negative, 0);
+                this.JogMove(arg.AxisName, E_JogMoveDir.Negative, velocity);
         }
 
         void ReqOriginReturn(AxisControlEventArgs arg)
@@ -330,7 +331,7 @@ namespace VehicleControlSystem.ControlLayer
 
             if (arg.PosDir == AxisControlEventArgs.ePosDir.Lock)
             {
-                result = Lock_Sync();
+                result = this.MoveToLockPosition( arg.AxisName );
                 if (result != 0)
                 {
                     var alarm = this.sql.AlarmDAL.GetK(result);
@@ -347,7 +348,7 @@ namespace VehicleControlSystem.ControlLayer
             }
             else
             {
-                result = Unlock_Sync();
+                result = this.MoveToUnlockPosition( arg.AxisName );
                 if (result != 0)
                 {
                     var alarm = this.sql.AlarmDAL.GetK(result);

+ 59 - 13
Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/Advantech/Advantech.cs

@@ -30,7 +30,25 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
         string errormsg = string.Empty;
 
         //Todo:Dll 에서 상태 가져오기
-        bool IsConnected = false;
+        //bool IsConnected = false;
+        bool IsConnected
+        {
+            get 
+            {
+                var state = new AdvCan.CanStatusPar_t();
+                var ret = this.device.acGetStatus( ref state );
+                if ( ret == AdvCANIO.SUCCESS )
+                {
+                    //정상 연결일때 값이 12 들어옴.
+                    if ( state.status == 12/*AdvCan.STATUS_OK*/ )
+                        return true;
+                    else
+                        return false;
+                }
+                else
+                    return false;
+            }
+        }
 
         #region Enum
         public enum eSendMode
@@ -78,6 +96,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
         public Advantech( BMUManager mrg, string canPortName )
         {
             this.manager = mrg;
+
             this.canPortName = canPortName;
 
             this.device = new AdvCANIO();
@@ -90,9 +109,13 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
 
         void TryToConnect( )
         {
+            //var a = AdvCANIO.OPERATION_ERROR; == -1
             this.qqW.Clear();
 
-            var ret = this.device.acCanOpen( this.canPortName/*this.manager.BMUConfig.ID*/ , false , 500 , 500 );
+            var d = this.device.acCanClose();
+            Thread.Sleep( 50 );
+
+            var ret = this.device.acCanOpen( this.canPortName, false , 500 , 500 );
 
             if(ret < 0)
             {
@@ -101,12 +124,19 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
             }
 
             ret = this.device.acEnterResetMode();
-            if(ret < 0)
+            if ( ret < 0 )
             {
                 throw new Exception( "AdvCAN Reset Error" );
                 return;
             }
 
+            //ret = this.device.acSetAcceptanceFilterMode( AdvCan.PELICAN_SINGLE_FILTER );
+            //if ( ret < 0 )
+            //{
+            //    throw new Exception( "AdvCAN AcceptFilterMode Set Error" );
+            //    return;
+            //}
+
             ret = this.device.acSetBaud(500);
             if ( ret < 0 )
             {
@@ -114,6 +144,20 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
                 return;
             }
 
+            ret = this.device.acSetAcceptanceFilterMask( Convert.ToUInt32( "FFFFFFFF" , 16 ));
+            if ( ret < AdvCANIO.SUCCESS )
+            {
+                throw new Exception( "AdvCAN AcceptFilterMask Set Error " );
+                return;
+            }
+
+            ret = this.device.acSetAcceptanceFilterCode( Convert.ToUInt32( "FFFFFFFF" , 16 ) );
+            if ( ret < AdvCANIO.SUCCESS )
+            {
+                throw new Exception( "AdvCAN AcceptFilterCode Set Error " );
+                return;
+            }
+
             ret = this.device.acSetTimeOut( 2000 , 2000 );
             if(ret < AdvCANIO.SUCCESS)
             {
@@ -135,8 +179,8 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
                 return;
             }
 
-            this.IsConnected = true;
-
+            //this.IsConnected = true;
+            this.Write( eSendMode.AUTO );
             manager._OnConnected();
         }
 
@@ -244,7 +288,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
             uint pulNumberofWritten = 1;
             AdvCan.canmsg_t[] msg = new AdvCan.canmsg_t[1];
             
-            msg[ 0 ].flags = AdvCan.MSG_EXT;
+            msg[ 0 ].flags = 0; // -> standard = 0, 
             msg[ 0 ].cob = 0;
             msg[ 0 ].id = idOffset + Convert.ToByte( this.manager.BMUConfig.ID );
             msg[ 0 ].length = ( short )AdvCan.DATALENGTH;
@@ -269,11 +313,13 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
 
             if(ret == AdvCANIO.TIME_OUT)
             {
-                CanError( );
+                CanError();
+                logger.E( "Battery Write TimeOut Error" );
             }
             else if (ret == AdvCANIO.OPERATION_ERROR)
             {
-                CanError(  );
+                CanError();
+                logger.E( "Battery Operation Error" );
             }
 
             return 1;
@@ -290,8 +336,8 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
         /// <returns></returns>
         void ReadMessage( )
         {
-            Thread.Sleep( 1000 );
-            uint readCount = 3;
+            Thread.Sleep( 10 );
+            uint readCount = 3; 
             uint pulNumberofRead = 3;
             AdvCan.canmsg_t[] recv = new AdvCan.canmsg_t[ 3 ];
 
@@ -317,7 +363,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
         {
             //null check battery receive
             var ll = recv.Select( x => x.data ).ToList();
-            if ( !ll.Any(null) )
+            if ( !ll.Any() )
                 return;
 
             ll.ForEach( r =>
@@ -380,7 +426,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
         void CanError(  )
         {
             //var result = PCANBasic.Uninitialize( this.handle );
-            this.IsConnected = false;
+            //this.IsConnected = false;
             var ret = this.device.acCanClose();
 
             //logger.E( $"[Battery Advantech] - {e.Message} -" );
@@ -458,7 +504,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
 
         private void DisConnect( )
         {
-            this.IsConnected = false;
+            //this.IsConnected = false;
             //PCANBasic.Reset( this.handle );
             //PCANBasic.Uninitialize( this.handle );
 

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

@@ -69,10 +69,10 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
                         data.Scale = 1;
                         break;
                     case eDataKind.ChargeCompleteTime:
-                        data.Scale = 1;
+                        data.Scale = 60;
                         break;
                     case eDataKind.DisChargeCompleteTime:
-                        data.Scale = 1;
+                        data.Scale = 60;
                         break;
                     case eDataKind.SOC:
                         data.Scale = 1;

+ 36 - 15
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -408,10 +408,10 @@ namespace VehicleControlSystem.ControlLayer
 
         private void ReqConveyor( DriveControlEventArgs args )
         {
-            if ( args.CvDir == DriveControlEventArgs.eCvDir.CW )
-                this.OnOffConveyor( true, true );
-            else if ( args.CvDir == DriveControlEventArgs.eCvDir.CCW )
+            if ( args.CvDir == DriveControlEventArgs.eCvDir.CW ) //Load
                 this.OnOffConveyor( true, false );
+            else if ( args.CvDir == DriveControlEventArgs.eCvDir.CCW ) //Unload
+                this.OnOffConveyor( true, true );
             else if ( args.CvDir == DriveControlEventArgs.eCvDir.STOP )
                 this.OnOffConveyor( false, false );
         }
@@ -688,6 +688,7 @@ namespace VehicleControlSystem.ControlLayer
         #region Control Action Method
         public void EStop()
         {
+            OnOffConveyor( false );
             //Clamp EStop
             this.clamp.ClampEStop();
             this.motion.EStop();
@@ -1036,17 +1037,17 @@ namespace VehicleControlSystem.ControlLayer
         /// (Run = true, CW = true CCW = false)
         /// </summary>
         /// <param name="isOn"></param>
-        /// <param name="isCW"></param>
+        /// <param name="isLoad">bit On 시 Unload 방향 진행.</param>
         /// <returns></returns>
-        int OnOffConveyor( bool isOn, bool isCW = false )
+        int OnOffConveyor( bool isOn, bool isLoad = false )
         {
             if ( IsInverterError() )
                 return 16;
 
-            if ( isCW )
-                this.iO.OutputOn( "OUT_CV_CWCCW" );
-            else
+            if ( isLoad )
                 this.iO.OutputOff( "OUT_CV_CWCCW" );
+            else
+                this.iO.OutputOn( "OUT_CV_CWCCW" );
 
             if ( isOn )
                 this.iO.OutputOn( "OUT_CV_RUN" );
@@ -1085,13 +1086,15 @@ namespace VehicleControlSystem.ControlLayer
         bool IsLifterDuplication() => this.iO.IsOn( "IN_LIFTER_DUPLICATION_DETECT" );
         bool IsPIOInterLockOn() => this.iO.IsOn( "OUT_PIO_INTERLOCK" );
 
-        int Load_Carrier()
+        public int ConveyorLoad()
         {
             if ( IsDetectedCenter() )
                 return 9;
 
+            logger.D( "[Manual Load] - Conveyor On" );
             OnOffConveyor( true, true );
 
+            bool isStartDetected = false;
             long sTime = SwUtils.CurrentTimeMillis;
             while ( true )
             {
@@ -1101,32 +1104,46 @@ namespace VehicleControlSystem.ControlLayer
                     return 10;
                 }
 
-                if ( IsDetectedLoadStart() )
+                if ( this.IsDetectedLoadStart() && !isStartDetected )
+                    isStartDetected = true;
+
+                if ( !this.IsDetectedLoadStart() && isStartDetected )
+                {
+                    this.SetConveyorSpeed( false );
+                    logger.D( "[Manual Load] - Conveyor Slow State" );
+                }
+
+                if ( IsDetectedLoadStop() )
                     break;
             }
+            OnOffConveyor( false );
+            logger.D( "[Manual Load] - Conveyor Off" );
 
             return 0;
         }
 
-        int UnloadCarrier()
+        public int ConveyorUnload()
         {
             if ( !IsDetectedLoadStart() )
                 return 11;
 
-            OnOffConveyor( true, true );
+            logger.D( "[Manual Unload] - Conveyor On" );
+            OnOffConveyor( true, false );
 
             long sTime = SwUtils.CurrentTimeMillis;
             while ( true )
             {
                 if ( SwUtils.Gt( sTime, 20 * ConstUtils.ONE_SECOND ) ) //Wait 20Sec
                 {
-                    OnOffConveyor( false, true );
+                    OnOffConveyor( false, false );
                     return 12;
                 }
 
                 if ( !IsDetectedLoadStart() )
                     break;
             }
+            OnOffConveyor( false );
+            logger.D( "[Manual Unload] - Conveyor Off" );
 
             return 0;
         }
@@ -1437,10 +1454,14 @@ namespace VehicleControlSystem.ControlLayer
                     this.BatteryState = ( double )obj.Value;
                     break;
                 case eDataKind.ChargeCompleteTime:
-                    this.BatteryChargeTime = (double)obj.Value * obj.Scale;
+                    if ( obj.Value == null || obj.Value <= 0 )
+                        return;
+                    this.BatteryChargeTime = (double)obj.Value / obj.Scale;
                     break;
                 case eDataKind.DisChargeCompleteTime:
-                    this.BatteryDisChargeTime = ( double )obj.Value * obj.Scale;
+                    if ( obj.Value == null || obj.Value <= 0 )
+                        return;
+                    this.BatteryDisChargeTime = ( double )obj.Value / obj.Scale;
                     break;
                 case eDataKind.SOC:
                     this.BatteryStateOfCharge = ( double )obj.Value * obj.Scale;

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

@@ -6,6 +6,7 @@ using System.Text;
 using System.Threading.Tasks;
 using GSG.NET;
 using GSG.NET.Extensions;
+using GSG.NET.Logging;
 using GSG.NET.ObjectBase;
 using GSG.NET.Quartz;
 using OHV.Common.Events;
@@ -24,6 +25,8 @@ namespace VehicleControlSystem
     [Module(ModuleName = "VCSystem")]
     public class VCSystem : IModule, IDisposable
     {
+        Logger logger = Logger.GetLogger();
+
         Scheduler scheduler = null;
         IEventAggregator eventAggregator = null;
         public IIO IO = null;
@@ -70,6 +73,7 @@ namespace VehicleControlSystem
             this.vehicle.Init();
             this.scheduler.Init();
             this.autoManager.Init(this.vehicle);
+
         }
 
         private void Vehicle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
@@ -104,6 +108,8 @@ namespace VehicleControlSystem
         }
         private void EzIO_OnContd(string ID)
         {
+            this.IO.OutputOn( "OUT_TEACH_MODE" );
+
             //throw new NotImplementedException();
         }
         #endregion
@@ -139,13 +145,45 @@ namespace VehicleControlSystem
                     ReqBuzzerStop();
                     break;
                 case VCSMessageEventArgs.eVCSMessageKind.ReqMachineModeChg:
-                    ReqMachineModeChg(msg);
+                    ReqMachineModeChg( msg );
+                    break;
+                case VCSMessageEventArgs.eVCSMessageKind.ReqAddCommand:
+                    break;
+                case VCSMessageEventArgs.eVCSMessageKind.ReqTest:
+                    ReqTest();
+                    break;
+                case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorLoad:
+                    ReqConveyorLoad();
+                    break;
+                case VCSMessageEventArgs.eVCSMessageKind.ReqConveyorUnload:
+                    ReqConveyorUnload();
                     break;
                 default:
                     break;
             }
         }
 
+        private void ReqConveyorUnload()
+        {
+            int result = 0;
+            result = this.vehicle.ConveyorUnload();
+        }
+
+        private void ReqConveyorLoad()
+        {
+            int result = 0;
+            result = this.vehicle.ConveyorLoad();
+        }
+
+        private void ReqTest()
+        {
+            logger.D( "Test Request" );
+            if ( this.IO.WaitChangeInputIO( true, 30000, "IN_CV_DETECT_00" ) )
+                logger.D( "Test - Time in" );
+            else
+                logger.D( "Test - Time out" );
+        }
+
         private void ReqMachineModeChg( VCSMessageEventArgs msg )
         {
             var reply = new GUIMessageEventArgs();
@@ -184,6 +222,12 @@ namespace VehicleControlSystem
         {
             this.autoManager.IsErrorProcessing = false;
             this.vehicle.VehicleStateProperty = eVehicleState.Idle;
+
+            if ( !this.IO.IsOn( "IN_MC_ON" ) )
+            {
+                this.IO.WriteOutputIO( "OUT_SAFETY_RESET", true );
+                this.IO.WriteOutputIO( "OUT_SAFETY_RESET", false, 3000 );
+            }
         }
 
         private void ReqEStop()