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…

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…

设计模式: 策略模式

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

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

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

基于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;并且想将这些模块发布到不同的仓库或目标位置&…

在UE5中使用OverlayMaterial制作多材质效果

UE5.1中新增了OverlayMaterial&#xff0c;可以让物体套用2个材质球效果&#xff0c;如A材质球为正常材质内容&#xff0c;B材质球为菲涅尔&#xff0c;或是B材质球是法线外拓描边等&#xff0c;该功能类似Unity的多pass效果&#xff0c;方便了日常使用。 下面就讲将怎么用Ove…

开源软件的利弊

目录 开源软件 优势 免费 透明 可更改 可协作 影响力 坏处 安全隐患 良莠不齐 学习成本 持续性问题 未知风险 开源软件 开源软件是一种基于开放协作和共享的软件开发模式&#xff0c;其利弊对于软件产业和社会发展具有重要意义 优势 免费 谁能拒绝不要钱的东西…

多线程相关(1)

线程调度 线程状态&#xff1a;状态切换阻塞与唤醒阻塞唤醒 wait 与 sleep创建线程方式 线程是cpu任务调度的最小执行单位&#xff0c;每个线程拥有自己独立的程序计数器、虚拟机栈、本地方法栈。 线程状态&#xff1a; 线程状态包括&#xff1a;创建、就绪、运行、阻塞、死亡…

2024.2.20

使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 #include<myhead.h> int main(int argc, const char *argv[]) {char str[100]"";puts("please input str:");//从终端读…

软件实例分享,饭店餐饮会员卡管理系统怎么弄会员充值怎么记账

软件实例分享&#xff0c;饭店餐饮会员卡管理系统怎么弄会员充值怎么记账 一、前言 以下软件教程以 佳易王餐饮会员管理系统软件V16为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、会员可以登记电子会员卡或使用vip卡片 2、卡类型可以自由…

【LeetCode】无权图的最短路精选7题——单源、多源

目录 无权图的单源最短路问题&#xff1a; 1. 迷宫中离入口最近的出口&#xff08;中等&#xff09; 2. 最小基因变化&#xff08;中等&#xff09; 3. 单词接龙&#xff08;困难&#xff09; 4. 为高尔夫比赛砍树&#xff08;困难&#xff09; 无权图的多源最短路问题&a…

疾控中心污水采样过程中会遇到哪些困难

在疾控中心的污水采样过程中&#xff0c;可能会遇到多种困难。 首先&#xff0c;污水的成分可能非常复杂&#xff0c;包括各种细菌、病毒、寄生虫、重金属、化学物质等&#xff0c;这给采样带来了很大的挑战。其次&#xff0c;污水中的有害物质可能会对采样设备和人员造成损害…

预处理详解

目录 预定义符号介绍 ​编辑 预处理指令 #define #define 定义标识符 #define 定义宏 #define 替换规则 #define中#和##的使用 带副作用的宏参数 宏和函数的对比 命令行定义 预处理指令 #undef 预处理指令 #include 头文件被包含的方式&#xff1a; 本地文件包含 …

【Unity】【VR开发】Unity云同步功能使用心得

【背景】 有时出差,旅行等等也带着电脑,晚上想要继续编辑项目,就需要用到云同步功能。目前实践下来,发现有些内容可以同步,有些内容则是不可以同步的,总结如下。 【如何云同步一个本地项目】 UnityHub的项目面板中有两个选项卡:项目和云端项目。 鼠标挪动到想要云同步…