SRDev编程指令使用规约F6.docx
《SRDev编程指令使用规约F6.docx》由会员分享,可在线阅读,更多相关《SRDev编程指令使用规约F6.docx(43页珍藏版)》请在冰豆网上搜索。
![SRDev编程指令使用规约F6.docx](https://file1.bdocx.com/fileroot1/2023-1/6/24faaa5b-467c-4f8a-9340-5b0327126e48/24faaa5b-467c-4f8a-9340-5b0327126e481.gif)
SRDev编程指令使用规约F6
F6
SRDev编程指令使用规约
1.STEC编程概念
建议用户在看此章前首先了解本书前几章内容,并了解有关STEC控制器的资料。
STEC控制器的二次开发通过高效、灵活的脚本语言——SRScript来实现。
SRScript是北京硕人时代科技有限公司开放给控制工程师和二次开发用户的专用脚本语言,具有严谨的语法及规则解释,提供了从界面显示到控制状态等多种功能强大的函数及命令接口,并支持同时在实时或非实时状态下运行。
使用SRScript,用户可以简单、快速的实现按自己的需求对控制器的功能进行定义。
SRScript同时也提供了强大的调试环境,开发人员可以方便的对自己的程序进行调试。
SRScript脚本语句很接近与高级语言BASIC,在脚本中所有定义的变量类型均为通用变量,用户不用关注变量的类型。
SRScript程序从运行状态上可分三类:
实时脚本、非实时脚本和通讯脚本。
在控制器软件系统启动后,三类脚本将自动开始执行。
1.1理解程序扫描周期:
STEC标准控制周期为200ms,可通过setcp(x)改变扫描周期,在每个扫描周期的开始控制器都会指向程序的首端执行指令,一个扫描周期结束后将完成一次控制任务。
实时控制脚本程序在每个控制周期中都会被执行一次,且执行时不会被中断。
因此在此脚本中实现控制器的实时性要求较高的控制策略,例如随AI/DI输入量的瞬时变化来设置AO/DO的输出值。
虚拟通道脚本程序在控制器软件系统取虚拟通道值时被调用,脚本程序的最后一条语句值为本虚拟通道值(返回值),执行过程也不会被中断。
虚拟通道脚本程序可以编写多个。
非实时脚本:
在STEC监控画面相关程序运行时被不断重复执行。
可以在此脚本程序中实现监控画面表现、人机界面交互功能和对实时性要求不高的控制策略,程序的扫描周期是变化的。
1.2运行机制
SRScript程序从运行状态上可分两类:
实时脚本和非实时脚本。
在控制器软件系统启动后,实时控制脚本先运行,约1秒之后非实时脚本开始运行。
下图为SRScript运行机制示意图:
✧实时脚本:
分为实时控制脚本程序和虚拟通道脚本程序。
●实时控制脚本程序在每个控制周期(STEC2000标准控制周期为200ms)中都会被执行一次,且执行时不会被中断。
因此在此脚本中实现控制器的实时性要求较高的控制策略,例如随AI/DI输入量的瞬时变化来设置AO/DO的输出值。
●虚拟通道脚本中的输入量,如虚拟AI、DI,在控制器软件系统取虚拟通道值时被调用,脚本程序的最后一条语句值为本虚拟通道值(返回值),执行过程也不会被中断。
●虚拟通道脚本中的输出量,如虚拟AO,DO,在此通道输出设置值(包括系统置值和脚本函数置值)时被调用。
调用时,内置脚本变量param会被置为所设参数值。
注意:
每个控制器中只能存在一个实时控制脚本程序,但可以随系统中配置的虚拟通道数而拥有多个虚拟通道脚本程序。
✧非实时脚本:
在STEC监控画面相关程序运行时被不断重复执行。
可以在此脚本程序中实现监控画面表现、人机界面交互功能和对实时性要求不高的控制策略。
1.3脚本说明
以下内容是SRScript的详细介绍,由于非实时脚本与实时脚本在功能上及运行状态都有所不同,所以在语法上也有区别,我们对不同之处将会分别说明。
1.4非实时、实时相同部分1.4.1常量:
脚本中支持数字常量,支持科学记数法。
数字常量在内部全部作为浮点数来处理,1对应布尔型的“真”或“开”,0对应“假”或“关”。
例:
以下均为合法的常数:
1.2510.251e5
1.4.2保留字:
SRScript中的保留字是指在任何脚本程序的任何地方都可以直接引用的一些特殊变量名,它对应一些常用的固定值或者是当前系统相关的变化值,如时间信息等。
在命名其它变量时不能再使用保留字。
SRScript中支持的保留字如下:
e或E:
自然指数值
pi或PI:
圆周率
1.4.3变量:
脚本中变量的命名与其它高级语言基本相同,但不支持下划线,必须以字母开头,可包含数字,但长度不能超过10个字符。
例:
下面均为合法的变量名:
OutdoorT
Supply
FlagWarn
X1
Y1
注意:
♦变量为大小写敏感;
如supplyT和SupplyT会被认为是不同的变量。
♦变量无需指定类型;
♦变量名不能与保留字冲突;
♦实时脚本程序中的变量可在非实时脚本程序中使用,可以认为是同一变量,而实时脚本不能引用非实时脚本的变量。
当非实时脚本执行时遇到不可识别的变量时,其与实时脚本通讯,查询实时脚本中是否有此变量,如果有,则非实时脚本将这一变量作为实时脚本的引用变量。
对该变量的操作与一般没有什么不同。
这一机制主要用于非实时脚本与实时脚本的通讯。
例如:
实现根据用户输入的值,修改供水温度设定值:
TSet是实时脚本中供水温度设定值,TInput是非实时脚本中用户的输入值。
要改变供水温度的设定值,只须下面这条语句即可:
TSet=TInput
1.4.4表达式:
支持标准表达式,运行符函数可嵌套。
算术运算支持符:
+、-、*、/
关系运算符:
>,<,>=,<=
逻辑运算符:
!
——非,&——与,|——或
其它运算符:
(,)
例:
下面均为合法的表达式:
hour*60+minute
0.5*ai(2,0)/(tin+tout)
(di(1,0)|di(1,3))&(ai(0,0)>5.0)
注意:
为了增加实时脚本的高度可靠性,实时脚本不支持等号关系运行符。
非实时脚本支持等号运算符,参见“非实时脚本专有语法”。
在编写实时脚本时应尽量减少嵌套。
1.4.5程序块
条件执行块—根据条件判断执行的语句序列
if(条件)
语句1
……
else//可以没有
或elseif//注意 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)
循环体语句
……
endl
说明:
直接执行循环体语句序列n次,n可以是表达式。
例:
下面的非实时脚本程序在屏幕上显示插在第1槽上AI卡上各通道的值:
iChn=0
loop(8)
atiChn+1,1
output(ai(1,iChn))
iChn=iChn+1
endl
end
1.4.6初始化段
以{}包围的语句段为初始化段,在脚本程序中只能出现一次,并只会在程序初始运行时执行一次,也就是说在控制器上运行时,每重启一次控制器,这部分代码才会被执行。
在实时脚本中,这部分代码会最先执行。
虚拟通道脚本中不能有初始化段,所需要的初始化工作应在实时控制脚本中的初始化段中完成。
例:
下面的非实时脚本的初始化段将保存的几个参数载入:
{
loadTset2,ValPosSet
}
关于load词句的使用请参看相关说明。
1.4.7定时执行块
$var
语句1
…
}
包括起来的脚本段将每var秒执行一次,var可以是常量或变量。
例:
下面的程序每30分钟改变一次二次供水温度的设定值:
$1800
if(OutdoorT>0)
Tset2=65
else
Tset2=70
Endif
}
实时脚本中的周期性执行块不能有条件扫描,否则行为会不确定,这可能会造成$执行失效,必须保证这个段每次扫描都扫描到。
如下面这段:
if(kzcl>0)
$cycle
dT=t2g-trueT
aT=abs(dT)
}
endif
应改为
$cycle
if(kzcl>0)
dT=t2g-trueT
aT=abs(dT)
endif
}
1.4.8函数:
●ai
格式:
ai(slot,chn)
功能:
取得ai卡slot槽,chn通道的模拟输入量
参数:
slot—槽口号chn—通道号
返回值:
第slot槽,第chn通道对应的模拟输入量
说明:
返回值为转换后的量;
slot,chn均从0开始,可以是虚拟的槽口号,通道号
例:
下面的词句将第0槽第2通道的转换后量赋给变量roomT
roomT=ai(0,2)
●di
格式:
di(slot,chn)
功能:
取得di卡slot槽,chn通道的开关输入量
参数:
slot—槽口号chn—通道号
返回值:
1—开0—关
说明:
slot,chn均从0开始,可以是虚拟的槽口号,通道号
例:
设有一块DI卡插在第2槽上,其第3通道联接着低水位开关,下面的程序段实现当低水位时开启联接在第6槽第2通道的补水泵:
ifdi(2,3)
do(6,2,1)
endif
do函数的用法参见do函数。
●ci
格式:
ci(slot,chn)
功能:
取得slot槽,chn通道的计数器输入量
参数:
slot—槽口号chn—通道号
返回值:
第slot槽,第chn通道对应的计数器输入量
说明:
返回值为转换后的量;
slot,chn均从0开始,可以是虚拟的槽口号,通道号
ci通道是可选的DI卡的前三个通道,可在组态环境中配置。
例:
下面的语句将第2槽第0通道计数器测量转换后的值赋给变量flow
flow=ci(2,0)
●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)
●do
格式:
do(slot,chn,v)
功能:
设置do卡slot槽,chn通道的模块输出
参数:
slot—槽口号chn—通道号v—输出值
返回值:
无
说明:
当v为0时通道输出置为关,当v为1时通道输出置为开
例:
设有一块DI卡插在第2槽上,其第3通道联接着低水位开关,下面的程序段实现当低水位时开启联接在第6槽第2通道的补水泵:
ifdi(2,3)
do(6,2,1)
endif
do函数的用法参见do函数。
●abs
格式:
abs(v)
功能:
得到变量v的绝对值
参数:
需要返回绝对值的变量名
返回值:
变量v的绝对值
说明:
●ln
格式:
ln(v)
功能:
返回v的自然对数
参数:
v
返回值:
v自然对数
说明:
●log
格式:
log(v)
功能:
返回v的对数
参数:
v
返回值:
v对数
说明:
●sin
格式:
sin(v)
功能:
正弦函数
参数:
v:
角度(角度制)
返回值:
v的正弦
说明:
●cos
格式:
cos(v)
功能:
余弦函数
参数:
v:
角度(角度制)
返回值:
v的余弦
说明:
●tan
格式:
tan(v)
功能:
正切函数
参数:
v:
角度(角度制)
返回值:
v的正切
说明:
●min
格式:
min(x1,x2)
功能:
返回两数的最小值
参数:
x1,x2
返回值:
x1,x2中的最小值
说明:
●max
格式:
max(x1,x2)
功能:
返回两数的最大值
参数:
x1,x2
返回值:
x1,x2中的最大值
说明:
●sqrt
格式:
sqrt(v)
功能:
计算数的开方
参数:
v
返回值:
v的开方
说明:
●pow
格式:
pow(x,p)
功能:
指数运算
参数:
x:
根,p:
幂
返回值:
x的p次幂
说明:
x和p均可为浮点数
●setidlim(ID,uppper,down)
功能:
设定ID所对应的数据源(Data_tag.ID)的量程
参数:
ID-表示要改变的Data_tag.ID
upper-表示上限
down-表示下限
返回值:
无
说明:
在组态环境中也可设置量程,此函数用于量程在控制器运行之后还需要变化的应用。
●setwarn(ID,uppper,down)
功能:
设定ID所对应的数据源(Data_tag.ID)的报警上下限。
参数:
ID-表示要改变的Data_tag.ID
upper-表示上限
down-表示下限
返回值:
无
说明:
在组态环境中也可以设置报警上下限,此函数用于报警上下限在控制器运行之后还需要改变的场合。
●setcp(down)
功能:
设定控制器实时脚本与非实时脚本的扫描周期。
参数:
down-表示要改变的扫描周期数量,最小不能小于20ms
返回值:
无
说明:
此函数只能再实时脚本与非实时脚本的初始化段中使用,不得放入初始化段以后的代码。
举例:
{
setcp(100)
}
说明把实时脚本扫描周期从默认200ms改变为100ms
1.4.9注释:
脚本程序的注释行以#开头,注释行中内容将不会被解析执行。
本脚本只支持行注释。
1.4.9.1语句:
脚本程序的每行为一条完整的执行语句,不支持换行符。
每行字符个数最
多为128个。
脚本程序以小写end结束,即在所有语句之后,一定有单独的end作为终结符。
注意事项:
由于脚本在控制器上是解析运行,特别是实时控制脚本,是在实时态解析运行,因此应注意以下几点来保证脚本执行效率:
1)命名的变量名应尽可能的短
2)常数尽可能短
3)嵌套层次尽可能浅
1.5实时脚本专有部分
有部分语法和函数等只在实时部分有效,说明如下:
1.5.1函数:
●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
●pidoff
格式:
pidoff(no)
功能:
设置第no路pid控制为关
参数:
no—对应于组态环境中配置的pid控制路数序号,序号从1开始
返回值:
无
说明:
系统运行时pid控制缺省值为打开,本函数用于关闭打开的pid控制
例:
见pidoff例
●pidv
格式:
pidv(no,v)
功能:
设置第no路pid控制值为v,序号从1开始
参数:
no—对应于组态环境中配置的pid控制序号v—pid控制值
返回值:
无
说明:
系统运行时pid控制缺省设定值为在组态环境中的设定值。
此函数可在运行过程中改变设定值。
例:
下面的语句按公式将第一个PID控制回路的设定值设定为室外温度(接在ai(0,0))的函数。
$300
pidv(1,18+0.1*ai(0,0))
}
●pidcoef
格式:
pidcoef(no,coefP,coefI,coefD),序号从1开始
功能:
设置第no路pid控制的比例、积分和微分系数
参数:
no—对应于组态环境中配置的pid控制序号
coefP:
比例系数
coefI:
积分系数
coefD:
微分系数
返回值:
无
说明:
此函数用于运行过程中改变比例、积分和微分系数
1.5.2脚本命令:
●延时赋值
功能:
指定某变量值在一定时间后变为指定值。
语法格式:
变量名=值~时间延迟(单位为秒)
例如:
a=17~2
变量a将在2秒钟后变为17
说明:
当同一个变量被不同的词句指定延迟赋值时,只有离现在最近时间的赋值起作用;
直接赋值语句会立即生效,并取消此变量的延迟赋值。
实时脚本注意事项:
♦实时脚本每控制周期执行一次(STEC2000的标准设置为200ms),执行中不会被中断;
♦实时脚本程序中可命名的变量个数限制为不超过128个。
♦如果实时脚本程序过长或过于复杂,其执行时间超过控制周期时,会造成下一次执行的时间延时。
1.6非实时脚本专有部分
1.6.1保留字:
year:
当前日期年份
month:
当前日期月份
day:
当前日期天数
hour:
当前时间小时数,24小时制
minute:
当前时间分钟数
second:
当前时间秒数
例,当前时间为2002年2月7日下午2点35分17秒时,上述各变量值分别为:
year:
2002
month:
2
day:
7
hour:
14
minute:
35
second:
17
1.6.2常量:
非实时脚本程序中支持字符常量,字符常量由两个单引号括起,中间是为字符,值为ASCII码值。
例如’c’就是一个合法的字符常量。
1.6.3表达式:
支持等于关系运算符:
:
:
例:
下面的程序等待用户按键,用户按“a”键时,显示“1键按下”,按其它键则不显示。
InputKey=inkey()
if(InputKey:
:
'1')
show1键按下
endif
1.6.4程序块:
循环语句—循环执行循环体中语句序列
while(v)
语句1
…
endw
说明:
当常量或变量v为真(非0)时持续执行语句序列。
例:
下面的程序不断重复直到“0”键按下
key=‘?
’
while(!
(key:
:
’0’))
key=inkey()
#……
#….
endw
1.6.5函数:
●color
格式:
color(r,g,b)
功能:
指定当前前景色
参数:
r—红色色值g—绿色色值b—蓝色色值
返回值:
无
说明:
r,g,b参数的取值范围为0—255;
当前前景色设置影响之后所有的绘图操作。
缺省的前景色为兰色,对应r,g,b分别为0,0,255。
改变前景色可改变包括字符在内的颜色。
注意:
虽然颜色参数的范围是0至255,由于彩色显示面板本身颜色数的限制,颜色可能会失真。
●colorf
格式:
colorf(r,g,b)
功能:
指定当前填充色
参数:
r—红色色值g—绿色色值b—蓝色色值
返回值:
无
说明:
r,g,b参数的取值范围为0—255;
当前填充设置影响之后所有的绘图的填充操作,但目前版本的文本输出的背景色固定为黑色。
缺省的填充色为黑色。
●format
格式:
format(len,decimal)
功能:
设定当前数据输出格式
参数:
len—输出格式长度decimal—输出小数点位数
返回值:
无
说明:
函数执行后数据输出格式将不会再改变,直到下一次设定时为止
例:
下面的语句将输出格式设定为总长为名,小数点后位数为2:
format(7,2)
●output
格式:
output(v)
功能:
在当前绘图位置显示表达式v
参数:
v—需要显示的变量
返回值:
无
说明:
可用at和atp命令行改变当前绘图位置。
输出格式用format函数设定。
●moveto
格式:
moveto(x,y)
功能:
移动当前绘图坐标起始点到(x,y)
参数:
x,y—坐标点,从0开始,范围为x:
[0,319],y:
[0,239]
返回值:
无
说明:
x,y值可以为0,单位为象素
●lineto
格式:
lineto(x,y)
功能:
从当前绘图坐标起始点绘制线段到(x,y)并设定绘图坐标起始点为(x,y)
参数:
x,y—坐标点,从0开始,范围为x:
[0,319],y[0,239]
返回值:
无
说明:
x,y值可以为0,单位为象素;
函数执行后当前绘图坐标起始点变为(x,y);
线段颜色为当前前景色。
●rect
格式:
rect(x,y,width,height,bFill,lineWidth)
功能:
以坐标(x,y)为左上顶点绘制矩形
参数:
x,y—坐标点,从0开始,范围为x:
[0,319],y[0,239]
width—矩形宽height—矩形高
bFilll—是否填充lineWidth—边框宽度
返回值:
无
说明:
x,y值可以为0,单位为象素;
x,y为矩形的左上角坐标点;
矩形边框颜色为当前前景色,如果bFill不为0则以当前填充色填充所绘制矩形。
●circle
格式:
circle(x,y,radius,bFill,lineWidth)
功能:
以坐标(x,y)为圆心绘制圆
参数:
x,y—坐标点radius—圆半径
bFilll—是否填充lineWidth—边宽度
返回值:
无
说明:
x,y值可以为0,单位为象素;
圆边颜色为当前前景色,如果bFill不为0则以当前填充色填充所绘制圆。
●input
格式:
input(len)
功能:
在当前绘图坐标点等待输入
参数:
len—等待输入长度
返回值:
输入的字符串或浮点数
说明:
本函数为阻塞方式运行;
输入内容将会在当前绘图坐标点显示;
回车键表示输入完成,最长输入字符个数为len。
●inkey
格式:
inkey()
功能:
等待按键输入
参数:
无
返回值:
输入的按键值
说明:
本函数为阻塞方式运行;
输入的按键不会显示在当前界面中。
注意这是一个阻塞方式运行的函数,执行这一函数时界面会完全停止下来。
应特别提示用户必须操作完成再离开。
●viewno
格式:
viewno()
功能:
返回当前显示监控界面在组态环境中组态的序号
参数:
无
返回值:
组态环境中对应当前监控界面的组态序号1至6,当前显示的画面是主界面(组态配置的顶级菜单)时,返回0。
说明:
序号取值从1开始。
在组态环境中配置的监控画面与非实时脚本是共同运行的。
系统在刷新组态生成的监控画面的同时运行非实时脚本。
非实时脚本通过viewno()函数可以知道当前所显示的组态生产的监控画面是第几个,并由此决定执行哪部分程序。
例:
下面的程序在显示组态的第二个监控画面上显示流动的动画效果:
{
clip=1
}
ifviewno():
:
2
at8,8
ifclip>2
clip=0
endif
clip=clip+1
if(clip:
:
1)
show[******]