Resultados 401 al 425 de 1294
- 04/08/2016, 01:13 #401
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Mientras, voy haciendo algunas pruebas.
Partiendo de donde lo dejamos, puedo hacer esto:
Código PHP:for fila in results :
id_rele = fila[0]
nombre = fila[1]
modo = fila[2]
id_rele2 = fila[3] #### no hace falta cargalo, es sólo un ejemplo
operacion = fila[4]
parametro = fila[5]
condicion = fila[6]
valor = fila[7]
if parametro == 'Vbat' and condicion == '>' :
.... #aquí vendrían todas las condiciones
¿Dónde se complica? Pues que como son varias las condiciones que deben cumplirse y están en distintas filas, habría que usar variables extras para saber si una condición estaba activa o no en el paso anterior.
No me disgusta lo de usar 2 tablas, pero igual que tú (Manuel) quizás colocaría todas las condiciones, parámetros y valores en una misma fila.
Por poner un ejemplo:
Código PHP:for fila in results :
id_rele = fila[0]
nombre = fila[1]
modo = fila[2]
operacion = fila[4]
parametro1 = fila[5]
condicion1 = fila[6]
valor1 = fila[7]
parametro2 = fila[8]
condicion2 = fila[9]
valor2 = fila[10]
parametro3 = fila[11]
condicion3 = fila[12]
valor3 = fila[13]
if operacio == 'ON' :
if ....
Y mientras escribía esto, he pensado que todavía se puede simplificar más, sin necesidad de poner ni parámetros, ni condiciones, sólo valores. Vbat, Ibat, SOC, ... Respetando en las condiciones de los algoritmos dichos parámetros, condiciones y valores.
Tal que :
Código PHP:if operacion == 'ON' : ###no tengo claro para que vamos a usarlo
if vbat > valor1 and ibat > valor2 and SOC > valor3 :
print('Rele %s ON'),id_rele
i2c_rele(.....)
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
-
- 04/08/2016, 03:06 #402
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Bueno...un poco de codificación...esta sin validar dado que lo haré solo aqui "a pelo" y no en un entorno real
Espero no tener muchos errores lógicos y/o de sintaxis
Partimos que tenemos una tabla formada por el join de las tablas Reles y Reles_C con los siguientes campos relevantes:
Id_Rele, Modo, Operacion, Parametro, Condicion, Valor
Aunque segun comenta Nikitto los registros se tendran en una matriz Result[I][J], para una mejor lectura del algoritmo pondré R(I,Valor) o R(I,Condicion),.... para referirnos a cada campo del registro I
...Vamos a ver como podría ser el algoritmo...
Al principio del programa se deben inicializar poniendo todo a 0 / apagando los reles....
Si se guarda el estado de los reles en la BD se puede coger dicho estado al principio del programa
Utilizaremos 2 matrices (Rele_Out y Reles_Out_Ant) para tener el estado de los reles en T y en T-1
Código PHP:'Inicio Programa
.....
For I=1 to 8 ' Integrados GPIO se puede poner 8 como max o el numero de integrados GPIO instalados
For J=1 to 8 ' 8 puertos por cada integrado GPIO
Rele_Out(I,J)=0 ' Estado de los reles a 0
Rele_Out_Ant(I,J)=0 ' Estado de los Reles en la anterior muestra a 0
I2C_Rele (I+31,J,0) ' Apago todos los reles utilizando la funcion I2C_Rele hecha previamente
Next J
Next I
......
Ahora vamos con la parte a ejecutar con cada muestra
Código PHP:'BUCLE CADA MUESTRA
.........
Leo datos Vbat, Ibat,etc
Guardo en la BD
......
' Algoritmo condiciones RELES
For I=1 to 8
For J=1 to 8
Rele_Out_Ant(I,J)=Rele_Out(I,J) ' Guardamos el estado anterior de los reles
Next J
Next I
Poner código para leer de la BD las tablas de reles+condiciones y pasar los valores a R(I,J)
N_Condiciones= XXXXXX 'Poner funcion para que de el numero de registros de la tabla de condiciones
For I= 1 to N_Condiciones
Puerto=R(I,Id_Rele)%10 ' Nos da el numero de rele en cada integrado GPIO del 1 al 8
GR= (R(I,Id_Rele)-Puerto)/10-31 'Nos da el Grupo de Reles... de tal forma que
' GR=1 si Id_rele=32X,
' GR=2 si Id_rele=33X
'.....
Rele_Out(GR,Puerto)=1 ' Encendemos virtualmente todos los reles por defecto
' posteriormente lo haremos o no en funcion de la programacion horaria
Next I
' Bucle para ver si los mantenemos encendidos o se apagan dependiendo de las condiciones
For I= 1 to N_Condiciones
Puerto=R(I,Id_Rele)%10
GR= (R(I,Id_Rele)-Puerto)/10-31
'Vbat
If R(I,Parametro)=="Vbat" and R(I,Condicion)=="<" then
If R(I,Operacion)=="ON" and Vbat > Valor and Rele_Out_Ant(GR,Puerto)==0 then Rele_Out(GR,Puerto)=0
If R(I,Operacion)=="OFF" and Vbat < Valor then Rele_Out(GR,Puerto)=0
Endif
If R(I,Parametro)=="Vbat" and R(I,Condicion)==">" then
If R(I,Operacion)=="ON" and Vbat < Valor and Rele_Out_Ant(GR,Puerto)==0 then Rele_Out(GR,Puerto)=0
If R(I,Operacion)=="OFF" and Vbat > Valor then Rele_Out(GR,Puerto)=0
Endif
'Ibat
If R(I,Parametro)=="Ibat" and R(I,Condicion)=="<" then
If R(I,Operacion)=="ON" and Ibat > Valor and Rele_Out_Ant(GR,Puerto)==0 then Rele_Out(GR,Puerto)=0
If R(I,Operacion)=="OFF" and Ibat < Valor then Rele_Out(GR,Puerto)=0
Endif
If R(I,Parametro)=="Ibat" and R(I,Condicion)==">" then
If R(I,Operacion)=="ON" and Ibat < Valor and Rele_Out_Ant(GR,Puerto)==0 then Rele_Out(GR,Puerto)=0
If R(I,Operacion)=="OFF" and Ibat > Valor then Rele_Out(GR,Puerto)=0
Endif
'SOC
If R(I,Parametro)=="SOC" and R(I,Condicion)=="<" then
If R(I,Operacion)=="ON" and SOC > Valor and Rele_Out_Ant(GR,Puerto)==0 then Rele_Out(GR,Puerto)=0
If R(I,Operacion)=="OFF" and SOC < Valor then Rele_Out(GR,Puerto)=0
Endif
If R(I,Parametro)=="SOC" and R(I,Condicion)==">" then
If R(I,Operacion)=="ON" and SOC < Valor and Rele_Out_Ant(GR,Puerto)==0 then Rele_Out(GR,Puerto)=0
If R(I,Operacion)=="OFF" and SOC > Valor then Rele_Out(GR,Puerto)=0
Endif
......otras condiciones...Iplaca, Temp,...
' Forzado ON/OFF
If R(I,Modo)=="ON" then Rele_Out(GR,Puerto)=1
If R(I,Modo)=="OFF" then Rele_Out(GR,Puerto)=0
Next I ' siguiente condicion
'Ahora toca encender o apagar los reles realmente de acuerdo a la matriz Rele_Out() que nos ha quedado
'Bucle de encendido/apagado de RELES
For I=1 to 8
For J=1 to 8
If Rele_Out(I,J)=1 and Rele_Out_Ant(I,J)=0 then
I2C_Rele (I+31,J,1) ' Enciendo utilizando la funcion I2C_Rele hecha previamente
Endif
If Rele_Out(I,J)=0 and Rele_Out_Ant(I,J)=1 then
I2C_Rele (I+31,J,0) ' Apago utilizando la funcion I2C_Rele hecha previamente
Endif
Next J
Next I
......
Faltaria
- Hacer algo para encender solo 1 rele en cada bucle y asi no tener picos en el inversor
- Ver incongruencias...por ejm que se de un registro que no tenga un valor de parámetro valido (Vbat, Ibat,..) o condición valida (>,<) ......,para ello hay que asegurar que en la BD solo se pueden meter registros validos
Igualmente parece que se podría hacer un código genérico que dependiendo de una tabla donde se den de alta los posibles parámetros (Vbat, Ibat, SOC,...) funcionara de tal forma que si queremos añadir un nuevo parámetro (por ejm Iplaca3) no haría falta cambiar/modificar el código sino dar de alta un registro mas en la tabla de parámetros posibles y ya esta
No obstante probemos si va el algoritmo y después lo mejoramos si procede y ponemos la programación horaria
Edito...
Nikitto acabo de ver que ya le estabas dando vueltas...sigo pensando que es mas "profesional" mantener dos tablas y todavía mas tener una tercera de posibles parámetros (Vbat, Ibat,SOC,..) .... esto de la tercera tabla nos lo planteamos despues
En mi algoritmo considero que se saca de la BD una matriz de dos dimensiones R(I,J) con todas las condiciones dadas de alta y en donde I es el numero de registro y J es el campo dentro del registro....y con ello hacer un FOR ......¿lo haces asi?
Si esto complica se puede hacer sin matriz con un DO...WHILE empezado por el primer registro y recorriendo la tabla hasta llegar al ultimo registro (condición while de salida)
- - - - - - - - - - - - - - - - - - -
Dale una vuelta a esta lógica que dices.....si tienes solo unos 4 parametros Vbat, Ibat, SOC y Temp... y quieres poder encender y apagar reles con todas las posibles combinatorias
Por ejm encender cuando
Vbat> Valor y Ibat> Valor y SOC>Valor ....o
Vbat< Valor y Ibat> Valor y SOC>Valor ....o
......
Piensa que un rele puede ser para consumo (Depuradora) o para otro uso (conectar placas, grupo electrogeno, etc) y por tanto por ejm la condicion de Vbat para el ON a veces sera con Vbat>Valor y otras Vbat<Valor
Igual para otros parametros..por ejm si el parametro es temperatura, el ON de un calefactor sera claramente distinto que el de un Aire Acondicionado
Calefactor....ON si Temp<X....OFF si Temp>Y
Aire Acond...ON si Temp>X....OFF si Temp<YÚltima edición por Mleon; 04/08/2016 a las 03:20 Razón: Mensaje anterior Nikitto
- 04/08/2016, 08:53 #403
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
¡Pedazo trabajo te has marcado!
Luego me lío con el código. Aunque yo no me refería a usar una tercera tabla, sino a usar algo parecido a lo que usas tú. Una primera tabla con id_rele, nombre y modo; y una segunda tabla con operación (ON/OFF) y todos los parámetros, condiciones y valores.
Es decir, ahora en cada fila id_rele de la segunda tabla, se define una operación (ON/OFF) y un solo parámetro (vbat, ibat, soc), ¿ no sería más cómodo definir todos los parámetros en esa misma línea? Y que para un mismo id_rele sólo hubiera 2 líneas, uno con operación ON y otra con operación OFF.
Pongo ejemplo de como se vería con el JOIN:
321, DEPURADORA, PRG, 321, ON, vbat, >, 26, ibat, >, 0, SOC, >, 95, ......
321, DEPURADORA, PRG, 321, OFF, vbat, <, 25.5, ibat, <, -10, SOC, <, 90, .....
Lógicamente las comas sobran.
¿Qué te parece está idea? ¿No es más cómodo, fácil? En resumidas cuentas, es muy parecido a como lo tienes tú.PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 04/08/2016, 10:53 #404
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Se que es mas fácil conceptualmente hacer lo que dices....pero es mucho mas potente y serio hacer lo que estamos haciendo
Si se hace lo que dices y posteriormente se quiere añadir otro parámetro ( Temperatura, Iplaca, ...) toca cambiar el diseño de la BD y la codificación......lo cual no es grave pero no estaríamos haciendo un buen diseño
Con las 2 tablas si posteriormente se quiere añadir un parámetro la BD no hace falta cambiarla....la codificación si
Con las 3 tablas que yo comentaba al final....no se tocaría ni la BD ni la codificación
Como estamos para aprender la primera opción, dado que tenemos una BD, es una solución demasiado de aficionado.....
La opción que hemos elegido si la miras no es muy difícil de entender, y ya veras como es mejor que lo de registros con muchos campos ( y que conste que asi lo tengo yo implementado ahora, pero yo no tengo la potencia de una Rpi con BD, internet, etc)Última edición por Mleon; 05/08/2016 a las 00:42
PVControl+ (web espejo a la real cada 5'...se puede trastear)
Manual Instalación desde Imagen SD
Manual Instalación Reles Wifi
Algo de Funcionalidad (ya tiene control excedentes via wifi, etc...)#743
- 04/08/2016, 11:54 #405
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Me fiaré de ti en cuanto a potencia y seriedad de programación. En mi trabajo siempre he pensado que cuantas menos uniones menos posibilidades de que algo falle. Lógicamente mis estudios dejan algo que desear, no así mi cabezonería y ganas de aprender.
Seguiré con el código propuesto adaptándolo a Python.
Mientras la depuradora funciona dentro del horario establecido por el programador horario, valga la redundancia; de 11h a 16h, siempre que se cumplan estas condiciones:
Código PHP:if vbat > 25.5 and soc > 94 :
i2c_rele(0x20,1,1)
elif vbat < 25 or soc < 90 :
i2c_rele(0x20,1,0)
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 04/08/2016, 12:06 #406
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Ok....aqui has programado en codigo los parametros que usas y la histeresis de ON/OFF....es totalmente valido pero creo que estamos de acuerdo que si se quiers cambiar que en lugar de encenderse con SOC>94 queremos que sea 92.....no es buena solucion parar el programa, cambiar la codificacion, y arrancar el programa
PVControl+ (web espejo a la real cada 5'...se puede trastear)
Manual Instalación desde Imagen SD
Manual Instalación Reles Wifi
Algo de Funcionalidad (ya tiene control excedentes via wifi, etc...)#743
- 04/08/2016, 12:26 #407
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
En eso y en mucho más estamos totalmente de acuerdo. Ya hace tiempo que tomamos la decisión de usar BD. Lo del código es momentáneo mientras no llega el resto.
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 04/08/2016, 23:32 #408
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Vamos con la primera parte del algoritmo. Para complicar la cosa en Python no existen las matrices, hay que crearlas:
Código PHP:### Definir matrices Rele_Out y Rele_Out_Ant y apagar todos los reles
Rele_Out = [None] * 9
for i in range(9):
Rele_Out[i] = [None] * 9
Rele_Out_Ant = [None] * 9
for i in range(9):
Rele_Out_Ant[i] = [None] * 9
for I in range(1,9) :
for J in range(1,9) :
Rele_Out[I][J] = 0
Rele_Out_Ant[I][J] = 0
i2c_rele(I+31,J,0)
Código PHP:for I in range(1,9) :
for J in range(1,9) :
Rele_Out[I][J] = 0
Rele_Out_Ant[I][J] = 0
print('Rele_Out[%s][%s]=%s') % (I,J,Rele_Out[I][J])
print('Rele_Out_Ant[%s][%s]=%s') % (I,J,Rele_Out_Ant[I][J])
Rele_Out[1][1]=0
Rele_Out_Ant[1][1]=0
Rele_Out[1][2]=0
Rele_Out_Ant[1][2]=0
Rele_Out[1][3]=0
Rele_Out_Ant[1][3]=0
Rele_Out[1][4]=0
Rele_Out_Ant[1][4]=0
Rele_Out[1][5]=0
Rele_Out_Ant[1][5]=0
Rele_Out[1][6]=0
Rele_Out_Ant[1][6]=0
Rele_Out[1][7]=0
Rele_Out_Ant[1][7]=0
Rele_Out[1][8]=0
Rele_Out_Ant[1][8]=0
Rele_Out[2][1]=0
...
Rele_Out[8][3]=0
Rele_Out_Ant[8][3]=0
Rele_Out[8][4]=0
Rele_Out_Ant[8][4]=0
Rele_Out[8][5]=0
Rele_Out_Ant[8][5]=0
Rele_Out[8][6]=0
Rele_Out_Ant[8][6]=0
Rele_Out[8][7]=0
Rele_Out_Ant[8][7]=0
Rele_Out[8][8]=0
Rele_Out_Ant[8][8]=0
Última edición por nikitto; 04/08/2016 a las 23:59
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 05/08/2016, 00:18 #409
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Curiosa forma de las matrices de Python......
He visto que hay que asegurar que este asignada bien la memoria a las filas
Para comprobarlo, pon por ejm en el bucle en lugar de =0 que cada valor sea =10*I+J...es decir
Código PHP:for I in range(1,9) :
for J in range(1,9) :
Rele_Out[I][J] = 10*I+J
Rele_Out_Ant[I][J] = 10*J+I
print('Rele_Out[%s][%s]=%s') % (I,J,Rele_Out[I][J])
print('Rele_Out_Ant[%s][%s]=%s') % (I,J,Rele_Out_Ant[I][J])
Última edición por Mleon; 05/08/2016 a las 00:33
- 05/08/2016, 06:10 #410
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Código PHP:Rele_Out[1][1]=11
Rele_Out_Ant[1][1]=11
Rele_Out[1][2]=12
Rele_Out_Ant[1][2]=21
Rele_Out[1][3]=13
Rele_Out_Ant[1][3]=31
Rele_Out[1][4]=14
Rele_Out_Ant[1][4]=41
Rele_Out[1][5]=15
...
Rele_Out_Ant[7][8]=87
Rele_Out[8][1]=81
Rele_Out_Ant[8][1]=18
Rele_Out[8][2]=82
Rele_Out_Ant[8][2]=28
Rele_Out[8][3]=83
Rele_Out_Ant[8][3]=38
Rele_Out[8][4]=84
Rele_Out_Ant[8][4]=48
Rele_Out[8][5]=85
Rele_Out_Ant[8][5]=58
Rele_Out[8][6]=86
Rele_Out_Ant[8][6]=68
Rele_Out[8][7]=87
Rele_Out_Ant[8][7]=78
Rele_Out[8][8]=88
Rele_Out_Ant[8][8]=88
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 05/08/2016, 10:26 #411el_cobarde Invitado
- 05/08/2016, 10:48 #412
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
PVControl+ (web espejo a la real cada 5'...se puede trastear)
Manual Instalación desde Imagen SD
Manual Instalación Reles Wifi
Algo de Funcionalidad (ya tiene control excedentes via wifi, etc...)#743
- 06/08/2016, 04:12 #413
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
No estaba muy a gusto yo con eso de repetir el mismo código por cada parámetro variando solo el nombre de dicho parámetro (Vbat, Ibat,SOC....) y por eso lo de plantearme una tercera tabla
Asi que, como no conozco Python, se lo comento a mi hijo y me dice.....trivial...usa un diccionario
En fin...me quedo un poco mas tranquilo con respecto a mi pensión en el futuro y veo que es eso del diccionario
Tras ver un poco los conceptos..parace que lo logico es tener los valores capturados del sistema FV en un diccionario....por ejemplo DatosFV de tal forma que:
Código PHP:DatosFV={} #damos de alta el diccionario al principio
........
# en el programa en lugar de asignar a las variables Vbat, Ibat,... asignamos en el diccionario
DatosFV['Vbat']= 25
DatosFV['Ibat']= -3.5
DatosFV['SOC']= 95
........
# en el algoritmo de los reles ponemos dentro del bucle que va recorriendo las condiciones simplemente este código que debería valer para cualquier parámetro
........
If R(I,Condicion)=="<" then
If R(I,Operacion)=="ON" and DatosFV[R(I,Parametro)] > Valor and Rele_Out_Ant(GR,Puerto)==0 then
Rele_Out(GR,Puerto)=0
If R(I,Operacion)=="OFF" and DatosFV[R(I,Parametro)] < Valor then Rele_Out(GR,Puerto)=0
Endif
If R(I,Condicion)==">" then
If R(I,Operacion)=="ON" and DatosFV[R(I,Parametro)] < Valor and Rele_Out_Ant(GR,Puerto)==0 then
Rele_Out(GR,Puerto)=0
If R(I,Operacion)=="OFF" and DatosFV[R(I,Parametro)] > Valor then Rele_Out(GR,Puerto)=0
Endif
.........
Logicamente la sintaxis de DatosFV[R(I,Parametro)] no estará bien...mañana veo como seria realmente en Python
Si funciona..... queda bastante mas "elegante" que mi codificación anterior
Ademas no haria falta cambiar nada del código si "mañana" necesitamos poner condiciones con otros parametros no contemplados ahora (Temp, Iplaca2,...)
En cualquier caso parece que siempre sera mas serio tener los datos que se leen de la instalación FV y que se guardan en la BD en un diccionario que las aglutine en lugar de en variables "sueltas" tipo Vbat, Ibat, SOC,....
- 06/08/2016, 11:39 #414
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Yo, la verdad, estoy exhausto. Ayer me tiré como 4 horas intentanto pasar el resultado de JOIN a una tabla tal que R[I][J]. Resultado = cero patatero.
Después de dormir un poco por fin tengo algo:
Código PHP:import MySQLdb
reles = MySQLdb.connect(host = "localhost", user = "fv", passwd = "fv", db = "fv")
cursor = reles.cursor()
sql_reles='SELECT * FROM reles JOIN reles_c WHERE reles.id_rele = reles_c.id_rele'
a=cursor.execute(sql_reles)
a=int(a) # a = numero de filas de la base de datos
R=cursor.fetchall()
for i in range(a): #numero de filas (variable)
for j in range(8): #numero de columnas (valor fijo)
print(R[i][j])
Esta claro que tu hijo nos va a salvar el trasero, mis vídeos de youtube sobre Python, no son suficientes. Cuando vi la parte de 'tablas' mencionaban tres: tuplas(inmutables), listas(mutables) y diccionarios(donde la clave es inmutable). La verdad entonces pensé más en un libro (diccionario) donde cada palabra (clave, en este caso) tiene un significado. Realmente, así es, cada clave hace referencia a una variable.
- - - - - - - - - - - - - - - - - - -
Profundizando más en el código anterior:
Código PHP:import MySQLdb
Rele = [None] * 9
for i in range(9):
Rele[i] = [None] * 9
reles = MySQLdb.connect(host = "localhost", user = "fv", passwd = "fv", db = "fv")
cursor = reles.cursor()
sql_reles='SELECT * FROM reles JOIN reles_c WHERE reles.id_rele = reles_c.id_rele'
a=cursor.execute(sql_reles)
a=int(a)
R=cursor.fetchall()
for i in range(a):
for j in range(8):
Rele[i+1][j+1]=R[i][j] #i+1 y j+1 para evitar el fila 0, columna 0
print(Rele[i+1][j+1])
Código PHP:...
321
DEPURADORA
PRG
321
ON
Vbat
>
26
321
DEPURADORA
PRG
321
OFF
Vbat
<
25
322
TERMO
PRG
322
ON
Vbat
>
25
322
TERMO
PRG
322
OFF
Vbat
<
24
...
Alguna cosa más mientras voy revisando el nuevo código:
¿Supongo que el uso del diccionario queda restringido al propio programa en Python? Y que por ahora, ¿no hay que hacer ningún cambio en las tablas: datos, reles y reles_c de la base de datos fv?
El uso de condición, operación y parámetro, por ahora queda limitada a una posición dentro de la fila.
Ejemplos:
Esta es una fila obtenida de la BD
((321L, 'DEPURADORA', 'PRG', 321L, 'ON', 'SOC', '>', Decimal('95'))
Como ya hemos añadido un +1 a I y a J ahora los registros empiezan en 1,1
Entonces:
Rele[1][5] <= Operación
Rele[1][6] <= Parámetro
Rele[1][7] <= Condición
Rele[1][8] <= Valor
es decir,
Rele[1][operacion] NO EXISTE, hay que usar los números.PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 06/08/2016, 14:19 #415
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Lo siento, una pena que no sepa Python (por ahora), el pasar una consulta o tabla de una BD a una matriz o a un diccionario de Python debe ser algo bastante estandard para quien trabaje con Python y BD
Lo bueno es que este "tiempo perdido" normalmente suele ser util para asentar conocimientos, etc
Quien no le haya amanecido alguna vez pensando un algoritmo que no sale es que ha programado poco
El que el indice empiece en 0,0 no es problema
Luego entiendo que con este código tenemos en la matriz R[][] todas las condiciones de los reles dadas de alta ¿no?
Lo único igual que con a=int(a) tenemos el numero de filas ¿ hay forma de tener el numero de columnas?..... a mi siempre me gusta dejar el código lo mas genérico posible...asi, si mañana el numero de columnas varia no se tiene que estar preocupado de analizar el código para ver donde hay que cambiarlo
No entiendo demasiado para que se crea la matriz Rele......nos vale con la matriz R.....si solo es por el tema del indice de 0,0 a 1,1....creo que no merece la pena....cambiamos el algoritmo un poco para adaptarnos a que R[][] empieza en 0,0
No veo que haya que hacer cambio en las tablas
Ya comente al principio del post en el que puse el algoritmo que el poner R[I][Operacion] lo hacia por claridad en la lectura del algoritmo, pero que en la realidad habria que cambiar los nombres "Operacion", "Condicion",... por números
Es verdad que una vez analizas el tema de diccionarios etc en Python, supongo que en lugar de utilizar matrices se podría hacer con diccionarios y así utilizar nombres en lugar de números
En cualquier caso ...utiliza lo que te sientas mas comodo de utilizar
- 06/08/2016, 18:41 #416
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Algoritmo o cualquier otro problema...después de reposar las neuronas, a uno se le hace más fácil todo.
Efectivamente.
Sí
Por ahora, ni idea de como hacerlo. He de mirarlo.
Yo diría que también. Pero como NO lo tenía claro, he buscado una posible solución.
Perfecto.
Se me paso ese comentario. Aunque te puedo asegurar que he intentado cambiar los números por nombres, usando una lista. Tal que:
j=['','id_rele','nombre','modo',id_rele2', .....] # el primer registro está vació por ser posición 0
Lo malo es que no ha funcionado.PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 07/08/2016, 03:53 #417
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Bueno...me lo he instalado y me he puesto un poco a mirar Python
Jugando con matrices,listas y diccionarios......con este código
Código PHP:print ("Utilizando Matrices y listas")
#Creacion matriz 8x8
R = [[None] * 8 for i in range(8)]
#Creacion lista solo 2 filas por pereza
Creles=[[1,"Termo","PRG",1,"ON","Vbat",">",25],[2,"Depuradora","PRG",2,"ON","Ibat",">",10]]
#Asignar Valores matriz directamente
R[0][0]=1
R[0][1]="Termo"
R[0][5]="Vbat"
R[0][7]=26
#Asignar Valores matriz con lista
print ("prueba de asignacion fila 1")
R[1]=Creles[1]
print (Creles[1])
print (R[1])
print ()
print ("prueba de asignacion elemento")
R[0][7]=Creles[0][7] # cambio valor 26 por 25
print (Creles[0][7])
print (R[0][7])
print()
# imprimimos la matriz completa y la lista completa
print ("Lista")
print (Creles)
print ("Matriz")
print (R)
print()
print ("luego no hay basicamente diferencia entre lista y matriz")
print ("en cuanto a la forma de referirse a sus componentes")
print ("----------------------")
print ("Vamos a utilizar Diccionarios")
#Diccionario datos FV
DatosFV={} #Creamos diccionario para los datos FV
#Asignamos valores normalmente
DatosFV['Vbat']=25
DatosFV['Ibat']=100
DatosFV['SOC']=95
#Prueba de un for usando nombres
for i in ("Vbat","Ibat","SOC"):
print (DatosFV[i])
print()
# Diccionario Condiciones para no usar numeros
C={'parametro':5,'valor':7} # pongo como ejm solo 2
print (Creles[0][5])
print (Creles[0][C['parametro']])
print()
print (Creles[1][5])
print (Creles[1][C['parametro']])
print ()
#Prueba de inspeccion de valores FV usando matriz , lista y diccionario
DatosFV[R[0][5]]=28 #Cambiamos el valor de DatosFV['Vbat'] refer. con Matriz
DatosFV[Creles[1][5]]=33 #Cambiamos el valor de DatosFV['Ibat'] refer. con lista
#Ahora rizamos un poco el rizo
print (DatosFV['Vbat'])
print (DatosFV[Creles[0][5]])
print (DatosFV[Creles[0][C['parametro']]])
print (DatosFV[Creles[1][C['parametro']]])
Código PHP:Utilizando Matrices y listas
prueba de asignacion fila 1
[2, 'Depuradora', 'PRG', 2, 'ON', 'Ibat', '>', 10]
[2, 'Depuradora', 'PRG', 2, 'ON', 'Ibat', '>', 10]
prueba de asignacion elemento
25
25
Lista
[[1, 'Termo', 'PRG', 1, 'ON', 'Vbat', '>', 25], [2, 'Depuradora', 'PRG', 2, 'ON', 'Ibat', '>', 10]]
Matriz
[[1, 'Termo', None, None, None, 'Vbat', None, 25], [2, 'Depuradora', 'PRG', 2, 'ON', 'Ibat', '>', 10], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None]]
luego no hay basicamente diferencia entre lista y matriz
en cuanto a la forma de referirse a sus componentes
----------------------
Vamos a utilizar Diccionarios
25
100
95
Vbat
Vbat
Ibat
Ibat
28
28
28
33
>>>
Última edición por Mleon; 07/08/2016 a las 04:34
- 07/08/2016, 11:49 #418
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Grande Manuel.
Creo que ya tengo el código a falta de probar.
Para no liarme he ido a buscar siempre las coordenadas 0,0. Menos en la definción de i2c_rele(), que lo he dejado tal cual.
Código PHP:#definicion de variables
DatosFV={} #Creamos diccionario para los datos FV
OP={'id_rele':0,'nombre':1,'modo':2,'id_rele2':3,'operacion':4,'parametro':5,'condicion':6,'valor':7}
...
### Definir matrices Rele_Out y Rele_Out_Ant y apagar todos los reles
Rele_Out = [[None] * 8 for i in range(8)]
Rele_Out_Ant = [[None] * 8 for i in range(8)]
for I in range(8) :
for J in range(8) :
Rele_Out[I][J] = 0
Rele_Out_Ant[I][J] = 0
i2c_rele(I+32,J+1,0) # las primeras coordenadas seran 32,1 = dirección, puerto
...
### Cargar tablas reles y reles_c
reles = MySQLdb.connect(host = "localhost", user = "fv", passwd = "fv", db = "fv")
cursor = reles.cursor()
sql_reles='SELECT * FROM reles JOIN reles_c WHERE reles.id_rele = reles_c.id_rele'
ncon=cursor.execute(sql_reles)
ncon=int(ncon) # = numero de condiciones
R=cursor.fetchall()
#Asignamos valores al diccionario
DatosFV['Vbat']=vbat
DatosFV['Ibat']=ibat
DatosFV['SOC']=soc
#algoritmo condiciones reles
for I in range(8):
for J in range(8):
Rele_Out_Ant[I][J]=Rele_Out[I][J] #para guardar el estado anterior de los reles
for I in range(ncon):
Puerto=(R[I][0]%10)-1 # desde 0 a 7
GR=(R[I][0]-Puerto)/10-32 # desde 0 donde GR=0 si id_rele=32X, GR=1 si id_rele=33X
Rele_Out[GR][Puerto]=1 #encendemos virtualmente todos los eles por defecto
for I in range(ncon):
Puerto=(R[I][0]%10)-1 # desde 0 a 7
GR=(R[I][0]-Puerto)/10-32 # desde 0 donde GR=0 si id_rele=32X, GR=1 si id_rele=33X
if R[I][OP['condicion']]=='<':
if R[I][OP['operacion']]=='ON' and DatosFV[R[I][OP['parametro']]] > R[I][OP['valor']] and Rele_Out_Ant[GR][Puerto] == 0 :
Rele_Out[GR][Puerto]=0
if R[I][OP['operacion']]=='OFF' and DatosFV[R[I][OP['parametro']]] < R[I][OP['valor']] :
Rele_Out[GR][Puerto]=0
if R[I][OP['condicion']]=='>':
if R[I][OP['operacion']]=='ON' and DatosFV[R[I][OP['parametro']]] < R[I][OP['valor']] and Rele_Out_Ant[GR][Puerto] == 0 :
Rele_Out[GR][Puerto]=0
if R[I][OP['operacion']]=='OFF' and DatosFV[R[I][OP['parametro']]] < R[I][OP['valor']] :
Rele_Out[GR][Puerto]=0
### forzado ON/OFF
if R[I][OP['modo']]=='ON' :
Rele_Out[GR][Puerto]=1
if R[I][OP['modo']]=='OFF' :
Rele_Out[GR][Puerto]=0
#bucle encendido/apagado reles
for I in range(8):
for J in range(8):
if Rele_Out[I][J] == 1 and Rele_Out_Ant[I][J] == 0 :
i2c_rele(I+32,J+1,1) #encender rele
if Rele_Out[I][J] == 0 and Rele_Out_Ant[I][J] == 1 :
i2c_rele(I+32,J+1,0) #apagar rele
Última edición por nikitto; 07/08/2016 a las 12:57 Razón: Faltaban comilla dentro de OP['...']
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 07/08/2016, 12:13 #419
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
La verdad es porque nos hemos empeñado en utilizar nombres en lugar de numeros en la matriz R....es bueno en cuanto a claridad de lectura aunque casi nos quedamos sin stock de corchetes [ ]
La parte que a lo mejor se debe cambiar es la de asignar
DatosFV['Vbat'] = Vbat
......
Dado que lo logico es que no se utilicen ya las variables Vbat... y en el programa principal, cuando se leen los datos de Voltios, SOC, etc...se asignen directamente los valores al diccionario DatosFV
Bueno...una vez atacados los problemas de sintaxis....habra que ver si la logica del algoritmo funciona segun previsto o noPVControl+ (web espejo a la real cada 5'...se puede trastear)
Manual Instalación desde Imagen SD
Manual Instalación Reles Wifi
Algo de Funcionalidad (ya tiene control excedentes via wifi, etc...)#743
- 07/08/2016, 12:19 #420
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Otro tema...visto como funciona Python parece que no hace falta el doble for para guardar el estado anterior de los reles sino simplemente
Rele_Out_Ant= Rele_OutPVControl+ (web espejo a la real cada 5'...se puede trastear)
Manual Instalación desde Imagen SD
Manual Instalación Reles Wifi
Algo de Funcionalidad (ya tiene control excedentes via wifi, etc...)#743
- 07/08/2016, 12:24 #421
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Viendo un poco el codigo...una pequeña errata en los comentarios...GR=1 si id_rele=33X
PVControl+ (web espejo a la real cada 5'...se puede trastear)
Manual Instalación desde Imagen SD
Manual Instalación Reles Wifi
Algo de Funcionalidad (ya tiene control excedentes via wifi, etc...)#743
- 07/08/2016, 13:25 #422
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Tengo el código probado, sin usar la def i2c_rele() y parece que funciona:
He hecho algunos arreglos en el programa inicial.
Voy a probar lo del doble for y confirmo.
- - - - - - - - - - - - - - - - - - -
Arreglado. Thx.
Supongo te refieres a cambiar esta parte:
Código PHP:#algoritmo condiciones reles
for I in range(8):
for J in range(8):
Rele_Out_Ant[I][J]=Rele_Out[I][J] #para guardar el estado anterior de los reles
Código PHP:Rele_Out_Ant = Rele_Out
He probado lo de quitar lo del doble for y no funciona. Hay que ir fila a fila y columna a columna.
- - - - - - - - - - - - - - - - - - -
Ejemplo del funcionamiento ( cambiando los i2c_rele() por print() ):
Código PHP:...
Apagar reles
Apagar reles
Apagar reles
Apagar reles
Apagar reles
Apagar reles
Apagar reles
Apagar reles
Apagar reles
Apagar reles
Apagar reles
Encender rele = 321
Encender rele = DEPURADORA
Código PHP:import MySQLdb
DatosFV={} #Creamos diccionario para los datos FV
OP={'id_rele':0,'nombre':1,'modo':2,'id_rele2':3,'operacion':4,'parametro':5,'condicion':6,'valor':7}
### Definir matrices Rele_Out y Rele_Out_Ant y apagar todos los reles
Rele_Out = [[None] * 8 for i in range(8)]
Rele_Out_Ant = [[None] * 8 for i in range(8)]
for I in range(8) :
for J in range(8) :
Rele_Out[I][J] = 0
Rele_Out_Ant[I][J] = 0
print('Apagar reles')
while True: #aqui empezaria el bucle
reles = MySQLdb.connect(host = "localhost", user = "fv", passwd = "fv", db = "fv")
cursor = reles.cursor()
sql_reles='SELECT * FROM reles JOIN reles_c WHERE reles.id_rele = reles_c.id_rele'
ncon=cursor.execute(sql_reles)
ncon=int(ncon)
R=cursor.fetchall()
#Asignamos valores al diccionario
DatosFV['Vbat']=27
DatosFV['Ibat']=1
DatosFV['SOC']=97
#algoritmo condiciones reles
for I in range(8):
for J in range(8):
Rele_Out_Ant[I][J]=Rele_Out[I][J] #para guardar el estado anterior de los reles
for I in range(ncon):
Puerto=(R[I][0]%10)-1 # desde 0 a 7
GR=(R[I][0]-Puerto)/10-32 # desde 0 donde GR=0 si id_rele=32X, GR=1 si id_rele=33X
Rele_Out[GR][Puerto]=1 #encendemos virtualmente todos los reles por defecto
for I in range(ncon):
Puerto=(R[I][0]%10)-1 # desde 0 a 7
GR=(R[I][0]-Puerto)/10-32 # desde 0 donde GR=0 si id_rele=32X, GR=1 si id_rele=33X
if R[I][OP['condicion']]=='<':
if R[I][OP['operacion']]=='ON' and DatosFV[R[I][OP['parametro']]] > R[I][OP['valor']] and Rele_Out_Ant[GR][Puerto] == 0 :
Rele_Out[GR][Puerto]=0
if R[I][OP['operacion']]=='OFF' and DatosFV[R[I][OP['parametro']]] < R[I][OP['valor']] :
Rele_Out[GR][Puerto]=0
if R[I][OP['condicion']]=='>':
if R[I][OP['operacion']]=='ON' and DatosFV[R[I][OP['parametro']]] < R[I][OP['valor']] and Rele_Out_Ant[GR][Puerto] == 0 :
Rele_Out[GR][Puerto]=0
if R[I][OP['operacion']]=='OFF' and DatosFV[R[I][OP['parametro']]] < R[I][OP['valor']] :
Rele_Out[GR][Puerto]=0
### forzado ON/OFF
if R[I][OP['modo']]=='ON' :
Rele_Out[GR][Puerto]=1
if R[I][OP['modo']]=='OFF' :
Rele_Out[GR][Puerto]=0
#bucle encendido/apagado reles
for I in range(8):
for J in range(8):
if Rele_Out[I][J] == 1 and Rele_Out_Ant[I][J] == 0 :
print('Encender rele ='),R[I][J] #encender rele
if Rele_Out[I][J] == 0 and Rele_Out_Ant[I][J] == 1 :
print('Apagar rele ='),R[I][J] #apagar rele
Yaaaaaaaa queda menos.Última edición por nikitto; 07/08/2016 a las 13:41
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 07/08/2016, 13:29 #423
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Pues yo haciendo pruebas me funciona sin problemas...tengo Python 3.5
Este código....
Código PHP:R1 = [[None] * 8 for i in range(8)]
R2 = [[None] * 8 for i in range(8)]
R1[0][0]= 1 # asigno elemento de R1
print ("Imprimo R1 y R2..deben ser distintas en elemento 0,0")
print (R1)
print()
print(R2)
print()
R2=R1 # asigno matriz completa
print ("Imprimo de nuevo..deben ser iguales")
print (R1)
print()
print(R2)
print()
Código PHP:Imprimo R1 y R2..deben ser distintas en elemento 0,0
[[1, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None]]
[[None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None]]
Imprimo de nuevo..deben ser iguales
[[1, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None]]
[[1, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None]]
Última edición por Mleon; 07/08/2016 a las 13:48
- 07/08/2016, 14:01 #424
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Vale, ya veo el problema. Un segundo.
- - - - - - - - - - - - - - - - - - -
este es el final corregido porque no me cuadraba el resultado del print():
Código PHP:...
Apagar reles
Apagar reles
Encender rele (direccion,puerto)= 0 0
Encender rele (direccion,puerto)= 0 1
Código PHP:#bucle encendido/apagado reles
for I in range(8):
for J in range(8):
if Rele_Out[I][J] == 1 and Rele_Out_Ant[I][J] == 0 :
print('Encender rele (direccion,puerto)='),I,J #encender rele
if Rele_Out[I][J] == 0 and Rele_Out_Ant[I][J] == 1 :
print('Apagar rele (direccion,puerto)='),I,J #apagar rele
Código PHP:#algoritmo condiciones reles
Rele_Out_Ant=Rele_Out
#for I in range(8):
# for J in range(8):
# Rele_Out_Ant[I][J]=Rele_Out[I][J] #para guardar el estado anterior de los reles
Código PHP:...
Apagar reles
Apagar reles
Apagar reles
- - - - - - - - - - - - - - - - - - -
La versión que uso es la 2.7.3, ya que en versiones > 3 encontré que algunas cosas no estaban implementadas.
De todas formas voy a probar el algoritmo a parte.
- - - - - - - - - - - - - - - - - - -
Fuera del programa funciona bien:
Archivo adjunto 15067PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 07/08/2016, 15:08 #425
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
No se ve el archivo adjunto
Habra que mirar el por que no funciona..por eso de entenderlo
Igualmente he visto que cuando se inicializan la matrices Rele_Out y Rele_Out_Ant....se pueden poner directamente a 0 en lugar a [None] de esta forma
Código PHP:Rele_Out = [[0] * 8 for i in range(8)]
Rele_Out_Ant = [[0] * 8 for i in range(8)]
Última edición por Mleon; 07/08/2016 a las 15:24