Python实现comtrade文件读取

article/2025/10/22 5:27:15

最近在学习python,发现这个语言挺有意思,写起来比较轻松。后面打算用它代替matlab来做数据分析。写了一个comtrade格式录波文件的读取类。目前仅支持读取comtrade的binary格式文件。仅读取模拟量,不解析开关量。上comtrade类代码。

#!/usr/bin/env python 3.8.0
# -*- coding: utf-8 -*-
#
''' ########################################################################'''
import matplotlib.pyplot as plt
import re
import struct''' ##########################################################################                                                               ## COMTRADE文件读取                                                       ##                                                               ########################################################################''''''------------------------- 全局变量 -------------------------'''
ERROR   = -1
OK      = 0class Comtrade():"""comtrade文件类"""'''------------------------- 初始化变量 -------------------------'''def __init__(self, filename=''):#--文件名self.file_name = filenameself.cfg_file_name = filename+'.cfg' self.dat_file_name = filename+'.dat' print("## The cometrade file:"+self.file_name)# 列表,存储cfg文件每一行内容self.cfglines = []  # 模拟量通道数self.analog_chanel_num = 0# 开关量word数self.digit_chanel_num = 0# DAT数据格式 BYNARY 或 ASCIIself.file_format = ''# 采样点数self.wave_points = 0# 字典list# cfg模拟量通道信息 字典# An,ch-id,ph,ccbm,uu,a,b,skew,min,max,primary,secodary,ps<CR/LF>self.ana_infos = []      # 每一帧的数据长度 单位BYTE# 4, 4,         2,  2,   2,  2,  2,   2# n,timestamp,A1,A2,……Ak,D1,D2,……Dm<CR/LF>self.dataframe_lenth = 0# 二进制数据帧self.packed_datas = []# 大小端self.endian_mode = 'little-endian'# 二进制数据解析格式self.pack_format = '''''------------------------- 读取CFG文件 -------------------------'''def cfg_read(self):#--读取CFG文件内容,按行存储至列表try:with open(self.cfg_file_name) as cfg_file_obj:lines = cfg_file_obj.readlines()       for line in lines:line = line.rstrip()line = line.split(',')self.cfglines.append(line)  #print(self.cfglines[-1])    #--CFG文件不存在,打印提示信息,return    except FileNotFoundError:       msg = "## ERROR: The file " + self.cfg_file_name + " doesn't exist."    print(msg)return ERROR#--模拟量通道数nums = re.findall("\d+", self.cfglines[1][1])self.analog_chanel_num = int(nums[0])    #--开关量word数nums = re.findall("\d+", self.cfglines[1][2])self.digit_chanel_num = int((int(nums[0])+15)/16)   #--检查文件是否BINARY格式,no则returnself.file_format = self.cfglines[-2][0]if self.file_format != 'BINARY':msg =   "## ERROR: The file format is "+self.file_format+\", the tool doesn't support."    print(msg) return ERROR  #--采样点数self.wave_points = int(self.cfglines[-5][-1])#--提取模拟量通道的相关信息i = 0while i < self.analog_chanel_num:self.ana_infos.append({})self.ana_infos[i]['An']          = int(self.cfglines[i+2][0])self.ana_infos[i]['ch-id']       = self.cfglines[i+2][1]self.ana_infos[i]['ph']          = self.cfglines[i+2][2]self.ana_infos[i]['ccbm']        = self.cfglines[i+2][3]self.ana_infos[i]['uu']          = self.cfglines[i+2][4]self.ana_infos[i]['a']           = float(self.cfglines[i+2][5])self.ana_infos[i]['b']           = float(self.cfglines[i+2][6])self.ana_infos[i]['skew']        = float(self.cfglines[i+2][7])self.ana_infos[i]['min']         = int(self.cfglines[i+2][8])self.ana_infos[i]['max']         = int(self.cfglines[i+2][9])self.ana_infos[i]['primary']     = float(self.cfglines[i+2][10])self.ana_infos[i]['secondary']   = float(self.cfglines[i+2][11])self.ana_infos[i]['ps']          = self.cfglines[i+2][12]self.ana_infos[i]['ana_data']    = []self.ana_infos[i]['pri_data']    = []i += 1#print(self.ana_infos)return OK'''------------------------- 读取DAT文件 -------------------------'''def dat_read(self):#--读取DAT文件# 4, 4,         2,  2,   2,  2,  2,   2# n,timestamp,A1,A2,……Ak,D1,D2,……Dm<CR/LF>self.dataframe_lenth = 4+4+2*self.analog_chanel_num+2*self.digit_chanel_numtry:with open(self.dat_file_name,'rb') as dat_file_obj:      #按二进制格式读取i = 0while i < self.wave_points:recv_buf = dat_file_obj.read(self.dataframe_lenth)if len(recv_buf) != self.dataframe_lenth:msg = "## ERROR: The dat file isn't match the wave points."print(msg)return ERRORelse:self.packed_datas.append(recv_buf)i +=1except FileNotFoundError:msg = "## ERROR: The file " + self.dat_file_name + " does not exist."print(msg)return ERROR#--大小端if self.endian_mode == 'little-endian':self.pack_format += '<'else:self.pack_format += '>'#--序号n+时标timestampself.pack_format += 'I'self.pack_format += 'I'#-----模拟量Analogi = 0while i < self.analog_chanel_num:self.pack_format += 'h'i +=1#-----开关量Digiti = 0while i < self.digit_chanel_num:self.pack_format += 'H'i +=1#-----按格式读取数据i = 0while i < self.wave_points:n_stuct = struct.Struct(self.pack_format)n_unpacked_data = n_stuct.unpack(self.packed_datas[i])j=0while j < self.analog_chanel_num:self.ana_infos[j]['ana_data'].append(n_unpacked_data[2+j])j +=1i +=1#print(self.ana_infos[0])#-----转换到一次值 i = 0while i < self.wave_points:j=0while j < self.analog_chanel_num:self.ana_infos[j]['pri_data'].append( \(self.ana_infos[j]['ana_data'][i]+self.ana_infos[j]['b'])*self.ana_infos[j]['a'] )j +=1i +=1return OK''' --------------------------- file end --------------------------- '''
main函数测试。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
''' ########################################################################'''
from comtrade import Comtrade
import matplotlib.pyplot as plt
import re
import struct''' ##########################################################################                                                               ##    main                                                  ##                                                               ########################################################################''''''------------------------- 全局变量 -------------------------'''
ERROR   = -1
OK      = 0'''------------------------- main -------------------------'''def main ():""" Function doc """cfile = Comtrade("twave")cfg_read_ok = cfile.cfg_read()dat_read_ok = cfile.dat_read()if cfg_read_ok==0 and dat_read_ok==0:plt.plot(cfile.ana_infos[1]['pri_data'][1000:], linewidth=1, )plt.show()return OK'''------------------------- run -------------------------'''
main()
'''------------------------- end -------------------------'''

运行结果。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/lTNjPpY4.shtml

相关文章

Comtrade格式录波数据显示

本文介绍几种comtrade格式的电力录波查看方法&#xff0c;并给出相关的下载链接 这几个软件的具体使用方法就不一一详述了&#xff0c;最后给出使用MATLAB GUI的录波数据查看步骤 具体还是要自己动手实现 几个软件实现效果图以及相关下载链接 仅供参考 ScopeView Download 效…

COMTRADE格式录波数据分析以及函数实现(一)

一、首先&#xff0c;看一下COMTARDE是什么 COMTRADE是IEEE标准电力系统暂态数据交换通用格式。标准为电力系统或电力系统模型采集到的暂态波形和事故数据的文件定义了一种格式。该格式意欲提供一种易于说明的数据交换通用格式。IEEE于1991年提出&#xff0c;并于1999进行了修…

如何申请免费SSL证书?宝塔面板SSL证书安装部署完整教程

如何申请免费SSL证书&#xff1f;宝塔面板SSL证书安装部署完整教程 现在很多网站都由原来的http://www.xxx.com转换为https://www.xxx.com&#xff0c;这就是说从http协议转到了https协议。如果说网站不是https协议&#xff0c;Chrome浏览器会提示不安全。https比http协议安全性…

HTTPS证书及其安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 HTTPS证书及其安装 HTTPS证书一、 试查http协议1启动jmeter&#xff0c;添加测试元件1&#xff09;添加缓存管理器2&#xff09;添加cookie管理器3&#xff09;添加http请求默…

【Linux】宝塔面板 SSL 证书安装部署

宝塔面板 SSL 证书安装部署 前言证书下载宝塔配置SSL注意事项 前言 前期有讲过Tomcat和Nginx分别部署SSL证书&#xff0c;但也有好多小伙伴们私信我说&#xff0c;帮忙出一期宝塔面板部署SSL证书的教程&#xff0c;毕竟宝塔的用户体量也是蛮大的&#xff0c;于是宠粉的博主&am…

宝塔面板 SSL 证书安装部署

注册与购买域名-Tencent Cloud 腾讯云、华为云、阿里云等都可以购买域名并备案做dns解析。需要主要&#xff1a;域名的购买可以任意选云服务厂商&#xff0c;但是dns解析时只能指向dns服务商的主机。简单的说&#xff1a;腾讯云的dns服务器可以解析腾讯云的云服务器(ECS),不能…

javaScript中的鼠标事件

鼠标点击事件 onclick单击事件 鼠标单击时事件处理函数 <input type"button" id"bt" value"点击"> <script> //找到按钮并设置点击事件document.getElementById("bt").onclick function (){//被点击后弹出弹出框alert…

JavaScript鼠标事件与函数

通过鼠标触发事件&#xff0c;类似用户的行为&#xff1a; 鼠标事件列表&#xff0c;要在(body)里设一个div,id名要为box&#xff0c;style里设置它的的宽、高&#xff0c;然后再script里设置脚本语言&#xff0c;使他在里面能够运行。下面script都例了鼠标每一样事件&#xff…

java鼠标js触发事件吗,JavaScript鼠标事件是什么?JavaScript鼠标事件详解

js中是比较简单的语言&#xff0c;然而js的精髓就是js事件&#xff0c;这也是js当中最重要的部分&#xff0c;很多人对JavaScript鼠标事件是什么还不是很了解&#xff0c;下面我们对JavaScript鼠标事件进行详解。 一&#xff1a;在js中&#xff0c;鼠标事件有很多&#xff0c;其…

Js鼠标事件与函数

鼠标事件&#xff08;Mouse Events&#xff09; 通过鼠标触发事件, 类似用户的行为: 鼠标事件列表&#xff0c;要在body里设一个div&#xff0c;id名要为box&#xff0c;style里设置它的宽、高&#xff0c;然后再script里设置脚本语言&#xff0c;使它在里面能够运行。下面scr…

JS鼠标事件(非常详细)

这里写目录标题 一、 常用到的鼠标事件鼠标点击鼠标移动鼠标经过鼠标来源鼠标定位鼠标按键 一、 常用到的鼠标事件 在 JavaScript 中&#xff0c;鼠标事件是 Web 开发中最常用的事件类型&#xff0c;鼠标事件类型详细说明如下表所示&#xff1a; 鼠标事件类型 项目Valueclick…

JS鼠标事件实现动效

1 JS鼠标事件 click鼠标点击事件 事件对象.onclickfunction() {}mousedown / mouseup 鼠标按下/松开事件 事件对象.onmousedown function() {}mouseenter / mouseleave 鼠标移入/移出事件mouseover / mouseout 鼠标移入移出mousemove 鼠标移动事件mousewheel 滚轮滚动事件 注…

JavaScript鼠标事件

JavaScript鼠标事件 js中是比较简单的语言&#xff0c;然而js的精髓就是js事件&#xff0c;这也是js当中最重要的部分&#xff0c;很多人对JavaScript鼠标事件是什么还不是很了解&#xff0c;下面我们对JavaScript鼠标事件进行详解。 鼠标事件&#xff08;Mouse Events&#…

Linux运维之zabbix(四)onealert云告警平台

Linux运维之zabbix&#xff08;四&#xff09;onealert云告警平台 什么是云告警平台&#xff1f; 可以通过微信、邮件等快速接入各类警告信息&#xff0c;通过降噪、聚类、分派、通知、排班等功能&#xff0c;提高告警管理能力 云告警平台的部署 百度搜索oneallert&#xf…

zabbix集成onealert报警 、利用proxy分担server端压力

前言 告警将重要信息发送给运维「或者其他相关人」&#xff0c;及时发现并且处理问题。在所有开源监控软件里面&#xff0c;Zabbix 的告警方式无疑是最棒的。告警的方式各式各样&#xff0c;从 Email 告警到飞信、139/189邮箱、最后到微信甚至电话告警&#xff0c;接入存在各种…

利用zabbix部署onealert云报警平台

实验环境&#xff1a; server4 172.25.254.4 server4作为zabbix-server服务器&#xff0c;并在其上搭建zabbix-agent客户端。 server5 172.25.254.5 server5 作为zabbix-agent客户端 1. 部署好zabbix基本环境&#xff0c;让其监控sever4、s…

Zabbix(五)利用Zabbix部署onealert云告警平台

一、利用Zabbix部署onealert云告警平台 人的精力是有限的&#xff0c;当我们部署好zabbix监控&#xff0c;为监控主机添加各种监控项完毕之后&#xff0c;不可能时时刻刻去盯着我们的主机看&#xff0c;如果一个主机出现异常&#xff0c;我们该如何在第一时间获得其异常信息&a…

Zabbix监控整合OneAlert报警平台实现邮件、短信、微信、电话多方式报警

Zabbix传统告警方法 Email&#xff1a;调用 sendmail 、sendEmail 等脚本通过 SMTP 发送邮件 飞信&#xff1a;飞信已经退出历史舞台&#xff0c;不再有人使用 189/139&#xff1a;发送邮箱邮件至邮箱&#xff0c;邮箱将短信转到用户手机短信&#xff0c;存在一定的延迟 微…

详解 OneAlert 排班可以帮你做什么

排班的存在&#xff0c;实质是通过有序安排&#xff0c;降低企业/团队人力成本&#xff0c;提升工作效率。 阅读导航&#xff08;预计2min&#xff09; 1. 详解排班功能 轮班机制 工作时间 双视图展示 灵活调整 2. 利用排班如何助力运维团队 排班策略让告警更精准分派到人 …

zabbix 使用onealert云报警平台

在www.onealert.com上 获取key值 安装步骤&#xff1a; [rootserver1 zabbix安装包]# cp oneitsm_zabbix_release-1.2.0.tar.gz /usr/lib/zabbix/alertscripts/ [rootserver1 zabbix安装包]# cd /usr/lib/zabbix/alertscripts/ [rootserver1 alertscripts]# ls oneitsm_zab…