-
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
mmm....no me convence. Por cada paso del for cargará en la fila X los valores de cada una de las columnas tal cual están asignadas. Hasta aquí vamos bien.
¿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(.....)
Perdón por el tocho.
-
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)
- - - - - - - - - - - - - - - - - - -
Cita:
Iniciado por
nikitto
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(.....)
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
-
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ú.
-
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)
-
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)
-
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
-
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.
-
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
Ejemplo de como funciona.
-
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Cita:
Iniciado por
nikitto
Vamos con la primera parte del algoritmo. Para complicar la cosa en Python no existen las matrices, hay que crearlas:
......
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
...
Ejemplo de como funciona.
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])
Una vez comprobado logicamente hay que volver a poner 0
-
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
Funciona bien. ¿Este paso he de incorporarlo al programa? ¿O sólo era una mera comprobación?
-
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Cita:
Iniciado por
Mleon
Se que es mas fácil conceptualmente hacer lo que dices....pero es mucho mas potente y serio hacer lo que estamos haciendo ...
Cita:
Iniciado por
nikitto
... 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
Apoyo 100% lo que dice Mleon. Lo hacéis bien, enhorabuena!
A la larga tiene muchas ventajas la programación estructurada y transparente; cuanto más comentarios, mejor ...
-
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Cita:
Iniciado por
nikitto
Código PHP:
Rele_Out[1][1]=11
Rele_Out_Ant[8][7]=78
Rele_Out[8][8]=88
Rele_Out_Ant[8][8]=88
Funciona bien. ¿Este paso he de incorporarlo al programa? ¿O sólo era una mera comprobación?
Era solo una comprobacion.... el programa hay que dejarlo como estaba...inicializando los reles a apagado
-
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Cita:
Iniciado por
Mleon
Código PHP:
'BUCLE CADA MUESTRA
.........
'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
.......
......otras condiciones...Iplaca, Temp,...
......
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,....
-
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])
Lo malo, o simplemente diferente, es que los registros siempre empiezan en 0,0 (fila 0, columna 0)
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])
Ya está pasado el JOIN de las dos tablas de la BD a una matriz.
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.
-
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Cita:
Iniciado por
nikitto
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.
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
Cita:
Iniciado por
nikitto
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])
Lo malo, o simplemente diferente, es que los registros siempre empiezan en 0,0 (fila 0, columna 0)
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
Cita:
Iniciado por
nikitto
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])
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
Cita:
Iniciado por
nikitto
- - - - - - - - - - - - - - - - - - -
¿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?
No veo que haya que hacer cambio en las tablas
Cita:
Iniciado por
nikitto
.......
Rele[1][operacion] NO EXISTE, hay que usar los números.
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
-
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Cita:
Iniciado por
Mleon
Quien no le haya amanecido alguna vez pensando un algoritmo que no sale es que ha programado poco
Algoritmo o cualquier otro problema...después de reposar las neuronas, a uno se le hace más fácil todo.
Cita:
Iniciado por
Mleon
El que el indice empiece en 0,0 no es problema
Efectivamente.
Cita:
Iniciado por
Mleon
Luego entiendo que con este código tenemos en la matriz R[][] todas las condiciones de los reles dadas de alta ¿no?
Sí
Cita:
Iniciado por
Mleon
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
Por ahora, ni idea de como hacerlo. He de mirarlo.
Cita:
Iniciado por
Mleon
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
Yo diría que también. Pero como NO lo tenía claro, he buscado una posible solución.
Cita:
Iniciado por
Mleon
No veo que haya que hacer cambio en las tablas
Perfecto.
Cita:
Iniciado por
Mleon
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
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.
-
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']]])
Me da este resultado
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
>>>
Bueno yo creo que tengo algo mas claro en funcionamiento de Python...me faltaría instalarme Mysql para tener un entorno lo mas parecido (aunque yo estoy en PC windows)
-
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
-
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 no
-
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_Out
-
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
-
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.
- - - - - - - - - - - - - - - - - - -
Cita:
Iniciado por
Mleon
Viendo un poco el codigo...una pequeña errata en los comentarios...GR=1 si id_rele=33X
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
por:
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
Codígo de pruebas bd.py
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.
-
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Cita:
Iniciado por
nikitto
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
por:
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.
- - - - - - - - - - - - - - - - - - -
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()
Da este resultado
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]]
-
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
He cambiado esto en el print(), no afecta si se usa i2c_rele()
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
Haciendo esta modificación la salida es:
Código PHP:
...
Apagar reles
Apagar reles
Apagar reles
No se activa ningún relé. No digo que no funcione lo planteado tal cual, pero dentro del programa no va.
- - - - - - - - - - - - - - - - - - -
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 15067
-
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Cita:
Iniciado por
nikitto
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)]
Con lo que se optimiza un poco el codigo