Appearance
常用计算函数示例
主要语句类型示例 | 描述 | |
---|---|---|
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 | ds = op.status("W3.TEST.TEST") outds1=ds:timeout() return outds1 | 判断超时 |
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 | now=op.now() dt=op.bmonth(now) month=op.month() year=op.timeadd("M",-month+1, dt) return year | 返回当年1月1日00:00:00的时间戳 |
16 | now=op.now() dt=op.bmonth(now) lastmonth=op.timeadd("M",-1, dt) | 返回上月1日00:00:00的时间戳, op.today()是当日凌晨时间戳 |
17 | local 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.POINT | AX | |
CALC | 记录符合条件的变化时刻 | W3.MAX.TIME | R8 | v = 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.AMAX | R8 | m = 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.MAX | R8 | if(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.A | DX | |
DAS | 中间点,用来和原始点对比 | W3.UNIT1.A1 | AX | |
CALC | 脉冲信号计算点 | W3.UNIT1.A2 | AX | tag1="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.DX | DX | |
CALC | 统计DX 0变1的次数 | W3.UNIT.COUNT | R8 | tag="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.DX | DX | ||
CALC | DX变0则时长清零,统计单次DX 0变1的时长, | W3.UNIT.TIME | R8 | tag="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.TIME | R8 | tag="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状态下时长;变化计算,则不统计超时状态时长; |
数据库镜像监测函数说明和示例
点的来源 | 点的类型 | 点名 | 描述 | 计算类型 | 计算公式 |
---|---|---|---|---|---|
CALC | AX | AR_SYNC_STEP | 历史同步步序 | 每秒计算 | return op.ar_sync_step() |
CALC | AX | AR_SYNC_USED | 历史同步耗时 | 每秒计算 | return op.ar_sync_used() |
CALC | R8 | AR_SYNC_TIME | 历史同步时间 | 每秒计算 | return op.ar_sync_time() |
CALC | AX | AR_SYNC_QUEUE | 历史同步队列 | 每秒计算 | return op.ar_sync_queue() |
CALC | AX | RT_SYNC_STEP | 实时同步步序 | 每秒计算 | return op.rt_sync_step() |
CALC | AX | RT_SYNC_USED | 实时同步耗时 | 每秒计算 | return op.rt_sync_used() |
CALC | R8 | RT_SYNC_TIME | 实时同步时间 | 每秒计算 | return op.rt_sync_time() |
CALC | AX | RT_SYNC_QUEUE | 实时同步队列 | 每秒计算 | return op.rt_sync_queue() |
CALC | AX | AR_SYNC_DONE_0 | 至第一个目的数据库的镜像同步是否完成 | 每秒计算 | return op.ar_sync_done(0) |
CALC | AX | AR_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})