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