当前位置:

首页 > 硬件相关 > C#玩转GTS四轴运动控制器(固高步进电机无编码器版)-实战教程

C#玩转GTS四轴运动控制器(固高步进电机无编码器版)-实战教程

由于电机不带编码器,无法进行home和当前位置信息读取!功能:三个轴的点位运动:前进+后退,并分别显示每个轴的移动脉冲数(可以换算为距离)!开发环境:VS2017硬件设备:固高科技三维移动平台在上一版本的基础上,增加了以下功能:记录每次运行的距离,即使关闭软件,也能记录当前距离原点的距离(原点首次需在机台上选定)。运行超出机台的最大距离后停止运动。代码语言:javascript代码运行次数:0usingSystem;usingSystem.Windows.Forms;usinggts;usin

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

功能:

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

开发环境:VS2017

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

在上一版本的基础上,增加了以下功能:

记录每次运行的距离,即使关闭软件,也能记录当前距离原点的距离(原点首次需在机台上选定)。运行超出机台的最大距离后停止运动。

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

代码语言:javascript

代码运行次数:0

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> 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 { }
    }
}

}

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

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
硬件相关 开发环境
相关文章 更多
显示器色温怎么调不刺眼?色温调多少看着最舒服
显示器色温怎么调不刺眼?色温调多少看着最舒服

详解显示器色温的舒适调节区间、刺眼的核心诱因,以及在不同使用场景与环境光下的具体调节步骤与校准方法。

显卡风扇不转怎么回事判断是否正常及解决方法
显卡风扇不转怎么回事判断是否正常及解决方法

发现显卡风扇不转先别慌,这很可能是正常的智能启停功能。本文详解如何区分待机静音与硬件故障,提供从软件检测到物理清理的完整解决思路。

笔记本加内存条后无法开机怎么办及解决方法
笔记本加内存条后无法开机怎么办及解决方法

笔记本加装新内存后遇到黑屏或无法开机?不要慌张,本文通过重新插拔、清洁金手指、单根测试等具体操作步骤,帮你快速判断是安装失误还是硬件不兼容,并给出相应解决办法。

电脑主机前置usb不能用怎么解决排查修复教程
电脑主机前置usb不能用怎么解决排查修复教程

针对电脑主机前置USB接口无法识别设备的问题,本文提供一套基于因果逻辑的排查流程。涵盖检查机箱内部USB针脚连接、验证BIOS中USB控制器状态、更新芯片组驱动以及排除供电不足等常见原因,帮助用户快速恢复接口功能。

无线鼠标充不进电解决办法及故障排查步骤
无线鼠标充不进电解决办法及故障排查步骤

遇到无线鼠标充不进电的问题,不要急于更换设备。本文详解从清理接口氧化层、更换数据线到检测电池电压的完整排查流程,帮助你判断是临时故障还是硬件损坏。

蓝牙游戏手柄连接教程吃鸡
蓝牙游戏手柄连接教程吃鸡

想知道如何用蓝牙手柄玩吃鸡游戏?本文详细讲解手机蓝牙手柄的连接步骤、主流映射软件的使用方法以及实战中的键位布局技巧,助你提升射击手感,同时解析外设玩家的匹配机制与注意事项。

游戏手柄蓝牙连接为何每次都要重连原因排查与解决方法
游戏手柄蓝牙连接为何每次都要重连原因排查与解决方法

本文深入分析游戏手柄蓝牙频繁断开且需重连的根本原因,涵盖电池电压检测、操作系统电源管理策略及驱动冲突。通过具体的系统设置调整和固件更新步骤,解决蓝牙握手失败问题,恢复手柄的稳定连接状态。

显示器画面模糊抖动怎么解决及排查方法教程
显示器画面模糊抖动怎么解决及排查方法教程

遇到显示器画面模糊或抖动时,可通过检查视频连接线、调整系统分辨率与刷新率、更新显卡驱动等步骤进行排查和修复。

小米智能门锁换电池后怎么开机
小米智能门锁换电池后怎么开机

小米智能门锁更换新电池后无法开机或屏幕不亮?本文详解电池极性检查、金属触点清洁及强制重启方法,帮你快速解决供电问题,让门锁恢复正常使用。

电视机声音怎么连接到外置音响
电视机声音怎么连接到外置音响

想让电视声音更震撼?本文详解如何通过HDMI ARC、光纤、蓝牙和3.5mm接口将电视连接至外置音响,包含具体设置步骤与常见问题排查,助你轻松打造家庭影院。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。