一、C#编程-GTS控制卡实现Z型路线

编程前需注意问题

更新驱动程序软件

编程前需确定,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轴
}

写在后面

想留下一些关于学习和成长的记忆,面对前途和感情,即使明知道自己选择的路不那么平坦,要面对许多不确定和不可能,但一直执着追求,没有偷懒,努力争取,会觉得日子并没有虚度。
——献给过去的时光。(于武汉)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值