1、脚本程序本章介绍 MCGS 嵌入版的脚本语言,主要内容包括: 脚本语言编辑环境 脚本程序语言要素 脚本程序基本语句 脚本程序的查错和运行脚本程序简介脚本程序是组态软件中的一种内置编程语言引擎。当某些控制和计算任务通过常规组态方法难以实现时,通过使用脚本语言,能够增强整个系统的灵活性,解决其常规组态方法难以解决的问题。MCGS 嵌入版脚本程序为有效地编制各种特定的流程控制程序和操作处理程序提供了方便的途径。它被封装在一个功能构件里(称为脚本程序功能构件) ,在后台由独立的线程来运行和处理,能够避免由于单个脚本程序的错误而导致整个系统的瘫痪。在 MCGS 嵌入版中,脚本语言是一种语法上类似 Bas
2、ic 的编程语言。可以应用在运行策略中,把整个脚本程序作为一个策略功能块执行,也可以在动画界面的事件中执行。MCGS嵌入版引入的事件驱动机制,与 VB 或 VC 中的事件驱动机制类似,比如:对用户窗口,有装载,卸载事件;对窗口中的控件,有鼠标单击事件,键盘按键事件等等。这些事件发生时,就会触发一个脚本程序,执行脚本程序中的操作。脚本语言编辑环境脚本程序编辑环境是用户书写脚本语句的地方。脚本程序编辑环境主要由脚本程序编辑框、编辑功能按钮、MCGS 嵌入版操作对象列表和函数列表、脚本语句和表达式 4 个部分构成,分别说明如下: 脚本程序编辑框用于书写脚本程序和脚本注释,用户必须遵照 MCGS 嵌入
3、版规定的语法结构和书写规范书写脚本程序,否则语法检查不能通过。 编辑功能按钮提供了文本编辑的基本操作,用户使用这些操作可以方便操作和提高编辑速度。比如,在脚本程序编辑框中选定一个函数,然后按下帮助按钮,MCGS 嵌入版将自动打开关于这个函数的在线帮助,或者,如果函数拼写错误,MCGS 嵌入版将列出与所提供的名字最接近函数的在线帮助。 脚本语句和表达式列出了 MCGS 嵌入版使用的三种语句的书写形式和 MCGS 嵌入版允许的表达式类型。用鼠标单击要选用的语句和表达式符号按钮,在脚本编辑处光标所在的位置填上语句或表达式的标准格式。比如,用鼠标单击 ifthen 按钮,则 MCGS 嵌入版自动提供一
4、个 if then 结构,并把输入光标停到合适的位置上。 MCGS 嵌入版对象和函数列表以树结构的形式,列出了工程中所有的窗口、策略、设备、变量、系统支持的各种方法、属性以及各种函数,以供用户快速的查找和使用。比如,可以在用户窗口树中,选定一个窗口:“窗口 0”,打开窗口 0 下的“方法” ,双击 Open 函数,则 MCGS 嵌入版自动在脚本程序编辑框中,添加一行语句:用户窗口.窗口 0.Open() ,通过这行语句,就可以完成窗口打开的工作。脚本程序语言要素在 MCGS 嵌入版中,脚本程序使用的语言非常类似普通的 Basic 语言,本节将对脚本程序的语言要素进行详细的说明。数据类型MCGS
5、 嵌入版脚本程序语言使用的数据类型只有三种: 开关型:表示开或者关的数据类型,通常 0 表示关,非 0 表示开。也可以作为整数使用; 数值型:值在 3.4E38 范围内; 字符型:最多 512 个字符组成的字符串。变量、常量及系统函数变量:脚本程序中,用户不能定义子程序和子函数,其中数据对象可以看作是脚本程序中的全局变量,在所有的程序段共用。可以用数据对象的名称来读写数据对象的值,也可以对数据对象的属性进行操作。开关型、数值型、字符型三种数据对象分别对应于脚本程序中的三种数据类型。在脚本程序中不能对组对象和事件型数据对象进行读写操作,但可以对组对象进行存盘处理。常量: 开关型常量:0 或非 0
6、 的整数,通常 0 表示关,非 0 表示开; 数值型常量:带小数点或不带小数点的数值,如: 12.45, 100 字符型常量:双引号内的字符串,如:“OK” ,“正常”系统变量:MCGS 嵌入版系统定义的内部数据对象作为系统内部变量,在脚本程序中可自由使用,在使用系统变量时,变量的前面必须加“$”符号,如 $Date。系统函数:MCGS 嵌入版系统定义的内部函数,在脚本程序中可自由使用,在使用系统函数时,函数的前面必须加“!”符号,如!abs( )。属性和方法:MCGS 嵌入版系统内的属性和方法都是相对于 MCGS 嵌入版的对象而说的,引用对象的方法可以参见下个部分。注:有关系统变量和系统函数
7、详细的使用方法,请参见MCGS 嵌入版参考手册MCGS 嵌入版对象MCGS 嵌入版的对象形成一个对象树,MCGS 嵌入版对象的属性就是系统变量,MCGS 嵌入版对象的方法就是系统函数。MCGS 嵌入版对象下面有“用户窗口”对象, “设备”对象, “数据对象” 等子对象。 “用户窗口”以各个用户窗口作为子对象,每个用户窗口对象以这个窗口里的构件作为子对象。使用对象的方法和属性,必须要引用对象,然后使用点操作来调用这个对象的方法或属性。为了引用一个对象,需要从对象根部开始引用,这里的对象根部,是指可以公开使用的对象。MCGS 嵌入版对象,用户窗口、设备和数据对象都是公开对象,因此,语句InputE
8、Time = $Time 是正确的,而语句 InputETime = MCGS.$Time 也是正确的,同样,调用函数!Beep()时,也可以采用 MCGS.!Beep()的形式。可以写:窗口 0.Open(),也可以写:MCGS.用户窗口.窗口 0.Open(),还可以写:用户窗口.窗口 0.Open()。但是,如果要使用控件,就不能只写:控件 0.Left,而必须写:窗口 0.控件 0.Left,或:用户窗口.窗口 0.控件0.Left。在对象列表框中,双击需要的方法和属性,MCGS 将自动生成最小可能的表达式。事件在 MCGS 嵌入版的动画界面组态中,可以组态处理动画事件。动画事件是在某
9、个对象上发生的,它可能是带参数也可能是不带参数的动作驱动源。如:用户窗口上可以发生事件:Load, Unload,它们分别在用户窗口打开和关闭时触发。可以对这两个事件编写一段脚本程序,当某一事件触发时(用户窗口打开或关闭时)其相应脚本程序被执行。用户窗口的 Load 和 Unload 事件没有参数,而 MouseMove 事件有参数,在组态这个事件时,可以在参数组态中,选择把 MouseMove 事件的几个参数连接到数据对象上,这样,当 MouseMove 事件被触发时,就会把 MouseMove 的参数,包括鼠标位置,按键信息等送到连接的数据对象,然后,在事件连接的脚本程序中,就可以对这些数
10、据对象进行处理。表达式由数据对象(包括设计者在实时数据库中定义的数据对象、系统内部数据对象和系统函数) 、括号和各种运算符组成的运算式称为表达式,表达式的计算结果称为表达式的值。当表达式中包含有逻辑运算符或比较运算符时,表达式的值只可能为 0(条件不成立,假)或非 0(条件成立,真) ,这类表达式称为逻辑表达式;当表达式中只包含算术运算符,表达式的运算结果为具体的数值时,这类表达式称为算术表达式;常量或数据对象是狭义的表达式,这些单个量的值即为表达式的值。表达式值的类型即为表达式的类型,必须是开关型、数值型、字符型三种类型中的一种。表达式是构成脚本程序的最基本元素,在 MCGS 嵌入版的组态过
11、程中,也常常需要通过表达式来建立实时数据库对象与其它对象的连接关系,正确输入和构造表达式是 MCGS 嵌入版的一项重要工作。运算符算术运算符 乘方 * 乘法 除法 整除 加法 减法 Mod 取模运算逻辑运算符 AND 逻辑与 NOT 逻辑非 OR 逻辑或 XOR 逻辑异或比较运算符 大于 大于等于 等于(注意,字符串比较需要使用字符串函数 !StrCmp,不能直接使用 等于运算符) 小于等于 小于 不等于运算符优先级按照优先级从高到低的顺序,各个运算符排列如下: ( ) *, ,Mod , , , , , NOT AND,OR,XOR基本辅助函数作为脚本语言的一部分,MCGS 嵌入版提供了几组
12、基本辅助函数,这些函数主要不是作为组态软件的功能提供的,而是为了完成脚本语言的功能提供的。这些函数包括以下几类:位操作函数,数学函数,字符串函数,时间函数。位操作函数提供了对数值型数据中的位进行操作的功能。可以用开关型变量来提供这里的数值型数据。在脚本程序编辑器里,位操作函数都列在数学函数中,包括按位与(!BitAnd) ,按位或(!BitOr),按位异或(!BitXor) ,按位取反(!BitNot ),清除数据中的某一位或把某一位置 0(!BitClear) ,设置数据中的某一位或把某一位置 1(!BitSet),检查数据中某一位是否为 1(!BitTest) ,左移和右移(!BitLSh
13、ift,!BitRShift) 。数学函数提供了常见的数学操作,包括开方,随机数生成以及三角函数等。字符串函数提供了与字符串相关的操作,包括字符串比较,截取,搜索以及格式化等。时间函数提供了和时间计算相关的函数。时间可以以一个字符串的形式表示,但是,为了方便进行时间计算,在 MCGS 嵌入版中,使用了一种内部格式来保存时间的值,这种内部格式的时间值可以保存在一个开关型变量中,同时,可以使用函数!TimeStr2I 和!TimeI2Str来完成字符串形式时间量和内部格式形式时间量的转换,如:A1 = !TimeStr2I(“2001-3-2 12:23:23”),这里 A1 是一个开关型数据对象
14、,获得了一个内部形式的时间量,而再用 InputETime=!TimeI2Str(A1,“%Y-%m-%d %H:%M:%S “) 又可以把保存在 A1 中的内部形式的时间量转换为字符串形式。当时间转换为内部格式后,就可以进行时间的运算。运算完毕后,再转换为字符串形式的时间,以便输出和使用。具体函数的使用方法,可以参照MCGS 嵌入版参考手册中的说明。功能函数为了提供辅助的系统功能,MCGS 嵌入版提供了功能函数。功能函数主要包括以下几类:运行环境函数,数据对象函数,系统函数,用户登录函数,定时器操作,文件操作,配方操作函数等。运行环境函数和数据对象函数主要是提供了对 MCGS 嵌入版内部各个
15、对象操作的方法。系统函数提供了系统功能,包括启动程序,发出按键信息等等。用户登录函数提供了用户登录和管理的功能。包括打开登录对话框,打开用户管理对话框等等。定时器提供了 MCGS 嵌入版内建定时器的操作。包括对内建时钟的启动,停止,复位,时间读取等操作。文件操作提供了对文件的操作,包括删除、拷贝文件,把文件拆开、合并,寻找文件,遍历文件,在文件中进行读写操作。对 CSV(逗号分割的文本文件)进行读写操作等等。具体的函数说明,可以参看MCGS 嵌入版参考手册。 脚本程序基本语句由于 MCGS 嵌入版脚本程序是为了实现某些多分支流程的控制及操作处理,因此包括了几种最简单的语句:赋值语句、条件语句、
16、退出语句和注释语句,同时,为了提供一些高级的循环和遍历功能,还提供了循环语句。所有的脚本程序都可由这五种语句组成,当需要在一个程序行中包含多条语句时,各条语句之间须用“:”分开,程序行也可以是没有任何语句的空行。大多数情况下,一个程序行只包含一条语句,赋值程序行中根据需要可在一行上放置多条语句。赋值语句赋值语句的形式为:数据对象 = 表达式。赋值号用“=”表示,它的具体含义是:把“=” 右边表达式的运算值赋给左边的数据对象。赋值号左边必须是能够读写的数据对象,如:开关型数据、数值型数据以及能进行写操作的内部数据对象,而组对象、事件型数据对象、只读的内部数据对象、系统函数以及常量,均不能出现在赋
17、值号的左边,因为不能对这些对象进行写操作。赋值号的右边为一表达式,表达式的类型必须与左边数据对象值的类型相符合,否则系统会提示“赋值语句类型不匹配”的错误信息。条件语句条件语句有如下三种形式:If 表达式 Then 赋值语句或退出语句If 表达式 Then语句EndIfIf 表达式Then语句Else语句EndIf条件语句中的四个关键字“If”、“Then”、“Else ”、“Endif ”不分大小写。如拼写不正确,检查程序会提示出错信息。条件语句允许多级嵌套,即条件语句中可以包含新的条件语句,MCGS 脚本程序的条件语句最多可以有 8 级嵌套,为编制多分支流程的控制程序提供方便。“IF”语句
18、的表达式一般为逻辑表达式,也可以是值为数值型的表达式,当表达式的值为非 0 时,条件成立,执行“Then”后的语句,否则,条件不成立,将不执行该条件块中包含的语句,开始执行该条件块后面的语句。值为字符型的表达式不能作为“if”语句中的表达式。循环语句循环语句为 While 和 EndWhile,其结构为:While 条件表达式.EndWhile当条件表达式成立时(非零) ,循环执行 While 和 EndWhile 之间的语句。直到条件表达式不成立(为零) ,退出。退出语句退出语句为“Exit” ,用于中断脚本程序的运行,停止执行其后面的语句。一般在条件语句中使用退出语句,以便在某种条件下,停
19、止并退出脚本程序的执行。注释语句以单引号“ ”开头的语句称为注释语句,注释语句在脚本程序中只起到注释说明的作用,实际运行时,系统不对注释语句作任何处理。脚本程序的查错和运行脚本程序编制完成后,系统首先对程序代码进行检查,以确认脚本程序的编写是否正确。检查过程中,如果发现脚本程序有错误,则会返回相应的信息,以提示可能的出错原因,帮助用户查找和排除错误。常见的提示信息有: 组态设置正确,没有错误 未知变量 未知表达式 未知的字符型变量 未知的操作符 未知函数 函数参数不足 括号不配对 IF 语句缺少 ENDIF IF 语句缺少 THEN ELSE 语句缺少对应的 IF 语句 ENDIF 缺少对应的
20、 IF 语句 未知的语法错误根据系统提供的错误信息,作出相应的改正,系统检查通过,就可以在运行环境中运行,达到简化组态过程、优化控制流程的目的。系统操作函数!AppActive()函数说明:此函数在嵌入版中无效,考虑兼容性问题,故保留。!Beep()函数意义:发出嗡鸣声。返 回 值:数值型。返回值=0:调用成功;0:调用失败。参 数:string,字符串表达式,指定要发送的按键消息。实 例:!SendKeys(“%TAB“),切换窗口。说 明 :每个按键由一个或多个字符表示。为了指定单一键盘字符,必须按字符本身的键。例如,为了表示字母 A,可以用 “A“ 作为 string。为了表示多个字 符
21、,就必须在字符后面直接加上另一个字符。例如,要表示 A、 B 及 C,可用 “ABC“ 作为 string。对 SendKeys 来说,加号 (+)、插入符 ()、百分比符号 (%)、上划线 () 及圆括号 ( ) 都具有特殊意义。为了指定上述任何一个字符,要将它放在大括号 () 当中。例如,要指定正号,可用 + 表示。为了指定大括号字符,请使用 及 。为了在按下按键时指定那些不显示的字符,例如:ENTER 或 TAB 以及那些表示动作而非字符的按键,请使用下列代码:按键 代码 BACKSPACE BACKSPACE, BS, 或 BKSP BREAK BREAK CAPS LOCK CAPS
22、LOCK DEL or DELETE DELETE 或 DEL DOWN ARROW DOWN END END ENTER ENTER或 ESC ESC HOME HOME INS or INSERT INSERT 或 INS LEFT ARROW LEFT NUM LOCK NUMLOCK PAGE DOWN PGDN PAGE UP PGUP RIGHT ARROW RIGHT SCROLL LOCK SCROLLLOCK TAB TAB UP ARROW UP F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F1
23、1 F11 F12 F12 F13 F13 F14 F14 F15 F15 F16 F16 为了指定那些与 SHIFT、CTRL 及 ALT 等按键结合的组合键,可在这些按键码的前面放置一个或多个代码,这些代码列举如下:按键 代码SHIFT +CTRL ALT %为了说明在按下其它按键时应同时按下 SHIFT、CTRL、及 ALT 的任意组合键,请把那些按键的码放在括号当中。例如,为了说明按下 E 与 C 的时候同时按下 SHIFT 键,请使用 “+(EC)“。为了说明在按下 E 的时候同时按下 SHIFT 键,但接着按 C 而不按 SHIFT,则使用“+EC“。注 意:不能用 SendKey
24、s 将按键消息发送到这样一个应用程序,这个应用程序并没有被设计成在 Microsoft Windows 中运行。 Sendkeys 也无法将 PRINT SCREEN 按键 PRTSC 发送到任何应用程序。!SetLinePrinter(n)函数意义:打开/关闭行式打印输出。返 回 值:数值型。返回值=0:调用成功;0:调用失败。参 数:n1,数值型,设定年数,小于 1000 和大于 9999 时不变;n2,数值型,设定月数,大于 12 和小于 1 时不变;n3,数值型,设定天数,大于 31 和小于 1 时不变;n4,数值型,设定小时数,大于 23 和小于 0 时不变;n5,数值型,设定分钟数
25、,大于 59 和小于 0 时不变;n6,数值型,设定秒数,大于 59 和小于 0 时不变。实 例:!SetTime(2000,1,1,1,1,1), 设置当前系统时间为 2000 年 1 月 1 日 1 时1 分 1 秒。!Shell()函数说明:此函数在嵌入版中无效,考虑兼容性问题,故保留。!Sleep(mTime)函数意义:在脚本程序中等待 mTime 毫秒,然后再执行下条语句。只能在策略中使用,否则会造成系统响应缓慢。返 回 值:数值型。返回值=0:调用成功;0:调用失败。参 数:Dat1,数值型,条件表达式,如:D=15。Dat2,数值型,等待条件满足的超时时间,单位:ms 。为 0 则无限等待。实 例:!WaitFor(D=15,12000) ,等变量 D 的值等于 15 后,程序再继续执行,如果在 12 秒后条件仍然没有满足,也自动继续执行。此函数通常用于做实验时,等待某个条件满足,然后再接着执行实验流程。他与 Sleep函数以及 While 循环语句、其他循环策略配合,能够实现复杂的流程调度。注 意:!WaitFor 只能用于策略中,而不能直接在窗口控件的脚本程序中使用。!WinHelp()函数说明:此函数在嵌入版中无效,考虑兼容性问题,故保留。