Skip to content

常用计算函数示例

主要语句类型示例描述
1return op.value("W3.SYS.VOLTOTAL")- op.value("W3.SYS.VOLFREE")减法示例
2return op.value("W3.SYS.VOLTOTAL")+ op.value("W3.SYS.VOLFREE")加法示例
3return op.value("W3.SYS.VOLFREE") / op.value("W3.SYS.VOLTOTAL") * 100乘除法示例
4return 55常量示例
5if(op.value("W3.NODE.AX")>op.value("W3.NODE.I2")) then v=op.value("W3.NODE.AX") else v=8 end return vif else语句
6sum=0 for i = 1, 100 do sum=sum+i end return sum+op.value("W3.AAA.AA3")for语句
7ds = op.status("W3.TEST.TEST") outds1=ds:timeout() return outds1判断超时
8ds = 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;
9tag1 = "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"
10RT=op.value("W3.NODE.AX") if(RT>50) then v=1 elseif(RT < 50) then v=2 else v=3 end return vif elseif 语句
11if ((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;
12s = 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 * multiplier0为平均值,1位标准差的,随机数
13tagT1 = "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}) endW3.B.A1为累计产量,W3.B.A2为小时产量,根据累计产量计算小时产量
14x=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点
15now=op.now() dt=op.bmonth(now) month=op.month() year=op.timeadd("M",-month+1, dt) return year返回当年1月1日00:00:00的时间戳
16now=op.now() dt=op.bmonth(now) lastmonth=op.timeadd("M",-1, dt)返回上月1日00:00:00的时间戳, op.today()是当日凌晨时间戳
17local myArray = {"W3.222.COILS","W3.222.CX","W3.TEST.SS","W3.SYS.JMLF","W3.SYS.JMNS","W3.SYS.JMPD","W3.SYS.JMPM","W3.SYS.JMPC"} sum=0 for i=1,#myArray do if(op.status(myArray[i]):timeout()) then sum=sum+1 end end return sum 判断多个测点的状态,统计共有几个测点超时,返回超时测点的数量
18--计算出今天凌晨的时间戳 t=op.today() --计算出今早10的时间 t1=op.timeadd("h", 10, t) 计算出今早12的时间 t2=op.timeadd("h", 12, t) --返回今早10点的值 rs=op.snapshot("W3.TEST.TEST",t1) --返回今早12点的值 rz=op.snapshot("W3.TEST.TEST",t2) --计算两个时间的差值 v=rz.value-rs.value --打印结果值 return v计算指定时刻的数据差,示例为早12点和10点数据差
19其他用法参见lua函数附录

统计变化周期中最大值

点的来源描述点名类型计算公式
DAS原始点W3.MAX.POINTAX
CALC记录符合条件的变化时刻W3.MAX.TIMER8v = op.value("W3.MAX.TIME") if(op.value("W3.MAX.POINT")<1) then v=op.time("W3.MAX.POINT") end return v
CALC中间变量W3.MAX.AMAXR8m = op.value("W3.MAX.AMAX") v = op.value("W3.MAX.POINT") if(v< 1) then t = op.value("W3.MAX.TIME")-1 s = op.snapshot("W3.MAX.TIME", t) t1 = s.value m = op.max("W3.MAX.POINT",t1 ,t) end return m.value
CALC最大值W3.MAX.MAXR8if(op.value("W3.MAX.AMAX")<1) then v=op.value("W3.MAX.MAX") else v=op.value("W3.MAX.AMAX") end return v

脉冲信号记录

点的来源描述点名类型计算公式
DAS原始点W3.UNIT1.ADX
DAS中间点,用来和原始点对比W3.UNIT1.A1AX
CALC脉冲信号计算点W3.UNIT1.A2AXtag1="W3.UNIT1.A" --原始点 tag2="W3.UNIT1.A1" --中间点 tag3="W3.UNIT1.A2" --计算点 v1=op.value(tag1) v2=op.value(tag2) v3=op.value(tag3) if (v1~=v2) then op.set(tag2,{0,0,v1}) op.set(tag3,{0,0,1}) elseif(v1==v2) then op.set(tag3,{0,0,0}) end

DX变1次数

点的来源描述点名类型计算公式
DAS开关点W3.UNIT.DXDX
CALC统计DX 0变1的次数W3.UNIT.COUNTR8tag="W3.UNIT.COUNT" x=op.value("W3.UNIT.DX") y=op.dynamic("W3.UNIT.COUNT") v=y.av if((y.ds&1)==0 and x==1) then v=v+1 end op.set(tag, {0, x, v})

DX变1时长

点的来源描述点名类型计算公式备注
DAS开关点W3.UNIT.DXDX
CALCDX变0则时长清零,统计单次DX 0变1的时长,W3.UNIT.TIMER8tag="W3.UNIT.TIME" x=op.value("W3.UNIT.DX") y=op.dynamic("W3.UNIT.TIME") v=op.value("W3.UNIT.TIME") if((y.ds&1)==1 and x==1) then v=v+1 else v=0 end op.set(tag, {0, x, v})每秒计算,可统计timeout状态下时长;变化计算,则不统计超时状态时长;
CALC统计DX 0变1的时长,DX变0时长不清零W3.UNIT.TIMER8tag="W3.UNIT.TIME" x=op.value("W3.UNIT.DX") y=op.dynamic("W3.UNIT.TIME") v=op.value ("W3.UNIT.TIME") if((y.ds&1)==1 and x==1) then v=v+1 end op.set(tag, {0, x, v})每秒计算,可统计timeout状态下时长;变化计算,则不统计超时状态时长;

数据库镜像监测函数说明和示例

点的来源点的类型点名描述计算类型计算公式
CALCAXAR_SYNC_STEP历史同步步序每秒计算return op.ar_sync_step()
CALCAXAR_SYNC_USED历史同步耗时每秒计算return op.ar_sync_used()
CALCR8AR_SYNC_TIME历史同步时间每秒计算return op.ar_sync_time()
CALCAXAR_SYNC_QUEUE历史同步队列每秒计算return op.ar_sync_queue()
CALCAXRT_SYNC_STEP实时同步步序每秒计算return op.rt_sync_step()
CALCAXRT_SYNC_USED实时同步耗时每秒计算return op.rt_sync_used()
CALCR8RT_SYNC_TIME实时同步时间每秒计算return op.rt_sync_time()
CALCAXRT_SYNC_QUEUE实时同步队列每秒计算return op.rt_sync_queue()
CALCAXAR_SYNC_DONE_0至第一个目的数据库的镜像同步是否完成每秒计算return op.ar_sync_done(0)
CALCAXAR_SYNC_DONE_1至第二个目的数据库的镜像同步是否完成每秒计算return op.ar_sync_done(1)

复杂脚本示例

A,B两个测点的年月日累积量(原始点为累计值)
bash
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})