WPF开发经验-实现一种三轴机械手控件

打印 上一主题 下一主题

主题 893|帖子 893|积分 2679

一 引入


 
考虑实现一种三轴机器人控件。
三轴机器人用来将某种工件从一个位置运送到另一个位置。
其X轴为手臂轴,可以正向和反向运动,它处于末端,直接接触工件;
其T轴为旋转轴,可以对手臂进行旋转;
其Z轴为升降轴,可以对手臂和旋转部分进行升降。
 
二 RobotControl

定义出机器人的轴动作枚举,轴的动作分为回原点,正向运动,反向运动。
  1. public enum WaferRobotZAction
  2. {
  3.     Z_Origin,
  4.     Z_CW,
  5.     Z_CCW
  6. }
  7. public enum WaferRobotXAction
  8. {
  9.     X_Origin,
  10.     X_CW,
  11.     X_CCW
  12. }
  13. public enum WaferRobotTAction
  14. {
  15.     T_Origin,
  16.     T_CW,
  17.     T_CCW
  18. }
复制代码
声明一个WaferRobotControl的自定义控件,它继承自Control类。
定义一个Wafer属性来表示WaferRobot上的工件。
定义表示X轴动作、T轴动作和Z轴动作的依赖属性,它可以被实际的业务数据源绑定。
当实际的业务数据发生改变时,轴动作属性相应改变,并VisualStateManager来转换控件的状态,以触发样式模板中的动画。
  1. public class WaferRobotControl : Control
  2. {
  3.     static WaferRobotControl()
  4.     {
  5.         DefaultStyleKeyProperty.OverrideMetadata(typeof(WaferRobotControl), new FrameworkPropertyMetadata(typeof(WaferRobotControl)));
  6.     }
  7.     public static readonly DependencyProperty WaferProperty = DependencyProperty.Register("Wafer", typeof(int), typeof(WaferRobotControl));
  8.     public int Wafer { get => (int)GetValue(WaferProperty); set => SetValue(WaferProperty, value); }
  9.     public static readonly DependencyProperty RobotZActionProperty = DependencyProperty.Register(
  10.        "RobotZAction",
  11.        typeof(WaferRobotZAction),
  12.        typeof(WaferRobotControl),
  13.        new PropertyMetadata(WaferRobotZAction.Z_Origin, RobotZActionPropertyChangedCallback));
  14.     public WaferRobotZAction RobotZAction
  15.     {
  16.         get => (WaferRobotZAction)GetValue(RobotZActionProperty);
  17.         set => SetValue(RobotZActionProperty, value);
  18.     }
  19.     private static void RobotZActionPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  20.     {
  21.         var control = d as WaferRobotControl;
  22.         var oldAct = (WaferRobotZAction)e.OldValue;
  23.         var newAct = (WaferRobotZAction)e.NewValue;
  24.         switch (newAct)
  25.         {
  26.             case WaferRobotZAction.Z_Origin:
  27.                 VisualStateManager.GoToState(control, newAct.ToString(), true);
  28.                 break;
  29.             case WaferRobotZAction.Z_CW:
  30.                 if (newAct != oldAct)
  31.                 {
  32.                     VisualStateManager.GoToState(control, newAct.ToString(), true);
  33.                 }
  34.                 break;
  35.             case WaferRobotZAction.Z_CCW:
  36.                 if (newAct != oldAct)
  37.                 {
  38.                     VisualStateManager.GoToState(control, newAct.ToString(), true);
  39.                 }
  40.                 break;
  41.             default:
  42.                 break;
  43.         }
  44.     }
  45.     public static readonly DependencyProperty RobotXActionProperty = DependencyProperty.Register(
  46.         "RobotXAction",
  47.         typeof(WaferRobotXAction),
  48.         typeof(WaferRobotControl),
  49.         new PropertyMetadata(WaferRobotXAction.X_Origin, RobotXActionPropertyChangedCallback));
  50.     public WaferRobotXAction RobotXAction
  51.     {
  52.         get => (WaferRobotXAction)GetValue(RobotXActionProperty);
  53.         set => SetValue(RobotXActionProperty, value);
  54.     }
  55.     private static void RobotXActionPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  56.     {
  57.         var control = d as WaferRobotControl;
  58.         var oldAct = (WaferRobotXAction)e.OldValue;
  59.         var newAct = (WaferRobotXAction)e.NewValue;
  60.         switch (newAct)
  61.         {
  62.             case WaferRobotXAction.X_Origin:
  63.                 VisualStateManager.GoToState(control, newAct.ToString(), true);
  64.                 break;
  65.             case WaferRobotXAction.X_CW:
  66.                 if (newAct != oldAct)
  67.                 {
  68.                     VisualStateManager.GoToState(control, newAct.ToString(), true);
  69.                 }
  70.                 break;
  71.             case WaferRobotXAction.X_CCW:
  72.                 if (newAct != oldAct)
  73.                 {
  74.                     VisualStateManager.GoToState(control, newAct.ToString(), true);
  75.                 }
  76.                 break;
  77.             default:
  78.                 break;
  79.         }
  80.     }
  81.     public static readonly DependencyProperty RobotTActionProperty = DependencyProperty.Register(
  82.         "RobotTAction",
  83.         typeof(WaferRobotTAction),
  84.         typeof(WaferRobotControl),
  85.         new PropertyMetadata(WaferRobotTAction.T_Origin, RobotTActionPropertyChangedCallback));
  86.     public WaferRobotTAction RobotTAction
  87.     {
  88.         get => (WaferRobotTAction)GetValue(RobotTActionProperty);
  89.         set => SetValue(RobotTActionProperty, value);
  90.     }
  91.     private static void RobotTActionPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  92.     {
  93.         var control = d as WaferRobotControl;
  94.         var oldAct = (WaferRobotTAction)e.OldValue;
  95.         var newAct = (WaferRobotTAction)e.NewValue;
  96.         switch (newAct)
  97.         {
  98.             case WaferRobotTAction.T_Origin:
  99.                 VisualStateManager.GoToState(control, newAct.ToString(), true);
  100.                 break;
  101.             case WaferRobotTAction.T_CW:
  102.                 if (newAct != oldAct)
  103.                 {
  104.                     VisualStateManager.GoToState(control, newAct.ToString(), true);
  105.                 }
  106.                 break;
  107.             case WaferRobotTAction.T_CCW:
  108.                 if (newAct != oldAct)
  109.                 {
  110.                     VisualStateManager.GoToState(control, newAct.ToString(), true);
  111.                 }
  112.                 break;
  113.             default:
  114.                 break;
  115.         }
  116.     }
  117.     public override void OnApplyTemplate()
  118.     {
  119.         base.OnApplyTemplate();
  120.         VisualStateManager.GoToState(this, WaferRobotZAction.Z_Origin.ToString(), true);
  121.         VisualStateManager.GoToState(this, WaferRobotXAction.X_Origin.ToString(), true);
  122.         VisualStateManager.GoToState(this, WaferRobotTAction.T_Origin.ToString(), true);
  123.     }
  124. }
复制代码
 

三 Style

控件模板的实现思路。
将机器人的样式分为三部分,不动的底座部分,Z轴部分,包含T轴和X轴的手臂部分。
VisualStateGroup中定义出轴动作的VisualState,编写转换动画。
  1. [/code]View Code 
  2. [size=5]四 效果演示[/size]
  3. 界面代码如下:
  4. [code]<Window x:Class="WpfApp1.MainWindow"
  5.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  6.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  7.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  8.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  9.         xmlns:wpfapp1="clr-namespace:WpfApp1"
  10.         mc:Ignorable="d" Background="WhiteSmoke"
  11.         Title="MainWindow" Height="800" Width="1200">
  12.     <Canvas>
  13.         <wpfapp1:WaferRobotControl Canvas.Left="472" Canvas.Top="171" x:Name="robot"/>
  14.         <Button Content="Z CW" Canvas.Left="757" Canvas.Top="338" Width="60" Height="30" Click="ZCWButton_Click"   />
  15.         <Button Content="Z CCW" Canvas.Left="757" Canvas.Top="388" Width="60" Height="30" Click="ZCCWButton_Click"/>
  16.         <Button Content="X CW" Canvas.Left="838" Canvas.Top="338" Width="60" Height="30" Click="XCWButton_Click"/>
  17.         <Button Content="X CCW" Canvas.Left="838" Canvas.Top="389" Width="60" Height="30" Click="XCCWButton_Click"/>
  18.         <Button Content="T CW" Canvas.Left="919" Canvas.Top="338" Width="60" Height="30" Click="TCWButton_Click"/>
  19.         <Button Content="T CCW" Canvas.Left="919" Canvas.Top="389" Width="60" Height="30" Click="TCCWButton_Click"/>
  20.         <Button Content="Auto" Canvas.Left="757" Canvas.Top="439" Width="60" Height="30" Click="AutoButton_Click"/>
  21.     </Canvas>
  22. </Window>
复制代码
 
后台代码如下:
  1. public partial class MainWindow : Window
  2.     {
  3.         public MainWindow()
  4.         {
  5.             InitializeComponent();
  6.         }
  7.         private void ZCWButton_Click(object sender, RoutedEventArgs e)
  8.         {
  9.             robot.RobotZAction = WaferRobotZAction.Z_CW;
  10.         }
  11.         private void ZCCWButton_Click(object sender, RoutedEventArgs e)
  12.         {
  13.             robot.RobotZAction = WaferRobotZAction.Z_CCW;
  14.         }
  15.         private void XCWButton_Click(object sender, RoutedEventArgs e)
  16.         {
  17.             robot.RobotXAction = WaferRobotXAction.X_CW;
  18.         }
  19.         private void XCCWButton_Click(object sender, RoutedEventArgs e)
  20.         {
  21.             robot.RobotXAction = WaferRobotXAction.X_CCW;
  22.         }
  23.         private void TCWButton_Click(object sender, RoutedEventArgs e)
  24.         {
  25.             robot.RobotTAction = WaferRobotTAction.T_CW;
  26.         }
  27.         private void TCCWButton_Click(object sender, RoutedEventArgs e)
  28.         {
  29.             robot.RobotTAction = WaferRobotTAction.T_CCW;
  30.         }
  31.         private async void AutoButton_Click(object sender, RoutedEventArgs e)
  32.         {
  33.             robot.RobotTAction = WaferRobotTAction.T_CCW;
  34.             await Task.Delay(1000);
  35.             robot.RobotXAction = WaferRobotXAction.X_CW;
  36.             await Task.Delay(2000);
  37.             robot.Wafer = 1;
  38.             await Task.Delay(200);
  39.             robot.RobotXAction = WaferRobotXAction.X_CCW;
  40.             await Task.Delay(2000);
  41.             robot.RobotZAction = WaferRobotZAction.Z_CW;
  42.             await Task.Delay(1000);
  43.             robot.RobotTAction = WaferRobotTAction.T_CW;
  44.             await Task.Delay(1000);
  45.             robot.RobotXAction = WaferRobotXAction.X_CW;
  46.             await Task.Delay(2000);
  47.             robot.Wafer = 0;
  48.             await Task.Delay(200);
  49.             robot.RobotXAction = WaferRobotXAction.X_CCW;
  50.             await Task.Delay(2000);
  51.             robot.RobotTAction = WaferRobotTAction.T_Origin;
  52.             await Task.Delay(1000);
  53.             robot.RobotZAction = WaferRobotZAction.Z_CCW;
  54.         }
  55.     }
复制代码
 
                                     本文作者: 一团静火
                 本文链接: https://www.cnblogs.com/wwwen/p/17076289.html
                 关于博主: 水平有限,不足或错误之处,请批评指正。如果文章对您有帮助,可以点击文章右下角【推荐】一下。
                 版权声明: 本博客所有文章除特别声明外,系原创文章,均采用 BY-NC-SA 许可协议。转载请注明出处!并保留此段内容。
            
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表