基本运算符与表达式.docx
- 文档编号:26658649
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:16
- 大小:23.89KB
基本运算符与表达式.docx
《基本运算符与表达式.docx》由会员分享,可在线阅读,更多相关《基本运算符与表达式.docx(16页珍藏版)》请在冰豆网上搜索。
基本运算符与表达式
POWERCOMM2000基本运算符与表达式
一、概述
为满足电力系统运行的需要,本系统提供了各种不同运算的符号称为运算符,参加运算的数据称为运算量或操作数,用运算符把运算量连接起来的式子称为表达式。
Exp表达式基于预编译-动态执行模式,用户可以联机在线修改,系统检查语法无误后,表达式立即生效,参加主机运算。
这种方法比用编程实现某一特定计算功能的作法,其优越之处是不言而喻的,它的执行速度大大高于解释-执行模式的方法,其灵活性也高于编译模式,因而是实时系统理想的计算工具。
Exp表达式按功能可分为算术运算、关系运算和逻辑运算。
Exp表达式不仅提供加、减、乘、除、乘方、开方、逻辑关系判断等运算,还能进行if-then-else运算,加上表达式提供了对各类实时数据、历史数据及统计数据的存取调用,就使得系统能够方便灵活地满足各种针对电力系统实际需要的具体要求,而不需要修改应用程序。
如在线线损分析,功率因数计算,电容器自动投切统计等均可由用户根据实际情况灵活组织表达式来实现。
二、表达式的引用方法
本系统中的Exp表达式与计算量点是一一对应,每一个计算量点都有一个“表达式”定义项,由该表达式计算所得的结果就是该计算量点的值。
计算量点(表达式)的计算时间周期可以调整,满足各种实时计算的需要,计算量点与遥测量一样具有越限处理、合格率统计、历史记录等功能。
三、表达式的语法定义
Exp.表达式采用运算符优先策略,允许递归嵌套组合调用。
运算符分为单目和双目运算两种,优先级共分10级,数值越大,参加运算时的优先级越高。
优先级
运算类型
0
true/false(t./f.)
函数调用,如(pntval())等
1
空(预留)
2
空(预留)
3
逻辑或(.or.)
4
逻辑与(.and.)
5
逻辑非(.not.)
6
等于(=),不等于(#,<>)
大于等于(>=),小于等于(<=)
大于(>),小于(<)
7
加(+),减(-)
8
乘(*),除(/)
9
乘方/开方(**,^)
PowerComm2000的标识符说明:
xxxa(d,n,y,o)yyyy,前面3位xxx表示站号,接着就是测点类型,a表示遥测量,d表示遥信量,n表示计算表达式,y表示电度量,o表示离线遥信量,后面的4位yyyy表示的是点号。
如:
1a1表示的是1号站的1号遥测点
2d100表示的是2号的100号遥信点。
Exp表达式包括算术运算、关系运算、逻辑运算和内部函数四个部分,下面将详细介绍各个表达式语法定义。
3.1算术运算表达式
3.1.1加法运算(+)
举例:
pntval("01a001")+1
解释:
遥测一号站一号点工程值加上1。
3.1.2减法运算(-)
举例:
pntval("01a001")-2
解释:
遥测一号站一号点工程值减去2。
3.1.3乘法运算(*)
举例:
pntval("01a001")*1.5
解释:
遥测一号站一号点工程值乘以1.5。
3.1.4除法运算(/)
举例:
pntval("01a001")/10
解释:
遥测一号站一号点工程值除以10。
3.1.5乘方/开方运算(**或^)
举例:
pntval("01a001")**3
解释:
遥测一号站一号点工程值乘3次方。
举例:
pntval("01a001")**(1/2)
解释:
遥测一号站一号点工程值开2次方。
3.2关系运算表达式
3.2.1if-then-else条件判断——iif(表达式1,表达式2,表达式3)
说明:
如果表达式1的值为真,本iif()表达式取表达式2的值,否则,取表达式3的值。
举例:
iif(pntval("01a001")>10,pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值大于10,本iif()表达式取遥测一号站二号点工程值,否则,取遥测一号站三号点工程值。
3.2.2不等于条件判断(#或<>)
举例:
iif(pntval("01a001")<>1,pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值不等于1,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.2.3大于等于条件判断(>=)
举例:
iif(pntval("01a001")>=10,pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值大于等于10,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.2.4小于等于条件判断(<=)
举例:
iif(pntval("01a001")<=10,pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值小于等于10,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.2.5等于条件判断(=)
举例:
iif(pntval("01a001")=10,pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值等于10,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.2.6大于条件判断(>)
举例:
iif(pntval("01a001")>10,pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值大于10,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.2.7小于条件判断(<)
举例:
iif(pntval("01a001")<10,pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值小于10,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.3逻辑运算表达式
3.3.1逻辑与(.and.)
举例:
iif((pntval("01a001")<100).AND.(pntval("01a002")=200),
pntval("01a002"),pntval("01a003")
解释:
如果遥测一号站一号点工程值小于100且遥测一号站二号点工程值等于200,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.3.2逻辑或(.or.)
举例:
iif((pntval("01a001")<100).OR.(pntval("01a002")=200),
pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值小于100或遥测一号站二号点工程值等于200,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.3.3逻辑非.not.
举例:
iif(.NOT.(pntval("01a001")=100),pntval("01a002"),pntval("01a003"))
解释:
如果遥测一号站一号点工程值不等于100,本iif()表达式取遥测一号站二号点工程值,否则取遥测一号站三号点工程值。
3.4有关时间表达式的内部函数
3.4.1ctod("JULIAN时间串")
说明:
输入JULIAN时间串,输出YYYYMMDD时间串
举例:
ctod("09/02/95")
解释:
输出"19950902"字串,表示1995年09月02日。
3.4.2date("POWERCOMM2000系统时间串:
cc/cc/cc")
说明:
输入系统时间串,输出JULIAN时间
举例:
ctod(date("cc/cc/cc"))-ctod(date("96/02/01"))
解释:
计算从1996年2月1日起至今日的累计天数。
3.4.3hour("POWERCOMM2000系统时间串:
cc/cc/cc_cc:
cc")
说明:
输入系统时/分表示串,输出小时数
举例:
hour("cc/cc/cc_cc:
cc")
解释:
如果当前时间为16:
45,输出16。
3.4.4minute("POWERCOMM2000系统时间串:
cc/cc/cc_cc:
cc")
说明:
输入系统时/分表示串,输出分钟数
举例:
minute("cc/cc/cc_cc:
cc")
解释:
如果当前时间为16:
45,返回45。
3.4.5second()
说明:
无须输入参数,将当前系统时间的秒读出,输出浮点数(0~59)即当前秒。
3.5常用内部函数
3.5.1pntval("POWERCOMM2000系统点标识符"),getval("POWERCOMM2000系统点标识符")
说明:
输入点标识符,给出该点的工程值。
这两个函数的作用是一样的。
输入:
"01a001"格式的PID
输出:
浮点数
举例:
pntval("01a002")
解释:
取遥测一号站二号点工程值。
3.5.2setval("POWERCOMM2000系统点标识符",浮点数)
说明:
输入点标识符,将浮点数设置进该点的工程值。
输入:
参数1--PID格式的点标识符,参数2--浮点数
输出:
浮点数
举例:
setval("01a002",pntval("01n001"))
解释:
将计算量一号站一号点的工程值赋给遥测一号站二号点。
举例:
setval("02d001",1)
解释:
将二号站一号遥信点置为合位置
(1)。
3.5.3abs(表达式)
说明:
取表达式值的绝对值
举例:
abs(-6)
解释:
计算结果为6。
3.5.4ontime("属性:
?
",表达式1,表达式2)
说明:
如果当前系统时间满足属性条件,则ontime()表达式取表达式1的值,否则取表达式2的值
属性:
1,表示整点钟;2,表示整天;3,表示整月;4,表示整季度;5,表示整年。
举例:
ontime("3",0,pntval("01n010")+pntval("01n009"))
解释:
在某个月内,本ontime()表达式取计算量一号站十号点加上计算量一号站九号点的和,即pntval("01n010")+pntval("01n009")。
当该月已经结束下月刚开始的时候,本ontime()表达式第一次计算时取0值。
ontime()主要用于从某一新时段开始需要清零的场合。
3.5.5INT(浮点数)
说明:
四舍五入取整
举例:
INT(2.3)
解释:
计算结果为2
举例:
INT(-2.8)
解释:
计算结果为-3)
3.5.6FIX(浮点数)
说明:
取纯整数部分
举例:
FIX(2.318)
解释:
计算结果为2
举例:
FIX(-2.888)
解释:
计算结果为-2
3.5.7TAIL(浮点数)
说明:
取小数点后面部分
举例:
TAIL(2.318)
解释:
计算结果为0.318
举例:
TAIL(-2.888)
解释:
计算结果为0.888
3.5.8取出月最大值、最大值时间的表达式:
(1)取最大值:
定义(01N001)
iif(pntval(“01n001”)>pntval(“01a001”),pntval(“01n001”),pntval(“01a001”))
(2)最大值清零定义(01N002)
ontime(“3”,0,pntval(“01n001”))
(3)取最大值时间:
定义(01N003)
iif(pntval(“01n001”)=pntval(“01a001”),timet(),pntval(“01n003”))
(4)最大值时间清零定义(01N004)
ontime(“3”,timt(),pntval(“01n003”))
3.5.9putvalanyway("xxdxxx",状态值)
说明:
输入遥信点标识符,将状态值设置进该点的工程值,不管该点是否被设置为点使能.
输入:
参数1--PID格式的遥信点标识符;参数2—状态值
输出:
状态值
举例:
putvalanyway("02d001",1)
解释:
将二号站一号遥信点置为合位置
(1)。
3.5.10取实时数据的属性值(数值)rtdbattr(“pid”,”attr_name”);
输入:
参数1(字串)—pid需要取值的实时数据点的pid字符串;参数2(字串)—attr_name属性标识名字串。
3.5.11设置实时数据的属性值(数值)setattr(“pid”,”attr_name”,”szval”)
输入:
参数1(字串)—pid需要取值的实时数据点的pid字符串;参数2(字串)—attr_name属性标识名字串。
与结构中的名称相同,目前仅允许设置遥测点的上下限;参数3(字串)—szval设置的数值。
3.6旁路转代函数
3.6.1检测旁路转代:
chksubs(intinteger,"(a1,a3),(y4,y100)");
输入:
参数1--转代触发条件,参数2--转代对集合
输出:
表达式的取值等于第一个参数的值.
说明:
转代对由两个pid组成,用","隔开,且放置在"("和")"内,相邻转代对之间用","隔开。
转代对中第一个pid为转代点,即当转代条件成立时,使用该pid测点的值顶替第二个pid测点的值;转代对中第二个pid为被转代点,即当转代条件成立时,使用该pid测点的值被第一个pid测点的值顶替;pid对最大不能超过32个。
如果参数2不符合规格,则将不作任何事情,只对那些合法的pid对作自动转代操作
举例:
chksubs(pntval("1d1")*pntval("1d5"),"(1a1,1a3),(1y4,1y100)");
解释:
1d1和1d5两个遥信点的值都等于1时,1a1测点的值替换1a3测点的值,1y4测点的值去替换1y100测点的值.
3.6.2新的旁路转代函数simple_pi_subs(intinteger,”1a1”,”1b1”,”1c1”,”1d1”)
输入:
参数1--转代触发条件;参数2--转代点pid;参数3--被转代点pid;参数4--转代电量累加值存储点pid;参数5--转代时间(以分钟为单位)累计值pid。
输出:
等于参数1的值。
说明:
采用chksubs()函数,在处理PI点时采用增量叠加的方式,将转代点的增量值叠加到被转代点上;而simple_pi_subs()提供的不是采用增量叠加方法,而是将转代电量(即电度增量)保存于指定的虚拟PI点,并且将转代时间(以分钟为单位)保存到另一个虚拟PI点。
注意:
参数4、参数5是为了处理电度量旁路转代而设立的虚拟PI点,该类型的PI点应该配置到与转代点、被转代点相同站,而且必须位于所有实际采集PI点后;独立保存转代电量及转代时间(以分钟为单位)
举例:
simple_pi_subs(pntval("1d1")*pntval("1d5"),"1y1","1y3","1y90","1y91");
解释:
1d1和1d5两个遥信点的值都为真时,1y1电度量点转代1y3电度量点,转代电量累加值保存于1y90点,转代时间(以秒为单位)累加值保存于1y91点。
新旁路转代(simple_pi_subs())的工程实现方法:
A)在需要旁路转代的站的计算量中,定义一个计算量点,将其表达式按simple_pi_subs()的用法说明加以定义;
B)将指定用于保存转代电量累加和转代时间累加的PI点定义为历史记录点;
C)需要统计转代电量、时间数据时,使用历史数据计算出相应值。
需更新文件:
SCADA_ROOT\bin\cal.dll、SCADA_ROOT\bin\Rtdb.dll、SCADA_ROOT\bin\dbstudio.exe
3.6.3完整模式旁路转代(pi_subs(intinteger,”1a1”,”1b1”))
说明:
逐次记录实际发生的旁路转代事件,并保存到关系数据库;按月创建虚拟旁路转代记录,以供统计使用;
输入:
参数1--转代触发条件;参数2--转代点pid;参数3--被转代点pid。
输出:
函数返回值为表达式1的值。
举例:
pi_subs(pntval("1d1")*pntval("1d5"),"1y1","1y3");
解释:
1d1和1d5两个遥信点的值都为真时,1y1电度量点转代1y3电度量点。
完整模式旁路转代(pi_subs())的工程实现方法:
A)按pi_subs()函数使用说明配置相关计算量点;
B)从关系数据库中读取符合条件的记录,以用于报表或其它。
3.6.4三种旁路转代函数的适用范围
chksubs()
simple_pi_subs()
pi_subs()
替换/增量叠加模式;AI;PI;无需统计给定时间的转代电量及转代时间
独立保存转代电量及转代时间(以分钟为单位);转代电量未叠加到被转代点
独立、完整实现模式,独立保存转代电量及起止时间、且无需依赖于虚拟PI点。
3.7其它函数
3.7.1光子牌闪烁计数器表达式函数flickcounter("d1,d2,n3")
输入:
由被逗号','隔开的pid字符串序列构成的字符串,其中pid个数不能超过256个。
输出:
等于所有点的闪烁计数值的和。
说明:
对于遥测点,其闪烁计数值等于工程值取整;
对于遥信点,其闪烁计数值由Alarm_Ack决定,Alarm_Ack非0,表示确认了,闪烁计数值等于0;Alarm_Ack等于0,表示未被确认,闪烁计数值等于1;
对于计算量点,其闪烁计数值等于其工程值取整;
对于电度量点,其闪烁计数值等于其工程值取整;
对于离线遥信点,其闪烁计数值由其状态确定,分状态:
计数值等于0;合状态:
计数值等于1。
函数将忽略那些无效的pid。
举例:
flickcounter("1d1,1d2,5n3")
解释:
取1d1,1d2,5n3的光子牌闪烁计数值的和。
3.7.2计划值表达式schedule(“pid”,”cc/cc/x”,”file_name”)
说明:
大约,每十分钟运行一次,实现将计划值保存到历史库,显示计划值时就用现有曲线
输入:
参数1(字串)—PID字串,保存计划值的测点,可以保存计划值、上限、下限等的测点;
参数2(字串)—时间字串,将计划值保存在哪一天,为了方便,建议将计划值保存在昨天使用"cc/cc/-1"字串即可;参数3(字串)—计划值文件名,计划值文件,不带路径名,放在data目录。
3.7.3取计划值表达式的某个时间点的设定值scheduleval(”cc/cc/cc”,”file_name”)
说明:
用户根据需要确定运行时间间隔,本表达式最快一分钟运行一次,否则会浪费资源。
输入:
参数1(字串)—时间字串,取哪个时间点的计划值;
参数2(字串)—计划值文件名,计划值文件,不带路径名,放在data目录。
3.7.4播放指定的声音文件sound(float,”sound_file”)
输入:
参数1(浮点数)—播放声音的条件,为0时不播放声音,非零时就将声
音文件加入报警队列;参数(字串)—声音文件名,不包含路径名称,默认路径是SCADA_ROOT下的wave目录。
3.7.5跳指定的画面文件jumpgraph(float,”graph_file”)
输入:
参数1(浮点数)—跳画面的条件,为0时不播放声音,非零时就将声音
文件加入报警队列;
参数2(字串)—画面文件名,不包含路径名称,默认路径是SCADA_ROOT下的wave目录。
3.7.6取标准C的时间函数Timet()
3.7.7正弦函数Sin()
3.7.8余弦函数Cos()
3.7.9正切函数Tan()
3.7.10反正弦函数Asin()
3.7.11反余弦函数Acos()
3.7.12反正切函数Atan()
3.7.13取模函数Mod()
四、列举表达式的一些用例
4.1计算功率因素
已知某线路有功PID号为”01a001”,无功PID号为”01a002”,要求计算出该线路功率因素,计算表达式为:
(pntval(“01a001”)**2+pntval(“01a002”)**2)**(1/2)
4.2根据有功计算累计电度
已知有功PID号为”01a001”(单位为Kw),要求计算该点当月累计电度(单位为Kwh),计算表达式的PID号为”01n001”,计算周期为3秒。
ontime(3,0,pntval(“01n001”)+pntval(“01a001”)/1200)
4.3计算安全天数;
已知安全天数起始计算日期为”2004/01/01”,计算当天的累计安全运行天数
计算表达式为:
ctod(date("cc/cc/cc"))-ctod(date("04/01/01"))
4.4更改测点上下限值
已知电压点PID号为”01a001”,要求夏秋季节电压上限为120,冬春季节的电压上限值为125;
原理:
在每年的4月1日和10月1日零点分别改变测点限值,因此两个计算表达式来实现:
ontime(“3”,iif(month(“cc/cc/cc”)=10,setattr(“01a001”,”High_Alarm_Limit”,”125”)),0)
ontime(“3”,iif(month(“cc/cc/cc”)=4,
setattr(“01a001”,”High_Alarm_Limit”,”120”)),0)
实现逻辑闭锁条件;
4.5求越限累计时间;
求某一遥测点电压点(01a008)当月累计越限运行时间、正常运行时间;要求:
无效值不参与统计,停电时(电压值接近于0)不参与越退统计.
原理:
根据测点的状态判断,进行自加运算,计算处于各个状态的时间。
必须根据状态而不能根据值来判断,不能根据值的大小,因为值可能是无效。
另外,对于设置了延时报警和死区报警的测点来说。
通过值的大小来判断显然是不合理的。
设定01a008测点的上下限,并设置越限报警。
设置计算量点计算周期均为3秒
总运行时间:
(01n040)
ontime("3",0,iif(rtdbattr("01a008",Status")>0,pntval("01n040")+0.05,pntval("01n040")))
正常运行时间:
(01n041)
ontime("3",0,iif(rtdbattr("01a008","Status")=2,pntval("01n041")+0.05,pntval("01n041")))
越上限运行时间:
(01n042)
ontime("3",0,iif(rtdbattr("01a008","Status")=6,pntval("01n042")+0.05,pntval("01n042")))
越下限运行时间:
(01n043)
ontime("3",0,iif(rtdbattr("01a008","Status")=7,pntval("01n043")+0.05,pntval("01n043")))
合格率:
(01n044)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 运算 表达式
![提示](https://static.bdocx.com/images/bang_tan.gif)