C# GTS四轴运动控制器实例(固高科技步进电机不带编码器) -V1
时间:2022-07-23
本文章向大家介绍C# GTS四轴运动控制器实例(固高科技步进电机不带编码器) -V1,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
注:由于电机不带编码器,无法做home和当前位置信息读取!
功能:
三个轴的点位运动:前进+后退,并分别显示每个轴的移动脉冲数(可以换算为距离)!
开发环境:VS2017
硬件设备:固高科技三维移动平台
在上一版上添加了如下功能:
- 记录每次运行的距离,即使关闭软件,也能记录当前距离原点的距离(原点首次得在机台选定)
- 运行超出机台的最大距离后停止运动.
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 { }
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- .Net Core + EF + mysql 从数据库生成实体
- Git 常用命令
- Nodejs 一些细节 (持续更新)
- Jenkins 凭据使用
- React源码解读【一】API复习与基础
- choco 安装 和 mkcert 本地https
- js 函数柯里化(Currying)
- GPS数据Python解析及地图可视化
- 文稿:Ant Design从无到有,带你体悟大厂前端开发范式
- 在React中实现和Vue一样舒适的keep-alive
- uniapp获取接口数据,渲染在picker选择器里面
- 我们是这样一步一步实现分布式锁的
- 缓存并发神技,如何通过双 key 来解决缓存并发问题?
- LRU缓存淘汰算法实现方案,这次没人再说你不会开发
- JVM技术总结之三——类加载机制