STEC2000 二次开发环境说明书
硕人时代
STEC2000
控制器
用户手册
二次开发环境说明书
STEC2000 二次开发环境说明书
STEC2000二次开发环境说明书
概述
STEC 控制器的二次开发通过高效、灵活的脚本语言——SRScript来实现。 SRScript是硕人科技开放给控制工程师和二次开发用户的专用脚本语言,具有严谨的语法及规则解释,提供了从界面显示到控制状态等多种功能强大的函数及命令接口,并支持同时在实时或非实时状态下运行。使用SRScript,用户可以简单、快速的实现按自己的需求对控制器的功能进行定义。
SRScript同时也提供了强大的调试环境,开发人员可以方便的对自己的程序进行调试。
阅读对象
该说明书为控制工程师二次开发时的函数速查手册; 同时也是工程师系统了解STEC控制器二次开发支持的手册。
运行机制
SRScript 程序从运行状态上可分两类:实时脚本和非实时脚本。在控制器软件系统启动后,实时控制脚本先运行,之后非实时脚本开始运行。
下图为SRScript运行机制示意图:
STEC2000 二次开发环境说明书
² 实时脚本:分为实时控制脚本程序和虚拟通道脚本程序。
l 实时控制脚本程序在每个控制周期(STEC2000标准控制周期为200ms)
中都会被执行一次,且执行时不会被中断。因此在此脚本中实现控制器的实时性要求较高的控制策略,例如随AI/DI输入量的瞬时变化来设置AO/DO的输出值。
l 虚拟通道脚本中的输入量,如虚拟AI、DI,在控制器软件系统取虚拟通
道值时被调用,脚本程序的最后一条语句值为本虚拟通道值(返回值),执行过程也不会被中断。
l 虚拟通道脚本中的输出量,如虚拟AO,DO,在此通道输出最置值,包
括系统置值和脚本函数置值,时最调用。调用时,内置脚本变量param会被置为所设参数值。
注意:每个控制器中只能存在一个实时控制脚本程序,但可以随系统中配置
的虚拟通道数而拥有多个虚拟通道脚本程序。
² 非实时脚本:在STEC监控画面相关程序运行时被不断重复执行。可以在此脚
本程序中实现监控画面表现、人机界面交互功能和对实时性要求不高的控制策略。
脚本说明
以下内容是SRScript的详细介绍,由于非实时脚本与实时脚本在功能上及运行状态都有所不同,所以在语法上也有区别,我们对不同之处将会分别说明。
非实时、实时相同部分
常量:
脚本中支持数字常量,支持科学记数法。数字常量在内部全部作为浮点数来处理,1对应布尔型的“真”,0对应“假”。 例:以下均为合法的常数: 1.25 1 0.25 1e5
STEC2000 二次开发环境说明书
保留字:
SRScript中的保留字是指在任何脚本程序的任何地方都可以直接引用的一些特殊变量名,它对应一些常用的固定值或者是当前系统相关的变化值,如时间信息等。在命名其它变量时不能再使用保留字。SRScript中支持的保留字如下:
e 或 E:自然指数值 pi 或PI:圆周率
ShD : 这是一个内置的紧急状态的脚本变量。会在最初被设定为0。当此变量被设定为大于0.1时,系统会启动在组态环境中的停止过程脚本并停止运行。
例:某工程要求出现紧急故障时将接在AO(5,0)的蒸汽调节阀关闭,并将接在DO 0至6通道上的的泵与阀关闭。 停止过程脚本定义如下:
在实时脚本中当凝水箱水位(接在ai(3,4))过低或二次回水压力过低时,将ShD置为1,则系统会进入紧急停止状态。
STEC2000 二次开发环境说明书
变量:
脚本中变量的命名与其它高级语言基本相同,不支持下划线,必须以字母开头,可包含数字,但长度不能超过10个字符。 例:下面均为合法的变量名: OutdoorT
Supply FlagWarn X1 Y1
变量为大小写敏感;
如 supplyT 和 SupplyT 会被认为是不同的变量。
注意:
变量无需指定类型; 变量名不能与保留字冲突;
实时脚本程序中的变量可在非实时脚本程序中使用,可以认为是同一变量,而实时脚本不能引用非实时脚本的变量。 当非实时脚本执行时遇到不可识别的变量时,其与实时脚本通讯,查询实时脚本中是否有此变量,如果有,则非实时脚本将这一变量作为实时脚本的引用变量。对该变量的操作与一般没有什么不同。这一机制主要用于非实时脚本与实时脚本的通讯。例如:实现根据用户输入的值,修改供水温度设定值: TSet 是实时脚本中供水温度设定值,TInput是非实时脚本中用户的输入值。要改变供水温度的设定值,只须下面这条语句即可: TSet = TInput
表达式:
支持标准表达式,运行符函数可嵌套。 算术运算支持 符: +、-、*、/ 关系运算符:>, <, >=, <=
逻辑运算符:! ——非,& ——与, | ——或 其它运算符:(,) 注意:
为了增加实时脚本的高度可靠性,实时脚本不支持等号关系运行符。非实时脚本支持在编写实时脚本时应尽量减少嵌套。 hour*60+minute
0.5 * ai(2,0)/(tin + tout)
等号运算符,参见“非实时脚本专有语法”。 例:下面均为合法的表达式:
STEC2000 二次开发环境说明书
(di(1,0)|di(1,3))&(ai(0,0)>5.0)
程序块
条件执行块 —根据条件判断执行的语句序列 if (条件) 语句1 ……
else //可以没有
或 else if //注意 else 和 if 之间有空格 语句2 ……
endif //注意end和if之间没有空格 说明:
当条件为真(非0)时执行语句1及相应序列当条件为假(0)时执行语句2及相应序列 例:下面的程序段实现了供水温度的分段控制
if( OutdoorT > 0) if( OutdoorT > 5 ) # 5度以上时 Tset = 60
else
#0至5度时 Tset = 65 endif
else if(OutdoorT <-5) #-5度以下 Tset = 78 else
#-5到0度 Tset = 73 endif
endif
循环块 —循环执行循环体中语句序列 loop(n)
STEC2000 二次开发环境说明书
循环体语句 …… endl 说明:
直接执行循环体语句序列n次,n可以是表达式。 例:
初始化段
以 { } 包围的语句段为初始化段,在脚本程序中只能出现一次,并只会在程序初始运行时执行一次(也就是说在控制器上运行时,每重启一次控制器,这部分代码才会被执行)。这实时脚本中,这部分代码会最先执行。虚拟通道脚本中不能有初始化段,所需要的初始化工作应在实时控制脚本中的初始化段中完成。
例: 下面的非实时脚本的初始化段将保存的几个参数载入: { }
关于load 词句的使用请参看相关说明。 定时执行块
$var 语句1
… }
包括起来的脚本段将每var 秒执行一次,var可以是常量或变量。 例:下面的程序每30分钟改最一次二次供水温度的设定值: $1800
下面的非实是脚本程序在屏幕上显示插在第1槽上AI卡上各通道的值: iChn = 0 loop(8) endl end
at iChn+1,1 output(ai(1,iChn)) iChn = iChn + 1
load Tset2, ValPosSet
if(OutdoorT>0) else
Tset2 = 65
STEC2000 二次开发环境说明书
}
Tset2 = 70
Endif
函数:
l ai
格式:ai(slot,chn)
功能:取得ai卡slot槽, chn通道的模拟输入量 参数:slot—槽口号 chn—通道号
返回值:第slot槽,第chn通道对应的模拟输入量 说明:
返回值为转换后的量;
slot,chn均从0开始,可以是虚拟的槽口号,通道号 例:
下面的词句将第0槽 第2通道的转换后量赋给变量 roomT roomT = ai(0,2) l di
格式:di(slot,chn)
功能:取得di卡slot槽, chn通道的开关输入量 参数:slot—槽口号 chn—通道号 返回值:1—开 0—关 说明:
slot,chn均从0开始,可以是虚拟的槽口号,通道号 例:
设有一块DI卡插在第2槽上,其第3通道联接着低水位开关,下面的程序段实现当低水位时开启联接在第6槽第2通道的补水泵: if di(2,3) do(6,2,1) endif
do函数的用法参见do函数。 l ci
格式:ci(slot,chn)
功能:取得slot槽, chn通道的计数器输入量 参数:slot—槽口号 chn—通道号
STEC2000 二次开发环境说明书
返回值:第slot槽,第chn通道对应的计数器输入量 说明:
返回值为转换后的量;
slot,chn均从0开始,可以是虚拟的槽口号,通道号
ci 通道是可选的DI卡的前三个通道,可在组态环境中配置。 例:下面的语句将第2槽第0通道计数器测量转换后的值赋给变量flow flow = ci(2,0) l ao
格式:ao(slot,chn,v)
功能:设置ao卡slot槽, chn通道的模块输出为v 参数:slot—槽口号 chn—通道号 返回值:无 说明:
变量v乘以配置文件中相应的修正系数为最终输出值。
当该通道配置为电压输出时,v的范围是0至10,单位是伏。当该通道配置为电流输出时,v的范围是0至20,单位是毫安。 例:
设一块AO卡插在第7槽第0通道,联接在一台变频器的输入端,配置为电压输出。该变频器接受0至10伏电压输入,对应频率输出为0到50Hz,下面的词句将此变频器的频率设定为30Hz: ao(7,0,6.0) l do
格式:do(slot,chn,v)
功能:设置do卡slot槽, chn通道的模块输出 参数:slot—槽口号 chn—通道号 v—输出值 返回值:无 说明:
当v为0时通道输出置为关,当v为1时通道输出置为开 例:
设有一块DI卡插在第2槽上,其第3通道联接着低水位开关,下面的程序段实现当低水位时开启联接在第6槽第2通道的补水泵: if di(2,3) do(6,2,1) endif
do函数的用法参见do函数。 l abs
STEC2000 二次开发环境说明书
格式:abs(v)
功能:得到变量v的绝对值 参数:需要返回绝对值的变量名 返回值:变量v的绝对值 说明: l ln 格式:ln(v)
功能:返回v的自然对数 参数:v
返回值:v自然对数 说明: l log 格式:log(v) 功能:返回v的对数 参数:v 返回值:v对数 说明: l sin 格式:sin(v) 功能:正弦函数 参数:v:角度(角度制) 返回值:v的正弦 说明: l cos 格式:cos(v) 功能:余弦函数 参数:v:角度(角度制) 返回值:v的余弦 说明: l tan 格式:tan(v) 功能:正切函数 参数:v:角度(角度制)
STEC2000 二次开发环境说明书
返回值:v的正切 说明: l min 格式:min(x1,x2) 功能:返回两数的最小值 参数:x1,x2
返回值:x1,x2中的最小值 说明: l max 格式:max(x1,x2) 功能:返回两数的最大值 参数:x1,x2
返回值:x1,x2中的最大值 说明: l sqrt 格式:sqrt(v) 功能:计算数的开方 参数:v 返回值:v的开方 说明: l pow 格式:pow(x,p) 功能:指数运算 参数:x:根,p:幂 返回值:x的p次幂 说明:x和p均可为浮点数
l setidlim (ID,uppper,down)
功能:设定ID所对应的数据源(Data_tag.ID)的量程 参数:ID-表示要改变的Data_tag.ID
upper-表示上限 down-表示下限
返回值:无
说明:在组态环境中也可设置量程,此函数用于量程在控制器运行之后还需要变化的
应用。
STEC2000 二次开发环境说明书
l setwarn (ID,uppper,down)
功能:设定ID所对应的数据源(Data_tag.ID)的报警上下限。 参数:ID-表示要改变的Data_tag.ID
upper-表示上限 down-表示下限
返回值:无
说明:在组态环境中也可以设置报警上下限,此函数用于报警上下限在控制器运行之后还需要改变的场合。 l xv(index)
脚本提供1000个可供使用的通用变量,编号为0至999。通过xv函数可以得到其值。 例: xv(100)
返回第100个通用变量的值。 l sxv(index,value)
脚本提供1000个可供使用的通用变量,编号为0至999。通过sxv函数设定其值。 如:
sxv(100,12.6)将第100个通用变量的值设为12.6。
其它:
l 注释:
脚本程序的注释行以#开头,注释行中内容将不会被解析执行。本脚本只支持行注释。
l 语句:
脚本程序的每行为一条完整的执行语句,不支持换行符。每行字符个数最多为128个。脚本程序以小写 end 结束,即在所有语句之后,一定有单独的end作为终结符。
注意事项:
由于脚本在控制器上是解析运行,特别是实时控制脚本,是在实时态解析运行,因此1) 命名的变量名应尽可能的短 2) 常数尽可能短 3) 嵌套层次尽可能浅
应注意以下几点来保证脚本执行效率:
STEC2000 二次开发环境说明书
实时脚本专有部分
有部分语法和函数等只在实时部分有效,说明如下:
保留字:
err : 表示调用I/O函数后,函数执行状况。 err为0表示执行正常,不为1表示出错。 注意: err为只读保留字。不可用作它用。
该保留字不能在非实时脚本中使用。
函数:
l pidon 格式:pidon(no)
功能:设置第no路pid控制为开
参数:no—对应于组态环境中配置的pid控制路数序号,序号从1开始 返回值:无 说明:
系统运行时pid控制缺省值为打开,本函数用于打开已经确定被关闭的pid控制例: 下面的程序段实现第一路PID控制在外温(接在ai(0,0))在-5至+5内时有效。 if( ai(0,0)>5|ai(0,0)<-5) pidoff(1)
else
pidon(1) endif
l pidoff 格式:pidoff(no)
功能:设置第no路pid控制为关
参数:no—对应于组态环境中配置的pid控制路数序号, 序号从1开始 返回值:无 说明:
系统运行时pid控制缺省值为打开,本函数用于关闭打开的pid控制 例:
STEC2000 二次开发环境说明书
见pidoff 例
l pidv 格式:pidv(no,v)
功能:设置第no路pid控制值为v , 序号从1开始
参数:no—对应于组态环境中配置的pid控制序号 v—pid控制值 返回值:无 说明:
系统运行时pid控制缺省设定值为在组态环境中的设定值。可此函数可在动行过程中改变设定值。 例:
下面的语句按公式将第一个PID控制回路的设定值设定为室外温度(接在ai(0,0))的$300 } l pidcoef
格式:pidcoef(no,coefP, coefI, coefD), 序号从1开始 功能:设置第no路pid控制的比例、积分和微分系数 参数:no—对应于组态环境中配置的pid控制序号
coefP:比例系数 coefI:积分系数 coefD:微分系数 返回值:无
说明: 此函数用于运行过程中改变比例、积分和微分系数
l bvws
发布时间:2003-7-30 格式:bvws(sw)
功能:AI量和计数器量超量程时是否产生报警的开关 参数:sw—为1时产生报警,为0时不产生报警 返回值:无
说明: 此函数用于关闭或开启原始测量值超量程报警功能。
pidv(1,18+0.1*ai(0,0))
函数。
STEC2000 二次开发环境说明书
脚本命令:
l 延时赋值
功能:指定某变量值在一定时间后变为指定值。 语法格式:
变量名=值 ~ 时间延迟(单位为秒)
例如: a=17 ~ 2
变量a将在2秒钟后变为17 说明:
当同一个变量被不同的词句指定延迟赋值时,只有离现在最近时间的赋值起作用; 直接赋值语句会立即生效,并取消此变量的延迟赋值。
时间延迟小于半控制周期时,如为0时,该语句会取消之前的延时赋值,但不会改变变量的目前值。即 a=0 与 a=0~0是不等价的。
即用如 a=???~0的语句可以取消对该变量的延时赋值,但不改变量的当前值。
实时脚本注意事项:
实时脚本每控制周期执行一次(STEC2000的标准设置为200ms),执行中不会被中断; 实时脚本程序中可命名的变量个数限制为不超过128个。
非实时脚本专有部分 保留字:
year:当前日期年份 month:当前日期月份 day:当前日期天数
hour:当前时间小时数,24小时制 minute:当前时间分钟数 second:当前时间秒数
例,当前时间为2002年2月7日下午2点35分17秒时,上述各变量值分别为: year: 2002 month: 2
STEC2000 二次开发环境说明书
day: 7 hour:14 minute:35 second:17
常量:
非实时脚本程序中支持字符常量,字符常量由两个单引号括起,中间是为字符,值为ASCII码值。例如’c’就是一个合法的字符常量。
表达式:
支持等于关系运算符:::
例:下面的程序等待用户按键,用户按“a”键时,显示“1键按下”,按其它键则不显示。 InputKey = inkey() if (InputKey::'1') show 1键按下 endif
程序块:
循环语句—循环执行循环体中语句序列 while(v) 语句1 … endw 说明:
当常量或变量v为真(非0)时持续执行语句序列。 例: 下面的程序不断重复直到“0”键按下 key = ‘?’ while(!(key::’0’))
#…. endw
key = inkey() #……