# -*- coding: utf-8-*-
import traceback
# 封装了转储接口的结构体
functions = None
# 定义错误码
returnDef = {"icv_success":0,
"ec_read_failed":15008}
# 关系数据库中,创建数据表的SQL语句
createDataTable = "CREATE TABLE t_cvTagData ("\
"fd_nodename VARCHAR(64),"\
"fd_tagname VARCHAR(64),"\
"fd_tagdesc VARCHAR(128),"\
"fd_datetime VARCHAR(24),"\
"fd_tagvalue VARCHAR(32),"\
"fd_tagquality int,"\
"PRIMARY KEY(fd_nodename,fd_tagname,fd_datetime))"
# 用于第一种方式读取数据
# 需要转储的数据点名
fixTagNames = ["object_1.a"]
# 字段名
fieldName = "F_VTQ"
# 用于第二种方式读取数据
# "点名.字段名"
tagField = ["object_1.a.A_CV","object_1.a.F_TIMESTAMP","object_1.a.F_QUALITY"]
# 数据源名称,注意:不是DSN,是ICV数据源的名称, 比如是'mysql',而不是'127.0.0.1@database'
DataSource = "mysql"
# SCADA名称
scadaName = "added_scadaname1"
lastDict = None
# 数据组句柄
groupHandle = None
# 用于存放以两种方式获取数据所需句柄
fixDataHandles = []
userDefHandles = []
# 时间戳格式转换(非必须)
def getTimeRepr(sec, usec):
import time
timeVal = time.localtime(sec)
return "%04d-%02d-%02d %02d:%02d:%02d.%03d" \
% (timeVal.tm_year, timeVal.tm_mon, timeVal.tm_mday,
timeVal.tm_hour, timeVal.tm_min, timeVal.tm_sec, usec/1000)
# 注册转储接口包(必须,建议不要更改)
def setEnviron(functionContainer):
global functions
functions = functionContainer
return returnDef["icv_success"]
# 初始化规则(必须)
def initRule():
# 注册数据组
global groupHandle
groupHandle = functions.regGroup()
# 提供两种不同的注册接口
# 1. addTag2Group:
# a. 输入参数: 组句柄、点名和字段名;
# b. 对应的读取数据接口: readVTQByHandle, readValueByHandle。
# 2. addTag2GroupEx:
# a. 输入参数: 组句柄、"点名.字段名";
# b. 对应读取数据接口: readValueByName
# 以上两种接口区别在于,前者在第一次read调用时将整个组下所有点的数据都读到内存中,之后的read更为迅速;
# 后者仅读一个点。
global fixDataHandles
for tagName in fixTagNames:
tempHandle = {"name":None,"ntf":None,"desc":None}
tempHandle["name"] = tagName
tempHandle["ntf"] = functions.addTag2Group(groupHandle, tagName, "F_VTQ")
tempHandle["desc"] = functions.addTag2Group(groupHandle, tagName, "A_DESC")
fixDataHandles += [tempHandle]
global userDefHandles
for tagFieldName in tagField:
userDefHandles += [functions.addTag2GroupEx(groupHandle, tagFieldName)]
# 创建表
ret = functions.createTable(DataSource, createDataTable)
# 注册定时器,四个输入参数:第一个和最后一个参数都置0,第二个参数为定时器周期(单位:ms),第三个参数为相位(单位:ms)
functions.regTimer(0, 2000, 500, 0)
return returnDef["icv_success"]
# 注销规则(必须)
def finiRule():
functions.unRegGroup(groupHandle)
return returnDef["icv_success"]
# 数据转储定时器(如果注册了定时器,必须实现,若数据不通过定时器转储,直接return即可)
def onTimer(sec, usec, id):
try:
# 获取冗余状态,若为非活动节点,直接返回
status = functions.getRMStatus()
if status == 0:
return returnDef["icv_success"]
# 获取grouphandle句柄
functions.readGroup(groupHandle)
for tagFieldName in tagField:
# 读取数据的某字段,返回一个字典,该字段的值是userValue["value"],返回值userValue["ret"]
userValue = functions.readValueByName(tagFieldName)
print "readbyname:", tagFieldName, "=[",userValue["value"],":", userValue["ret"],"]"
# 根据initRule()中注册的handle读取
for pairHandle in fixDataHandles:
# 用第1种方式读取VTQ的接口,即该数据的值(value),时间戳(timestamp),数据质量(quality)
# 返回字典:dictVTQ["value"], dictVTQ["timeSec"], dictVTQ["timeUsec"], dictVTQ["quality"], dictVTQ["ret"]
dictVTQ = functions.readVTQByHandle(groupHandle, pairHandle["ntf"])
dictDesc = functions.readValueByHandle(groupHandle, pairHandle["desc"])
# 通过第2种方式读取时间戳
currTime = functions.readValueByName("object_1.a.F_TIMESTAMP")
sql = "insert into t_cvTagData(fd_nodename,fd_tagname, fd_tagdesc,fd_datetime, fd_tagvalue,fd_tagquality) "\
"values('%s','%s','%s','%s','%s',%d)" % (scadaName,pairHandle["name"],dictDesc["value"],currTime["value"], dictVTQ["value"],dictVTQ["quality"])
functions.execSql(DataSource, sql)
return returnDef["icv_success"]
except Exception, e:
traceback.print_exc()
return returnDef["ec_read_failed"]
|