Página 17 de 52 PrimerPrimer ... 716171827 ... ÚltimoÚltimo
Resultados 401 al 425 de 1294
  1. #401
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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.
    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í

  2. #402
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado 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)=' 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 I1 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 I1 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)=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 Ver mensaje

    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
    Última edición por Mleon; 04/08/2016 a las 02:20 Razón: Mensaje anterior Nikitto

  3. #403
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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í

  4. #404
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado 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; 04/08/2016 a las 23:42

  5. #405
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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í

  6. #406
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado 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

  7. #407
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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í

  8. #408
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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]=
    Ejemplo de como funciona.
    Última edición por nikitto; 04/08/2016 a las 22: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í

  9. #409
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc

    Cita Iniciado por nikitto Ver mensaje
    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
    Última edición por Mleon; 04/08/2016 a las 23:33

  10. #410
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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?
    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í

  11. #411
    el_cobarde Invitado

    Predeterminado Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc

    Cita Iniciado por Mleon Ver mensaje
    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 Ver mensaje
    ... 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 ...

  12. #412
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc

    Cita Iniciado por nikitto Ver mensaje
    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

  13. #413
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc

    Cita Iniciado por Mleon Ver mensaje


    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...IplacaTemp,...
      
      
      
    ...... 
    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,....

  14. #414
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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.
    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í

  15. #415
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc

    Cita Iniciado por nikitto Ver mensaje
    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 Ver mensaje

    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 Ver mensaje

    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 Ver mensaje
    - - - - - - - - - - - - - - - - - - -

    ¿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 Ver mensaje

    .......

    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

  16. #416
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc

    Cita Iniciado por Mleon Ver mensaje
    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 Ver mensaje
    El que el indice empiece en 0,0 no es problema
    Efectivamente.

    Cita Iniciado por Mleon Ver mensaje
    Luego entiendo que con este código tenemos en la matriz R[][] todas las condiciones de los reles dadas de alta ¿no?


    Cita Iniciado por Mleon Ver mensaje
    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 Ver mensaje
    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 Ver mensaje
    No veo que haya que hacer cambio en las tablas
    Perfecto.

    Cita Iniciado por Mleon Ver mensaje
    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.
    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í

  17. #417
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado 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
    = [[None] * 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'NoneNoneNone'Vbat'None25], [2'Depuradora''PRG'2'ON''Ibat''>'10], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone]]

    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)
    Última edición por Mleon; 07/08/2016 a las 03:34

  18. #418
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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] * for i in range(8)]
            
    Rele_Out_Ant = [[None] * 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]=#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] == :
                                    
    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] == :
                                    
    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] == and Rele_Out_Ant[I][J] == :
                                    
    i2c_rele(I+32,J+1,1#encender rele

                            
    if Rele_Out[I][J] == and Rele_Out_Ant[I][J] == :
                                    
    i2c_rele(I+32,J+1,0#apagar rele 
    Última edición por nikitto; 07/08/2016 a las 11: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í

  19. #419
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado 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

  20. #420
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado 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

  21. #421
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado 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

  22. #422
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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 Ver mensaje
    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] * for i in range(8)]
    Rele_Out_Ant = [[None] * 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]=#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] == :
                                    
    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] == :
                                    
    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] == and Rele_Out_Ant[I][J] == :
                                    print(
    'Encender rele ='),R[I][J#encender rele

                            
    if Rele_Out[I][J] == and Rele_Out_Ant[I][J] == :
                                    print(
    'Apagar rele ='),R[I][J#apagar rele 
    - - - - - - - - - - - - - - - - - - -

    Yaaaaaaaa queda menos.
    Última edición por nikitto; 07/08/2016 a las 12: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í

  23. #423
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc

    Cita Iniciado por nikitto Ver mensaje

    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] * for i in range(8)]
    R2 = [[None] * for i in range(8)]

    R1[0][0]= # 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
    [[1NoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone]]

    [[
    NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone]]

    Imprimo de nuevo..deben ser iguales
    [[1NoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone]]

    [[
    1NoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone], [NoneNoneNoneNoneNoneNoneNoneNone]] 
    Última edición por Mleon; 07/08/2016 a las 12:48

  24. #424
    Avatar de nikitto
    nikitto está desconectado Forero
    Fecha de ingreso
    ago 2015
    Ubicación
    Cambrils
    Mensajes
    983

    Predeterminado 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] == and Rele_Out_Ant[I][J] == :
                                    print(
    'Encender rele (direccion,puerto)='),I,#encender rele

                            
    if Rele_Out[I][J] == and Rele_Out_Ant[I][J] == :
                                    print(
    'Apagar rele (direccion,puerto)='),I,#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
    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í

  25. #425
    Avatar de Mleon
    Mleon está desconectado Forero
    Fecha de ingreso
    may 2016
    Ubicación
    MADRID
    Mensajes
    991

    Predeterminado Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc

    Cita Iniciado por nikitto Ver mensaje
    - - - - - - - - - - - - - - - - - - -

    Fuera del programa funciona bien:

    Archivo adjunto 15067

    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] * for i in range(8)]
    Rele_Out_Ant = [[0] * for i in range(8)] 
    Con lo que se optimiza un poco el codigo
    Última edición por Mleon; 07/08/2016 a las 14:24

Página 17 de 52 PrimerPrimer ... 716171827 ... ÚltimoÚltimo



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