Slicetex Electronics - Foro

Software Slicetex => StxLadder - Slicetex Ladder Designer Studio => Mensaje iniciado por: Ronald en marzo 02, 2017, 15:05:16 pm

Título: Registro Caudal Agua y Acceso Web
Publicado por: Ronald en 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

Título: Re: Registro Caudal Agua y Acceso Web
Publicado por: Soporte en 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.


Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en marzo 02, 2017, 18:46:16 pm
Si boris, efectivamente el registro es cada 8 horas.

Graciaas
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en 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.
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en marzo 06, 2017, 20:13:58 pm
Algunas capturas de pantalla del navegador accediendo al PLC.
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en 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 (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 (http://www.slicetex.com/hw/stx80xx/docs/STX80XX-MP-PLC-AX_CX_DX.pdf)

Introducción al Lenguaje Pawn
STXLADDER-PI.pdf (http://www.slicetex.com/ladder/docs/files/STXLADDER-PI.pdf)







Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en 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



Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en 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



Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en 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.
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en 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 (http://www.slicetex.com/hw/stx80xx/docs/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
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en 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
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en 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) (http://foro.slicetex.com/index.php?topic=247.msg1306#msg1306)

Lamentablemente el archivo que me pasas no es el proyecto completo. Para pasar todo el proyecto debes ir a menú de StxLadder (http://slicetex.com/ladder):
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
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en 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?
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en 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.

Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en agosto 04, 2017, 21:22:20 pm
Mira, te adjunto el proyecto original modificado para leer el caudal instantáneo en todas las entradas DIN.

Para acceder a la lectura, debes ir a la página web "all.shtml" del servidor Web del PLC.

En la página principal, cuando cargues al PLC el proyecto, tenes un link de acceso, mira las imágenes de captura de pantalla a continuación:

(http://foro.slicetex.com/index.php?action=dlattach;topic=247.0;attach=491;image)

(http://foro.slicetex.com/index.php?action=dlattach;topic=247.0;attach=493;image)

Fíjate como la funciones en archivo "Flow.p" fueron modificadas para poder obtener caudal de cualquier entrada, por ejemplo si queres caudal de entrada DIN1 haces:

FlowGetLitersPerMinute(1)

Para entrada DIN2:

FlowGetLitersPerMinute(2)

Y así sucesivamente... hasta DIN12 con FlowGetLitersPerMinute(12).

Nota: Para mantener compatibilidad con código anterior, si la llamas a la funcion sin argumento, obtiene caudal de entrada DIN7 por defecto, ejemplo FlowGetLitersPerMinute()


Saludos

Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en agosto 20, 2017, 09:52:16 am
Buenos días,

Boris, no puedo ver la web del ejemplo modificado del proyecto original, ya que me solicita usuario y clave y al colocar la que le tengo me dice que es invalida, si cambiaste la clave y el usuario por favor pasame los datos,

Por otro lado, quiero leer varios caudales al mismo tiempo, ejemplo:

Quiero leer el caudal de las entradas DIN 1, 2,3,4,5,6,10,12 al mismo tiempo, que función utilizaría o si hago un espejo de la función ya enviada.

Gracias por la colaboracion
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en agosto 22, 2017, 10:05:04 am
Buenos dias,

Boris, no puedo ver la web del ejemplo modificado del proyecto original, ya que me solicita usuario y clave y al colocar la que le tengo me dice que es invalida, si cambiaste la clave y el usuario por favor pasame los datos,

No recuerdo que cambiáramos la clave, pero intenta usuario: slicetex contraseña: slicetex

Igualmente, podes desactivar la clave o cambiarla desde menú "Herramientas > Generar Código > Web Server", opción  "Activar Autentificación".

Luego compilas y cargas programa nuevamente.

Por otro lado, quiero leer varios caudales al mismo tiempo, ejemplo:

Quiero leer el caudal de las entradas DIN 1, 2,3,4,5,6,10,12 al mismo tiempo, que función utilizaría o si hago un espejo de la función ya enviada.

Gracias por la colaboración

Fue respondido en su consulta anterior, favor leer nuestra respuesta anterior (http://foro.slicetex.com/index.php?topic=247.msg1403#msg1403), donde habíamos subido un ejemplo completo que lee los caudales de todas las entradas (DIN1 hasta DIN12), ver también imágenes descriptivas.

Saludos
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en agosto 28, 2017, 20:34:30 pm
Buenas noches,

Boris, disculpa que siga molestando, pero repito que esto se debe a mi novatada.


he venido adaptando el ejemplo que me enviaste a lo que necesito, y todo va bien, ahora estoy tratando de mantener las lecturas de todas de las entradas DIN. osea hace un contador por entrada DIN

EJEMPLO: Cuando un caudal de agua en la entra el la entrada din 4, este lo lee en el registro de todas las entradas DIN4, pero regresa a cero, mi idea es que ese valor se mantenga y luego al pasar otro caudal, este se sume con el valor antes mostrado y así sucesivamente.

esto lo había hecho cuando utilizábamos 1 sola entrada

// Activar contador DIN7/COUNT1 para cuenta por flanco ascendente.
   Count1Enable(COUNT_EDGE_RISING)
   
   // Crear Variable para almacenar Lectura de pulsos de DIN7 (acumulador)
   new Float: fb = 0
   
   //Obntener cuenta del contador 1
   fb = IntToFloat(Count1GetEventCnt())

utilizando y adaptando esa función no logro resultados positivos.

reitero mis disculpa y agradezco tu colaboración
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en agosto 29, 2017, 09:25:26 am
Buenos días Ronald,

he venido adaptando el ejemplo que me enviaste a lo que necesito, y todo va bien, ahora estoy tratando de mantener las lecturas de todas de las entradas DIN. osea hace un contador por entrada DIN

EJEMPLO: Cuando un caudal de agua en la entra el la entrada din 4, este lo lee en el registro de todas las entradas DIN4, pero regresa a cero, mi idea es que ese valor se mantenga y luego al pasar otro caudal, este se sume con el valor antes mostrado y así sucesivamente.

El código lee todas las entradas midiendo el caudal instantáneo, es decir el caudal que esta presente en la entrada [L/min], y es el que se muestra en la página all.shtml, tal como pedía la consigna que habías solicitado.

¿Que necesitas hacer? ¿Cuando regresa a cero el caudal que lees? ¿Bajo que condición harías la suma de caudales?

Detallar estos puntos así podemos ayudarte.

Saludos
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en agosto 29, 2017, 13:09:39 pm
Necesito que si por el caudalimetro de la entrada 5 pasan 2 litros, estos se me reflejen en la DIN 5 de la pagina all.shtml, y que no regrese a cero, osea que se mantenga en la pagina all.shtml esos 2 litros, luego si pasan 3 litros mas, la pagina me muestro los 5 litros. así en todas las entradas. si esta lectura llega a un valor muy grande y no es recomendable para el plc, quisiera poder hacer un reset individual por lineas.

Gracias
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en agosto 29, 2017, 20:10:53 pm
Buenas tardes Ronald,

Necesito que si por el caudalimetro de la entrada 5 pasan 2 litros, estos se me reflejen en la DIN 5 de la pagina all.shtml, y que no regrese a cero, osea que se mantenga en la pagina all.shtml esos 2 litros, luego si pasan 3 litros mas, la pagina me muestro los 5 litros. así en todas las entradas. si esta lectura llega a un valor muy grande y no es recomendable para el plc, quisiera poder hacer un reset individual por lineas.

Ningún problema.

Te adjunto un proyecto que te muestra el caudal acumulado en Litros en todas las entradas din en la página all.shtml.

Te pido que lo pruebes, ya que lo modifiqué para mostrar la cantidad de litros acumulados, pero no lo probé en laboratorio por cuestión de tiempo.



Te explico que modifiqué:

El programa muestra en la página all.shtml los litros acumulados llamando a la función FlowGetAccumulatedLitres(Din) desde el archivo OnPrintEvent.p (que es la encargada de procesar la página web).

La función FlowGetAccumulatedLitres(Din) esta definida en archivo Flow.p con el siguiente código:

Código: (Pawn) [Seleccionar]
Float: FlowGetAccumulatedLitres(Din=7)
{
   new Float: TotalLitres
   
   // Calcular litros acumulados, teniendo en cuenta que 450 pulsos equivalen a un litro.
   TotalLitres = IntToFloat(DinCounterGetValue(Din)) / 450.0
   
   return TotalLitres 
}

Como podes ver, devuelve la cantidad de litros haciendo el siguiente calculo:

LitrosAcumulados = PulsosAcumulados / 450.0

Donde: 450 pulsos/min = 1 L/min

Para afinar el cálculo, podes modificar dicha constante numérica en esa función.

En el argumento de la funcion FlowGetAccumulatedLitres(Din), pasas el número de entrada que deseas leer los litros/min acumulados.

Ejemplo, para entrada DIN4: FlowGetAccumulatedLitres(4)



Esta versión acumulará el caudal hasta que se llenen los contadores y se rebalsen en un numero enorme, pero podemos hacer otra versión en que se fije un limite de litros y se resetee automáticamente (para evitar números excesivos).

Pero por ahora, proba si esto es lo que estas buscando en cuanto a la acumulación de litros, para luego decirme y vemos el otro paso.

Saludos
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en agosto 29, 2017, 22:14:52 pm
Si eso es exactamente lo que busco. muchas gracias

Referente a lo del reset, mas que resetear las lineas automáticamente, seria poder hacer la limpieza de registros de cada linea individualmente, asi como se hace en el icono de CONTROL.

MuCHAS GRACIAS
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en agosto 30, 2017, 18:24:33 pm
Buenas tardes,

Si eso es exactamente lo que busco. muchas gracias

Referente a lo del reset, mas que resetear las lineas automáticamente, seria poder hacer la limpieza de registros de cada linea individualmente, asi como se hace en el icono de CONTROL.

MuCHAS GRACIAS

Le adjunto versión del proyecto donde es posible en la página control.shtml volver a cero y limpiar todos los registros o cuentas manualmente, tocando el interruptor "LIMPIAR/BORRAR REGISTROS".

Cuando ese interruptor se toca, se llama a la función FlowFlushCounters() desde archivo OnPostEvent.p.

La función FlowFlushCounters() resetea la cuenta de todos los contadores para entradas DIN, y la misma esta definida en el archivo flow.p:

Código: (Pawn) [Seleccionar]
FlowFlushCounters()
{
   // Resetear a 0 cuentas acumuladas para todos los contadores.
   for(new i=1; i <= 12; i++)
   {
      DinCounterClear(i)
   }
}

Notar que se llama a DinCounterClear() para cada entrada DIN en el loop for.

Los contadores pueden contar hasta el numero 2147483647, luego si no son reseteados, vuelven automáticamente a 0.

Es importante que entienda los cambios, así puede realizar modificaciones.

Saludos

Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Ronald en septiembre 21, 2017, 19:52:56 pm
hola boris,

Sigo molestando, estoy con el reset individual por lineas del programa, tengo los botones de cada linea en control.shtml.
<td>LIMPIAR/BORRAR REGISTROS LINEA 1</td>
    <td> <img id="FlushSamplesSwitch1" src="/switch0.png" width="48" height="48"> </td>
    <td>LIMPIAR/BORRAR REGISTROS LINEA 2</td>
    <td> <img id="FlushSamplesSwitch2" src="/switch0.png" width="48" height="48"> </td>   
    <td>LIMPIAR/BORRAR REGISTROS LINEA 3</td>
    <td> <img id="FlushSamplesSwitch3" src="/switch0.png" width="48" height="48"> </td>

En OnPostEvent.p.     con FlowFlushCounters(1)   mando a resetear la linea 1

y en flow.p
FlowFlushCounters(Din=1)
{
     
   // Resetear a 0 cuentas acumuladas para el contadores.
   for(new i=1;  i <= 12; i++) 
 
   
   {
      DinCounterClear(1)

y me funciona perfecto para la entrada 1,

el tema es que cuando quiero hacerlo para las siguientes lineas y que me funcionen en simultaneo, osea que pueda limpiar los registros de la linea que yo quiera sin modificar el registro de otra linea, no me esta funcionando

esperando tu colaboracion.

reitero mi disculpas.
Título: Re:Registro Caudal Agua y Acceso Web
Publicado por: Soporte en septiembre 21, 2017, 21:35:19 pm
Buenas noches Ronald,

Por cada reset-individual que pongas en la página, deberías tener en OnPostEvent.p un "if" que lo procese.

Fijate, para el del ejemplo tenes en OnPostEvent.p :

Código: (Pawn) [Seleccionar]
if(WebServerCheckFieldValueStr("Form", "FLUSH") == 1)
{
      // Obtener el valor Bool del campo FLUSH.
      if(WebServerGetFieldValueBool("Value"))
      {
         // Vaciar registro de muestras.
         FlowFlushSamples()
         
         // Resetear a 0 la cuenta de todos los contadores para entradas DIN.
         FlowFlushCounters()
      }
      else
      {
         // Nada
      }

      // Retornar de evento inmediatamente.
      return
}

Luego desde ese "if", llamarías a cada reset de contador individualmente: DinCounterClear(1), DinCounterClear(2), DinCounterClear(3)....y asi.

También nota como en control.shtml se indica o se identifica el switch del ejemplo con "FLUSH". Si agregas diferentes "switchs", debes ponerle diferentes nombres.

Saludos