适用于南方电网61850icd模型文件的模型定义导出工具
主要功能说明:加载61850icd文件,生成模型定义excel表格
天天改来改去,手动整理excel表格烦死,所以写了一个python,自动生成excel表格。
注:不一定适合所有厂家
生成的excel表格内容展示:
import os
import xml.etree.ElementTree as ET
import pandas as pd
import reprint(' ______________________________________________________________________________ ')
print('| |')
print('| Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) on win32 |')
print('| 注1:仅限南网测控模型,其他没测试 |')
print('| 注2:跳过了GOOSE订阅、发布,仅保留上送监控的数据点 |')
print('| 注3:在数据集中的双点遥信,如果没有遥控功能,四遥类别需要手动修改 |')
print('| 注4:随手写的,不关注条理性、效率 |')
print('|______________________________________________________________________________|\n\n')os.system('pause')icdFilePath = '测控装置模型.icd'
(file, ext) = os.path.splitext(icdFilePath)
excelPath = file+'.xlsx'
print(icdFilePath)
print(excelPath)ET.register_namespace('','http://www.iec.ch/61850/2003/SCL')
tree = ET.ElementTree(file = icdFilePath)######<打开excel>
writer=pd.ExcelWriter(excelPath)
form_header=['序号','信息描述','DO名称','LN','LD','数据集','四遥类别']
df1 = pd.DataFrame(columns=form_header)
#df1.loc[0] = ['序号0','信息描述0','DO名称0','LN0','LD0','数据集0','四遥类别0']
#df1.loc[1] = ['序号1','信息描述1','DO名称1','LN1','LD1','数据集1','四遥类别1']
######</打开excel>#CurrPath = os.getcwd() #获取当前目录
root = tree.getroot()
#print(root)
#print("root.tag=%s"%root.tag)
#print("root.attrib=%s"%root.attrib)
same=re.findall(r"{(.+?)}",root.tag)
same='{'+same[0]+'}'
print(same)#获取数据集下面数据点的ldInst、prefix、lnClass、lnInst、doName
def GetDataRefrence(FCDA_data):ldInst = ''prefix = ''lnClass = ''lnInst = ''doName = ''ldInst = FCDA_data.attrib['ldInst']if 'prefix' in FCDA_data.attrib:prefix = FCDA_data.attrib['prefix']lnClass = FCDA_data.attrib['lnClass']if 'lnInst' in FCDA_data.attrib:lnInst = FCDA_data.attrib['lnInst']doName = FCDA_data.attrib['doName']return ldInst,prefix,lnClass,lnInst,doName#获取LN下面各个LN的prefix、lnClass、inst
def GetLNAllName(LNNode):prefix=''lnClass=''inst=''if 'prefix' in LNNode.attrib:prefix = LNNode.attrib['prefix']if 'lnClass' in LNNode.attrib:lnClass = LNNode.attrib['lnClass']if 'inst' in LNNode.attrib:inst = LNNode.attrib['inst']return prefix,lnClass,inst#去LLN0或者LN下的DOI里面,找到匹配的prefix,lnClass,lnInst,doName,获取描述
def SearchRefrence(IEDNode,AccessPointName,LDinstName,prefixName,lnClassName,lnInstName,doName):desc=''for AccessPointNode in IEDNode.iter(tag="%sAccessPoint"%same): #AccessPointNodeif AccessPointName == AccessPointNode.attrib['name']: #查找同名的访问点for LDeviceNode in AccessPointNode.iter(tag="%sLDevice"%same): #LDeviceNodeif LDinstName == LDeviceNode.attrib['inst']: #查找同名的逻辑设备if 'LLN0' == lnClassName:for LN0Node in LDeviceNode.iter(tag="%sLN0"%same): #到LD0里面for DOINode in LN0Node.iter(tag="%sDOI"%same): #到LD0的DOI里面if doName == DOINode.attrib['name']:desc = DOINode.attrib['desc']return desc else:for LNNode in LDeviceNode.iter(tag="%sLN"%same): #到LN节点prefix,lnClass,inst=GetLNAllName(LNNode)if prefixName==prefix and lnClassName==lnClass and lnInstName==inst:for DOINode in LNNode.iter(tag="%sDOI"%same): #到DOI节点if '.' in doName:DoName=doName.split('.')[0]SdName=doName.split('.')[1]if DoName==DOINode.attrib['name']:for SDNode in DOINode.iter(tag="%sSDI"%same):if SdName == SDNode.attrib['name']:desc = SDNode.attrib['desc']return descelse:if doName == DOINode.attrib['name']:desc = DOINode.attrib['desc']return desc return desc#获取四遥类型
#在数据集中,只有遥信没有遥控的双点,会识别错误,请手动修改
def GetSiYaoType(LDdevice,DataSet,prefix,lnClass,doName,DOINode):if None != DOINode:doName = DOINode.attrib['name']if 'MEAS' == LDdevice:return '遥测'if 'dsAin' in DataSet:return '遥测'if 'dsRelayEna' in DataSet:return '遥信+遥控'if 'Parame' in DataSet:return '定值参数'if 'ATCC' in lnClass:if 'ChgA' in doName or 'ChgB' in doName or 'ChgC' in doName:return '遥信'else:return '遥信+遥控'if 'GGIO' in lnClass:return '遥信'if 'LTSM' in lnClass:return '遥信'if 'SCLI' in lnClass:return '遥信'if 'CILO' in lnClass:return '遥信'if 'LPHD' in lnClass:return '_'if 'CSWI' in lnClass:#ctlModel = ''if '' == DataSet:return '遥控'if 'PosA' in doName or 'PosB' in doName or 'PosC' in doName:return '遥信'#if None != DOINode:# for DAINode in DOINode.iter(tag="%sDAI"%same): # #如果ctlModel== status-only 就是纯遥信# #如果ctlModel== sbo-with-enhanced-security,并且没有stVal,就是纯遥控# #如果ctlModel== sbo-with-enhanced-security,并且有stVal,就是遥信+遥控# if 'ctlModel' == DAINode.attrib['name']:# ctlModel = DAINode.iter(tag="%sVal"%same).text# print('ctlModel=',ctlModel)# os.system('pause')return '遥信+遥控'if '' != DataSet and 'GAPC' in lnClass:return '遥信+遥控'elif 'GAPC' in lnClass:return '遥控'return '_'#添加到excel数据行
def AddExcelLoc(df,i,LDeviceNode,LNNode,DOINode,Type):prefix,lnClass,inst = GetLNAllName(LNNode)#print('##########',prefix,lnClass,inst)#os.system('pause')df.loc[i] = [i+1, DOINode.attrib['desc'],DOINode.attrib['name'],prefix+lnClass+inst,LDeviceNode.attrib['inst'],'',Type]return 0#搜索表格里面存在的 prefix+lnClass+inst, LDevice_instName,
def SearchExcelDf(df,LDevice_instName,prefix,lnClass,inst):#print(df)#os.system('pause')result = df.query("LD==@LDevice_instName & LN==@prefix+@lnClass+@inst") #numexpr 方式 A,B,C为列名#print(result)if result.empty:#print('未找到:',LDevice_instName,prefix,lnClass,inst)return Falseelse:#print('找到:',LDevice_instName,prefix,lnClass,inst)return True#排除的LN列表
#False 排除的
#True 不排除的
def ExcludeLnList(LDevice,prefix,lnClass):tables =[ \['CTRL', '', 'LPHD'], \['CTRL', 'wf', 'GGIO'], \['CTRL', 'GOIN', 'GGIO'], \['MEAS', '', 'LPHD'], \['MEAS', 'GOIN', 'GGIO'], \['MEAS', 'Ana', 'GGIO'], \['PIGO', '', '']]for table in tables:if table[1] == '' and table[2] == '':if table[0] == LDevice:return Trueelif table[1] == '':if table[0] == LDevice and table[2] == lnClass :return Trueelif table[2] == '':if table[0] == LDevice and table[1] == prefix :return Trueelif table[0] == LDevice and table[1] == prefix and table[2] == lnClass :return Truereturn False#排除的DO列表
def ExcludeDoList(DoName):tables = [ \'PhyHealth', \'Mod', \'Beh', \'Health', \'OpOpn', \'OpCls', \'Str', \'Op', \'Loc']if DoName in tables:return Trueelse:return False#从指定访问点,调到指定的LN节点
def GotoLNNode(AccessPointNode,LDeviceName,prefixName,lnClassName,instName,same):for LDeviceNode in AccessPointNode.iter(tag="%sLDevice"%same):if(LDeviceName == LDeviceNode.attrib['inst']):if 'LLN0' == lnClassName:for LN0Node in LDeviceNode.iter(tag="%sLN0"%same): #到LD0里面return LN0Node.iter(tag="%sDOI"%same) #到LD0的DOI里面 else:for LNNode in LDeviceNode.iter(tag="%sLN"%same): #到LN节点prefix,lnClass,inst=GetLNAllName(LNNode)if prefixName==prefix and lnClassName==lnClass and lnInstName==inst:return LNNodebreak;print("未找到LN节点:",LDeviceName,prefixName,lnClassName,instName)return None#从指定访问点,调到指定的DO节点,如果到SD(含符号.),则跳到SD节点
def GotoDOINode(AccessPointNode,LDeviceName,prefixName,lnClassName,instName,doName,same):LNNode = GotoLNNode(AccessPointNode,LDeviceName,prefixName,lnClassName,instName,same)if LNNode == None:return Noneif '.' in doName:DoName_s=doName.split('.')[0]SdName_s=doName.split('.')[1]for DOINode in LNNode.iter(tag="%sDOI"%same): #到DOI节点if DoName_s==DOINode.attrib['name']:for SDINode in DOINode.iter(tag="%sSDI"%same): #到SDI节点if SdName_s == SDINode.attrib['name']:return SDINodeelse:for DOINode in LNNode.iter(tag="%sDOI"%same): #到DOI节点if doName==DOINode.attrib['name']:return DOINodeprint("未找到DO/SD节点:",LDeviceName,prefixName,lnClassName,instName,doName)return None#找不在数据集里面的特殊点
def GetSpecialDO(AccessPointNode,LDeviceNode,same,df,i):LDevice_instName = LDeviceNode.attrib['inst']for LNNode in LDeviceNode.iter(tag="%sLN"%same): prefix,lnClass,inst = GetLNAllName(LNNode)if False == SearchExcelDf(df,LDevice_instName,prefix,lnClass,inst): #如果未找到if False == ExcludeLnList(LDevice_instName,prefix,lnClass): #不是要忽略的print(LDevice_instName,prefix,lnClass,inst)for DOINode in LNNode.iter(tag="%sDOI"%same): #到DOI节点for DAINode in DOINode.iter(tag="%sDAI"%same): #到DAI节点if 'sAddr' in DAINode.attrib:if DAINode.attrib['sAddr'] != '':Type = GetSiYaoType(LDevice_instName,'',prefix,lnClass,DOINode.attrib['name'],DOINode)AddExcelLoc(df,i,LDeviceNode,LNNode,DOINode,Type)i = i+1break;#################DoNode = GotoLNNode(AccessPointNode,LDevice_instName,prefix,lnClass,inst,same):#if DoNode == None:# continuereturn ii=0
for IEDNode in tree.iter(tag="%sIED"%same): #IEDNode#print("ele.tag=%s ele.attrib=%s"%(IEDNode.tag,IEDNode.attrib))for AccessPointNode in IEDNode.iter(tag="%sAccessPoint"%same): #AccessPointNode#print(AccessPointNode.tag,AccessPointNode.attrib)AccessPointName = AccessPointNode.attrib['name'] #到S1访问点print('\n##AccessPointName='+AccessPointName)#if AccessPointName == 'S1':# continue#print(AccessPointNode.iter)for LDeviceNode in AccessPointNode.iter(tag="%sLDevice"%same): #LDeviceNodeLDevice_instName = LDeviceNode.attrib['inst']print('####LDevice:%s'%LDevice_instName)for DataSetNode in LDeviceNode.iter(tag="%sDataSet"%same): #DataSetNodeif 'dsLog' in DataSetNode.attrib['name']: #跳过日志continueif 'dsGOOSE' in DataSetNode.attrib['name']: #跳过GOOSE输出continueDataSet_name = DataSetNode.attrib['name']DataSet_desc = DataSetNode.attrib['desc']#print('%s\t%s'%(DataSet_name,DataSet_desc))for FCDANode in DataSetNode.iter(tag="%sFCDA"%same): #FCDANodeldInst,prefix,lnClass,lnInst,doName = GetDataRefrence(FCDANode)#print('%s/%s%s%s/%s '%(ldInst,prefix,lnClass,lnInst,doName),end='')desc = SearchRefrence(IEDNode,AccessPointName,ldInst,prefix,lnClass,lnInst,doName)Type = GetSiYaoType(LDevice_instName,DataSet_name,prefix,lnClass,doName,None)df1.loc[i] = [i+1,desc,doName,prefix+lnClass+lnInst,ldInst,'%s(%s)'%(DataSet_name,DataSet_desc),Type]i=i+1#print('%s'%desc)#df1.to_excel(writer,sheet_name='第一表',index=0)i=GetSpecialDO(AccessPointNode,LDeviceNode,same,df1,i)######<写,并关闭excel>
df1.to_excel(writer,sheet_name='第一表',index=0)
#df2.to_excel(writer,sheet_name='第二表',index=0)
writer.close()
######</写,并关闭excel>
#os.system('pause')
适用于南方电网61850icd模型文件的模型定义导出工具相关推荐
- 文件夹目录结构导出工具及下载
一.功能和使用说明 "文件夹目录导出工具"能够实现将指定的文件夹下的所有文件和子文件夹的名字以三种方式导出.这种三种方式分别是:网页文件,xml文件和文本方式显示. 操作方法非常简 ...
- solidworks 3D模型文件导出到tanner ledit版图软件中
solidworks 3D模型文件导出到tanner ledit版图软件中 简介 操作 1. 文件格式问题 2. SW直接导出DXF文件到LEDIT的问题 3.布尔操作,得到所需版图 注意事项 补充 ...
- 母子关系:DAE是COLLADA的模型文件(转载)
母子关系:DAE是COLLADA的模型文件 标签: dae collada it 分类: 网络IT 我们提到了Google Earth/Google Maps 中用于三维建筑模型的DAE文件,DAE是 ...
- OBJ网格模型文件(上) - 学习随笔
很早的时候一直有个执念: 我要从0开始,编程写一个obj模型的加载器. 在学习3dsmax的时候,发现这种格式被很多软件所支持,而且导出的文件只含模型和材质,体积很小很干净,建好模型之后通常保存为自身 ...
- xBIM 实战01 在浏览器中加载IFC模型文件
系列目录 [已更新最新开发文章,点击查看详细] 一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5 选择一个空的项目 新建完成后,项目结构如下: 二.添 ...
- python基于模型对测试集和训练集的预测概率结果文件可视化模型的校准曲线、多个模型的校准曲线(calibration curve)
python基于模型对测试集和训练集的预测概率结果文件可视化模型的校准曲线.多个模型的校准曲线(calibration curve) 目录
- 【TensorFlow系列】【五】利用inception v3 pb模型文件做预测
2019独角兽企业重金招聘Python工程师标准>>> 本文介绍如何利用imagenet比赛上训练好的inception v3冻结的pb模型进行inference. 1.下载ince ...
- 查看tensorflow pb模型文件的节点信息
查看tensorflow pb模型文件的节点信息: import tensorflow as tf with tf.Session() as sess:with open('./quantized_m ...
- Tensorflow:TF模型文件(checkpoint文件夹下ckpt文件之data、index、meta)保存、模型导入、恢复并fine-tuning之详细攻略
Tensorflow:TF模型文件(checkpoint文件夹下ckpt文件之data.index.meta)保存.模型导入.恢复并fine-tuning之详细攻略 目录 保存TF训练好的模型 1.T ...
最新文章
- java 反射机制_详解Java中的反射机制的优缺点
- 使用ThreadLocal绑定连接资源(事务)
- 利用Python进行数据分析——Ipython
- Mac硬件温度管理软件TG Pro
- 【转】Linux下发生段错误时如何生成core文件
- ThinkPHP扩展,实现Redis的CURD操作。
- 报名 | 2019世界人工智能大会-腾讯论坛:8月,在上海等你!
- 移动互联网创业:美国不代表全球
- SpringBoot自定义banner,如何定制炫酷的banner提升项目B格?
- 电流电压与欧姆定律与基尔霍夫定律
- 游戏服务器排队系统,游戏服务器排队功能
- SAP中采购订单交货己完成相关逻辑和控制原理分析
- Win PE CD-ROM 制作简介(系统修复光盘)
- Android 9格锁屏
- String字符串删除空格的七种方式
- 【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数通过执行计划看sum()over()对员工工资进行累加
- 数据结构(严蔚敏)【一元多项式的运算】【C语言】
- MATLAB | 绘图复刻(九) | 泰勒图及组合泰勒图
- SVN1.6.5安装及配置
- 测试导航卫星软件,全球导航卫星应用GNSS的原理和用途