自定义脚本示例

Navigation:  iCentroview系统的配置 > 配置客户端 > 服务端配置 > SCADA节点总览配置 > 转储配置 > 自定义脚本转储配置 >

自定义脚本示例

Previous pageReturn to chapter overviewNext page

以下是示例代码:

# -*- 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(020005000)
    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"]