编程前需注意问题
更新驱动程序软件
编程前需确定,PCI设备完成更新驱动程序软件,否则无法正常运行程序,显示问题为“打开办卡失败,可能原因:1.板卡没有插好;2.有其他的程序正在对板卡操作。”
框架问题
如果使用.net,则net6.0-windows为最终文件,也就是说dll文件此时应放在net6.0-windows中,若使用framwork,则找debug。本文以framwork为例。

硬件背景
采用了固高GTS400控制卡,控制x,y轴运动,在运动方面,x与y轴均为2000脉冲运动1mm。
程序编写
整体编写
本段程序将完成工作台的z字型移动。主要采用了点位运动,运动轨迹如图所示。
图中黄色轨迹为返回起始点路径。


参数设置界面如图,


代码如下
int dist1, dist2;
int interval1;
int lPrfMode; // 运动模式
short sRtn; // 指令返回值变量
int lAxisStatus; // 轴状态
bool bFlagMotion = false; // 规划器运动标志
trap.acc = Convert.ToDouble(this.textBox_Taa1.Text) * 2;
trap.dec = Convert.ToDouble(this.textBox_Tda1.Text) * 2;
trap.smoothTime = Convert.ToInt16(this.textBox_time.Text);
trap.velStart = 0;
nSpeed = Convert.ToInt32(Convert.ToDouble(textBox_nspeed1.Text)) * 2;//初速度
mSpeed = Convert.ToInt32(Convert.ToDouble(textBox_mspeed1.Text)) * 2;//运行速度
dist1 = Convert.ToInt32(double.Parse(X_range1.Text)) * 2000;
dist2 = Convert.ToInt32(double.Parse(Y_range1.Text)) * 2000;
interval1 = Convert.ToInt32(double.Parse(Y_interval1.Text) * 2000);
gts.mc.GT_SetTrapPrm(2, ref trap);//设置点位运动参数
gts.mc.GT_SetVel(2, mSpeed);//设置目标速度
gts.mc.GT_SetTrapPrm(1, ref trap);//设置点位运动参数
gts.mc.GT_SetVel(1, mSpeed);//设置目标速度
for (int i = 0; i <= (Math.Abs(dist2) / interval1); i++)
{
gts.mc.GT_SetPos(2, Convert.ToInt32(Math.Pow(-1, i)) * dist1 / 2 + dist1 / 2);//设置目标位置
gts.mc.GT_Update(1 << (2 - 1));//更新轴运动
gts.mc.GT_GetSts(2, out lAxisStatus, 1, out clk);
while ((lAxisStatus & 0x400) != 0)
{
gts.mc.GT_GetSts(2, out lAxisStatus, 1, out clk);
Thread.Sleep(Math.Abs(10));
}
if (emergencyStopflag)
break;
else
gts.mc.GT_Update(1, 0);
if (i + 1 > (Math.Abs(dist2) / interval1))
{
if (Convert.ToInt32(Math.Pow(-1, i)) == -1)
gts.mc.GT_SetPos(1, 0);//设置目标位置
gts.mc.GT_Update(1 << (1 - 1));//更新轴运动
}
else
{
gts.mc.GT_SetPos(2, 0);//设置目标位置
gts.mc.GT_Update(1 << (2 - 1));//更新轴运动
gts.mc.GT_SetPos(1, 0);//设置目标位置
gts.mc.GT_Update(1 << (1 - 1));//更新轴运动
}
break;
}
gts.mc.GT_SetPos(1, interval1 * (i + 1));//设置目标位置
gts.mc.GT_Update(1 << (1 - 1));//更新轴运动
gts.mc.GT_GetSts(1, out lAxisStatus, 1, out clk);
while ((lAxisStatus & 0x400) != 0)
{
gts.mc.GT_GetSts(1, out lAxisStatus, 1, out clk);
Thread.Sleep(Math.Abs(10));
}
if (emergencyStopflag)
break;
else
gts.mc.GT_Update(1, 0);
}
运行逻辑的解释
在循环中,首先进行x轴的运动,x轴运动到规定位置,y轴走一个间隔,当y轴完成整个区域的运动,控制设备,返回到初始原点。
点位与插补的解释
对代码进行逻辑上的解释,有一些事项需要注意。点位运动的坐标为绝对坐标。设置x,y的运动范围为4X4,间隔为1时,当完成一次轨迹行动之后,返回原点用插补运动,此时代码如下,2轴控制x运动,1轴控制y运动,此时并没有对轴的状态监测,所以实际运动为一个插补运动。
gts.mc.GT_SetPos(2, 0);//设置目标位置
gts.mc.GT_Update(1 << (2 - 1));//更新轴运动
gts.mc.GT_SetPos(1, 0);//设置目标位置
gts.mc.GT_Update(1 << (1 - 1));//更新轴运动
若更改代码如下,对轴的状态进行监测,则此代码控制平台回到原点经过的路线为∟路线,等x轴完成运动,y轴开始运动。
gts.mc.GT_SetPos(2, 0);//设置目标位置
gts.mc.GT_Update(1 << (2 - 1));//更新轴运动
while ((lAxisStatus & 0x400) != 0)
{
gts.mc.GT_GetSts(2, out lAxisStatus, 1, out clk);
Thread.Sleep(Math.Abs(10));
}
gts.mc.GT_SetPos(1, 0);//设置目标位置
gts.mc.GT_Update(1 << (1 - 1));//更新轴运动
关于急停(安全操作)
此处涉及到循环,在进行急停安全编程时,需跳出循环,否则急停操作无法实现。

设置全局变量emergencyStopflag = false,按下急停,进行停止指令,跳出轨迹循环。
急停代码如下:
private volatile bool emergencyStopflag = false;
private void button6_Click(object sender, EventArgs e)
{
emergencyStopflag = true;
for (int i = 1; i <= 4; ++i)
gts.mc.GT_Stop(1 << (i - 1), 0);//停止运动1~4轴
}
写在后面
想留下一些关于学习和成长的记忆,面对前途和感情,即使明知道自己选择的路不那么平坦,要面对许多不确定和不可能,但一直执着追求,没有偷懒,努力争取,会觉得日子并没有虚度。
——献给过去的时光。(于武汉)
580

被折叠的 条评论
为什么被折叠?



