C# GTS四轴运动控制器实例(固高科技步进电机不带编码器)

注:由于电机不带编码器,无法做home和当前位置信息读取!

功能:

三个轴的点位运动:前进+后退,并分别显示每个轴的移动脉冲数(可以换算为距离)!

开发环境:VS2017

硬件设备:固高科技三维移动平台

在上一版上添加了如下功能:

  1. 记录每次运行的距离,即使关闭软件,也能记录当前距离原点的距离(原点首次得在机台选定)

  2. 运行超出机台的最大距离后停止运动.

  3. 6a517caa9f6eeede340c14f349a76f50.png

    源码:

  4. using System;
    using System.Windows.Forms;
    using gts;
    using System.Xml;
    using System.Collections.Generic;namespace 三维平移台控制系统
    {public partial class mainFrom : DevComponents.DotNetBar.OfficeForm{public mainFrom()
    {this.EnableGlass = false;InitializeComponent();}short Rtn;int  vel = 0;int[] pos= {0,0,0 };int[] pos1 = { 0, 0, 0 };bool flag = false;uint clk;double prfpos, prfvel, encpos, encvel;short AXIS = 1;int X = 0;int Y = 0;int Z = 0;private void buttonX1_Click(object sender, EventArgs e)
    {mc.GT_ZeroPos(AXIS, 1);//for (int i=0; i<3;i++)//{//    pos1[i] += pos[i];//}pos1[AXIS - 1] += pos[AXIS - 1];pos[AXIS-1] = 0;}private void buttonX2_Click(object sender, EventArgs e)
    {//Rtn = mc.GT_Close();Rtn = mc.GT_PrfTrap(AXIS);mc.TTrapPrm trapprm;mc.GT_GetTrapPrm(AXIS, out trapprm);trapprm.acc = 0.1;//设置加速度trapprm.dec = 0.1;//设置减速度trapprm.smoothTime = 1;mc.GT_SetTrapPrm(AXIS, ref trapprm);pos[AXIS-1] += Convert.ToInt32(textBoxX1.Text)*500;vel = Convert.ToInt32(textBoxX2.Text)*2;mc.GT_SetPos(AXIS, pos[AXIS-1]);mc.GT_SetVel(AXIS, vel);// mc.GT_Update(AXIS);mc.GT_Update(1 << (AXIS - 1));//MessageBox.Show((1 << (AXIS - 1)).ToString());}private void buttonX3_Click(object sender, EventArgs e)
    {//Rtn = mc.GT_Close();Rtn = mc.GT_PrfTrap(AXIS);mc.TTrapPrm trapprm;mc.GT_GetTrapPrm(AXIS, out trapprm);trapprm.acc = 0.1;trapprm.dec = 0.1;trapprm.smoothTime = 1;mc.GT_SetTrapPrm(AXIS, ref trapprm);pos[AXIS-1] -= Convert.ToInt32(textBoxX1.Text)*500;vel = Convert.ToInt32(textBoxX2.Text)*2;mc.GT_SetPos(AXIS, pos[AXIS-1]);mc.GT_SetVel(AXIS, vel);//mc.GT_Update(AXIS);mc.GT_Update(1 << (AXIS - 1));}private void timer1_Tick(object sender, EventArgs e)
    {//if ()//{//    mc.GT_GetPrfPos(AXIS, out prfpos, 1, out clk);// profile 起始轴号//    mc.GT_GetEncPos(AXIS, out encpos, 1, out clk);// encoder 起始轴号//    textBox3.Text = prfpos.ToString();//    textBox5.Text = encpos.ToString();//    mc.GT_GetPrfVel(AXIS, out prfvel, 1, out clk);// 起始规划轴号//    mc.GT_GetEncVel(AXIS, out encvel, 1, out clk);// encoder 起始轴号//    textBox4.Text = prfvel.ToString();//    textBox6.Text = encvel.ToString();//}List<KeyValuePair<string, string>> settings = new List<KeyValuePair<string, string>>();KeyValuePair<string, string> kv = new KeyValuePair<string, string>("", "");mc.GT_GetPrfPos(AXIS, out prfpos, 1, out clk);// profile 起始轴号mc.GT_GetPrfVel(AXIS, out prfvel, 1, out clk);// 起始规划轴号if (AXIS == 1){labelX4.Text = "规划位置 : " + (prfpos / 500).ToString() + " mm";labelX5.Text = "规划速度 : " + (prfvel / 2).ToString() + " mm/s";kv = new KeyValuePair<string, string>("X", ((prfpos + pos1[0]) / 500 +X).ToString());settings.Add(kv);labelX10.Text = "距离原点 : " + ((prfpos + pos1[0])/500 + X).ToString() + " mm";if ((prfpos + pos1[0]) / 500 + X > 850)mc.GT_Stop(AXIS, 0);}else if (AXIS == 2){labelX6.Text = "规划位置 : " + (prfpos / 500).ToString() + " mm";labelX7.Text = "规划速度 : " + (prfvel / 2).ToString() + " mm/s";kv = new KeyValuePair<string, string>("Y", ((prfpos + pos1[1]) / 500 + Y).ToString());settings.Add(kv);labelX11.Text = "距离原点 : " + ((prfpos + pos1[1]) / 500 + Y).ToString() + " mm";if ((prfpos + pos1[1]) / 500 + Y > 500)mc.GT_Stop(AXIS, 0);}else if (AXIS == 3){labelX8.Text = "规划位置 : " + (prfpos / 500).ToString() + " mm";labelX9.Text = "规划速度 : " + (prfvel / 2).ToString() + " mm/s";kv = new KeyValuePair<string, string>("Z", ((prfpos + pos1[2]) / 500 + Z).ToString());settings.Add(kv);labelX12.Text = "距离原点 : " + ((prfpos + pos1[2]) / 500 + Z).ToString() + " mm";if ((prfpos + pos1[2]) / 500 + Z > 500)mc.GT_Stop(AXIS, 0);}SaveSettings(settings);}private void ReadConfigXML()
    {XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\config.xml");XmlNode settingNode = xmlDoc.DocumentElement;XmlElement e = settingNode.SelectSingleNode("X") as XmlElement;if (e == null){X = 0;}else{int val = 0;if (!int.TryParse(e.InnerText, out val)){X = 0;}else{X = val;}}e = settingNode.SelectSingleNode("Y") as XmlElement;if (e == null){Y = 0;}else{int val = 0;if (!int.TryParse(e.InnerText, out val)){Y = 0;}else{Y = val;}}e = settingNode.SelectSingleNode("Z") as XmlElement;if (e == null){Z = 0;}else{int val = 0;if (!int.TryParse(e.InnerText, out val)){Z = 0;}else{Z = val;}}}private void mainFrom_Load(object sender, EventArgs e)
    {comboBoxEx1.SelectedIndex = 0;textBoxX1.Text = "4";textBoxX2.Text = "5";labelX4.Text = "规划位置 : " + (0).ToString() + " mm";labelX5.Text = "规划速度 : " + (0).ToString() + " mm/s";labelX6.Text = "规划位置 : " + (0).ToString() + " mm";labelX7.Text = "规划速度 : " + (0).ToString() + " mm/s";labelX8.Text = "规划位置 : " + (0).ToString() + " mm";labelX9.Text = "规划速度 : " + (0).ToString() + " mm/s";/*初始化*/Rtn = mc.GT_Open(0, 1);Rtn = mc.GT_Reset();Rtn = mc.GT_LoadConfig("GTS800.cfg"); ;Rtn = mc.GT_ClrSts(1, 8); //axis 起始轴号,count ReadConfigXML();labelX10.Text = "距离原点 : " + (X).ToString() + " mm";labelX11.Text = "距离原点 : " + (Y).ToString() + " mm";labelX12.Text = "距离原点 : " + (Z).ToString() + " mm";labelX13.Text = "最大距离 : " + (850).ToString() + " mm";labelX14.Text = "最大距离 : " + (500).ToString() + " mm";labelX15.Text = "最大距离 : " + (500).ToString() + " mm";timer1.Enabled = true;}private void buttonX4_Click(object sender, EventArgs e)
    {mc.GT_Stop(AXIS, 0);}private void comboBoxEx1_SelectedIndexChanged(object sender, EventArgs e)
    {switch (comboBoxEx1.SelectedItem.ToString()){case "X轴":AXIS = 1; break;case "Y轴":AXIS = 2; break;case "Z轴":AXIS = 3; break;default:break;}}public static void SaveSettings(List<KeyValuePair<string, string>> settings)
    {try{string docPath = AppDomain.CurrentDomain.BaseDirectory + "\\config.xml";XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(docPath);XmlNode settingNode = xmlDoc.DocumentElement;if (settingNode == null)return;foreach (var kv in settings){SetNodeValue(xmlDoc, settingNode, kv.Key, kv.Value);}xmlDoc.Save(docPath);}catch { }}private static void SetNodeValue(XmlDocument XmlDoc, XmlNode rootnode, string key, string value)
    {try{XmlElement e = rootnode.SelectSingleNode(key) as XmlElement;if (e == null){XmlNode node = XmlDoc.CreateNode(XmlNodeType.Element, key, "");node.InnerText = value;rootnode.AppendChild(node);}else{e.InnerText = value;}}catch { }}}
    }

    04bafd9ae1443226924fb3d362995f72.png

    c6fa1fc8e7f7c14a0238e7dc73d32545.png

    ——————————

  5. 经典回顾

    往期推荐

    C# WPF框架Caliburn.Micro入门实例1

    C# WPF MVVM项目实战(进阶①)

    C# WPF MVVM项目实战(进阶②)

    C# WPF框架Caliburn.Micro快速搭建

    C# WPF项目实战

    C# WPF mvvm模式下combobox绑定(list<enum>、Dictionary<int,string>)

    C# WPF MVVM模式下在主窗体显示子窗体并获取结果

    C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面

    C# WPF文本框TextEdit不以科学计数法显示

    C# 通过正则表达式来限制控件输入有效性

    C# datagridview、datagrid、GridControl增加行号

    C# =>符号的使用

    C# 无意间写了一段线程死锁的代码

    C# 看懂这100+行代码,你就真正入门了(经典)

    C# WPF项目实战(经典)

    WPF 如何修改button圆角(经典)

    WPF XAML 为项目设置全局样式

    de491ec415a05606e606f779198a6954.jpeg

  6. -----------------------------------

  7. 需要进技术群交流的,请添加小编zls20210502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue-route核心知识整理

目录 1 相关理解 1.1 对 vue-router 的理解 1.2 对 SPA 应用的理解 1.3 对路由的理解 1.3.1 什么是路由&#xff1f; 1.3.2 路由的分类 2 几个注意点 3 路由的基本使用 4 嵌套 (多级) 路由 5 路由传参 5.1 query 方式传参 5.1.1 跳转路由并携带query参数&#xff0…

【项目】HTTP服务器

HTTP服务器 【项目】HTTP服务器项目介绍背景项目描述技术特点开发环境 网络协议栈HTTP协议特点URI & URL & URNURL格式HTTP请求与响应请求响应 CGI机制CGI的实现CGI的意义 日志封装TcpServer类线程池任务类CallBack回调方法类线程池类 封装HttpServer类主函数 封装HTTP…

Python asyncio的理解与入门

asyncio是Python标准库中用于编写异步代码的模块&#xff0c;它提供了一种基于协程的方式来处理并发任务。使用asyncio可以编写高效的异步程序&#xff0c;利用事件循环在单个线程中管理多个任务的执行。 下面是asyncio的基本概念和入门示例&#xff1a; 基本概念&#xff1a…

C 编译生成静态库、动态库的方式

背景 此前编程涉及到自定义编译生成静态库或动态库&#xff0c;为了方便以后查阅&#xff0c;在此记录一下&#xff0c;同时分享给大家。 将C文件编译成静态库或动态库可以使用不同的工具和编译选项&#xff0c;取决于你的需求和平台&#xff1b;以下是使用GCC编译器的简单示例…

Linux 内存top命令详解

通过top命令可以监控当前机器的内存实时使用情况&#xff0c;该命令的参数解释如下&#xff1a; 第一行 15:30:14 —— 当前系统时间 up 1167 days, 5:02 —— 系统已经运行的时长&#xff0c;格式为时:分 1 users ——当前有1个用户登录系统 load average: 0.00, 0.01, 0.05…

【ArcGIS微课1000例】0105:三维模型转体模型(导入sketchup转多面体为例)

文章目录 一、实验概述二、三维模型转多面体三、加载多面体数据四、注意事项一、实验概述 ArcGIS可以借助【导入3D文件】工具支持主流的三维模型导入。支持 3D Studio Max (.3ds)、VRML and GeoVRML 2.0 (.wrl)、SketchUp 6.0 (.skp)、OpenFlight 15.8 (.flt)、Collaborative …

【Web】没人比我更懂SSRF之入门必须要懂的知识汇总

目录 SSRF速览 伪协议 总览 file伪协议 dict伪协议 http协议 gopher伪协议 绕过 127限制绕过 302重定向绕过 DNS重绑定绕过 利用 gopher模拟请求打内网其他漏洞 Gopherus乱杀打组件 先看这篇文章&#xff1a;https://z3r4y.blog.csdn.net/article/details/135458…

算法——排序算法

目录 1、冒泡排序 2、插入排序 3、选择排序 4、归并排序 5、快速排序 6、堆排序 7、计数排序 8、桶排序 9、基数排序 常见的排序算法包括&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;选择排序&#xff08;Se…

Oracle12cR2之Job定时作业调度器详解

Oracle12cR2之Job定时作业调度器详解 文章目录 Oracle12cR2之Job定时作业调度器详解1.Oracle Job1. 关于Job2. 使用方法 2. Job详细说明1. 查看Job的相关视图2.SYS.DBA_JOBS视图字段详细说明 3. 创建及查看Job1. 创建Job2. 查看运行中的Job 1.Oracle Job 1. 关于Job 在 Oracle…

关于open3d的 kdtree模块的 查询偶发性崩溃问题

主要问题还是open3d的 kdtree模块的 query相关的算法引起的。没来得及在github提issue也查不到相关issue&#xff0c;因为是偶发性崩溃。所以需要记录一下&#xff0c;防止后人踩坑。 初始化kdtree的方式如下。 sample_pcd_data o3d.data.PCDPointCloud() pcd o3d.io.read_p…

面向对象分析和设计

面向对象分析与设计 面向对象的基本概念 软件工程学家Coad和Yourdon给出了一个定义&#xff1a;面向对象&#xff08;Object-Oriented&#xff09;对象&#xff08;Object&#xff09;继承&#xff08;Inheritance&#xff09;通信&#xff08;Communication&#xff09;。如…

设计模式: 策略模式

文章目录 一、什么是策略模式二、策略模式结构三、使用场景案例分析1、使用场景2、案例分析&#xff08;1&#xff09;消除条件分支 一、什么是策略模式 策略模式是一种行为型设计模式&#xff0c;它允许定义一组算法&#xff0c;并将每个算法封装在独立的类中&#xff0c;使它…

如何设计出用于喜欢的界面

要设计出用户喜欢的界面&#xff0c;你可以考虑以下几个方面&#xff1a; 用户研究&#xff1a;首先要了解用户的需求和偏好。你可以通过用户调研、用户访谈和数据分析来获取这些信息。了解用户的行为模式、喜好和痛点&#xff0c;有助于设计出更吸引人的界面。 直观的布局&am…

LeetCode 2656.K个元素的最大和

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。 将选中的元素 m 从数组中删除。 将新元素 m 1 添加到数组中。 你的得分增加 m 。 请你返回执行以上操作恰好 k 次后…

easyx 枪声模拟器

作品介绍:枪声模拟器 简介: “枪声模拟器”是一个基于Windows平台的简单程序,它使用C++编写,主要目的是通过模拟枪声来增强用户的体验。程序使用了图形库来展示一个蓝色的背景屏幕,并提示用户等待片刻后按空格键模拟开枪。当用户按下空格键时,程序会播放预先设定的枪声音…

代码随想录算法训练营第十八天|235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树节点

235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树节点 235.二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近…

[Swift]定义一个全局的可管理的计时器

定义一个全局计时器&#xff0c;延迟执行操作。可以对计时器进行全局控制&#xff0c;能手动控制暂停/重启/停止&#xff0c;并在计时结束后释放掉计时器。 import Foundationclass TimerManager {static let shared TimerManager()private var timer: DispatchSourceTimer?…

基于Java+Springboot+vue体育用品销售商城平台设计和实现

基于JavaSpringbootvue体育用品销售商城平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写> 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领…

在 Vue 中将 DOM 导出为图片

你好&#xff0c;我是小白Coding日志&#xff0c;一个热爱技术的程序员。在这里&#xff0c;我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客&#xff0c;一起在技术的世界里探索前行吧&#xff01; 在日常的工作中&…

【 Maven 】花式玩法之多模块项目

目录 一、认识Maven多模块项目 二、maven如何定义项目的发布策略 2.1 版本管理 2.2 构建配置 2.3 部署和发布 2.4 依赖管理 2.5 发布流程 三、使用Jenkins持续集成Maven项目 四、总结 如果你有一个多模块项目&#xff0c;并且想将这些模块发布到不同的仓库或目标位置&…