Registro Caudal Agua y Acceso Web

  • 9 Respuestas
  • 255 Vistas

Ronald

  • Novato
  • *
  • Mensajes: 4
Registro Caudal Agua y Acceso Web
« : marzo 02, 2017, 15:05:16 pm »
Hola boris,

Necesito leer un cuadalimetro el cual envía una señal cuadrada, se que se puede registrar mediante interrupciones para posteriormente medir los pulsos del caudal, según los datos del fabricante este caudalimetro por cada litro de agua que pasa por el sensor obtenemos 450 pulsos.

Inicie con el programa pero me pasa lo siguiente: Declaro mis variables y todo muy bien, hago mi variable tipo float ya que necesito ingresar decimales y la defino local por que necesito que al terminar el conteo de los pulsos se me reinicie, luego agrego mis componentes y todo perfecto

El tema es; cuando voy a determinar que la salida del componente sea resultado no me aparece ninguna variable. trate utilizando componente de operaciones aritméticas y contadores externos (get count)

Podrías ayudarme en esto por favor

« Última Modificación: marzo 02, 2017, 18:29:14 pm por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1625
  • Soporte Técnico
Re: Registro Caudal Agua y Acceso Web
« Respuesta #1 : marzo 02, 2017, 18:28:54 pm »
Buenas tardes Ronald,

Lo mas conveniente por el tipo de proyecto seria utilizar lenguaje Pawn, ya que será más fácil hacer la tabla de de registros que podrás leer e interactuar
por página web, aplicar formulas, y ademas enviar periódicamente el mail cada 8 horas.

Los registros estarán en la memoria EEPROM y se irán reemplazando a medida que pase la semana con los valores sensados.

Déjanos que te hagamos un programa con la lógica básica que indicas, así lo podes probar y luego te explico para que lo entiendas y puedas modificar con tu configuracion particular.

Cálculo que entre Lunes o Martes de la semana siguiente, te podemos tener el proyecto para que lo vayas probando.

Una consulta, el registro en la base de datos es una muestra cada 8 horas, no?.

El caudal instantáneo podrías verlo en tiempo real, pero seria bueno esa frecuencia para almacenar en base de datos.

Te subimos el proyecto cuando lo tengamos por este medio.

Saludos

Cita de: Ronald
Necesito leer un cuadalimetro el cual envía una señal cuadrada, se que se puede registrar mediante interrupciones para posteriormente medir los pulsos del caudal, según los datos del fabricante este caudalimetro por cada litro de agua que pasa por el sensor obtenemos 450 pulsos.

450 pulsos/min = 1 L/min -> 7.5 pulsos/seg = 1 L/min -> 7.5 Hz = 1 L/min


Luego necesito hacer una base de datos en el cual yo pueda ingresar al PLC y poder ver los registro de una semana aprox. y si es posible enviar a un e-mail un registro cada 8 horas.


« Última Modificación: marzo 02, 2017, 18:31:11 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Ronald

  • Novato
  • *
  • Mensajes: 4
Re:Registro Caudal Agua y Acceso Web
« Respuesta #2 : marzo 02, 2017, 18:46:16 pm »
Si boris, efectivamente el registro es cada 8 horas.

Graciaas

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1625
  • Soporte Técnico
Re:Registro Caudal Agua y Acceso Web
« Respuesta #3 : marzo 06, 2017, 19:42:15 pm »
Buenas tardes Ronald,

En el archivo adjunto pasamos el programa solicitado, es completamente funcional y ya puede continuar con mejoras o no, por su cuenta.

Le recomiendo cuando lo use en producción, agregar acceso protegido por clave, que se hace configurando muy fácilmente.



El programa lee el caudal [Litros/min] de un caudalimetro de acuerdo a los pulsos por segundo en la entrada DIN7/COUNTER del PLC (STX8091).
Si tiene dudas como conectarlo, nos avisa. Asegúrese de que entregue al menos 12V de tensión pico la onda cuadrada.

El caudal es muestreado cada FLOW_SAMPLE_PERIOD_TIME segundos y se almacena en la memoria EEPROM.
Cada muestra se asocia a una fecha/hora (llamdo TimeStamp).

Por cada muestra almacenada, se envía un mail a la dirección definida en constante FLOW_MAIL_TO detallando caudal y fecha/hora.

Accediendo al servidor web del PLC, es posible ver caudal instantáneo, registro de caudal con fecha/hora de la ultima semana, información de configuración y otros.

Ingrese con navegador a la direccion IP del PLC, por ej: http://192.168.1.81

Alli podra ver las paginas de acceso a registro e informacion.

En la tabla con los registros de caudal, la fila con los valores encerrados por corchetes [  ], significa que es la ultima muestra leída.
La tabla representa la memoria de almacenamiento en el PLC, la cual es circular, las muestras nuevas, van remplazando las viejas.

Recuerde configurar fecha/hora correctamente en el PLC, de lo contrario, las muestras se almacenarán, pero se mostrará la leyenda RTC ERROR.

ANTES DE USAR

En el archivo Globals.inc, es posible configurar direcciones de email y tiempo de muestreo con las constantes:

FLOW_MAIL_TO -> Dirección de destinatario.

FLOW_MAIL_FROM -> Dirección de remitente.

FLOW_SAMPLE_PERIOD_TIME -> Tiempo de muestreo en segundos (por defecto 15 minutos). Para 8 horas, usar valor 28800.

El sistema al energizarce, realiza un muestreo a los 30 segundos (enviando mail) y luego continua normalmente.



Configure el programa, grabe en PLC y luego pruebe.

Para documentación y ejemplos de uso del servidor web, descargue la nota de  aplicación AN030 desde nuestra pagina Web.

Para documentación y ejemplos de uso del cliente de email, descargue la nota de  aplicación AN020 desde nuestra pagina Web.

Le recomiendo intentar comprender el programa para que pueda modificarlo por su cuenta, esta muy bien documentado y organizado.

Saludos y quedamos a disposición.
« Última Modificación: marzo 07, 2017, 10:08:50 am por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1625
  • Soporte Técnico
Re:Registro Caudal Agua y Acceso Web
« Respuesta #4 : marzo 06, 2017, 20:13:58 pm »
Algunas capturas de pantalla del navegador accediendo al PLC.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1625
  • Soporte Técnico
Re:Registro Caudal Agua y Acceso Web
« Respuesta #5 : marzo 10, 2017, 11:44:39 am »
Cita de: Ronald
Ahora bien, tengo la siguiente inquietud:

1) Donde declaras DIN7  como entrada?, y como haría para declaras las demás entradas?
Esto por que tanto din 7 como din 8, son contadores rápido y en mi caso tengo como idea utilizar las 12 entradas y así poder ver la señal de las 12 entradas; tengo en cuenta que las otras 10 entradas (DIN 1 al 6 y DINA 9 al 12) son entradas para contadores de velocidad media y leen frecuencias de pulsos de hasta 2.5 khz.

Muy simple. Los contadores rápidos usan las entradas DIN7 y DIN8, cuya activación en el proyecto se hace en el archivo System.p, con las linea:

Código: (Pawn) [Seleccionar]
   // Activar contador DIN7/COUNT1 para cuenta por flanco ascendente.
   Count1Enable(COUNT_EDGE_RISING)

Ese código activa la funcion contador para DIN7.

En el archivo Flow.p se llama a la funcion FlowGetLitersPerMinute() que obtiene los litros por minutos:

Código: (Pawn) [Seleccionar]
Float: FlowGetLitersPerMinute()
{
   new Float: LitersPerMinute
   
   // Sensor  : 450 pulsos/min = 1 L/min -> 7.5 pulsos/seg = 1 L/min -> 7.5 Hz = 1 L/min
   // Formula : L/min = (freq) / 7.5 Hz
   LitersPerMinute = Count1GetEventFreq() / 7.5
   
   return LitersPerMinute
}

Fijate como se obtiene frecuencia con la función Count1GetEventFreq() y luego se divide por 7.5 para obtener litros por minutos.

De modo similar, se puede hacer la misma funcion para la entrada DIN8, solo que debería utilizarse la función Count2GetEventFreq() e incializarce antes con Count2Enable(COUNT_EDGE_RISING).


Para leer frecuencia con las otras entradas hay que usar otras funciones que solo estan disponibles en Pawn, como la consigna inicial era con una
sola entrada, no hicimos el ejemplo con esas funciones. Igual es facil de modificar para leer frecuencia con esas entradas, usando las funciones
DinCounterConfig() y DinCounterGetFreq() como se explica en este post:

http://www.slicetex.com/foro/smf/index.php?topic=207.0

Este tipo de entradas tienen una precision de +/- 1Hz.

Te puedo modificar el ejemplo para mostrar caudal instantáneo con las otras entradas, avísame.


Cita de: Ronald
2) Que pasaría si el volt. pico de la onda cuadrada no llega a 12?
Mi idea principal es medir el pulso y/o su frecuencia, ya que la frecuencia del pulso va variar dependiendo de la velocidad del flujo y la orientación del sensor.

Las entradas digitales necesitan una cierta tensión para polarizarce, pero al conectar varias entradas al mismo tiempo necesitas que sean del tipo open-colector (que actúan como un transistor que cierra a masa cuando se activa).

Eso quiere decir que al terminal DIC+ lo conectas a +12V, luego cada colector del caudalimetro lo conectas a DIN1, DIN2, etc... La masa del caudalimetro la conectas a la misma masa de la fuente que estas usando para alimentar DIC+.

Esa es la forma correcta de conectarlos y no renegas con tensiones de polarización necesarias.



Te doy una introducción rápida al programa:

El PLC se inicia y se llama a la función PlcMain() en archivo PlcMain.p.

Al entrar luego se llama a la función que definimos SystemInit() en archivo System.p.

La cual inicializa el servidor web, mails, timeouts, etc.

En el archivo OnTimeout.p se llama al evento @OnTimeout() que muestrea cada FLOW_SAMPLE_PERIOD_TIME segundos
el caudal, llamado a la funcion FlowSaveSample(), que a su vez graba en memoria EEPROM.

También aprovecha para enviar un email.

Así podes ir siguiendo las funciones y determinar como funciona el programa.

Te recomiendo leer:

Manual de Programacion Pawn del PLC
STX80XX-MP-PLC-AX_CX_DX.pdf

Introducción al Lenguaje Pawn
STXLADDER-PI.pdf







SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Ronald

  • Novato
  • *
  • Mensajes: 4
Re:Registro Caudal Agua y Acceso Web
« Respuesta #6 : abril 03, 2017, 15:13:38 pm »
Hola Bori,

Como haría para utilizar todas las entradas DIN y que el programa me envié un e-mail con el total de la cantidad de LITROS (no litro por minutos) que pase por el caudalimetro cada 2 horas, y de ser posible que el registro me genere 1 lectura con el total de litros cada 10min. hasta obtener las 21 lecturas.

Lo trate de hacer de la siguiente manera pero No Funciono

pulsos acumulados * 1.0/450

Float: Flowliters()
{
   new Float: Liters
   
   // Cada 450 pulson son un litro
   
   Liters = Count1GetEventFreq *1.0/450



Agradecido con tu colaboración




Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1625
  • Soporte Técnico
Re:Registro Caudal Agua y Acceso Web
« Respuesta #7 : abril 03, 2017, 17:47:05 pm »
Buenas tardes,

Para usar todas las entradas DIN como contadores, puede inicializarlas una sola vez con el siguiente comando en alguna parte del programa al arrancar, por ejemplo en su proyecto en SystemInit(), del archivo System.p:

Código: (Pawn) [Seleccionar]
   // Configurar todas las entradas DIN para funcionar como contadores.
   // Intevalo de muestreo: 10*0.1 mS = 1 mS.
   // A menor intervalo, mayor frecuencia y precisión puede lograr.

   DinCounterConfig(10)

Luego puede utilizar las funciones para leer numero de cuenta (pulsos) o frecuencia de cada entrada:



DinCounterGetValue(DinNum): Obtiene la cuenta actual del contador de la entrada DinNum (entre 1 y el numero maximo de entradas del PLC).

Ejemplo:

new Count

// Obtener cuenta del contador asignado para entrada DIN4.
Count = DinCounterGetValue(4)




DinCounterGetFreq(DinNum): Obtiene la frecuencia actual del contador de la entrada DinNum (entre 1 y el numero máximo de entradas del PLC). Precisión +/- 1 Hz.

Ejemplo:

new Freq

// Obtener frecuencia en Hz del contador asignado para entrada DIN4.
Freq = DinCounterGetFreq(4)




DinCounterGetRPM(DinNum): Obtiene la RPM actual del contador de la entrada DinNum (entre 1 y el numero máximo de entradas del PLC).

Ejemplo:

new RPM

// Obtener la RPM del contador asignado para entrada DIN4.
RPM = DinCounterGetRPM(4)




DinCounterClear(DinNum): Borra los registros del contador de la entrada DinNum (entre 1 y el numero máximo de entradas del PLC).

Ejemplo:

// Eliminar cuenta contador asignado para entrada DIN4. Resetea a 0.
DinCounterClear(4)




Nota: Puede ser útil por ejemplo cada dos horas, luego de leer la cantidad de pulsos acumulados, borrar la cuenta con la funcion DinCounterClear(DinNum) explicada arriba.



Solo le queda calcular cada dos horas el total de litros, ya que como lo esta haciendo, esta multiplicando frecuencia y no los pulsos acumulados.

Con las funciones que le pasé, puede calcular cada dos horas los litros acumulados en la entrada DIN4 por ejemplo, haciendo:

Código: (Pawn) [Seleccionar]

new Float: TotalLitres4

// Calcular litros acumulados, teniendo en cuenta que 450 pulsos equivale a un litro.
TotalLitres4 =  DinCounterGetValue(4) / 450.0

// Luego puede reiniciar contador a 0, para próxima lectura.
DinCounterClear(4)


Para medir tiempo cada 2 horas, puede usar las funciones Timeout, como se hace en el proyecto pasado:

Ver función SystemInit() en System.p, y agregar un timeout cada 7200 segundos:

Código: (Pawn) [Seleccionar]
Timeout2SetEvent(7200)
Luego en el evento @OnTimeout() en archivo OnTimeout.p lo procesa al timeout 2:

Código: (Pawn) [Seleccionar]
@OnTimeout()
{
   //
   // Comprobar si Timeout1 ha expirado (cada 8 horas).
   //
   
   if(Timeout1Check() == 1)
   {
      // Muestrear caudalimetro y guardar muestra.
      FlowSaveSample()
     
      // Enviar E-Mail con informe de caudal.
      SmtpSendEmail()
     
      // Recargar Timeout1 para proximo evento.
      Timeout1Reload(FLOW_SAMPLE_PERIOD_TIME)
   }

   //
   // Comprobar si Timeout2 ha expirado (cada 2 horas)
   //

   if(Timeout2Check() == 1)
   {
      // Calcular litros acumulados cada dos horas entradas DIN.

      // .... su código ....

      // Recargar Timeout2 para proximo evento.
      Timeout2Reload(7200)
   }

}

Si luego quiere enviar los litros acumulados por Mail, tiene que modificar las función SmtpUpdate() en el archivo Smtp.p, o basarse en el mismo, ya que ahí es desde donde se están enviando los mails en su programa.


Saludos



« Última Modificación: abril 03, 2017, 17:49:49 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Ronald

  • Novato
  • *
  • Mensajes: 4
Re:Registro Caudal Agua y Acceso Web
« Respuesta #8 : abril 07, 2017, 19:14:11 pm »
Hola Boris,

Gracias por las ayudas pero mi novata en pawm me llevan a seguir preguntando.

Trato de obtener el contador de pulsos de la entrada DIN7 = Count1 y no lo logro

lo estoy haciendo de esta manera:

 // Activar contador DIN7/COUNT1 para cuenta por flanco ascendente.
   Count1Enable(COUNT_EDGE_RISING)
   
   // Crear Variable para almacenar Lectura de pulsos de DIN7 (acumulador).
   new fb = 0
   
   // Obtener acumulado de pulsos
   fb = Count1GetEvalue()

Reitero mis disculpas y agradezco tus ayudas.

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1625
  • Soporte Técnico
Re:Registro Caudal Agua y Acceso Web
« Respuesta #9 : abril 10, 2017, 10:59:27 am »
Buenos dias,

Ningún problema.
Si estas contando pulsos con esa función, es incorrecto su nombre, seria:

// Crear Variable para almacenar Lectura de pulsos de DIN7 (acumulador).
new fb = 0

// Obtener cuenta del contador 1.
fb = Count1GetEventCnt()


Podes ver un ejemplo completo en la página 121 del manual STX80XX-MP-PLC-AX_CX_DX.pdf.

En el mismo manual también tenes la función Count1Reset() que pone a cero el contador de pulsos asociado a la entrada, en el caso de querer resetear

Tener en cuenta que la variable "fb" que usas es del tipo entera, no "Float" (que admite números decimales) como esta en el de proyecto CaudalimetroWeb que te pasé. Si queres convertir a Float para usar mismas variables del ejemplo, deberías hacer:

// Crear Variable para almacenar Lectura de pulsos de DIN7 (acumulador).
new Float: fb = 0

// Obtener cuenta del contador 1.
fb = IntToFloat(Count1GetEventCnt())


Y en "fb" queda el valor en Float, pero es opcional.

Saludos
« Última Modificación: abril 10, 2017, 11:03:02 am por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com