-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSerie13.py
More file actions
122 lines (108 loc) · 6.31 KB
/
Serie13.py
File metadata and controls
122 lines (108 loc) · 6.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from Tools import limitar
class Serie13:
largoRegistro = 42
bogusBytes = 57
largoHeaderData = 36
largoHeaderCalibracion = 35
largoRegistroErr = 7
iCoef = 6881
eCoef = 366 / 23331
deltaMax = 1.3
fkrCap = 2.0
thdCap = 10.0
phiCap = 1.0
reverse = True
# FORMAT STRINGS
regex = '(?P<bogus>(?<=\xff)[^\xff]{%s}(?=\xff))|(?P<calibr>[^\xff]{%s}(?=\xff))?\xff(?P<header>(?<=\xff)[^\xff]{%s}(?=\xff))|(?P<err>(?<=\xff)[^\xff]{%s}(?=\xff))|(?P<reg>[^\xff]{%s})'
headerFormatString = 'Equipo Nro:\t{}\t\tCódigo de Cliente: \tID. Subestación:\t{}\nNumero de Serie:\t{}\tPeriodo:\t{} {}.\nTensión: \t{} V\t\tFactor de Corrección: {}\nCorriente:\t{} Amp\t\tFactor de Corrección: {}\nDia inicio:\t{}\tDia fin:\t{}\nHora inicio:\t{}\tHora fin:\t{}\n\nFecha\tHora\tU1\tU1 Max\tU1 Min\tIA1\tCosFi 1\tEA1\tU2\tU2 Max\tU2 Min\tIA2\tCosFi 2\tEA2\tU3\tU3 Max\tU3 Min\tIA3\tCosFi 3\tEA3\tTHD1\tFlicker1\tP Total\tEA Total\tAnormalidad\n\t\tV\tV\tV\tA\tp.u.\tKWh\tV\tV\tV\tA\tp.u.\tKWh\tV\tV\tV\tA\tp.u.\tKWh\t%\t%\tKW\tKWh\t\n'
regFormatString = '%s\t%s\t%0.2f\t%0.2f\t%0.2f\t%0.2f\t%0.3f\t%0.3f\t%0.2f\t%0.2f\t%0.2f\t%0.2f\t%0.3f\t%0.3f\t%0.2f\t%0.2f\t%0.2f\t%0.2f\t%0.3f\t%0.3f\t%0.2f\t%0.3f\t%0.3f\t%0.3f\t%s\n'
errFormatString = '{}\t{}\t{}\n'
# MAPAS
regMap = ['fkrRaw', 'thdRaw3', 'e3b1', 'e3b2', 'e3b3', 'i3Raw', 'v3MinRaw', 'v3MaxRaw',
'v3Raw', 'thdRaw2', 'e2b1', 'e2b2', 'e2b3', 'i2Raw', 'v2MinRaw', 'v2MaxRaw', 'v2Raw', 'thdRaw1', 'e1b1',
'e1b2', 'e1b3', 'i1Raw', 'v1MinRaw', 'v1MaxRaw', 'v1Raw']
regDatMap = ['v1', 'v1Max', 'v1Min', 'i1', 'phi1', 'e1', 'v2', 'v2Max', 'v2Min', 'i2', 'phi2', 'e2', 'v3', 'v3Max',
'v3Min', 'i3', 'phi3', 'e3', 'thd', 'fkr', 'pTotal', 'eTotal']
calibrMap = ['fileName', 'cThd1', 'cRes1', 'cThd3', 'cRes3', 'cThd2', 'cRes2', 'cFkr']
headerMap = ['serie', 'equipo', 'periodo', 'dStrt', 'mStrt', 'yStrt', 'hStrt', 'minStrt', 'vNomRaw', 'iNomRaw',
'dEnd', 'mEnd', 'yEnd', 'hEnd', 'minEnd']
errMap = ['codigo', 'S', 'M', 'H', 'd', 'm', 'y']
# UNPACK STRINGS
unpackReg = '>x H H 3b H HHH H 3b H HHH H 3b H HHH'
unpackHeaderCalibracion = '=16s xxxxx H H H H H H H' # thd1 res1 thd3 res3 thd2 res2 fkr
unpackHeaderData = '>8s B 2s 2s2s2s2s2s x B B 2s2s2s2s2s 2x'
unpackErr = '>BBBBBBB'
def setRegex(self):
formatTuple = (
self.bogusBytes, self.largoHeaderCalibracion, self.largoHeaderData, self.largoRegistroErr,
self.largoRegistro)
self.regex = self.regex % formatTuple
def setVariante(self, rawData):
self.setRegex()
def analizarRegistroDat(self, reg, calibr, tv, ti, header):
from math import floor
calibr.cV = 26214 / (220 / header.vNom)
reg.v1 = reg.v1Raw * (header.vNom / calibr.cV) * tv
reg.v1Max = reg.v1MaxRaw * (header.vNom / calibr.cV) * tv
reg.v1Min = reg.v1MinRaw * (header.vNom / calibr.cV) * tv
if reg.v1 > reg.v1Max: reg.v1Max = reg.v1
if reg.v1Min > reg.v1: reg.v1 = reg.v1Min
reg.v1, reg.v1Max, reg.v1Min = (limitar(v, 0, header.vNom * self.deltaMax * tv) for v in
(reg.v1, reg.v1Max, reg.v1Min))
reg.v2 = reg.v2Raw * (header.vNom / calibr.cV) * tv
reg.v2Max = reg.v2MaxRaw * (header.vNom / calibr.cV) * tv
reg.v2Min = reg.v2MinRaw * (header.vNom / calibr.cV) * tv
if reg.v2 > reg.v2Max: reg.v2Max = reg.v2
if reg.v2Min > reg.v2: reg.v2 = reg.v2Min
reg.v2, reg.v2Max, reg.v2Min = (limitar(v, 0, header.vNom * self.deltaMax * tv) for v in
(reg.v2, reg.v2Max, reg.v2Min))
reg.v3 = reg.v3Raw * (header.vNom / calibr.cV) * tv
reg.v3Max = reg.v3MaxRaw * (header.vNom / calibr.cV) * tv
reg.v3Min = reg.v3MinRaw * (header.vNom / calibr.cV) * tv
if reg.v3 > reg.v3Max: reg.v3Max = reg.v3
if reg.v3Min > reg.v3: reg.v3 = reg.v3Min
reg.v3, reg.v3Max, reg.v3Min = (limitar(v, 0, header.vNom * self.deltaMax * tv) for v in
(reg.v3, reg.v3Max, reg.v3Min))
reg.i1 = reg.i1Raw * (header.iNom / self.iCoef)
reg.i2 = reg.i2Raw * (header.iNom / self.iCoef)
reg.i3 = reg.i3Raw * (header.iNom / self.iCoef)
reg.e1 = ((((reg.e1b1 << 7) + reg.e1b2) << 7) + reg.e1b3) * (header.iNom / 35) * (
self.eCoef / 1000) * tv * ti
reg.e2 = ((((reg.e2b1 << 7) + reg.e2b2) << 7) + reg.e2b3) * (header.iNom / 35) * (
self.eCoef / 1000) * tv * ti
reg.e3 = ((((reg.e3b1 << 7) + reg.e3b2) << 7) + reg.e3b3) * (header.iNom / 35) * (
self.eCoef / 1000) * tv * ti
calibr.cV = header.vNom
try:
thd1 = (100 / reg.v1) * (
(18 / (calibr.cThd1 - calibr.cRes1)) * (
reg.thdRaw1 - (floor(calibr.cRes1 / calibr.cV) * reg.v1)))
except ZeroDivisionError:
thd1 = 0.0
# thd2 = (100 / reg.v2) * (
# (18 / (calibr.cThd2 - calibr.cRes2)) * (reg.thdRaw2 - (floor(calibr.cRes2 / calibr.cV) * reg.v2)))
# thd3 = (100 / reg.v3) * (
# (18 / (calibr.cThd3 - calibr.cRes3)) * (reg.thdRaw3 - (floor(calibr.cRes3 / calibr.cV) * reg.v3)))
reg.thd = limitar(thd1, 0, self.thdCap)
try:
reg.phi1 = reg.e1 / (reg.i1 * reg.v1 / 1000 * header.periodo / 60)
except ZeroDivisionError:
reg.phi1 = 0.0
try:
reg.phi2 = reg.e2 / (reg.i2 * reg.v2 / 1000 * header.periodo / 60)
except ZeroDivisionError:
reg.phi2 = 0.0
try:
reg.phi3 = reg.e3 / (reg.i3 * reg.v3 / 1000 * header.periodo / 60)
except ZeroDivisionError:
reg.phi3 = 0.0
reg.phi1, reg.phi2, reg.phi3 = (limitar(phi, 0, self.phiCap) for phi in
(reg.phi1, reg.phi2, reg.phi3))
try:
fkr = ((reg.fkrRaw * header.vNom * .02) / calibr.cFkr) * (100 / reg.v1 * tv)
except ZeroDivisionError:
fkr = 0.0
reg.fkr = limitar(fkr, 0, self.fkrCap) * (220 / header.vNom)
reg.pTotal = (reg.v1 * reg.i1 * reg.phi1 + reg.v2 * reg.i2 * reg.phi2 + reg.v3 * reg.i3 * reg.phi3) / 1000
reg.eTotal = sum((reg.e1, reg.e2, reg.e3))
return reg