跳转至

运动程序

1.1 简介

本章主要介绍下载在控制器中运行的程序——运动程序。用户想要使用运动程序,需要了解相关的语法,以及下载步骤。本章将一一介绍。

1.2 指令列表

运动程序指令列表

指令 说明
GTN_Download 下载运动程序到运动控制器。
GTN_GetFunIdPro 读取运动程序中函数的标识。
GTN_GetVarIdPro 读取运动程序中变量的标识。
GTN_Bind 绑定线程、函数、数据页。
GTN_RunThread 启动线程。
GTN_StopThread 停止正在运行的线程。
GTN_PauseThread 暂停正在运行的线程。
GTN_GetThreadSts 读取线程的状态。
GTN_SetVarValueEx 设置运动程序中变量的值。
GTN_GetVarValueEx 读取运动程序中变量的值。

1.3 重点说明

为了表述方便,直接在PC机上调用动态链接库发送指令访问控制器的程序称为“应用程序”,下载到运动控制器上执行的程序称为“运动程序”。运动程序与应用程序的关系如图所示。

运动程序与应用程序的关系

运动程序的三个特点:独立性、实时性、并行性。

独立性:运动程序能够脱离主机在运动控制器上独立执行,主机能够将CPU资源分配给其它任务,从而将主机从繁琐的运动逻辑管理中解放出来。当然,如果需要,主机仍然可以在任何时候向控制器发送指令,即使运动控制器的运动程序正在执行。

重要

当主机指令和运动控制器上的运动程序控制相同的轴时,需仔细设计运动逻辑,以免造成混乱。

实时性:运动控制器上执行运动程序由于不需要通过总线和主机进行频繁的数据交换,因此具有更高的实时性。和在主机上执行的应用程序不同之处在于,运动程序对GT指令调用不必再通过PC总线,因此具有更高的执行效率。平均执行速度约为100指令/毫秒,是PC机执行API指令速度的5倍。

并行性:支持多任务,允许多达32个运动程序在运动控制器上同时执行。

提示

在多线程环境下,一个线程中连续的2条指令在执行时有可能被插入其它线程的指令。当启动多个线程并行执行时,应当仔细考虑线程之间是否会相互影响。

1.4 运动程序的使用

1.4.1 编写运动程序

运动程序可以使用C语言编写,但是一些编写规则和C语言略有不同。用户编写运动程序时应遵照“19.3.8语言元素”、“19.3.9运算指令”中的说明,否则有可能编译不通过。

运动程序可以和应用程序一样调用GT指令。用户可查阅1.5章节知道哪些指令可以在运动程序中调用。

提示

运动程序中,调用GT指令必须完整描述函数的每一个参数。 例如:short GT_GetClock(unsigned long pClock, unsigned long pLoop=NULL)。 在应用程序中调用,可以写成如下形式,使用VC可以编译通过: long lClock; GT_GetClock(&lClock); 在运动程序中调用,必须写成如下形式,否则编译不通过: long lClock, lLoop; GT_GetClock (&lClock, &lLoop);

1.4.2 MotionStudio编译、调试运动程序

为了让运动控制器能够执行用户用C语言编写的运动程序,必须对运动程序进行编译。使用MotionStudio编译运动程序,生成目标程序文件(*.bin)和符号文件(*.ini)。目标文件用来下载到运动控制器,符号文件用来保存运动程序编译信息。应用程序必须使用这2个文件才能正确下载和启动运动程序,访问运动程序的变量。

关于如何使用MotionStudio编译运动程序,具体操作如下:

1. 启动MotionStudio.exe,选择菜单栏的“项目”→“新建工程”,在弹出的窗口选择新建C语言运动程序工程,命名为“test”,如图所示:

MotionStudio新建运动程序工程

2. 工程新建成功后,会打开工程的代码编辑区的界面,如图所示,可以在右侧导航栏看到工程项目和包含的.c文件。

代码编辑界面

3. 在代码编辑区加上代码,如图所示。保存、编译、下载到控制器、运行运动程序等操作请参考MotionStudio的操作说明书,详见右侧按钮。

代码编辑
提示

如果编译不成功,则无法进行下一步操作。用户应按照编译器的提示仔细检查错误原因。

1.4.3 下载

编译成功后,用户需要在应用程序中调用GTN_Download指令将目标文件(*.bin)下载到运动控制器的内存中。用户应保证目标文件和符号文件与应用程序在同一目录下。

当下载新的运动程序时会覆盖原有的运动程序。运动控制器每次上电以后需要重新下载运动程序。

1.4.4 绑定线程、函数和数据页

运动程序下载到运动控制器后,还不能立即执行。运动控制器会自动为运动程序中的每个函数、全局变量和局部变量定义好ID,调用GTN_GetFunId读取函数ID,调用GTN_GetFunId读取变量ID。

为了执行运动程序,必须调用GTN_Bind指令绑定线程、函数和数据页。

运动控制器支持32个线程同时运行,一个线程只能分配一个函数,但是一个函数可以分配给多个线程同时执行,例如多轴回零时,可以让多个线程绑定同一个回零函数,然后同时启动这些线程就可以实现多轴同时回零。在线程执行过程中不允许绑定新的函数,除非线程执行完毕。

各函数的局部变量放在相互独立的数据页中。运动控制器提供32个数据页。在绑定线程和函数时,必须指明所使用的数据页。一个数据页只能分配给一个线程,但是一个线程可以使用多个数据页。线程在执行过程中可以切换数据页。其关系示意如图所示。

线程、函数和数据页的关系

1.4.5 启动,停止,暂停线程

将线程、函数和数据页绑定好后,调用指令就可以启动某一个线程。调用 GTN_StopThread停止某个正在运行的线程,调用GTN_PauseThread暂停线程。

1.4.6 查询线程状态

应用程序可以随时调用GTN_GetThreadSts指令查询线程的执行状态。包括该线程是否正在运行,线程绑定的函数的返回值,当前正在执行的指令所在行数,当前正在执行的指令的返回值。

应用程序可以随时调用GTN_SetVarValue指令更新运动程序中所有变量的值。

应用程序可以随时调用GTN_SetVarValue指令查询运动程序中所有变量的值。

1.4.7 例程

运动程序单线程累加求和示例

运动程序完成累加求和任务。定义了全局变量sum用于保存累加和,局部变量begin用于保存累加起点,局部变量end用于保存累加终点。累加完成以后程序结束。
该运动程序的编译步骤请参考使用"MotionStudio编译运动程序"
想要将编译后的运动程序下载到控制器中,需在应用程序中调用GTN_Download指令,应用程序负责下载、初始化、启动运动程序。

// ------------------------------------------------
// 累加求和
// begin 累加起点
// end   累加终点
// ------------------------------------------------
    int sum;
    int add(int begin, int end)
    {
    int i;
    int cc;

    for(i = begin; i <= end; i++)
    {
        sum = sum + i;
    }

    return sum;
    }
例程请参考。

运动程序多线程累加求和示例

运动程序代码和上面“单线程累加求和”示例相同。
想要将编译后的运动程序下载到控制器中,需在应用程序中调用GTN_Download指令,应用程序负责下载、初始化、启动运动程序。与“单线程累加求和”不同之处在于启动2个线程完成累加运算任务。
例程请参考。

1.4.8 语言元素

数据类型支持整型和浮点型2种数据类型。

1. 整型32位,取值范围是-2, 147, 483, 648 ~ 2, 147, 483, 647。

2. 浮点型采用定点格式,32位整数,16位小数。所能表示的最小精度为(1/2)16=0.0000152587890625。

1. 常量

可以在程序中直接使用立即数和宏。立即数可以是10进制整数、16进制整数和浮点数。

2. 变量

可以声明局部变量和全局变量。每个函数最多可声明1024个局部变量、1024个全局变量。整型类型说明符为int,浮点型类型说明符为double。

3. 数组

支持一维数组,支持常量下标索引和变量下标索引。

不支持多维数组,不支持用数组元素进行下标索引。

4. 函数

函数可以定义返回值类型和输入形参类型。

不支持在函数中调用自定义函数,但是可以调用GT运动控制指令。

5. 数据类型转换

支持强制数据类型转换。强制数据类型转换符有int、double。

(1) 数据类型转换符必须加括号,如a=(int)b;

(2) 数据类型转换不会改变变量本身的数据类型定义。

1.4.8 运算指令

支持算术运算、逻辑运算、关系运算、位运算,语法规则和C语言相同,但是不支持复杂表达式,只能使用2个操作数进行运算,而且这2个操作数的数据类型必须相同。

提示

由于运动程序中的浮点数据类型只有16位小数精度,请不要在运动程序中进行高精度浮点运算。

1. 算术运算

用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)共五种。

2. 逻辑运算

逻辑运算包括与(&&)、或(||)、非(!)三种。参数可以是整型变量、或者整型常数。

3. 关系运算

关系运算符用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。参与比较的参数类型必须一致。

4. 位运算

参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。

5. 流程控制

支持条件跳转、条件返回,语法规则和C语言相同。

(1) 条件跳转如下所示:

if(var) goto label

当条件变量var非0时,跳转到标记为label的指令。

不支持表达式作为判断条件。

(2) 条件返回如下所示:

if(var) return value

当条件变量var非0时,程序返回,返回值为value。

不支持表达式作为判断条件。

支持标准的if语句、while语句、for语句等。

提示

编写运动程序时:
1. 对于GT指令,其指令的参数个数必须写全。
2. GT指令中的参数宏定义,在运动程序当中不支持,需要重新定义。

1.5 可在运动程序中使用的指令

可在运动程序中使用的指令

GT_AlarmOff GT_GetExtIoValue GT_SetDataPage GT_AlarmOn
GT_GetGearMaster GT_SetDiReverseCount GT_AxisOn GT_GetGearRatio
GT_SetDo GT_CrdSpace GTN_GetJogPrm GT_SetDoBit
GT_CrdStart GT_GetMtrBias GT_SetExtIoBit GT_CrdStatus
GT_GetMtrLmt GT_SetExtIoValue GT_CtrlMode GT_GetPid
GT_SetGearMaster GT_Delay GT_GetPos GT_SetGearRatio
GT_DelayHighPrecision GT_GetPosErr GT_SetJogPrm GT_EncOff
GT_GetPrfMode GT_SetMtrBias GT_EncOn GT_GetPrfVel
GT_SetMtrLmt GT_EncScale GT_GetSoftLimit GT_SetOverride
GT_GearStart GT_GetStopDec GT_SetPid GT_GetAxisBand
GT_GetSts GT_SetPos GT_GetAxisEncPos GT_GetTrapPrm
GT_SetPosErr GT_GetAxisPrfVel GT_GetTriggerStatus GT_SetStopDec
GT_GetCaptureOffset GT_GetVel GT_SetTrapPrm GT_GetClock
GT_LinkCaptureOffset GT_SetTrigger GT_GetControlFilter GT_LmtSns
GT_SetVel GT_GetCrdVel GT_LmtsOff GT_StepDir
GT_GetDac GT_LmtsOn GT_StepPulse GT_GetDacValue
GT_PrfGear GT_Stop GT_GetDi GT_PrfJog
GT_SynchAxisPos GT_GetDiReverseCount GT_PrfTrap GT_Update
GT_GetDo GT_ProfileScale GT_ZeroPos GT_GetEncPos
GT_SetControlFilter GT_GetAxisEncAcc GT_GetExtIoBit GT_SetDac
提示
  1. 在编写运动程序过程中必须使用GT指令,GT指令请参照对应的GTN指令说明(GTN指令比GT指令多一个core参数)或者请参考《GTS运动控制器-基本功能》,下载网址为http://www.googoltech.com.cn/pro_view-3.html
  2. 如果想直接使用GTN指令,请参考LUA脚本