4 脚本系统.docx
《4 脚本系统.docx》由会员分享,可在线阅读,更多相关《4 脚本系统.docx(11页珍藏版)》请在冰豆网上搜索。
4脚本系统
第四章脚本系统
4.1脚本是什么
“脚本”是软件行业从电影剧本中借用过来的名词,它的英文叫Script。
它是一种解释性的编程语言,一般从主流开发编程语言演变而来,比如C、BASIC、PASCAL等,是他们的子集,当然也有新定义的。
使用比较简单。
脚本不能单独运行,它要靠宿主程序解释执行,可以和宿主程序进行交互,以扩充和增强宿主程序的功能,使宿主程序更灵活,更具有可定制性,提供了用户对应用软件的二次开发功能。
脚本一般包括:
变量类型定义、变量作用域、运算符结合律和优先级、语法、流程控制、系统函数、自定义函数、宿主程序的接口等内容的定义。
脚本的处理过程包括编辑、语法错误检查、伪编译、执行等。
如图4-1。
一般编辑、语法错误检查、伪编译在二次开发时完成,二次开发完成的结果指保存伪编译后的代码。
在二次开发时,组态程序一般提供执行预演功能以便观察实际执行效果。
在语法错误检查和伪编译时,如果发现错误要为二次开发用户指明哪行发生了何种错误以及应如何改正等提示信息。
图4-1脚本处理流程简图
目前的商业脚本有ASP中使用得VBScript、JAVAScript,微软Office中使用的VBA,网页制作中的Perl脚本等。
4.2脚本的应用
脚本的应用相当广泛,世界流行的大型软件都靠脚本来增强功能,比如AutoDesk公司的ACAD脚本,IE中的VBScript、JAVAScript,Intellution公司的Ifix中的VBA等。
使用脚本技术是目前应用软件开发先进性的体现,使用脚本和不使用脚本的软件是完全两个不同档次的软件。
4.2.1脚本在ACAD中的应用
AutoDesk公司的AutoCAD软件早在1987年的2.7DOS版中就提供了C脚本,现在的ACAD2002更是支持几种功能强大的脚本,正由于脚本的支持,才有二次开发商在通用ACAD的基础上通过脚本技术开发出了适用于各个行业的ACAD定制版本,比如建筑行业的建筑CAD,装修装饰行业的室内装饰CAD,机械行业的机械CAD。
这就是为什么ACAD要卖十几二十万一套的缘故。
4.2.2脚本在工控行业中的应用
工控行业中,每一个合同、工程都千差万别,有化工行业、制造行业、能源行业。
开发工业监控的软件开发商不可能也做不到为每一个工程开发一套监控软件。
然而借助于脚本技术,软件开发商专注于做好软件,不断升级更新。
把和行业密切相关的部分通过脚本技术让授权的系统集成商和最终用户来做二次开发,从而达到应用工程要求。
工控行业的国外老大Intellution公司的IFix产品采用了VBA脚本,VBA是需要微软授权,花钱购买的,但得到了强大的功能和技术保证和支持。
它可以访问和控制IFix系统中任何图形对象、数据对象、第三方控件对象、实时数据库、历史数据库等。
是将脚本技术应用在工控行业最成功的开发商之一。
GE公司的组态软件业提供了功能强大的VBScript脚本。
国内做的比较成功的是北京亚控公司出品的组态王6.0和大庆三维公司出品的力控ForceControl2.6版本。
组态王采用的是C脚本,力控采用的是BASIC脚本。
他们将脚本技术应用在画面图形动画、数据处理、计划任务、控制策略、数据访问等方面。
4.2.3脚本在SuperPower8000中的应用
在SuperPower8000中使用脚本,使我们的软件上升到一个很高的档次,大大的增强了它的竞争能力,为产品增加了一个亮丽的卖点。
但我们不是为了使用脚本而使用脚本,它实实在在的为软件带来了灵活性,提供了强大的二次开发能力,适应面更广,同时很多高级功能必须使用脚本才能完成。
采用脚本涉及到编译原理和技术,它是一个非常复杂和高深的技术,所以一般小公司的软件没有脚本功能,那些公司的软件不是不需要脚本,而是实力没达到。
一个好的脚本是可以单独作为一个商品出售或技术转让的。
SuperPower8000中的脚本主要应用在以下几个方面:
A.画面图形,使画面表现力更丰富,轻松实现复杂动画,工业仪表,母线动态复杂逻辑着色,通过宏替换简化组态数据关联操作。
B.控制策略,以实现机组负荷控制等功能。
C.操作票中的应用。
D.计划任务,包括定时任务,事件触发任务。
E.复杂计算,脚本的强大功能可以胜任傅利叶计算和方程式求解等任务。
F.通过脚本驱动产生的动画、事件驱动技术和内存变量能模拟机组的开停机过程。
G.自定义的用户交互操作。
满足用户苛刻的需求。
H.在报表中的应用。
4.3脚本设计
脚本的设计包括脚本类型的选择,书写规范,语法规范,对脚本的编辑编译处理等内容。
所有脚本都是事件驱动的,这些事件包括命令、鼠标事件、定时器事件、数据改变事件、对象状态变化事件等。
具体是指开关操作、计划任务、鼠标左键按下、开关变位、数据越限、定时刷新、图形动画、负荷平衡、SOE报警等事件的脚本驱动。
脚本主要在操作员站上的监控运行软件和实时数据库系统中运行。
4.3.1脚本的选型
脚本有很多,有国际标准的,也有企业自定义的。
比如网页使用的JavaScript、VbScript、Perl等,企业自定义的有基于C、PASCAL、BASIC的。
具体采用哪种和你的应用相关,功能要满足,成本低,和应用有好的接口和安全性,能自由扩充行业相关功能。
VBA是微软在Office中使用的,没有对外开放技术。
技术转让费上百万美元。
VBScriptControl是微软免费的玩具型的脚本,但它对宿主是非安全的,不能扩展行业相关功能,而且和宿主不易接口,国内外没有一家工控行业软件采用了VBScriptControl。
因此只有自己开发了,开发基于C的脚本。
理由如下:
A.外购脚本技术费用昂贵
B.C功能强大
C.可以自由扩充行业相关功能。
D.书写风格清晰明了
E.C语法流行,掌握的人多
F.开发者对C语法最熟悉
4.3.2书写规范
本脚本语法按照ANSIC标准,因此你可按照编写ANSIC的习惯开发脚本程序。
A、空白字符:
空格、制表、换行、回车、换页、纵向制表(verticaltab)和换行(newline)字符都称为空白字符(white-space),因为它们具有相同的功能,即作为打印页上单词和行之间的空白,使其更容易阅读。
通过空白字符和其它语言符号,例如运算符和标点,从而对语言符号进行定界。
当对代码进行词法分析时,C编译器忽略空白字符,除非使用它们作为分隔符或者字符常量或字符串文字的组成成分。
使用空白字符使程序更具可读性。
注意编译器也把注释作为空白字符处理。
B、注释:
注释为单行注释,/**/为单行部分注释。
如:
inta,b/*c,d,*/;
//为注释到行尾,如:
doubledblValt;//临时结果。
C、关键字:
voidVOID
charCHAR
byteBYTE
shortSHORT
wordWORD
intINT
longLONG
boolBOOL
dwordDWORD
floatFLOAT
doubleDOUBLE
CString
ifelse
elseif#define
mainreturn
4.3.3变量类型和作用域
voidVOID空类型
charCHAR字符型1字节宽度
byteBYTE字节1字节宽度
shortSHORT带符号短整型2字节宽度
wordWORD无符号短整型2字节宽度
intINT带符号整型4字节宽度
longLONG带符号整型4字节宽度
boolBOOL布尔型4字节宽度
dwordDWORD无符号整型4字节宽度
floatFLOAT浮点数8字节宽度
doubleDOUBLE浮点数8字节宽度
CString字符串型任意宽度
CString型可以进行加运算,比如:
CStringszText="朋友们";
szText+="大家好";
全局变量的定义与他被使用的位置无关。
在函数内部局部变量的名称不能相同,但他可以和全局变量的名称相同,作用顺序:
局部变量-〉全局变量-〉SCADA全局变量。
画面、画面图形属性、开关控制命令、SCADA参数如电流、电压都可作为变量被脚本访问和操作。
4.3.4运算符结合律和优先级
严格按C语法规范,如表4-1
表4-1运算符结合律和优先级
符号
操作类型
结合律
()后缀++后缀--
表达式
从左向右
前缀++前缀--+_~!
单目
从右向左
类型造型
单目
从右向左
*/%
乘法
从左向右
+-
加法
从左向右
<<>>
位移
从左向右
<><=>=
关系
从左向右
==!
=
相等
从左向右
&
按位AND
从左向右
^
按位异或
从左向右
|
按位OR
从左向右
&&
逻辑AND
从左向右
||
逻辑OR
从左向右
=*=/=%=
简单和复合赋值
从右向左
+=-=<<=>>=&=^=|=
简单和复合赋值
从右向左
顺序求值
从左向右
注:
优先级为从上到下降低。
4.3.5立即数的类型
'a'//系统转换为CHAR
12345//系统转换为INT
0x12345或0X12345//系统转换为DWORD
123.45//系统转换为DOUBLE
"12345"//系统转换为CString
TRUEtrueFALSEfalse//系统转换为BOOL
4.3.6变量数据类型的强制转换
数据类型的强制转换就是运算符优先级和结合律中的类型造型,支持如下格式:
(INT)、INT、INT()三种格式,至于加布加()看优先级。
和VC++相同。
例子:
INTna=2,nb=4;
DOUBLEdblal;
dblVal=sqrt(DOUBLE(na+nb));
intnc;
nc=(INT)sqrt(DOUBLE(na+nb));
intnd;
nd=INTsqrt(DOUBLE(na+nb));
4.3.7流程控制
支持ifelseelseif判断分支,并允许嵌套,嵌套层数不限。
满足复杂逻辑的需求。
每个脚本必须有且只有一个main函数,由脚本向导自动生成。
脚本从main函数的第一条语句开始执行。
4.3.8函数
函数分为系统函数和自定义函数:
自定义函数:
在当前脚本可见,自定义函数只需定义,不需说明,而且定义先后顺序无关。
例:
doubleArea(doubledblR)
{
doubledblArea;
dblArea=PI*dblR*dblR;
return(dblArea);
}
库函数:
即无需说明和定义就可直接应用的系统函数,支持部分标准C库函数,提供SCADA系统专用的库函数。
计算函数:
如
doublelog10(doublex);
字符处理函数:
如
voidMakeUpperStr(CStringszText);
系统信息获取函数:
如
CStringGetCurDate(void);
图形控制函数:
如
INTMoveMeDelta(DOUBLEdblDx,DOUBLEdblDy);//
画面控制函数:
如
intClosePic(CstringszPicName);
SCADA数据获取函数:
如
intGetScadaData(DOUBLE&dblData,CstringszArgName);
控制函数:
如
intStartControl(CstringszControlScript);
其它函数:
如
intMessageBox(CStringszText,CStringszTitle,DWORDdwType);
LONGRGB(intr,intg,intb);//构造颜色
voidPlayWav(CStringszWavFileName);//播放声音
…………………
函数的参数传递采用传值方式,和ANSIC标准一样,不能传引用,除非参数指定为传引用。
4.4脚本编辑
脚本编辑就是编写脚本源代码,本节讲述脚本编辑器的要求和设计。
4.4.1编辑器要求
SuperPower8000提供了脚本编写工具,采用VC的方式,支持语法颜色敏感。
注释、关键字、代码采用不同颜色显示,支持剪切、复制、粘贴功能,如图4-2。
当然你也可以采用第三方公司的编辑器编写,比如Qedit,VC等,这些都是很好的源程序书写工具。
使用SuperPower8000的编辑器可以得到额外的功能,比如表单选择SCADA参数和系统变量,表单选择系统函数等,大大提高了你的工作效率。
4.4.2编辑器设计
脚本编辑器类似于文字处理器,只不过处理侧重点不同,文字处理器主要处理排版和打印问题,脚本编辑器侧重于如何为脚本编写者提供方便,保证脚本代码编写的一次正确率。
它最重要的功能是语法颜色敏感和系统函数提示输入,尽量避免输入错误和笔误。
代码字符的录入是编辑器最基本的功能,编写一个文字处理器是很复杂的,幸好Microsoft的MFC类库中的CRichEditCtrl和CRichEditView为我们提供了这样的录入功能,而且支持RichTextFormat文本格式(Windows操作系统的的附件工具“写字板”就是勇它来开发的)。
因此我们只需扩展继承它们,代码录入编辑功能就有了,但这还不够,还需要增加语法敏感功能和SCADA变量、系统函数的插入功能。
原理和实现步骤如下:
(1)定义ClassCScEditPublic:
CrichEditCtrl扩展类。
(2)截获字符输入消息。
(3)对当前行进行句法分析,前后推导,找出关键字、注释、一般代码字符,将它们设为对应的颜色。
(4)截获剪切、粘贴、删除消息。
(5)剪切、粘贴、删除时,同样要截获并重新进行句法分析。
(6)加入热键呼出SCADA变量选单和系统函数选单功能,用户选择后插入到当前位置。
图4-2脚本编辑原型界面
注:
原型是软件工程中采用的一种软件开发方法,叫做原型法。
原型实际上就是模型,在用户对需求不是很明确的情况下,软件开发商做一个模型程序,用户有个感性认识后,然后依据原型提出具体的需求。
其他行业也有采用此法的,比如BMW宝马7系列高级轿车先用泥塑模型,请用户、美工、艺术家等审外观,再用木头作模型,在木模内部挖空间,结构设计师测量空间后再设计安装发动机、方向机、座椅等内部设备设施。
4.5脚本编译
脚本的编译一般都是伪编译,所谓伪编译就是生成的二进制代码不能直接在操作系统级执行,它必须在宿主程序中执行。
伪编译的目的主要有两个:
一是在执行前进行语法检查,二是将人类语言描述的代码变成程序能识别的代码,提高执行时的效率。
4.5.1编译器要求
SuperPower8000也采用伪编译技术。
采用了编译原理的技术。
编译在二次开发系统中的脚本编辑软件包里完成,生成二进制代码供运行系统调用执行。
编译系统提供的附加功能:
A、错误定位功能,具体指出用户编写脚本错误的行号、错误原因。
B、立即执行功能,比如用户在开发动画脚本时可以利用立即执行功能在开发期看到具体动画效果。
4.5.2编译器设计
编译的基本原理全世界都是一样的,那套理论很难理解,上过编译原理课的人都知道,老师都没讲明白。
SuperPower8000使用的编译技术也是以标准编译原理作为理论依据和基础,具体编译原理请阅读《编译原理及实践CompilerPrinciplesandPractice》美KennethC.Louden著冯博琴冯岚等译。
SuperPower8000对源代码采用了两次扫描技术:
第一遍扫描去注释、替换宏定义。
第二遍扫描是语法分析。
图4-3为本脚本编译流程简图。
图4-3脚本编译处理流程简图