上位机状态机开发之九点标定 一 开始运行 /// <summary> /// 开始运行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void materialButton13_Click ( object sender, EventArgs e) { // 一 初始化操作 var task1= Task. Run ( ( ) => { //// 1.回零 //commomCMD.ReturnOrg(); //// 2.回避让位 //commomCMD.MoveSafePlace(); } ) ; // 二运行主流程 // 协同取消操作 cts= new CancellationTokenSource ( ) ; // 当前步骤 CurrentStep= 0 ; Task task2= task1. ContinueWith ( new Action< Task> ( ( t) => { bool result= NinePointCalibProcess ( ) ; } ) , cts. Token) ; } 二 定义全局变量 /// <summary> /// 协同取消操作 /// </summary> private CancellationTokenSource cts; //当前步骤 private NPointStep CurrentStep= 0 ; 三 定义运行流程 using System ; using System. Collections. Generic ; using System. Linq ; using System. Text ; using System. Threading. Tasks ; namespace 上位机程序. Procedures{ public enum NPointStep { 平移1 , 平移2 , 平移3 , 平移4 , 平移5 , 平移6 , 平移7 , 平移8 , 平移9 , 平移10 , 平移11 , 平移12 , 平移13 , 平移14 , } } 四 九点标定流程 /// <summary> /// 九点标定流程 /// </summary> /// <returns></returns> private bool NinePointCalibProcess ( ) { // 循环 while ( cts. IsCancellationRequested== false ) { Invoke ( new Action ( ( ) => { rtb_info. AppendText ( $"执行到步骤【 { ( int ) CurrentStep+ 1 } 】:" + CurrentStep. ToString ( ) + "\n" ) ; } ) ) ; switch ( CurrentStep) { case NPointStep. 平移1 : // 1.移动到第一个位置 commomCMD. Move1 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,140,10" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; case NPointStep. 平移2 : // 1.移动到第二个位置 commomCMD. Move2 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,140,-10" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; case NPointStep. 平移3 : commomCMD. Move3 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,140,-30" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; case NPointStep. 平移4 : commomCMD. Move4 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,160,10" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; case NPointStep. 平移5 : commomCMD. Move5 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,160,-10" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; case NPointStep. 平移6 : commomCMD. Move6 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,160,-30" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; case NPointStep. 平移7 : commomCMD. Move7 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,180,10" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; case NPointStep. 平移8 : commomCMD. Move8 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,180,-10" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; case NPointStep. 平移9 : commomCMD. Move9 ( ) ; // 2.触发拍照 CommunicateService. Instance. Send3 ( "Calib,180,-30" ) ; // 3.(等待拍照结束)拍照结束才能走 Thread. Sleep ( 3000 ) ; CurrentStep++ ; break ; default : break ; } // 暂停 while ( true ) { if ( IsPause) { Thread. Sleep ( 20 ) ; System. Windows. Forms. Application. DoEvents ( ) ; } else { break ; } } } return false ; } 五 定义停止标志位 // 暂停的标志位 public bool IsPause= false ; 六 定义通用指令类 public class CommomCMD { /// <summary> /// 回原点 /// </summary> public void ReturnOrg ( ) { // 回原点 CommunicateService. Instance. Send ( "machinestart\\nDeviceUp\\n\r\n" ) ; WaitCmdStop ( "回原点" ) ; } /// <summary> /// 移动到安全位置 /// </summary> public void MoveSafePlace ( ) { CommunicateService. Instance. Send ( $"start\nG01 X117 Y-100 Z80 C0 F3000\n" ) ; WaitCmdStop ( "回避让位" ) ; } /// <summary> /// 移动到安全位置 /// </summary> public void MoveSafePlace2 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X117 Y-100 Z80 C0 F3000\n" ) ; WaitCmdStop ( "回避让位" ) ; } /// <summary> /// 移动到OK位置 /// </summary> public void MoveOKPlace ( ) { CommunicateService. Instance. Send ( $"start\nG01 X83 Y183 Z36 C0 F3000\n" ) ; WaitCmdStop ( "移动到OK位置" ) ; } /// <summary> /// 移动到OK位置 /// </summary> public void MoveOKPlaceUp ( ) { CommunicateService. Instance. Send ( $"start\nG01 X83 Y183 Z80 C0 F3000\n" ) ; WaitCmdStop ( "移动到OK位置" ) ; } /// <summary> /// 下降 /// </summary> public void MoveOKPlaceDown ( ) { CommunicateService. Instance. Send ( $"start\nG01 X86 Y183 Z8 C0 F3000\n" ) ; WaitCmdStop ( "移动到OK位置" ) ; } /// <summary> /// 移动到NG位置 /// </summary> public void MoveNGPlace ( ) { CommunicateService. Instance. Send ( $"start\nG01 X202 Y151 Z80 C0 F3000\n" ) ; WaitCmdStop ( "移动到NG位置" ) ; } /// <summary> /// 移动到NG位置 /// </summary> public void MoveNGPlaceDown ( ) { CommunicateService. Instance. Send ( $"start\nG01 X202 Y151 Z8 C0 F3000\n" ) ; WaitCmdStop ( "移动到NG位置" ) ; } /// <summary> /// 移动到抓取位置 /// </summary> public void MoveGrabPlace ( ) { CommunicateService. Instance. Send ( $"start\nG01 X220 Y-43 Z80 C0 F3000\n" ) ; WaitCmdStop ( "移动到抓取位置" ) ; } public void MoveGrabPlace2 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X220 Y-43 Z5 C0 F3000\n" ) ; WaitCmdStop ( "移动到抓取位置" ) ; } /// <summary> /// 抬升 /// </summary> public void MoveGrabPlaceUp ( ) { CommunicateService. Instance. Send ( $"start\nG01 X220 Y-43 Z80 C0 F3000\n" ) ; WaitCmdStop ( "移动到抓取位置" ) ; } /// <summary> /// 等待停止 /// </summary> /// <param name="axis">轴号</param> /// <returns></returns> public void WaitCmdStop ( string cmd) { // 获取mainform var mainForm1= Application. OpenForms. OfType < Form1> ( ) . FirstOrDefault ( ) ; // 跨UI mainForm1. Invoke ( new Action ( ( ) => { mainForm1. rtb_info. AppendText ( $"指令: { cmd } -开始执行\n" ) ; } ) ) ; // 重置为0 GlobalParameters. FinishFlag= 0 ; do { Thread. Sleep ( 1 ) ; } while ( GlobalParameters. FinishFlag== 0 ) ; // 重置为0 GlobalParameters. FinishFlag= 0 ; // 跨UI mainForm1. Invoke ( new Action ( ( ) => { mainForm1. rtb_info. AppendText ( $"指令: { cmd } -运行已结束\n" ) ; } ) ) ; } /// <summary> /// 打开吸嘴 /// </summary> public void OpenXiZui ( ) { CommunicateService. Instance. Send ( "start\nM3S11000\n" ) ; } /// <summary> /// 关闭吸嘴 /// </summary> public void CloseXiZui ( ) { CommunicateService. Instance. Send ( "start\nm5\n" ) ; } public void Move1 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X140 Y10 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置1" ) ; } public void Move ( double x, double y, double z) { CommunicateService. Instance. Send ( $"start\nG01 X { x } Y { y } Z { z } C0 F3000\n" ) ; WaitCmdStop ( $"移动到位置X { x } Y { y } Z { z } C0" ) ; } public void Move ( string x, string y, string z, double a) { CommunicateService. Instance. Send ( $"start\nG01 X { x } Y { y } Z { z } C { a } F3000\n" ) ; WaitCmdStop ( $"移动到位置X { x } Y { y } Z { z } C { a } " ) ; } public void Move2 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X140 Y-10 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置2" ) ; } public void Move3 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X140 Y-30 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置3" ) ; } public void Move4 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X160 Y10 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置4" ) ; } public void Move5 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X160 Y-10 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置5" ) ; } public void Move6 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X160 Y-30 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置6" ) ; } public void Move7 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X180 Y10 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置7" ) ; } public void Move8 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X180 Y-10 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置8" ) ; } public void Move9 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X180 Y-30 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置9" ) ; } public void MoveR1 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X200 Y-20 Z40 C-20 F3000\n" ) ; WaitCmdStop ( "移动到位置10" ) ; } public void MoveR2 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X200 Y-20 Z40 C-10 F3000\n" ) ; WaitCmdStop ( "移动到位置11" ) ; } public void MoveR3 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X200 Y-20 Z40 C0 F3000\n" ) ; WaitCmdStop ( "移动到位置12" ) ; } public void MoveR4 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X200 Y-20 Z40 C10 F3000\n" ) ; WaitCmdStop ( "移动到位置13" ) ; } public void MoveR5 ( ) { CommunicateService. Instance. Send ( $"start\nG01 X200 Y-20 Z40 C20 F3000\n" ) ; WaitCmdStop ( "移动到位置14" ) ; } }