[Yugong series] April 2023 WPF motion control platform-005. Function realization of the motion platform (end)


1. The function realization of the sports platform

1. Position calculation

  1. Physical usable distance (40000), retrieving position: 19945P, packing position: -19360P

  2. Pixel position: Picking position: 20px Packing position: 1020px

  3. Convert pulse to bit distance

    1. Stepper Drive Set Subdivision 8

    2. Stepper motor step angle 1.8°

    3. Lead: 8mm

      Calculate the number of pulses required for the stepping motor to walk 1cm

      360 / 1.8 = 200 pulses for one revolution

      200 * 8 = 1600 pulses make one revolution (subdivision)

      1600 / 8 = 200 (required for the stepper motor to walk 1mm)

      Therefore: 200 * 10 = 2000 pulses are needed to walk 1cm

      The actual distance of the material level: 19945 / 2000 = 9.9725cm

      The actual distance of the packing position: 19360 / 2000 = 9.68cm

  4. Calculate the moving distance of the physical car and the moving distance of the image car

    y = kx + b

    y is the position of the car in the software, x is the actual physical position

    Pixel available distance: 1000px

    Physical usable distance: 9.9725+9.68 = 19.6525

    k = 1000/ 19.6525 = 50.88411143620405

    B = 1020 - 50.88411143620405 * 9.68 = 527.4418012975448

Two, the code

The specific packaging code is in the previous article, and the complete code of the actual function is as follows:

<Window x:Class="Zhaoxi.Motion.CorePlat.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Zhaoxi.Motion.CorePlat"
        mc:Ignorable="d"
        Title="MainWindow" WindowStyle="None" ResizeMode="CanResizeWithGrip" AllowsTransparency="True"
        WindowStartupLocation="CenterScreen"
        Height="650" Width="1200" Loaded="Window_Loaded" MouseLeftButtonDown="Window_MouseLeftButtonDown">
    <Window.Resources>
        <Style x:Key="FontStyle" TargetType="Label">
            <Setter Property="FontFamily" Value="Microsoft YA Hei" />
            <Setter Property="FontSize" Value="20" />
            <Setter Property ="Foreground"  Value ="#E2E6E9" />
        </Style>
        <Style TargetType ="Hyperlink">
            <!-- 清除文字修饰(去掉下划线) -->
            <Setter Property ="TextBlock.TextDecorations" Value ="{x:Null}" />
            <Style.Triggers>
                <Trigger Property ="IsMouseOver" Value ="True">
                    <!-- 在鼠标悬停时显示下划线 -->
                    <Setter Property ="TextBlock.TextDecorations">
                        <Setter.Value >
                            <TextDecorationCollection>
                                <TextDecoration Location ="Underline" />
                            </TextDecorationCollection>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
        <Style TargetType="DataGrid">
            <Setter Property="RowHeaderWidth" Value="0"></Setter>
            <Setter Property="AutoGenerateColumns" Value="False"></Setter>
            <Setter Property="CanUserAddRows" Value="False"></Setter>
            <Setter Property="CanUserResizeColumns" Value="False"></Setter>
            <Setter Property="CanUserResizeRows" Value="False"></Setter>
            <Setter Property="HorizontalGridLinesBrush" Value="#496D87"></Setter>
            <Setter Property="VerticalGridLinesBrush" Value="#496D87"></Setter>
            <Setter Property="IsReadOnly" Value="True"></Setter>
            <Setter Property="BorderThickness" Value="0"></Setter>
            <Setter Property="BorderBrush" Value="#496D87"></Setter>
            <Setter Property="RowHeight" Value="30"></Setter>
            <Setter Property="VerticalScrollBarVisibility" Value="Auto"></Setter>
            <Setter Property="Background" Value="Transparent"></Setter>
            <Setter Property="GridLinesVisibility" Value="None" />
        </Style>

        <!--DataGrid表头样式-->
        <Style TargetType="DataGridColumnHeader">
            <Setter Property="Foreground" Value="#6F899D" />
            <Setter Property="FontSize" Value="14"></Setter>
            <Setter Property="Background" Value="Transparent"></Setter>
            <Setter Property="BorderThickness" Value="0 0 0 1"></Setter>
            <Setter Property="BorderBrush" Value="#496D87"></Setter>
            <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
            <Setter Property="Height" Value="30" />
        </Style>
        <Style x:Key="DataRowStyle" TargetType="{x:Type DataGridRow}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="BorderThickness" Value="0" />
        </Style>
        <Style x:Key="DataCellStyle" TargetType="{x:Type DataGridCell}">
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="BorderThickness" Value="0"></Setter>
        </Style>
        <Style TargetType="Button">
            <Setter Property="Width" Value="80" />
            <Setter Property="Height" Value="32" />
            <Setter Property="Background" Value="#AAAAAA" />
            <Setter Property="Foreground" Value="#DADADA" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border x:Name="Border" CornerRadius="5" Background="{TemplateBinding Background}" TextBlock.Foreground="{TemplateBinding Foreground}">
                            <!--设置控件的边框,圆角,背景色,字体颜色-->
                            <ContentPresenter Margin="{TemplateBinding Padding}" HorizontalAlignment="Center" VerticalAlignment="Center">
                                <!--显示控件的内容-->
                            </ContentPresenter>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="#faa755"/>
                                <Setter Property="Foreground" Value="#FADCB2"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Background" Value="#F29701"/>
                                <Setter Property="Foreground" Value="#FADCB2"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.Background>
            <LinearGradientBrush StartPoint="1, 0" EndPoint="0 , 1">
                <GradientStop Color="#365B74" Offset="0.2" />
                <GradientStop Color="#4A6E87" Offset="1"/>
            </LinearGradientBrush>
        </Grid.Background>
        <Grid.RowDefinitions>
            <RowDefinition Height="0.5*" />
            <RowDefinition Height="2.5*" />
            <RowDefinition Height="0.4*"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="0.3*"/>
        </Grid.RowDefinitions>
        <Grid Grid.Row="0">
            <Border BorderBrush="#74848F" BorderThickness="0 0 0 2" Margin="30 0 30 0" />
            <Image Width="60" Height="45" Margin="30 0 20 0" HorizontalAlignment="Left" Source="pack://application:,,,/Zhaoxi.Motion.CorePlat;component/Assets/Images/logo.png" />
            <Label Margin="100 0 0 0" HorizontalAlignment="Left" Style="{StaticResource FontStyle}" Content="朝夕运动控制平台" Foreground="#E2E6E9" VerticalAlignment="Center" />
            <TextBlock HorizontalAlignment="Right" FontSize="16" Margin="0 0 30 0" VerticalAlignment="Center">
                <Hyperlink Foreground="#FFEAE5E3" Click="Hyperlink_Click">[退出]</Hyperlink>
            </TextBlock>
        </Grid>
        <Grid Grid.Row="1" Margin="50 10 50 10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*" />
                <ColumnDefinition Width="2*"/>
                <ColumnDefinition Width="1*" />
            </Grid.ColumnDefinitions>
            <Border Margin="5" BorderBrush="#569BAC" CornerRadius="5" BorderThickness="1" Grid.Column="0">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="40" />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <StackPanel Grid.Row="0" Orientation="Horizontal">
                        <Line X1="8" Y1="8" X2="8" Y2="30" Stroke="#00F6FB" StrokeThickness="4"  />
                        <TextBlock Margin="20 0 0 0" Text="实时状态" FontSize="20" Foreground="#9FB1BF" HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </StackPanel>
                    <StackPanel  Grid.Row="1">
                        <TextBlock Text="当前位置" Margin="30 0" FontSize="14" Foreground="#718A9F" />
                        <WrapPanel Margin="90 0 0 0">
                            <TextBlock Text="{Binding RealLocation}" FontSize="30" Foreground="#C1CCD5"  />
                            <TextBlock Margin="20 5 0 0" Text="cm" VerticalAlignment="Center" FontSize="18" Foreground="#9DAFBC" />
                        </WrapPanel>
                    </StackPanel>
                    <StackPanel  Grid.Row="2">
                        <TextBlock Text="当前速度" Margin="30 0" FontSize="14" Foreground="#718A9F" />
                        <WrapPanel Margin="90 0 0 0">
                            <TextBlock Text="{Binding RealSpeed}" FontSize="30" Foreground="#C1CCD5"  />
                            <TextBlock Margin="20 5 0 0" Text="cm/s" VerticalAlignment="Center" FontSize="18" Foreground="#9DAFBC" />
                        </WrapPanel>
                    </StackPanel>
                    <StackPanel  Grid.Row="3">
                        <TextBlock Text="运动状态" Margin="30 0" FontFamily="Microsoft Ya Hei" FontSize="14" Foreground="#718A9F" />
                        <WrapPanel Margin="90 0 0 0">
                            <TextBlock Text="{Binding RunState}"  FontSize="30" Foreground="#4DCBA8"  />
                        </WrapPanel>
                    </StackPanel>
                </Grid>
            </Border>
            <Border Margin="5" BorderBrush="#569BAC" CornerRadius="5" BorderThickness="1" Grid.Column="1">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="40" />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <StackPanel Grid.Row="0" Orientation="Horizontal">
                        <Line X1="8" Y1="8" X2="8" Y2="30" Stroke="#00F6FB" StrokeThickness="4"  />
                        <TextBlock Margin="20 0 0 0" Text="实时信息提示" FontSize="20" Foreground="#9FB1BF" HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </StackPanel>
                    <DataGrid Margin="1" ItemsSource="{Binding Loggers}" Grid.Row="1" CellStyle="{StaticResource DataCellStyle}" RowStyle="{StaticResource DataRowStyle}">
                        <DataGrid.Columns>
                            <DataGridTextColumn Width="2.5*" Binding="{Binding LogTime}" Header="时间"/>
                            <DataGridTextColumn Width="5*" Binding="{Binding LogMessage}" Header="消息"/>
                            <DataGridTextColumn Width="*" Binding="{Binding LogType}" Header="类型"/>
                            <DataGridTextColumn Width="*" Binding="{Binding LogLevel}" Header="等级"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </Grid>
            </Border>
            <Border Margin="5" BorderBrush="#569BAC" CornerRadius="5" BorderThickness="1" Grid.Column="2">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="40" />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <StackPanel Grid.Row="0" Orientation="Horizontal">
                        <Line X1="8" Y1="8" X2="8" Y2="30" Stroke="#00F6FB" StrokeThickness="4"  />
                        <TextBlock Margin="20 0 0 0" Text="参数配置" FontSize="20" Foreground="#9FB1BF" HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </StackPanel>
                    <StackPanel  Grid.Row="1">
                        <TextBlock Text="取料速度" Margin="30 0 0 8" FontSize="14" Foreground="#718A9F" />
                        <WrapPanel>
                            <TextBox Text="{Binding RecpSpeed}" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" Margin="30 0 0 0" Background="#CFD7DD" Width="150">
                                <TextBox.Resources>
                                    <Style TargetType="{x:Type Border}">
                                        <Setter Property="CornerRadius" Value="5"/>
                                    </Style>
                                </TextBox.Resources>
                            </TextBox>
                            <TextBlock Margin="20 5 0 0" Text="cm/s" VerticalAlignment="Center" FontSize="18" Foreground="#9DAFBC" />
                        </WrapPanel>
                    </StackPanel>
                    <StackPanel  Grid.Row="2">
                        <TextBlock Text="加工速度" Margin="30 0 0 8" FontSize="14" Foreground="#718A9F" />
                        <WrapPanel>
                            <TextBox Text="{Binding ProcessSpeed}" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" Margin="30 0 0 0" Background="#CFD7DD" Width="150">
                                <TextBox.Resources>
                                    <Style TargetType="{x:Type Border}">
                                        <Setter Property="CornerRadius" Value="5"/>
                                    </Style>
                                </TextBox.Resources>
                            </TextBox>
                            <TextBlock Margin="20 5 0 0" Text="cm/s" VerticalAlignment="Center" FontSize="18" Foreground="#9DAFBC" />
                        </WrapPanel>
                    </StackPanel>
                    <StackPanel  Grid.Row="3">
                        <TextBlock Text="加工位置" Margin="30 0 0 8" FontSize="14" Foreground="#718A9F" />
                        <WrapPanel>
                            <TextBox Text="{Binding ProcessLocation}" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" Margin="30 0 0 0" Background="#CFD7DD" Width="150">
                                <TextBox.Resources>
                                    <Style TargetType="{x:Type Border}">
                                        <Setter Property="CornerRadius" Value="5"/>
                                    </Style>
                                </TextBox.Resources>
                            </TextBox>
                            <TextBlock Margin="20 5 0 0" Text="cm" VerticalAlignment="Center" FontSize="18" Foreground="#9DAFBC" />
                        </WrapPanel>
                    </StackPanel>
                </Grid>
            </Border>
        </Grid>
        <Grid Grid.Row="2" Margin="50 0 50 0" VerticalAlignment="Center">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*" />
                <ColumnDefinition Width="0.6*"/>
                <ColumnDefinition Width="0.6*"/>
                <ColumnDefinition Width="0.6*"/>
                <ColumnDefinition Width="2*"/>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Button Name="Btn_Start" Width="130" Content="启动系统" Grid.Column="0" Height="NaN" Margin="6,2,5,1" Click="Btn_Start_Click" />
            <Button Name="Btn_Recp" Content="去取料" Grid.Column="1" Click="Btn_Recp_Click" />
            <Button Name="Btn_Pack" Content="去打包" Grid.Column="2" Click="Btn_Pack_Click" />
            <Button Name="Btn_Tag" Content="贴标签" Grid.Column="3" Click="Btn_Tag_Click"/>
            <WrapPanel Grid.Column="5" VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock Text="去取料" VerticalAlignment="Center" Foreground="#BBC2C8" />
                <Rectangle Name="RecpLight" Margin="10 0 0 0" Width="80" Height="35" Fill="#BBC2C8" RadiusX="5" RadiusY="5" />
            </WrapPanel>
            <WrapPanel Grid.Column="6" VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock Text="去打包" VerticalAlignment="Center" Foreground="#BBC2C8" />
                <Rectangle  Name="PackLight" Margin="10 0 0 0" Width="80" Height="35" Fill="#BBC2C8" RadiusX="5" RadiusY="5" />
            </WrapPanel>
            <WrapPanel Grid.Column="7" VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock Text="贴标签" VerticalAlignment="Center" Foreground="#BBC2C8" />
                <Rectangle Name="MarkTagLight" Margin="10 0 0 0" Width="80" Height="35" Fill="#BBC2C8" RadiusX="5" RadiusY="5" />
            </WrapPanel>
        </Grid>
        <Grid Grid.Row="3">
            <Border BorderBrush="#1A305F" BorderThickness="0 0 0 10" />
            <Canvas>
                <Viewbox Name="MoveRegion" Width="150" Height="150" Canvas.Left="{Binding CarLocation}" Canvas.Top="77">
                    <Grid RenderTransformOrigin="0.5,0.5">
                        <Grid.RenderTransform>
                            <ScaleTransform ScaleX="{Binding CarDirection}" />
                        </Grid.RenderTransform>
                        <Path Data="M254.464 668.672c-60.928 0-110.592 49.664-110.592 110.592 0 60.928 49.664 110.592 110.592 110.592 60.928 0 110.592-49.664 110.592-110.592-0.512-61.44-49.664-110.592-110.592-110.592z" Fill="#135173" />
                        <Path Data="M850.944 487.936h-20.992l-194.56-206.336-0.512-0.512c-24.064-24.576-57.344-38.4-91.648-37.888h-245.76c-43.008 0-82.944 22.016-105.984 58.368l-1.024 1.536-84.48 184.832h-50.176c-28.16 0-50.688 22.528-50.688 50.688v135.168c0 60.416 48.128 110.08 108.032 112.64v-7.168c0-77.824 62.976-141.312 141.312-141.312s141.312 62.976 141.312 141.312v7.168h262.144v-7.168c1.536-77.824 66.048-139.776 144.384-138.24 75.776 1.536 136.704 62.464 138.24 138.24v7.168h34.304c23.552 0 43.008-19.456 43.008-43.008v-90.112c-0.512-91.648-75.264-165.376-166.912-165.376z m-677.376 0L244.736 332.8c11.776-17.408 31.744-28.16 52.736-28.16H404.48v183.296H173.568z m292.352 0V304.64h76.8c17.92 0 35.328 7.168 48.128 19.968l154.624 163.328H465.92z" Fill="#135173" />
                        <Path Data="M798.72 668.672c-60.928 0-110.592 49.664-110.592 110.592 0 60.928 49.664 110.592 110.592 110.592 60.928 0 110.592-49.664 110.592-110.592 0-61.44-49.664-110.592-110.592-110.592z" Fill="#135173" />
                    </Grid>
                </Viewbox>
                <StackPanel Canvas.Left="85" Canvas.Top="40">
                    <Ellipse Name="RecpPoint" Fill="#A0A0A0" Width="20" Height="20" />
                    <Line X1="10" Y1="3" X2="10" Y2="150" Stroke="#A5AEB4" StrokeThickness="2" StrokeDashArray="7" />
                </StackPanel>
                <StackPanel Canvas.Left="585" Canvas.Top="40">
                    <Ellipse Name="HomePoint" Fill="#A0A0A0" Width="20" Height="20" />
                    <Line X1="10" Y1="3" X2="10" Y2="150" Stroke="#A5AEB4" StrokeThickness="2" StrokeDashArray="7" />
                </StackPanel>
                <StackPanel Canvas.Left="790" Canvas.Top="40">
                    <Ellipse Name="TagPoint" Fill="#A0A0A0" Width="20" Height="20" />
                    <Line X1="10" Y1="3" X2="10" Y2="150" Stroke="#A5AEB4" StrokeThickness="2" StrokeDashArray="7" />
                </StackPanel>
                <StackPanel Canvas.Left="1085" Canvas.Top="40">
                    <Ellipse Name="PackPoint" Fill="#A0A0A0" Width="20" Height="20" />
                    <Line X1="10" Y1="3" X2="10" Y2="150" Stroke="#A5AEB4" StrokeThickness="2" StrokeDashArray="7" />
                </StackPanel>
            </Canvas>
        </Grid>
        <Canvas Grid.Row="4" Background="#91A6B4" Margin="0 2 0 0">
            <TextBlock Canvas.Left="80" Canvas.Top="6" Text="取料" FontSize="16" Foreground="#DEE4E8" />
            <TextBlock Canvas.Left="580" Canvas.Top="6" Text="原点" FontSize="16" Foreground="#DEE4E8" />
            <TextBlock Canvas.Left="780" Canvas.Top="6" Text="贴标签" FontSize="16" Foreground="#DEE4E8" />
            <TextBlock Canvas.Left="1080" Canvas.Top="6" Text="打包" FontSize="16" Foreground="#DEE4E8" />
        </Canvas>
    </Grid>
</Window>


using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using Zhaoxi.Motion.ControlLib;
using static gts.mc;

namespace Zhaoxi.Motion.CorePlat
{
    
    
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
    
    
        public ObservableCollection<MotionLogger> Loggers {
    
     get; set; } = new ObservableCollection<MotionLogger>();
        /// <summary>
        /// 定义点位目标的常量
        /// </summary>
        const int RECP_POS = 19360;
        const int PACK_POS = -19360;
        const int MTAG_POS = -8000;

        // 创建定时器对象
        private DispatcherTimer timer = new DispatcherTimer();
        private IAxisTool axisTool;
        private WorkState workState = WorkState.None;
        private double encPos;

        private double _realLocation = 0;
        private double _realSpeed = 0;
        private string _runState = "停止";
        // 系统默认的速度
        private double defaulVel = 8;
        // 系统默认颜色
        private Brush pointLightNewBrush;
        private Brush pointLightOldBrush;
        private Brush processLightBrush;
        // 记录小车的开始位置
        private double _carLocation;
        private int _carDirection = 1;

        /// <summary>
        /// 参数设置相关的字段
        /// </summary>
        private double _recpSpeed;
        private double _processSpeed;
        private double _processLocation;

        public event PropertyChangedEventHandler PropertyChanged;

        public void RiseProperty(string propertyName)
        {
    
    
            if (PropertyChanged != null)
            {
    
    
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public double RealLocation
        {
    
    
            get {
    
     return _realLocation; }
            set {
    
     _realLocation = value; RiseProperty(nameof(RealLocation)); }
        }

        public double RealSpeed
        {
    
    
            get {
    
     return _realSpeed; }
            set {
    
     _realSpeed = value; RiseProperty(nameof(RealSpeed)); }
        }
        public string RunState
        {
    
    
            get {
    
     return _runState; }
            set {
    
     _runState = value; RiseProperty(nameof(RunState)); }
        }

        public double RecpSpeed
        {
    
    
            get {
    
     return _recpSpeed; }
            set {
    
     _recpSpeed = value; RiseProperty(nameof(RecpSpeed)); }
        }

        public double ProcessSpeed
        {
    
    
            get {
    
     return _processSpeed; }
            set {
    
     _processSpeed = value; RiseProperty(nameof(ProcessSpeed)); }
        }

        public double ProcessLocation
        {
    
    
            get {
    
     return _processLocation; }
            set {
    
     _processLocation = value; RiseProperty(nameof(ProcessLocation)); }
        }

        public double CarLocation
        {
    
    
            get {
    
     return _carLocation; }
            set {
    
     _carLocation = value; RiseProperty(nameof(CarLocation)); }
        }

        public int CarDirection
        {
    
    
            get {
    
     return _carDirection; }
            set {
    
     _carDirection = value; RiseProperty(nameof(CarDirection)); }
        }


        public MainWindow()
        {
    
    
            InitializeComponent();
            // 设置DataContext
            DataContext = this;
            // 调用初始化方法
            InitData();
        }

        private void InitData()
        {
    
    
            // 定时器配置及启动
            timer.Interval = TimeSpan.FromMilliseconds(10);
            timer.Tick += Timer_Tick;
            timer.Start();

            // 创建对应轴卡的实例对象
            axisTool = AxisToolFactory.CreateInstance(AxisType.GTS800);
            // 初始化轴卡
            axisTool.AxisInit(1);

        }

        /// <summary>
        /// 刷新小车位置和监控轴状态
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void Timer_Tick(object sender, EventArgs e)
        {
    
    
            // 获取小车物理实际移动位置
            axisTool.GetAxisEncPos(1, out encPos);
            // 8p/ms => 8000p/s =>  (8000 / 2000) = 4cm/s
            axisTool.GetAxisEncVel(1, out double encVel);
            // 计算速度
            var speed = encVel * 1000 / 2000;
            // 获取物理位置
            var location = encPos / 2000;
            // 给当前位置赋值
            RealLocation = Math.Round(location, 2);
            // 给当前速度属性赋值
            RealSpeed = Math.Abs(Math.Round(speed, 2));
            // 计算小车在软件的位置
            CarLocation = -50.88411143620405 * location + 527.4418012975448;
            CarDirectionLocation();
            // 根据速度设置运行状态
            if (speed != 0)
            {
    
    
                RunState = "运行";
            }
            else
            {
    
    
                RunState = "停止";
            }
            switch (workState)
            {
    
    
                case WorkState.Package:
                    if (encPos == PACK_POS)
                    {
    
    
                        PackPoint.Fill = pointLightNewBrush;
                        PackLight.Fill = processLightBrush;
                    }
                    else
                    {
    
    
                        PackLight.Fill = Brushes.Tomato;
                    }
                    break;
                case WorkState.MarkTag:
                    if (encPos == MTAG_POS)
                    {
    
    
                        TagPoint.Fill = pointLightNewBrush;
                        MarkTagLight.Fill = processLightBrush;
                    }
                    else
                    {
    
    
                        MarkTagLight.Fill = Brushes.Gold;
                    }
                    break;
                case WorkState.Recplier:
                    if (encPos == RECP_POS)
                    {
    
    
                        RecpPoint.Fill = pointLightNewBrush;
                        RecpLight.Fill = processLightBrush;
                    }
                    else
                    {
    
    
                        RecpLight.Fill = Brushes.DodgerBlue;
                    }
                    break;
                case WorkState.Home:
                    if (encPos == 0)
                    {
    
    
                        HomePoint.Fill = pointLightNewBrush;
                    }
                    break;
                default:
                    break;
            }



        }
        /// <summary>
        /// 重置到点指示灯的功能
        /// </summary>
        private void ResetPointLight()
        {
    
    
            HomePoint.Fill = pointLightOldBrush;
            RecpPoint.Fill = pointLightOldBrush;
            TagPoint.Fill = pointLightOldBrush;
            PackPoint.Fill = pointLightOldBrush;
        }

        /// <summary>
        /// 退出应用程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Hyperlink_Click(object sender, RoutedEventArgs e)
        {
    
    
            // 停止轴
            axisTool.StopAxis(1);
            // 关闭轴卡
            axisTool.CloseAxis();
            // 关闭应用程序
            Application.Current.Shutdown();
        }

        private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
    
    
            this.DragMove();
        }

        /// <summary>
        /// 系统启动
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Start_Click(object sender, RoutedEventArgs e)
        {
    
    
            Loggers.Add(new MotionLogger
            {
    
    
                LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                LogMessage = "执行启动系统功能",
                LogLevel = 1,
                LogType = "INFO"
            });
            // 调用回原点方法
            // 创建运动参数对象
            var param = new AxisParameter
            {
    
    
                acc = 0.4,
                dec = 0.4,
                velStart = 0,
                smoothTime = 20
            };
            // 启动定时器
            timer.Start();
            // 执行回原操作
            axisTool.AxisGoHome(1, param, defaulVel, 3);
            // 切换位回原状态
            workState = WorkState.Home;
            // 调用重置到点指示灯的方法
            ResetPointLight();
        }

        /// <summary>
        /// 设置目标位置的点位运动
        /// </summary>
        /// <param name="pos"></param>
        private void SetPos(int pos)
        {
    
    
            double runVel = 0; // 运行速度
            // 重置到点指示灯颜色
            ResetPointLight();
            switch (workState)
            {
    
    
                case WorkState.None:
                    runVel = defaulVel;
                    break;
                case WorkState.Package:
                case WorkState.MarkTag:
                    runVel = ProcessSpeed;
                    break;
                case WorkState.Recplier:
                    runVel = RecpSpeed;
                    break;
            }
            // 创建运动参数对象
            var param = new AxisParameter
            {
    
    
                acc = 0.2,
                dec = 0.2,
                velStart = 0,
                smoothTime = 25
            };
            // 设置绝对运动目标位置
            // 8p / ms => 8000p / s =>  (8000 / 2000) = 4cm / s
            // 走4cm = > 8000p / s => 8 p / ms
            // runvel * 2000 / 1000
            var pVel = runVel * 2000 / 1000;
            axisTool.AxisAbsMove(1, param, pos, pVel);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Pack_Click(object sender, RoutedEventArgs e)
        {
    
    
            if (RealSpeed == 0)
            {
    
    
                Loggers.Add(new MotionLogger
                {
    
    
                    LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    LogMessage = "执行打包工序",
                    LogLevel = 0,
                    LogType = "INFO"
                });

                workState = WorkState.Package;
                SetPos(PACK_POS);
            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Recp_Click(object sender, RoutedEventArgs e)
        {
    
    
            if (RealSpeed == 0)
            {
    
    
                Loggers.Add(new MotionLogger
                {
    
    
                    LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    LogMessage = "执行取料工序",
                    LogLevel = 0,
                    LogType = "INFO"
                });
                workState = WorkState.Recplier;
                SetPos(RECP_POS);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Tag_Click(object sender, RoutedEventArgs e)
        {
    
    
            if (RealSpeed == 0)
            {
    
    
                Loggers.Add(new MotionLogger
                {
    
    
                    LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    LogMessage = "执行贴标签工序",
                    LogLevel = 0,
                    LogType = "INFO"
                });
                workState = WorkState.MarkTag;
                SetPos(MTAG_POS);
            }
        }
        /// <summary>
        /// 做数据的初始化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
    
    
            Loggers.Add(new MotionLogger
            {
    
    
                LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                LogMessage = "执行系统数据初始化",
                LogLevel = 0,
                LogType = "INFO"
            });

            // 初始化配置参数
            ProcessLocation = 4;
            ProcessSpeed = 4;
            RecpSpeed = 4;
            // 初始化到点指示灯的颜色
            pointLightOldBrush = new SolidColorBrush(Color.FromRgb(160, 160, 160));
            pointLightNewBrush = new SolidColorBrush(Color.FromRgb(77, 203, 168));
            processLightBrush = new SolidColorBrush(Color.FromRgb(187, 194, 200));
            // 获取小车物理实际移动位置
            axisTool.GetAxisEncPos(1, out encPos);
            // 在启动系统的时候初始化到点指示灯状态
            if (encPos == 0)
            {
    
    
                workState = WorkState.Home;
            }
            else if (encPos == MTAG_POS)
            {
    
    
                workState = WorkState.MarkTag;
            }
            else if (encPos == RECP_POS)
            {
    
    
                workState = WorkState.Recplier;
            }
            else if (encPos == PACK_POS)
            {
    
    
                workState = WorkState.Package;
            }
        }

        double oldValue = 0;
        /// <summary>
        /// 判断轴卡输出的是正脉冲还是负脉冲
        /// </summary>
        /// <param name="flag"></param>
        public void CarDirectionLocation()
        {
    
    
            Task.Run(() =>
            {
    
    
                while (RealSpeed != 0)
                {
    
    
                    double newValue = 0;
                    var result = GT_GetEncPos(1, out newValue, 1, out uint clk);
                    if (result != 0)
                    {
    
    
                        Console.WriteLine("Failed to get encoder position!");
                        break;
                    }

                    if (newValue > oldValue)
                    {
    
    

                        CarDirection = -1;
                    }
                    else if (newValue < oldValue)
                    {
    
    
                        CarDirection = 1;
                    }
                    oldValue = newValue;
                }
            });
        }
    }
}

insert image description here

Guess you like

Origin blog.csdn.net/aa2528877987/article/details/130376464