gd语言中文说明_第1页
gd语言中文说明_第2页
gd语言中文说明_第3页
gd语言中文说明_第4页
gd语言中文说明_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、GD语言中文说明目 录一. 引言二. 概述三. 语言结构31 语法元素3.1.1被接受字符的设定3.1.2 标识符3.1.3 保留字d 隔离符e 数字常数f 字符串g 注释(2) 数据结构a.GDL 目标A)目标类型B)说明参数目录C)状态变量关键字D)运算符(操作码)E)激励关键字b 目标间的层次关系A)数据类型和访问类型(3)过程a.激励条件b.可执行指令(4)GDL 应用程序结构四. 语言句法(1) GDL 文件(2) GDL 模块(3) 目标说明a 说明一个局部目标A)数组型目标B)定义文一子关系b 说明一个外部目标(4)过程a 激励器目录b 表达式A)代数表达式B)关系C)布尔表达式

2、C 可执行指令:赋值与操作符调用A)赋值B)目标操作符调用d 可执行指令:控制处理流程A)“IF”指令B)“WHILE”指令C)“RETURN”指令五、一个简单的程序例一、 引言由于包装机不断加快,包装机日趋复杂化以及对于内设本机生产数据处理的机床需求量日益增加,基于使用大功率控制器微处理设备的设计就必不可少了。然而,CPU 的特点是,控制器软件是用特殊且适应微处理器的语言书写的,就其本性而言,该语言是复杂的,要求专业人员来使用。用户在车间实际安装的是功率强大的尖端系统,具有高性能,但是,在执行维修操作或者修改机床配置时,该系统又是很复杂的。况且机床用户还日益面临着更加复杂的市场需求,这种需求

3、产生了生产适应性问题,面临着生产批量的不断减少及机床型号繁多的数量和种类,这种形式就更加迫切需要有一种控制系统,可以让本厂人员能进行简便的再配置,而不必依靠制造商的专业操作人员来操作。为满足这一需求,对自动包装机械已开发出一种新的控制系统,即使在使用极大功率CPU 时,也可以通过一种专门的程序语言与用户接口,这就是GD(GD Language)语言。实际上,GD 语言(GDL),结构化语句(structured text)描述程序设计语言,是一种高级结构程序语言,它是模块化的、能以一种简单而又快捷的方式对所有组成被控制系统的实际逻辑设备进行描述,然后,执行控制算法、过程可以在这些设备上运行。二

4、、 概述GDL 允许对数据结构(称为GDL 目标)定义,它们代表在机床上须受控制的实际部分或逻辑部分,GDL 还可以对控制算法(称为GDL 过程)的定义,它们为使系统在控制状态下作出所需要的行为而建立的目标应执行的动作。这样,以说明目标和过程的说明指令以及目标本身的操作指令都定义为构成过程本身的可执行指令。一个GDL 应用程序表示一套用来控制机床的所有目标和过程,在广义上来说是由一定的模块组成。每一个模块内含有一定的目标所需要的说明,而对于过程,则可有可无。在一个模块中定义的目标通常可以与在其他模块中的目标有逻辑联系。例如:其中一个目标的特性可以根据另一个目标的特性进行独特的定义,或者一个过程

5、的可执行指令可以参考在别处说明的目标。对于软件本身的发展速度和维修方面说来,发展使用复合、分离模块的应用程序的可能性是主要优点之一,但是有一个有限。在应用程序参考表示机床实际部分的条件下,识别存在目标的名称必须在整个应用程序中是唯一的,相应地,用户应当为过程的名称和模块的名称使用唯一的标识符(名称)。三、 语言结构在这一章里,总体上对描写GDL 的元素作分析,即是基本概念,但不作详细说明。首先,分析GDL 语法元素,然后是数据结构及意义,接着是GDL 过程的概念与执行方法,最后是浏览应用程序软件包的总体结构。在第四章里,详细说明写一个程序所使用的语句。3.1 语法元素在这一节里,要说明GDL

6、编译程序所接受的字符设定及语言元素的语法类型(单词),这些元素包括:标识符、保留字、隔离符、数字常量、字符串。属于这其中一类的序列单词组成GDL 指令。表示指令结束并属于隔离符类的单词是“;”。3.1.1 被接受字符的设定可以使用的字符是下列ASCII 码AZa.z09特殊的字符是 & = + - / ( ) , ; < > $ _字符设定包括空格(SP),回车(CR),换行(CF),横向制表符(HT)。如果在一个字符串中(即包括在二个单括号内的一组字符)插入一个横向制表符,这个制表符将转换成一个空格。要得到所需要的空格,应当插入所需要的空格数,而不是制表键。如果在源程序中

7、所包含的字符有一个不属于被接受的字符,那么一个语法出错信息便会显示。在字符串及注解中,可以有不属于被接受的字符存在。3.1.2 标识符标识符是定义模块名、过程名及GDL 目标名的单词。标识符的长度可达40 个字符长度,第一个字符必须是字母或一个划线字符首字符后面的字符可以是字母、数字和划线符。所有的标识符必须与保留字不同,参见所附的保留字目录。3.1.3 保留字保留字是编译程序为识别指令的语法而为其本身保留的单词,每一个保留字都不能与任何一个标识符相同,而且不能使用缩写形式。参见附录中的保留字。3.1.4 隔离符几乎所有的特殊字符均为隔离符,它们分为二类:单隔离符 = + - * / ( )

8、, ; < > | 双隔离符 <> <= >=在写双隔离符时,他们之间或他们与其他控制符之间不留空格,如:一个回车(CR),否则这个双隔离符将被解释成两个单隔离符。3.1.5 数字常量数字常量是一列数字字符,最长可达九个字符(最大允许值为999999999),在执行过程中,他们的值不变。当“减号”属于隔离符类时,放在常量前面的一个最终“一目减号”(一)不是该常量的组成部分。GDL 不接受实数型常量,只接受整数,即十进位小数点不能使用。3.1.6 字符串字符串是括在一个单引号()内的可打印ASCII 码序列,因此()字符不是字符串一部分,注意不要把单引号()字

9、符与重音符号()混淆,字符串的长度允许达40 个字符。若在一个字符内含有一个注解,这个注解就成为该字符串的一部分。字符串还可以含有一个横向制表字符(HT)。但是,该字符将转换为串内的一个空格。因此,即使在模块目录中呈现一个带有四个空格的字符串,但是程序运行中,控制系统会读已被转换的字符串,由此生成的正文显示出只带一个空格。为避免这种情况的发生,只要不在字符串使用制表字符就可以了,以和实际需要相符的空格数来代替制表字符。要把一个字符串拆为二行,击<ENTER>键,移至下一行,然后继续该串的后一部分,在这新的一行里,要重复单个的起始引号(),并用单引号()结束该字符串。若要把字符串拆成

10、二行,单个结束引号()只能在该串结尾处使用。字符串的显示是不留空格的。但可以在续行引号()左面插入空格,(如,产生一个缩进的第二行部分)其他非空格字符则不能插入。几个正确的例子:string splitonto two linesstring splitonto threelines3.1.7 注解注解的开始和结束都用特殊字符,注解可以含有无数个ASCII 码,包括CR,LF及HT 控制字符。在一个注解中不能插入另一个注解。但可以插入一个字符串(该字符串就成为注解的一部分)。编译程序对所有组成注解的字符不予理睬。注解可以在原程序的任何点出现,甚至在构成一个指令的两个单词之间也可以插入。注解还能

11、用来分隔二个其他符号,就好象是一串空格。3.2 数据结构如前所述,GDL 提供特有的数据结构。其中一些结构使得对受控机器的配置(GDL目标)变得简单有效,而其他结构则是用来控制和检测的实际装置(GDL 过程)。这一节对GDL 目标基础的基本概念作一说明,各特征的详细列表在具体细则中介绍。3.3 节描述GDL 过程。3.2.1 GDL 目标程序员能够处理的GDL 目标是对机床的实际部分或者不是实际硬件装置但表示软件结构部分的描述。按照需要,使用说明指令,在特定情况的基础上定义特性。借助于组成GDL 过程体的执行指令可对状态进行修正。GDL 目标描述一个机器实际器件的例子是STEPPER$MOTE

12、R(步进电机),GDL 目标描述一个软件装置的例子是SYNOPTIC(概要)。目标既可以是向量,也可以是数组。一个数组目录代表一组称为数组元素的向量目标。每一个数组元素有它自己的下标。下标括在大括弧内,它须设定为正整数值,即数组中第一个元素的下标是1 而不是0。可以说明一个数组目标,但不能说明它的单个的元素。所以在写说明时,决不要指明下标。反之,在可执行指令中,根据对下标的需要与否,可以参考全局数组及单一个别的目标。目标类型有两大类:第一类是我们已经描述过的,即一组硬件或软件目标类型,它们描述受控系统或允许写控制过程(标准目标)。第二大类(用户目标)含有专用软件目标类型,它们不直接控制机器,而

13、是定义在GDL程序中有意义的变量及用于写程序的变量。这类用户目标类型有:DIGITAL$VARIABLEINTEGER$CONSTANTINTEGER$VARIABLE一个INTEGER$VARIABLE 类型目标是一个程序变量,用以存入一个完整的整型值。与之相仿,一个DIGITAL$VARIABLE 类型目标可以含有一个数字值,而一个INTEGER$CONSTANT 类型目标含有一个在说明阶段被赋于的整型值,该值在程序执行过程中不能改变。标准目标与用户目标之间的区别仅仅是语义上的不同。假定编译程序对这二大类不作正式的区分,而且程序员只见到一组数据结构,那么我们从现在起只讲GDL 目标,不再区

14、分这二大类。GDL 目标不是一组目标,而是一组目标类型,程序员可以定义任意量的目标,即属于其中一种允许类型的单个目标,要用不同的名称去标识各单个目标。每个名必须是唯一的,就是说,再回到前面的例子,STEPPER$MOTOR 和SYNOPTIC 是二类目标,它们可以用来定义,如main_motor和carriage_advance_motor为属于第一类的二个目标。现在让我们来分析描述一个通用类型目标的元素。在为此类目标作说明时,就获得到达它所有元素的通道路,这样便可以与该目标本身相互配合。3.2.1.1 目标类型目标类型是这一范畴的具体特征,它用GDL 语言的一个保留字来表示。几个例子如:ST

15、EPPER$MOTOR, DIGITAL$INPUT,MACHINE.3.2.1.2 说明参数目录属于某一类的所有元素由一列标识特征的参数作完整的描述。这些值可以是数字常量,字符串,关键字或标识符,按需而定,一般来说,目标有所需要的特征。要考虑到每类目标赋值的一个极限。在某些情况下,同一目标的参数间存在着逻辑关系。如:对于STP$MOTOR$AXIS 来说,LOWER TRAVEL LIMIT (运行下限)参数必须小于或等于UPPER TRAVEL LIMIT (运行上限),否则会触发一个错误信息。字符串类型参数是双份的,以允许字符串以二种不同语言显示。通过专用指令由控制台执行对语言的选择。3

16、.2.1.3 状态变量关键字这些是关键字(状态变量关键字),当它们与标识属于此类范畴的一个目标名有关时,便为目标生成一个状态变量。如: CONSTANT$STATUS 是一个状态变量关键字 CONSTANT$STATUS OFmain_motor 组合是目标main_motor的状态变量。整组状态变量描述了某一时刻一个目标的特定状态,并由操作系统运行时间支持(RTS)控制器作不断的修正,以响应机器上发生的事件。这就是说,目标的状态是在不断更新的,它所表示的是系统真实的状态。而GDL 程序员双能介入每一个单一的变量,根据目标本身的控制要求对变量作出修改,即,当一个特定事件发生时,GDL 程序员可

17、以改变状态并执行所需的控制功能。如:对CONSTANT$STATUS OF main_motor赋值,结果是电动机操作条件的修正,这表示,电动机可以被启动来接收能量,也可以被切断电源。GDL 接受5 种不同的数据(V、3、2、2、1)每个状态变量只能取它的类型所许可的值,对于许可类型值的某一子集可能有进一步极限。在整数值是,这一极限可以是静态的,也是可以是动态的。在前一种情况中,极限对该目标类型是典型的。因此,这些极限在手册是标明相同类型的所有目标都有相同的极限(例如:对PWM$OUTPUT ,变量VALUE 表达一个值每一千)。所以赋值不能大于1000 或小于0),而在后一种情况中,赋于说明

18、参数的值为目标自身获得了极限。所以它们对于同一类型的目标可能是不同的(如:一个数组的长度限制了它的下标的最大可赋值)。若超出了这些极限,就会显示出错信息。对每个状态变量来说还有一个规定的访问类型READ (r) 如果只允许读变量WRITE (w) 如果只允许写变量READWRITE (rw) 如果允许读、写变量GDL 调试工具可以强制某些目标的状态变量为所要求达到的值。访问代码加上字母f(如:rwf)表示这种可能性。3.2.1.4 操作符对某些目标类型还有一些特殊命令,用一个指令代替一系列语句来执行复杂的状态修正操作,这些命令是宏指令。这些操作符表示为RTS(运行时间支持)服务程序的调用,最终

19、传送定义要执行动作所需的参数。这后者的使用是一般可能性之外的,借助于对状态变量的赋值来改变目标状态。每个操作符由一专用关键字,由它使用的目标各级最终参数目录来定义。3.2.1.5 激励关键字与状态变量关键字相似,每一个目标类型有其他有关的关键字。当这些有关关键字的后面跟着一个标识符时,便产生另一类变量,叫做目标“激励器”。只有当一个目标的一个激励器状态被修正,才能采取相应的动作以符合控制算法的要求,以此激励一个或者更多的GDL 过程。所以目标激励器是释放过程执行的装置。但是必须注意到仅仅一个激励器的变化对于释放一个过程的执行是不够的,事实上,要释放的那个过程应与一个专门激励器有关。从相反的观点

20、来看,每个GDL 过程在某方面必须与所有那些我们希望作为触发器使用的激励器相连。这种连接是由专用激励器的一个目录产生的,然后在写过程中,该目录与这个过程有关。受控系统中发生一个事件后,RTS(运行期支援)系统收到一个与那个目标有逻辑联系的中断,一个激励器状态被RTS 系统修正,在这种情况下,含有该激励器的全部过程都被执行,因而提供了中断所需的服务。例如, STATUS 是一个激励器关键字,STATUS OF digital_input_1 是digital_input_1的一个激励器。当这个输入状态改变时,所有在目录中含有这个激励器的过程都被执行。还有一种特殊类型激励器,它与任何一个具体目标都

21、无关:全局激励器。当一个过程的目录中包括全局激励器时,它们触发目录本身的扩展,以获得在该模块中说明的所有目标的激励器的某一子集。外部目标(用use 语句说明)不包含在生成的目录内。在这种情况下,应当避免用延伸形式写长目录。如,全局激励器ANY$DIAGN$STATUS 生成一个目录,该目录中含有与所有局部说明目标的诊断状态有关的全部激励器。3.2.2 目标间的层次关系如果二个目标间存在父子型关系,那么这两个目标有着上下层关系。这种关系是一种纽带,可以是逻辑的,也可以是逻辑与物理的。这种关系很显然是由一个事实构成的,那就是子目标在它的定义参数中有其父目标名。一般来说,一个目标可以拥有一个以上不同

22、类型的父目标,就象是一个目标可以拥有各种不同的子目标一样。层次联系代表了目标间的物理的或逻辑的连接。这就是说,在二个目标之间有一个信息流。例如:若一块主板与一块从板相连,这二块板被说明为父与子。因此,子目标有必要定义它打算占用父板上哪个连接通道。这个定义是通过为一个描述了所选通道的子目标作参数说明,用一适当关键字来执行的。编译程序执行各种层次检查以免重迭或其他错误的发生。还有一种情况:两个目标有层次关系,但无物理连接。例如:SYNOPTIC 。这样一个目标,拥有由图形目标构成的子目标(如:圆、线等等),但无信号流,因为在它们之间有一种专门的逻辑关系。在这里,无任何参数传到父目标。还有一种特殊情

23、况,说明参数含有一个目标名(无任何连接参数),但该名不是直接逐层连接的,就是说它不是一个“父”。这就是SPT$MOTOR$AXI$HOME$INUT 的情况,对这种情形,参数STPMOTOR NAME 是一个目标,在这个目标中,说明必须指出在STEPPERMOTOR BOARD NAME 参数中出现的带有同名的父目标。这个规则是常常为特殊情况而定的,无视这个规则,就会触发错误信息。对某些目标还存在定义参数,定义目标本身的物理配置。对于利用连接通道到达子目标的那些目标为如此。所有这些参数描述支援连接的物理设备的存在与否。因此可以任意配置父目标。如果说明一个设备不存在,其子目标便不能与它相连,也就

24、是不能使用那些通道。若一个设备为一特定类型的子目标而保留,同样,它也不能与其他类的目标连接。3.2.2.1 数据类型及访问类型如前所述如前所述,GDL 接受的数据基本类型有五种:整数数字设定值名称字符串拥有它们自己类型的语言元素有: 一个目标的说明参数 状态变量 有关一个操作符的参数因此,在对一个元素赋值时,须遵循所涉及的规定类型的法则。一个整型元素只能设定整数值,正负都可以,其绝对值范围0999999999。在特殊情况下,对于可接受的值有更严格的限度。这些限度源于该元素的性质。在任何情况下,这种进一步的限度是一个事件一事件的基础上为每一目标指明的。一个数字型目标由专门的关键字来假设二个值ON

25、 与OFF。这些元素作为<digitalconstant kwd>(数字常数关键字)一个设定值型元素由专门关键字设定一组值,这些关键字在赋值时描述元素的状态。如:状态变量CONSTANT$STATUS OF main_motor可以假设值ENABLED 和DISABLED,这些值称为<set constant kwd>(数字常数关键字)总的说来,另一个设定型元素假设值要用其他关键字来表示,这就是说,一个设定要配有一组不合法的设定常数关键字,不可以用不属于它的组的<设定>常数来对一个<设定>变量赋值。如果对一个<设定>变量赋值,而不是对

26、<设定>常数赋值,要考虑二个权限。第一,左右二边赋值变量须相同(不能把由PIAGN$STATUS 假设的值赋于CONTROL$STATUS)。第二,由右边变量所赋的所有值须对左边所赋变量有效。否则,显示出错信息。一个名 型元素,假设一个GDL 目标的标识符作为它的值,这个目标必须属于元素允许的目标类型的子集,它是在特定情况基础上规定的。一个“字符串”型元素,假设一个字符串作为它的值(一个字符串定义为括在单引号内的ASCII 码序列)。对于状态变量,规定了访问的允许类型。READ (r) 该变量是只读,即,它只能在一个表达式内出现。WRITE(w)该变量是只写,即,它在赋值指令中只能

27、是在左边部分。READWRITE(rw) 该变量可读可写加在访问类型代码后的字母f(如rwf)表示该状态变量可以由GDL 调试程序强制。3.3 过程一个GDL 模块是由任意量的过程组成的,通过过程可以对目标状态作修正。一个名标识一个过程。这个名必须对整个应用程序是唯一的(即没有任何一个其他的过程、目标或模块具有这个相同的名)过程由二个逻辑块构成:激励器目录及含有可执行指令的体。3.3.1 激励器条件在收到受控机器的一个服务要求时,由控制系统作出响应执行一个过程。换句话说,当机器上发生某个事件时,RTS 运行期支持系统探测到这个事件(收到该中断)并触发过程的执行,过程的执行完成一些动作使机器处于

28、正常状况。事件中涉及的目标与应执行的过程之间的联系是由激励器目录来完成的。一个事件发生时,它引起一个或几个目标的一个或几个激励器的变化。因此在激励目录中含有那些激励器的过程便被执行。一个目录可以包含无数个激励器,但是,要触发一个过程,只要有一个就可以足以作这个改变。而且,如果中断总是单个地生成,那么激励器也是一次改变一个。因此可以说,在任何一个特定的瞬间,只有一个目录是活动的。如果在过程执行中,属于这同一目录的另一个激励器必须有一个变化,则由RTS 系统对这新的执行要求排队,一旦第一个执行完成后,便再次激励同一过程。如果一个以上的过程含有相同的激励器,这些激励器的激励优先级已经规定,在作模块连

29、接时由系统设定。换句话说,可以作为过程执行的顺序并不是过程写入模块的顺序。如果想以预设置的顺序同步执行二个过程,则必须定义适当类型的另一个目标(如DIGITAL$FLAG)。在这种方式中,一个状态变量与一个激励器有同名。然后在修正目标状态的第一个过程加上一个指令,并且在第二个过程的激励器目录中为新目标加上激励器。在这种方式中,外部事件能发第一个过程,它修正辅助目标的状态。由于该状态变量也是一个激励器,这意为模拟,由于在第二个过程的目录不存在着另一事件的等效事件,通过程序,该事件便被执行。必须强调的是,一个过程的激励器目录不同于一个目标的激励器目录。事实上,一个目标激励器目录是目标元素的一个集合

30、,当它们变化时,可以用来能发一个过程的执行。而过程目录则包含由应用程序定义的可有目标所有激励器子集,在此基础上,过程本身必须触发执行。下面看外例子:假设已定义一个目标main_motor类型为DC$MOTOR$AXIS,它的激励器目录是:DIAGN$STATNS OF main_motorOPERATING$CONDITION OF main_motor目标encoderassoluto,类型为ABSOLUTE$ENCODER,它的目录是:DIAGN$STATUS OF absoluteencoder,OPERATING$CONDITION OF absoluteencoder,CFG$STA

31、TUS OF absoluteencoder,CFG$UPPATE$RQUEST OF absoluteencoder.然后,假设有二个过程:过程1,有下列目录:OPERATING$CONDITION OF main_motor ,OPERATING$CONDITION OF absoluteencoder过程2 的目录是:OPERATING$CONDITION OF absoluteencoder如果有一事件修正main_motor 的诊断条件,将没有任何过程被执行。如果该目标的操作条件被修正,这个事件只会触发过程1。如果目标absoluteencoder的操作条件修正,将会触发过程1 和2

32、,带有一个不确定的执行顺序。过程激励的一个目标可以包含全局激励器,就是那样一些激励器,它们与一特定类型的目标无关,因而不包括在这些目标的激励器目录中。全局激励器通过DECLARE(说明)指令,用来为激励器目录的过程生成目录。这些激励器目录包括在当前模块中说明的全部目标,但不包括外部目标。生成这些目录的标准取决于使用哪个全局激励器来定义。有二个全局激励器:ANY $ DIAGN $ STAUS生成一个目录,该目录含有描述局部目标诊断状态的所有这类激励器。ANY $ OBJECT $ INPUT生成一个目录,该目录含有除了那些已用关键字EDGE 和PHASE$MATCH 定义的激励器以外的全部其他

33、局部目标。3.3.2 可执行指令可执行指令构成过程体,可分属于两类:修正目标状态指令及控制执行流程指令。第一类包括: 赋值指令 为有关目标调用操作符第二类包括: 条件转移 迭代(重复) 跳转至过程结束一个过程至少须含有一个可执行指令3.3.3 一个GDL 应用程序结构一个GDL 文件只含有一个GDL 模块。一个应用程序通常由一个以上的模块组成。这些模块分别编译,然后由GDL 核实器实行连接。一个GDL 文件分为二个部分:一个块含有编译程序最终指令,另一个块构成GDL 实际模块。现在看一下模块结构。每一模块由一个名标识。这个名对应用程序必须是唯一的。(即其他模块、过程及目标都不纯在同一名)。每个

34、模块又分为二个部分:第一部分含有所有目标说明指令,第二部分带有所有过程。模块可以只含有目标说明二无过程,但不可以没有目标说明二只有过程。整个GDL 应用程序一般由多个模块组成。在其中一个模块存在的过程可以修正在该模块中在其他模块中说明的目标状态。换言之,可以使用应用于外部的操作符,正如外部目标的一个状态变量可以作为一个赋值的左边部分一样。事实上,这二种情况的结果都是目标状态的修正。一个目标资源可由模块访问。就是说目标的可见性延伸到整个应用程序。但是,如果一个过程须涉及外部目标,有必要通知编译程序。该目标已在别处说明。否则,它就被认为是不知的。通知由一个适当的指令来执行。该指令与一个说明相似,称

35、为use指令。编译程序不能在外部目标上作句法检查。这些检查是GDL 由检验程序进行的。实际上,该检验程序有专门任务,检查组成应用程序的所有模块的相关性,分解(辨)外部引用。若检测到错误,该程序便生成一个目录。否则,结果就是应用程序的映象,即所有说明的目标目录即有参数至关参数值。概括起来,产生一个GDL 应用程序的三个步骤是; 每一个模块必须由GDL 编译程序进行编译; 模块组须由GDL 检测程序模拟以分解(辨)外部引用; 应用程序须装入机器控制系统,然后启动。若需要,可用GDL 调试工具测试应用程序。四GDL 语法句法在分析了GDL 结构基础的概念之后,让我们仔细看一下语言使用的句法规则。在这

36、一章里,我们将再次谈到前面分析过的概念,并介绍如何正确无误地写一个程序。开始是含有一个GDL 模块的文件结构,然后分析GDL 模块,它的目标说明及可执行过程。在后面的表示中,所有保留字都以大写形式书写。4.1 GDL 文件一个GDL 应用中的每个文件由二部分组成:编译程序指令目录及GDL 实际模块。它的一般形式如下:指令1指令1指令KMODULE 样本模块END$MODULE对编译程序的指令可能会不足,但总是分成二组:只在实际模块启动前通知的指令及能与GDL 指令混合的指令。编译程序现有的版本不直接执行所提到的第一种,而对于第二种,只有一个指令(eject)。每个对编译程序的指令由一个关键字表

37、示,始字符为,后跟一个整数参数,括在一个小括弧内。由于不存在真的GDL 指令,所以编译程序指令不用;字符结束。唯一的执行指令是 eject,他使目录文件在打印时跳页。该指令可能位于一个指令的半端(由符号;,THEN,ELSE,LOOP 标识)及下一个指令的开端之间。而且在该指令后面应紧跟一个CR(回车)控制符。若在它后面跟的是其他字符或空格,会导致一个出错信息。4.2 GDL 模块在GDL 文件中只能有一个模块。该模块须以所赋名开始。见下例;MODULE somple_module;该模块须以语句END$MODULE;结束.模块细分为二部分。第一部分称为目标部分它含有所有的过程。目标部分开始语

38、句为:OBJECT$SECTION;结束句为;END$OBJECT$SECTION;与其相似,过程部分开始语句为:PROCEDUE$SECTION;结束语句为:END$PROCEDUE$SECTION;模块一般结构如下:MODULE samplemodule;OBJECT$SECTION;.END$OBJECT$SECTION;PROCEDURE$SECTION;.END$PROCEDURE$SECTION;END$MODULE;模块中只能有目标部分和过程部分。该两部分不能交换。目标部分必须要存在,而过程部分则可空缺(即模块只含有目标说明)。两个部分不能都空,因此,第一部分至少须有一个目标说明

39、或使用指令,第二部分如果存在的话,则至少包含一个过程。4.3 目标说明说明一个目标意思是让编译程序认识它。一个模块中说明的目标状态既可以由组成该模块的过程修正,也可以有驻在其他模块中的过程修正。要引用在另一模块中说明的目标,则应通知编译程序,所涉及的是一个外部目标。通知动作是由一语句完成的,该语句是与一个说明相识的,称为使用语句。4.3.1 说明一个局部目标下面是一个例子;DECLARE main_motor DC$MOTOR$GEAR main_motor,board,CH01,CH02,50,100,25,30;DECLARE 关键字后面跟一个目标名,然后是定义目标类型的关键字,最后是说明

40、参数的赋值目录。这些值是正确类型的一列数据,由逗号隔开。整个语句括在大括弧内。每个参数的类型(整数、数字、设定值、名、字符串)在手册的目标类型描述中定义。如果必要,还提供可赋值的范围。在某些情况下,对整型参数所赋的值构成了范围极限值,在操作符调用中这些值极限可以赋于目标状态变量或参数。若不考虑这些极限,会导致出错,如果说明参数只指明一个极限(如,一个最大值),另一个则由系统设为0。如果目录含有父目标名,在模块中该目标可以在当前目标前说明,也可在它后面说明,甚至可以在另一个模块中说明。在后一种情况下,不必要为父目标在后面带一个外部目标说明,因为不访问它的状态。赋于一个目标的名,必须与应用程序中其

41、他目标、过程及模块的名不同。标识目标类型的关键字必须是属于GDL 目标类型组(集合)的一个。参数应当由目标类型以准确的顺序调用。可以有无参数的目标。一个模块中可以包括任意数量的说明。如果这些说明中有一个出错,必要程序忽略,这个出错。所以每当在源程序的模块中遇到一个特殊的标识符,就触发一个没有说明的信息。在上例中,一个名为main_motor的目标被说明,它属于DC$MOTOR$GEAR 类型,它与一个名为main_motor_board的父目标相连,它有6 个整型参数,这些参数定义它的速度,加速度等特性。观察手册中该目标类型的结构,可以发现关键字CH01 是传到父目标的参数,即,它指明板上这个

42、电动机使用哪个连接通道。在这种特定情况下,占据的通道是01。4.3.1.1 数组型目标有一些称为“数组”目标的特殊目标,这是元素组(集合)。每个数组有一个下标,它的每个元素又是一个GDL 目标。你可以说明数组目标,但不能说明一个数组的单个元素。换言之,不允许说明不带一个下标的目标。说明一个数组目标时,DECLARE 的形式不变:DECLARE chain INTEGER$CHAIN100;用名chain,类型INTEGER$CHAIN 来定义一个数组。指明的参数是目标数组的维数(100 个元素)。只有在引用一个数组元素时(如,在一个赋值中)才能规定下标。下标必须是括在一方括号内的一个表达式:V

43、ALUE OF chain4+VALUE OF intvar=10;这里10 是在chain数组中赋于一元素状态变量的值,由一个下标标识,该下标的值是表达式。4+VALUE OF intvar 这里intvar是另一个已经说明过的目标。通常,一个目标数组可以作为一个参数在一个DECLARE 语句中出现。而它的任何一个元素不能作为一个参数。就是说,带有下标的参数是不存在的。相反,一个操作符调用可以含有一个数组参数,而且如果必要的话,还可以含有带一个下标的它的元素。一个过程激励器目录中,可以有数组元素。但是下标必须是整数常数,而不能是表达式。4.3.1.2 定义父子关系假设我们在写下列说明:DEC

44、LARE stepper_board_1 STP$MOTOR$BOARDmain_rack,SLOTOI,PRESENT,PRESENT,PRESENT,NOT$PRESENT,PRESENT;目标stepper_board_1以main_rack作为它的父目标,由SLOTOI 定义,占有连接通道,即,第一槽。现在,我们用不着担心main_rack是怎样被说明的。相反我们从目标细则的描述中道,stepper_board_1有5 个SUBASSY(配件),即通往它的子目标的通信通道集合,这一通道集合有5 个分支。这些通道在板上的物理存在由DECLARE 中的参数假设的值PRESENT 或NCT$

45、PRESENT 描述。从目标细则的叙述中,我们还了解到,第一分支(存在)有二个连接通道(CH01 与CH02),第二分支(存在)有通道CH03 与CH04,第三分支有CH05 与CH06,含有CH07和CH08 的第四分支在板上不存在。第五分支有CH01 至CH08,但是这些通道是未用于子型的,该类型与那些由前四个分支支持的通道专用类型不合。换言之,有二个分支,第一组包括14 个分支,专用于某类子目标,含有CH01 至CH08。第二组是一个分支构成,它专用于子目标的其他类型。这些类型有用于连接的不同通道,通道的编号也是CH01CH08。从这个配置中我们看到如何能与stepper_board_1

46、子目标相连。假定以stepper_axis_1为名说明一个子目标:DECLARE stepper_axis_1 STP$MOTOR$AXISstepper_board_1,CH01,10,15,8,10,2,32,10,6,54,26;从目标的描述中,我们看到第二个参数定义哪个通往父目标的连接通道被占据着(在这种情况下,它是CH01,第一通道)从目标STP$MOTOR$BOARD 的说明,我们还看到只有分支1-4 能支持这种类型的一个子目标连接,因为第五分支设置用于其他子目标类型。我们已建立了父目标第一分支PRESENT,这表示在第SWBASSY(配件)所有连接通道可得到。因此,stepper

47、_axis_1可以占用CH01。与其相似,它可以被指定占据从CH02_CH06中任何一通道,因为前三个分支都是PRESENT。说明:DECLARE stepper_axis_1 STP$MOTOR$AXIS stepper_board_1,CH07,10,15,8,10,2,32,10,6,54,26;它触发一出错信息,因为我们试图将子目标与父目标的一个实际来启用的通道连接。与之相似,若CH01 被stepper_axis_1占有,然后,我们将另一个子目标说明为stepper_axis_2,而它占有同一通道,这样会出错,因为有一个重叠。分支5 来用于子目标其他类型,我们可以作下列说明:DECL

48、ARE stepper_axis_1 STP$MOTOR$AXIS stepper_board_1,CH09,10,15,8,10,2,32,10,6,54,26;由此得到一个出错,因为我们试图占有的这一通道在这类子目标中不存在。又由于为不同类型保留分支这一事实,(即,独立的和不同的区域),可以在某一区域说明一个目标(如,像STP$MOTOR$AXIS 这样一个目标类型),两个目标与同一通道连接(如CH01)。事实上,由于区域不同,通道也就不同,即使它们有同名,也不会发生重叠。所有这些条件很明显的也适用于stepper_board_1与它的父目标main_rack之间的关系,因为每个目标可以同

49、时是父和子。这个规则不适用于:父目标没有分支时。这时,仅有一条约束规则是避免重叠。当子目标不说明通往父目标是连接通道时,即使这个重叠规则也不再存在。4.3.2 说明一个外部目标见下列:USE absolute_encoder ABSOLUTE$ENCODERUSE 关键字后面跟外部目标名和类型。模块中这一语句的包含内容允许所有模块过程访absolute_encoder状态变量并允许在任何激励目录中插入absolute_encoder激励器。很显然,在同一模块中用PECLARE 与USE 说明同一目标是不允许的。而且显然对在一个USE 中存在的,每个目标,必在另一模块中有一对应的DECLARE。

50、否则,GDL 核算器会送出一个非分辨外部目标信息。外部说明数量没有限制,很明显,这里没有双份的。如前所述,当你想要访问一个目标,该目标已在另一模块中定义,或者要修正它的状态,或者要在一个局部过程激励目录中增加一个激励器,这些说明就是有必要的。反之,如果在一个局部说明中(DECLARE),有一个参数是外部目标名,就没有必要为该目标增加USE,因为不要求对该目标进行访问。4.4 过程在过程部分内,可以有无数个过程。每一过程以它的说明开始,即,关键字PROCEDURE,后面跟着赋于它的名和一个分号;。过程名必须与应用程序中的其他过程名,模块名和目标名都不同。END 关键字结束过程,后跟分号;。激励器

51、目录及随后的可执行指令集构成了过程。激励目录是独特的,以ACTIVATORS关键字开始,后跟一个大括弧,括弧内有激励器实际目录,用一逗号分隔,语句以分号结束。过程里至少有一个可执行指令,不允许存在空的过程,下面是一个过程例:PROCEDURE example-1;ACTIVATORS OPERATING$CONDITION OF absolate_encoder,VALUE OF flag1;STATUS OF message-1=ON;SHIFT$FWD$ICH chain-1;END;如果在一个激励器中有变化,过程example-1被调用和激励。OPERATING$CONDITION OF

52、 absolute_encoder VALUE OF flag1. 其中absolute_encoder与flag1是在DECLARE 或USE 语句中定义的目标。对状态变量STATUS OF message-1赋于数字值ON,为目标chain-1调用操作符SHIFT$FWD$ICH,然后结束。4.4.1 激励器目录该目录的功能已经作了解释,现在分析句法。对激励器存在的数量无限制,但不允许有重复。如果一个激励器的标识符是一个数组元素,只有一个整数常量作为它的下标,而不能有一个表达式或状态变量。带有下列激励关键字的激励器EDGEPHASE$MATCH不能包含在含其他激励器的目录中。若它们包含在一

53、个目录中,它们就必须是唯一存在的元素(即,它们是独立型元素)。有二个全局激励器:ANY$DIAGN$STATUSANY$OBJECT$INPUT第一个全局激励器生成一个目录,内含与模块中用DECLARE 语句定义的全部目标诊断状态相连的全部激励器。与诊断状态连接的激励器是那些带DIAGN$STAUS 激励关键字的激励器。第二个全局激励器生成的目录中含有所有其他的激励器,它们与目标的诊断状态吴连接。但是,带有EDGE 及PHASE$MATCH 关键字的激励器不包括在这个目录中。一个全局激励器不能和包括在生成目录中的同类型其他显式激励器有关,那种激励器是有关用有关DECLARE 指令说明的目标,因

54、为在这种情形下,结果是有双元素。如果该显式激励器引用的目标已用USE 指令说明(即,它是有关外部目标),这个激励器能与全局激励器仪器显示。因为全局激励器生成的目录中不包括外部目标,所以不存在双元素。下面是一个实例语句:ACTIVATORS DIAGN $ STATUS OF main_motor,ANY $ DIAGN $ STATUS;如果在一个DECLARE 中说明main_motor会出错,但用USE 说明该目标,则是对的。对下面语句也是如此:ACTIVATORS OPERATING$CONDITION OF main_motor,ANY $ OBJECT $ INPUT;因为显式激励器

55、不包括在由全局激励器生成的目录内。二个全局激励器可以一起标明。在这时,结果生成二个单个目录的总目录。4.4.2 表达式一个表达式是由运算符相连的一序列有比例的操作数,运算符定义在操作数上执行的运算,表达式可分为三类:_ 代数表达式_ 关系表达式_ 布尔表达式操作数可以是:_ 状态变量_ 常数_ 子表达式每个操作数可以拥有它自己的类型,它们是:_ 整数_ 数字_ 设_定值(对子表达式无效)整型常数是数字值常数(GDL 不允许使用实型常数,即不可用十进位制小数点)数字型常数只用二个关键字表示:ON 和OFF设定型常数是能指明状态变量和设定型参数可接受值的所有关键字。如:ENABLED,DIS AB

56、LED,RUNNING$FWD,YELLOW,PRESENT,SLOTO3在连接运算符和操作数时,遵循关于类型的相关原则。状态变量还须有一种访问类型,能允许读。即,它们须为读或读写型的,而且如果它们仅仅是写型的,就不能成为表达式的一部分。括在圆括弧内的表达式称为子表达式,它在一个表达式中可以是一个操作数。根据子表达式所含的操作数和运算符,它可以拥有自己的类型。使用圆括弧可以修改运算符优先级的自然次序。最好在需要时才使用括弧,因为用括弧会减低编译程序的速度。表达式长度有极限。它的长度取决于构成表达式的元素量(由编码生成能力而产生极限),取决于表达式的复杂程度(即,子表达式的嵌套数量)。根据涉及的

57、情况,可通过减少不必要的圆括弧来达到极限之内的要求。但是常常可以利用辅助变量,把表达式拆为二部分。如果把表达式超出最大极限,编译程序会送出一个错误信息。就象带子表达式那样,表达式也有一个类型,该类型是由存在的操作数和运算符决定的,它们必须遵循所在语句的句法规则。下面是一些实例:5+7 是一个整型表达式POSITION OF main-motor+7这是含有一个状态变量的整数表达式( POSITION OF main-motor+7)这是一个整型子表达式5+( POSITION OF main-motor+7)*4这是一个整数表达式,式内含有一个子表达式作为主的操作数.STATUS OF cha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论