Mensajes recientes

Páginas: 1 [2] 3 4 ... 10
11
StxLadder - Slicetex Ladder Designer Studio / Re:Registro Caudal Agua y Acceso Web
« Último mensaje por Soporte agosto 04, 2017, 20:32:46 pm »
Buenas tardes Ronald,

actualmente esta programada la entrada DIN7, en el registro voy obteniendo cada 2 horas el valor del nivel de cuadal que esta acumulado ( si inicio el registro a las 8hrs en 0 y a las 10 hrs han pasado 20litros me lo muestra en la segunda linea y asi hasta completar las 21 lecturas).

lo que quiero ahora es: en la fila 1 del registro me muestre el valor del caudal de agua de la entrada DIN1, en la fila 2 me muestre el caudal de agua de la entrada DIN2. y así sucesivamente. hasta llegar a las 12 entradas.

podremos hacer esto?

Si, claro se puede. No necesitas almacenar valores en la memoria EEPROM ni el horario en que fueron tomados, porque vas a mostrar valores "actuales" de caudal, según me comentas.

Para ello una vez que obtengas el caudal de DIN1, lo guardas en una variable que luego podes mostrar vía Web, tal como se hace en el archivo "index.shtml" o en "reg.shtml" (si haces una tabla). Así debes hacer para DIN2, DIN3, etc.

Claramente, debes eliminar la parte de la página que no utilices para solo mostrar en cada linea el valor de los caudales de las entradas.

Pero recordar que si queres contar con todas las entradas DIN, debes usar las funciones que te comenté antes:

DinCounterGetValue(x), DinCounterGetFreq(x), etc.

Te paso el proyecto tuyo modificado (CaudalimetroWeb_ModificadoCliente.zip), donde te pongo esas funciones en el código para la lectura (archivo Flow.p), reemplazando Count1GetEventCnt() y Count1GetEventFreq() por DinCounterGetValue(7) y DinCounterGetFreq(7) respectivamente para la DIN7.

Si queres leer otra entrada, por ejemplo la DIN2, debes agregar código para usar DinCounterGetValue(2) y DinCounterGetFreq(2), de forma análoga.

Saludos

PD: Adjunto también el proyecto CaudalimetroWebDC_Version_2.zip es el poryecto original, solo que usa las funciones de contador descriptas anteriomente para DIN7, pudiendose modificar para DIN1, DIN2, ... etc



Ver también siguiente mensaje, donde te subo el ejemplo para leer todas las entradas DIN.


Nota: archivos adjuntos actualizados con corrección pequeña, bajar nuevamente si [P/seg] muestra valor 0.

12
StxLadder - Slicetex Ladder Designer Studio / Re:Registro Caudal Agua y Acceso Web
« Último mensaje por Ronald agosto 03, 2017, 20:48:32 pm »
buenas tardes boris,

Allí te paso el archivo, referente a lo de las lecturas. te explico: 

actualmente esta programada la entrada DIN7, en el registro voy obteniendo cada 2 horas el valor del nivel de cuadal que esta acumulado ( si inicio el registro a las 8hrs en 0 y a las 10 hrs han pasado 20litros me lo muestra en la segunda linea y asi hasta completar las 21 lecturas).

lo que quiero ahora es: en la fila 1 del registro me muestre el valor del caudal de agua de la entrada DIN1, en la fila 2 me muestre el caudal de agua de la entrada DIN2. y así sucesivamente. hasta llegar a las 12 entradas.

podremos hacer esto?
13
StxLadder - Slicetex Ladder Designer Studio / Re:Registro Caudal Agua y Acceso Web
« Último mensaje por Soporte agosto 03, 2017, 13:25:51 pm »
Buenos días Ronald,

Después de tanto tiempo retornamos con el tema del caudalimetro, ya esta funcionando perfecto con la entrada DIN7. pero estoy necesitando poner la funcionar las 10 entradas normales junto con las 2 de contadores rapido (DIN7 Y DIN8), allí te paso el proyecto con esta y me gustaría me asesoraras con el mismo.

¿Pudiste implementar, según te comenté en la consulta anterior, como contar pulsos en todas las entradas DIN?
¿Que parte te da problemas?

(Ver mensaje de arriba con respuesta anterior)

Lamentablemente el archivo que me pasas no es el proyecto completo. Para pasar todo el proyecto debes ir a menú de StxLadder:
Archivo > Crear backup del proyecto (zip)

Una vez creado el ZIP con todo el proyecto, podes subirlo para así poder abrir el proyecto completo.

Uno de los requerimientos que tengo es cambiar el registro de las 21 lecturas de una misma linea, quiero leer una linea por cada lectura, osea reducir a 12 los registros de lectura y cada una de las lineas por separado.
Sera posible realizar esto?

No comprendo bien. En memoria tenes 21 muestras de la DIN7.
¿Queres tener 12 registros por cada entrada DIN?.

Saludos
14
StxLadder - Slicetex Ladder Designer Studio / Re:Registro Caudal Agua y Acceso Web
« Último mensaje por Ronald agosto 02, 2017, 18:30:08 pm »
Hola boris,

Después de tanto tiempo retornamos con el tema del caudalimetro, ya esta funcionando perfecto con la entrada DIN7. pero estoy necesitando poner la funcionar las 10 entradas normales junto con las 2 de contadores rapido (DIN7 Y DIN8), allí te paso el proyecto con esta y me gustaría me asesoraras con el mismo.

Uno de los requerimientos que tengo es cambiar el registro de las 21 lecturas de una misma linea, quiero leer una linea por cada lectura, osea reducir a 12 los registros de lectura y cada una de las lineas por separado.

Sera posible realizar esto?

Espero tu colaboración

Gracias
15
STX8081 - Familia Power I/O Board / Re:Doble lector tarjetas hid
« Último mensaje por Soporte julio 18, 2017, 12:23:15 pm »
Buenos días Cristian,

La única forma que se me ocurre es agregando una pequeña interfaz externa de transistores como te muestro a continuación (que se podría armar a mano), ya que en el puerto de expansion me he quedado sin señales de interrupción libres para procesar el protocolo de otra tarjeta.

El esquema que te paso, tiene sus limitaciones:

  • Podrias detectar el código de las tarjetas, pero no sabrías de cuál.
  • Si se pasan al mismo tiempo, simplemente no se leería nada, porque se interpretaría como error.



En teoría, funcionaria, queda probar.

Saludos
16
STX8081 - Familia Power I/O Board / Doble lector tarjetas hid
« Último mensaje por coloriginal julio 17, 2017, 22:54:43 pm »
Hola Boris quería saber si se puede hacer que una placa lea desde dos lectores de tarjetas HID y poder identificar desde cual de los lectores se está obteniendo el nro. de tarjeta
17
STX8092 - Familia PLC Cube / Re:Evento Timeout
« Último mensaje por Soporte julio 17, 2017, 17:17:02 pm »
Buenas tardes,

¿No te entra en adentro del "else if" cuando Alarmas=1?

Podrías comentar la función HttpSendGet() y colocar LedToggle() para descartar algún error de argumentos que le pases a la función.

Si el Led Debug se activa/desactiva, es porque se ejecuta al código.

Te agrego el código a tu fragmento en color rojo:


@OnTimeout()

{
   //
   // Comprobar si Timeout1 ha expirado.
   //
   if(Timeout1Check() == 1)
   {
     if(Alarmas==0)
    {
       
    Mq="MQ-04"
    OT=OdT1
    GPM=Count1GetEventRPM_I()
    Contador=Count1GetEventCnt()
       // Enviar 4 campos con valores de Value1,Value2,Value3 y Value4 al servidor web.
       HttpSendGet("/PLCAdmin/GetHistorico?Maquina=%s&OT=%s&GPM=%d&Contador=%d",Mq, OT, GPM, Contador)

      }
       else if(Alarmas==1)
       {
           Mq="MQ-04"  // Comprobar si array Mq es suficientemente grande para almacenar "MQ-04"
           OT=Alarm1  // Comprobar si array OT es suficientemente grande para almacenar Alarm1
   
           // HttpSendGet("/PLCAdmin/GetHistorico?Maquina=%s&OT=%s&GPM=%d&Contador=%d",Mq, OT, 0, 0)
         
           LedToggle()
   
       }
      // Recargar Timeout1 para generarse en proximos 30 segundos.
      Timeout1Reload(30)
   
   }
     
   
 if(Timeout2Check() == 1)
   {
      // Comprobar si debemos iniciar una transmision HTTP.
   
    // Revisar si se han ingresado datos
     
   if(Alarmas2==0)
    {
       
    Mq="MQ-05"
    OT=OdT2
    GPM=Count2GetEventRPM_I()
    Contador=Count2GetEventCnt()
       // Enviar 4 campos con valores de Value1,Value2,Value3 y Value4 al servidor web.
       HttpSendGet("/PLCAdmin/GetHistorico?Maquina=%s&OT=%s&GPM=%d&Contador=%d",Mq, OT, GPM, Contador)

      }
       else if(Alarmas2==1)
    {
    Mq="MQ-05"
    OT=Alarm2
   
        HttpSendGet("/PLCAdmin/GetHistorico?Maquina=%s&OT=%s&GPM=%d&Contador=%d",Mq, OT, 0, 0)
    }
       
      // Recargar Timeout1 para generarse en proximos 30 segundos.
      Timeout2Reload(30)
   }
}

Los timeout deberían ser inicializados antes en el programa para que funcionen:

Timeout1SetEvent(30)
Timeout2SetEvent(30)

Saludos
18
STX8092 - Familia PLC Cube / Evento Timeout
« Último mensaje por InduxSA julio 17, 2017, 13:37:13 pm »
Hola Boris

Estoy teniendo un detalle en el evento Time out
Lo que hago es hacer dos paquetes de datos en en evento uno en Timeout1 y otro en timeout2,
dentro de cada uno de ellos valido el valor de la variable Alarmas para hacer el envio correspondiente

Mi problema es que en en evento Timeout1 no se umple el ciclo  cuando el valor de la Alarmas es 1

Te dejo el codigo del evento

@OnTimeout()

{
   //
   // Comprobar si Timeout1 ha expirado.
   //
   if(Timeout1Check() == 1)
   {
     if(Alarmas==0)
    {
       
    Mq="MQ-04"
    OT=OdT1
    GPM=Count1GetEventRPM_I()
    Contador=Count1GetEventCnt()
       // Enviar 4 campos con valores de Value1,Value2,Value3 y Value4 al servidor web.
       HttpSendGet("/PLCAdmin/GetHistorico?Maquina=%s&OT=%s&GPM=%d&Contador=%d",Mq, OT, GPM, Contador)

      }
       else if(Alarmas==1)
       {
    Mq="MQ-04"
    OT=Alarm1
   
        HttpSendGet("/PLCAdmin/GetHistorico?Maquina=%s&OT=%s&GPM=%d&Contador=%d",Mq, OT, 0, 0)
   
       }
      // Recargar Timeout1 para generarse en proximos 30 segundos.
      Timeout1Reload(30)
   
   }
     
   
 if(Timeout2Check() == 1)
   {
      // Comprobar si debemos iniciar una transmision HTTP.
   
    // Revisar si se han ingresado datos
     
   if(Alarmas2==0)
    {
       
    Mq="MQ-05"
    OT=OdT2
    GPM=Count2GetEventRPM_I()
    Contador=Count2GetEventCnt()
       // Enviar 4 campos con valores de Value1,Value2,Value3 y Value4 al servidor web.
       HttpSendGet("/PLCAdmin/GetHistorico?Maquina=%s&OT=%s&GPM=%d&Contador=%d",Mq, OT, GPM, Contador)

      }
       else if(Alarmas2==1)
    {
    Mq="MQ-05"
    OT=Alarm2
   
        HttpSendGet("/PLCAdmin/GetHistorico?Maquina=%s&OT=%s&GPM=%d&Contador=%d",Mq, OT, 0, 0)
    }
       
      // Recargar Timeout1 para generarse en proximos 30 segundos.
      Timeout2Reload(30)
   }
}

Saludos
19
STX8091 - Familia PLC Cube / Re:AYUDA: ruido eléctrico en entradas digitales?
« Último mensaje por Soporte julio 15, 2017, 20:59:08 pm »
Independiente del mensaje anterior, en el que te indico el error de parámetro en funciones DinReadFiltered(), te paso una versión para leer las entradas DIN de la placa STX570 filtrando y comprobando errores de comunicación, que hace más robusta la lectura.

Esto úsalo luego de aplicar los cambios anteriores:

Código: (Pawn) [Seleccionar]
// ********************************************************************************
// Funcion     : EXT_DinReadFiltered()
// Descripcion : Filtro anti-rebotes para STX570 con comprobación de errores en
//               comunicación.
//
// ENTRADAS:
//
//     - Din = Entrada discreta a leer.
//       Ejemplo EDIN1 para entrada Numero 1.
//       Recordar constantes EDIN tiene un valor "mascara" es decir:
//       EDIN1 = 00000001
//       EDIN2 = 00000010
//       EDIN3 = 00000100
//       EDIN8 = 10000000
//
// SALIDAS :
//
//     - Estado lógico de la entrada.
//
// ********************************************************************************


EXT_DinReadFiltered(Din)
{
   new dinState = 0
   new timeOut = 25
   new lastLevel = 0
   new currentLevel = 0
   
   do
   {     
      // Obtener estado de todas las entradas discretas del módulo.
      // Comprobar error de comunicación con módulo.
      if(Stx570_DinReadAll(0, dinState) < 0)
      {
         // Error de lectura entre PLC y módulo.
         
         // Esperar 20 mS para próximo intento.
         DelayMS(20)
         
         // Reiniciar timeout.
         timeOut = 25
         
         // Recomenzar ciclo (forzar).
         continue         
      }
     
      // Obtener nivel lógico de entrada.
      lastLevel = Stx570_DinRead(dinState, Din) == 1 ? 1: 0
     
      // Esperar 20 mS para próxima lectura.
      DelayMS(20)
     
      // Obtener estado de todas las entradas discretas del módulo.
      // Comprobar error de comunicación con módulo.
      if(Stx570_DinReadAll(0, dinState) < 0)
      {
         // Error de lectura.
         
         // Esperar 20 mS para próximo intento.
         DelayMS(20)
         
         // Reiniciar timeout.
         timeOut = 25
         
         // Recomenzar ciclo (forzar).
         continue
      }
     
      // Obtener nivel lógico de entrada.
      currentLevel = Stx570_DinRead(dinState, Din) == 1 ? 1: 0
     
      // Comprobar si estado actual difiere del último estado leído.
      if(currentLevel != lastLevel)
      {
         // Difiere, reiniciar timeout.
         timeOut = 25
      }
      else
      {
         // Iguales, decrementar timeout.
         timeOut--
      }   
   }   
   while(timeOut > 0)

   // Retornar último estado de entrada estable.
   return lastLevel
}

20
STX8091 - Familia PLC Cube / Re:AYUDA: ruido eléctrico en entradas digitales?
« Último mensaje por Soporte julio 15, 2017, 20:52:13 pm »
Buenas Guillermo,

Después de revisar más detenidamente tu código, me parece que el error esta en como seleccionas la entrada a leer, es decir un error numérico en el parámetro de la función, por ejemplo, yendo a tu código (ver partes señaladas en rojo):


      for(new i=1;i<=5;i++)
      {
         POTENCIOMETRO=VinRead(i+3)
      
         LedOff()
         
         /////////////////////////DEBUG/////////////////////////////////////
         debug_point:
              if(!DinValue(DIN13)) goto debug_point
         ///////////////////////////////////////////////////////////////////

         BitSet(Salida,i-1)
            
         if(POTENCIOMETRO<=SetPoint_Compuertas) OpenClose=0
         else OpenClose=1
      
         if(!OpenClose)
            {
            //Abrir
            while(POTENCIOMETRO<=SetPoint_Compuertas)
             {
               
               if(DinReadFiltered(i))
               {
                  LedOn()
                  break    //Final de carrera?
               }
               
               POTENCIOMETRO=VinRead(i+3)
               DelayMS(60)
               DoutSetOn(Salida)
             }
            DoutSetOff(Salida)
            }   
         else
            {
            //Cerrar
            while(POTENCIOMETRO>=SetPoint_Compuertas)
             {
               
               if(EXT_DinReadFiltered(i))
               {
                  LedOn()
                  break//Final de carrera?
               }
               
               POTENCIOMETRO=VinRead(i+3)
               DelayMS(60)
                Stx570_DoutSet(0, Salida)
               
             }
             Stx570_DoutClr(0, Salida)
         }
         
         BitClr(Salida,i-1)
         
        /////////////////////////DEBUG/////////////////////////////////////
         debug_point2:
         if(!DinValue(DIN13)) goto debug_point2
             ///////////////////////////////////////////////////////////////////
         

      }

Si te fijas, intentas usar la variable "i" que tiene el valor 1, 2, 3, 4 o 5, según se incrementa. Pero las funciones para leer entradas discretas, necesitan el "bit" a leer.

Por ejemplo:


 DIN1 = 00000001
 DIN2 = 00000010
 DIN3 = 00000100
 ...
 DIN8 = 10000000

 EDIN1 = 00000001
 EDIN2 = 00000010
 EDIN3 = 00000100
 ...
 EDIN8 = 10000000


Pero como les estas pasando un valor entre 1 y 5, te queda:

1 = 00000001 (selecciona para leer DIN1, bien)
2 = 00000010 (selecciona DIN2, bien)
3 = 00000011 (selecciona para leer DIN1 y DIN2 al mismo tiempo, mal)
4 = 00000100 (selecciona para leer DIN3, mal)
5 = 00000101 (selecciona para leer DIN3 y DIN1 al mismo tiempo, mal)

Creo que ese es el error que cometes.

No asi para activar las salidas, que usas BitXxx(Salida,i-1).

Para corregir rápido, podrías emplear:

DinReadFiltered(BIT(i-1))

EXT_DinReadFiltered(BIT(i-1))

La función BIT(x), es lo mismo que hacer (1 << x), es decir mueve "x" veces un bit a la izquierda.

Probalo y fíjate si ahora lees bien las entradas.
Como seguridad podrías verificar con un código separado, sin el resto de la lógica.

Saludos

PD: Para VinRead() se puede usar el número puro, no el "bit", por lo que no necesita modificación esa parte.


Páginas: 1 [2] 3 4 ... 10