Skip to content

常用计算函数示例

| 序号 | 主要语句类型示例 | 描述 |
| ------------ | ------------ | ------------ | ------------ |
| 1 | return op.value("W3.SYS.VOLTOTAL")- op.value("W3.SYS.VOLFREE") | 减法示例 |
| 2 | return op.value("W3.SYS.VOLTOTAL")+ op.value("W3.SYS.VOLFREE") | 加法示例 |
| 3 | return op.value("W3.SYS.VOLFREE") / op.value("W3.SYS.VOLTOTAL") * 100|乘除法示例|
| 4 | return 55 | 常量示例 |
| 5 | if(op.value("W3.NODE.AX")>op.value("W3.NODE.I2")) then v=op.value("W3.NODE.AX") else v=8 end return v | if else语句 |
| 6 | sum=0 for i = 1, 100 do sum=sum+i end return sum+op.value("W3.AAA.AA3") | for语句 |
| 7 | return op.status("W3.CALC_EG.CONST0")&32768==32768 | 判断超时 |
| 8 | ds = op.status("W3.A.A")if ((op.value("W3.A.B")) ==1 )then if(ds:alarm()) then v =1 else v=0 end else v = 0 end return v |当开关点W3.A.B为0时,计算点W3.A.C返回0;当开关点W3.A.B为1时,判断W3.A.A是否正在报警。如果报警,则计算点C返回1,如果不报警,计算点C返回0; |
| 9 | tag1 = "W3.CALC.B" tag2 = "W3.CALC.A" v = op.value(tag2) vv= string.sub (v, 1,8) op.set(tag1,{0,0,vv})|将"W3.CALC.A"点数据,取前8位写入测点 "W3.CALC.B" |
| 10 | RT=op.value("W3.NODE.AX") if(RT>50) then v=1 elseif(RT < 50) then v=2 else v=3 end return v| if elseif 语句|
| 11 | if ((op.value("条件1") >= 100) and (op.value("条件2") >= 10) and (op.value("条件3") == 1)) then var = 1 elseif ((op.value("条件1") < 100) and (op.value("条件2") < 10) and (op.value("条件3") == 0)) then var = 0 else var = 3 end return var| 使用英文标点和符号,“<=”或“>=”中的“=”号的位置视实际情况而定。输出结果为:只有“条件1 >= 100”、“条件2 >= 10”、“条件3 = 1” 同时满足时,返回1;只有“条件1 < 100”、“条件2 < 10”、“条件3 = 0” 同时满足时,返回0; 其余情况返回3; |
| 12 |s = 0 while (s >= 1 or s == 0) do v1=2*(math.random(0,1000)/1000)-1 v2 = 2*(math.random(0, 1000) / 1000) - 1 s = v1 * v1 + v2 * v2 end multiplier = math.sqrt(-2* math.log(s)/s) return v1 * multiplier| 0为平均值,1位标准差的,随机数 |
| 13 |tagT1 = "W3.B.A2" tagS1 ="W3.B.A1" T1 = op.value(tagT1 ) tm1=op.time(tagT1) m = op.minute() s = op.second() dt=op.now()-op.msecond()/1000 t_begin = dt - m*60-s t_end = t_begin +3599 rs = op.stat(tagS1,t_begin,t_end) T1 = rs.max - rs.min if((tm1<t_begin) and (dt>t_begin)) then --判断当前统计时刻是否为刚刚过整点的第一个值 op.set(tagT1,{t_begin,0,T1}) op.set(tagT1,{dt,0,T1}) else op.set(tagT1,{dt,0,T1}) end | W3.B.A1为累计产量,W3.B.A2为小时产量,根据累计产量计算小时产量 |
| 14 |x=op.value("W3.CALC.B") y=op.value("W3.CALC.A") h=tonumber(os.date("%H")) m=tonumber(os.date("%M")) s=tonumber(os.date("%S")) if (h == 0 and m == 0 and s == 0) then v = x else v = y end op.set("W3.CALC.A",{0,0,v})|判断满足零时十分零秒条件时,将B点的值设置给A点 |
| 15 | 其他用法参见lua函数附录| |

复杂脚本示例

A,B两个测点的年月日累积量(原始点为累计值)
taga="W3.A.A" --原始点A
tagb="W3.A.B" --原始点B

atag1="W3.A.AD" --A点每日零点瞬时值
atag2="W3.A.AM" --A点每月零点瞬时值
atag3="W3.A.AY" --A点每年零点瞬时值

btag1="W3.A.BD" --B点每日零点瞬时值
btag2="W3.A.BM" --B点每月零点瞬时值
btag3="W3.A.BY" --B点每年零点瞬时值

sumad="W3.A.SUMAD" --A点日累计点
sumam="W3.A.SUMAM" --A点月累积点
sumay="W3.A.SUMAY" --A点年累积点

sumbd="W3.A.SUMBD" --B点日累计点
sumbm="W3.A.SUMBM" --B点月累积点
sumby="W3.A.SUMBY" --B点年累积点

d=op.today() --日零点时间戳
m=op.bmonth() --月零点时间戳
dt = op.now() 
year = op.year(dt)
month = 01 
day = 01 
hour = 00 
minute = 00 
second = 00 
y=op.date(year,month,day,hour,minute,second) --年零点时间戳

ad=op.time(atag1) 
am=op.time(atag2)
ay=op.time(atag3)

bd=op.time(btag1)
bm=op.time(btag2)
by=op.time(btag3)

va=op.rvalue(taga)

if(ad~=d) then
op.set(atag1,{d,0,va})
elseif(am~=m) then
op.set(atag2,{m,0,va})
elseif(ay~=y) then
op.set(atag3,{y,0,va})
end

vb=op.rvalue(tagb)

if(bd~=d) then
op.set(btag1,{d,0,vb})
elseif(bm~=m) then
op.set(btag2,{m,0,vb})
elseif(by~=y) then
op.set(btag3,{y,0,vb})
end

vad=op.rvalue(atag1)
vam=op.rvalue(atag2)
vay=op.rvalue(atag3)

vbd=op.rvalue(btag1)
vbm=op.rvalue(btag2)
vby=op.rvalue(btag3)

op.set(sumad,{0,0,va-vad})
op.set(sumam,{0,0,va-vam})
op.set(sumay,{0,0,va-vay})
op.set(sumbd,{0,0,va-vbd})
op.set(sumbm,{0,0,va-vbm})
op.set(sumby,{0,0,va-vby})