Entrada Analógica 4-20ma

  • 5 Respuestas
  • 3476 Vistas

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Entrada Analógica 4-20ma
« : abril 22, 2016, 09:56:12 am »
Estimado Boris,

Instalé otro PLC para suplir el funcionamiento del que daño la tormenta.
Le cargué el mismo código de programa y tengo un problema con el valor de corriente que me muestra al acceder al servidor del plc.

Dicha corriente es de 13ma. Mediante osciloscopio se ve que la señal no presenta ningún tipo de ruido.

El problema es que el server me muestra un valor de 33 ma....

Te paso el codigo de PLC main y del evento postprint.

Seguro es un error de programa pero no me doy cuenta cual... Te comento que el jumper 3 está colocado.

Por mail voy a pasarte la dirección IP actual de acceso para que pruebes.

En este momento estoy tratando de solucionarlo.
Re-leí de nuevo el manual Pawn en esta parte pero no encuentro el problema.

Probé desactivar el filtro pero sigue dando lectura de 33ma en lugar de 13ma (que es lo que mido).

Aguardo tu respuesta...

Te paso los códigos:

PLC MAIN::::

Código: (Pawn) [Seleccionar]

// --------------------------------------------------------------------------------
// Archivo      : PlcMain.p
// Titulo       : Script principal del PLC.
//
// Creado por   : StxLadder Version 1.7.2.
// Fecha        : 29/01/2016 07:59:31
//
// Descripcion  :
//
// Aqui puede describir su proyecto.
//
// --------------------------------------------------------------------------------

//{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{

// --------------------------------------------------------------------------------
// Archivo      : PlcMain.p
// Titulo       : Servidor TCP/IP ejemplo Cooperativa Oliva.
//
// Creado por   : StxLadder Version 1.7.0.
// Fecha        : 24/12/2015 10:58:44
//
// Descripcion  :
//
// Este ejemplo configura el PLC como servidor TCP.
// El mismo acepta conexiones en el puerto 48000.
//
// Comprueba la recepcion de dos bytes y de acuerdo al valor
// de los mismos, activa las salidas DOUT1 a DOUT2.
//
// Cuando los bytes son recibidos, responde al cliente enviando
// dos bytes con el estado de las entradas digitales DIN1 y DIN2.
//
// --------------------------------------------------------------------------------

//}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}


// ********************************************************************************
// Funcion     : PlcMain()
// Descripcion : Punto de entrada principal del PLC.
// ********************************************************************************


//{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
// --------------------------------------------------------------------------------
// VARIABLES GLOBALES
// --------------------------------------------------------------------------------

// Buffer de recepcion.
new RxData[10]

// Buffer de transmision.
new TxData[5]
//}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

// Crear variable para almacenar corriente.
new Float: Corriente = 0;
new Float: V_alim_sens = 0;
new Float: V_alim_prom=0;
new cont_prom=1;

PlcMain()
{

//{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
   // Inicializar TCP Server.
   // Puerto: 82
   // Timeout Idle: 30 segundos.
   
 //  TcpServerInit(82, 30)
   
   // Activar evento para recepcion de datos de cliente.
 //  TcpServerSetRxEvent()   
//}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}   

   // Inicializar Web Server.
  WebServerInitialize();   // a este lo sigo iniciando en el puerto 82
   

   // Configuro rango Vin1 de 0 a 5 volt
VinSetRange(1, VIN_RANGE_5V); /// ver bien esto
VinSetRange(8, VIN_RANGE_10V); /// ver bien esto
//VinSetRange(4, VIN_RANGE_10V); /// ver bien esto
//VinFilterAOn(200,1000);
// VinFilterAOn(200,2000);

   // Aqui puede escribir codigo PAWN y llamar a otras funciones.
   
   for(;;)
   {
      // Loop principal.
   
  // Leer corriente de VIN1 y almacenar en variable "Current".
// 1Utilizar un resistor de 100 ohms como sensor de corriente.

Corriente = Float: VinToCurrent(1, 100);
V_alim_sens= Float: VinReadVolt(8);

//VinFilterAOff();

/*while(cont_prom<201)
{
V_alim_sens= Float: VinReadVolt(8);
V_alim_prom=V_alim_prom+V_alim_sens;
PauseUS(500);
cont_prom++;
}
V_alim_prom=V_alim_prom/200;*/

      // Delay Led.
      DelayMS(200)
      LedToggle()

   }

   // Retorno.
   return 0;
}

@OnTcpServerRx()
{
new Id

//
// Obtener conexiones con datos sin leer.
//

while((Id=TcpServerGetUnreadId()) > 0)
{
// Leer datos y almacenar en RxData[].
TcpServerRead(Id, RxData, 10)

//
// Comprobar si debemos activar/desactivar salidas digitales DOUT1 a DOUT2.
//

if(RxData[0] == 0)
{
DoutSetOff(DOUT1)
}
if(RxData[0] == 1)
{
DoutSetOn(DOUT1)
}

if(RxData[1] == 0)
{
DoutSetOff(DOUT2)
}
if(RxData[1] == 1)
{
DoutSetOn(DOUT2)
}

//
// Obtener estado de entradas Digigitales DIN1 a DIN2.
//

TxData[0] = DinValue(DIN1)
TxData[1] = DinValue(DIN2)
   
   // Enviar estado de entradas digitales al cliente usando el Id de la conexion
   // que recibio los datos.
   TcpServerSend(Id, TxData, 2)
}
}

// --------------------------------------------------------------------------------
// EOF
// --------------------------------------------------------------------------------


Evento OnPrintEvent:::::::

Código: (Pawn) [Seleccionar]

// --------------------------------------------------------------------------------
// Archivo     : OnPrintEvent.p
// Descripcion : Rutinas para procesar el evento @OnWebServerPrint().
// --------------------------------------------------------------------------------

// ********************************************************************************
// Funcion     : OnWebServerPrint()
// Descripcion : Evento llamado cuando el Web Server necesita imprimir una cadena
//               al cargarse una pagina dinamica.
//               Se deberia retornar lo antes posible de este evento, ya que
//               se procesa mientras la pagina se carga en el navegador.
// ********************************************************************************

@OnWebServerPrint()
{
//
// Obtener e imprimir el numero de cadena solicitada por el servidor.
//

switch(WebServerGetPrintNum())
{
//
// Procesar cadenas relacionadas a inputs.shtml
//

case 10:
WebServerPrintStr("%d", DinValue(DIN1))
case 11:
WebServerPrintStr("/l%d.gif", DinValue(DIN1))

// código agregado por mi para prueba
case 30:
//WebServerPrintStr("%3.3f", Corriente*12558)// Así lo muestra con 3 decimales
//WebServerPrintStr("%3.0f", Corriente*12558000)// Así lo muestra sin decimales
         WebServerPrintStr("%3.3f", Corriente/3)// Así lo muestra sin decimales en miles de litros
         //WebServerPrintStr("%3.0f", Corriente*12558)// Sensor nuevo FMK
case 31:
//{
WebServerPrintStr("%3.1f", V_alim_sens*12.25) //%f muestra un float con 1 decimales por defecto. Pág 67 de AN030
//cont_prom=1;
//V_alim_prom=0;
//V_alim_sens=0;
//}

//
// Procesar cadenas relacionadas a outputs.shtml
//

//         Bomba 1
case 20:
if(DoutValue(DOUT1) == 0)
{
WebServerPrintStr("checked")
}
case 21:
if(DoutValue(DOUT1) == 1)
{
WebServerPrintStr("checked")
}
//         Bomba 2
case 22:
if(DoutValue(DOUT2) == 0)
{
WebServerPrintStr("checked")
}
case 23:
if(DoutValue(DOUT2) == 1)
{
WebServerPrintStr("checked")
}
//         Bomba 3
case 24:
if(DoutValue(DOUT3) == 0)
{
WebServerPrintStr("checked")
}
case 25:
if(DoutValue(DOUT3) == 1)
{
WebServerPrintStr("checked")
}
//         Bomba 4
case 26:
if(DoutValue(DOUT4) == 0)
{
WebServerPrintStr("checked")
}
case 27:
if(DoutValue(DOUT4) == 1)
{
WebServerPrintStr("checked")
}
//         Bomba 5
case 28:
if(DoutValue(DOUT5) == 0)
{
WebServerPrintStr("checked")
}
case 29:
if(DoutValue(DOUT5) == 1)
{
WebServerPrintStr("checked")
}

case 40:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT1))
case 41:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT2))
case 42:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT3))
case 43:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT4))
case 44:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT5))
}
}

// --------------------------------------------------------------------------------
// EOF
// --------------------------------------------------------------------------------



Y por las dudas.... el código html de la página del server virtual::::::

Código: (HTML) [Seleccionar]

$!+ /header.html $

<h2>COSP Oliva - División Agua Corriente</h2>

<center>

<table id="t_VT">
<tr>Volumen en Tiempo Real </tr>
<th>Volúmen [Lt X 1000]</th>
<td>$! PrintStr 30 $</td>
<tr>
<th>Vcc_Sensor[V]</th>
<td>$! PrintStr 31 $</td>
</tr>
</table>

<br>
</center>
<meta http-equiv="Refresh" content="10">
<!-- Recarga automáticamente la página Vol_T cada 10 segundos-->

<center>
<h3>Volver a <a href="/">pagina principal</a>.</h3>
</center>

$!+ /footer.html $

« Última Modificación: abril 22, 2016, 21:05:52 pm por Soporte »

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Re:Entrada Analógica 4-20ma
« Respuesta #1 : abril 22, 2016, 10:02:51 am »
Boris,

Ahí te paso la dir IP....
En el código On print event
la línea

 WebServerPrintStr("%3.3f", Corriente/3)

leela como

WebServerPrintStr("%3.3f", Corriente)

La división por 3 la hice a modo de prueba...
La acabo de sacar... en definitiva el código completo quedó:

Código: (Pawn) [Seleccionar]

// --------------------------------------------------------------------------------
// Archivo     : OnPrintEvent.p
// Descripcion : Rutinas para procesar el evento @OnWebServerPrint().
// --------------------------------------------------------------------------------

// ********************************************************************************
// Funcion     : OnWebServerPrint()
// Descripcion : Evento llamado cuando el Web Server necesita imprimir una cadena
//               al cargarse una pagina dinamica.
//               Se deberia retornar lo antes posible de este evento, ya que
//               se procesa mientras la pagina se carga en el navegador.
// ********************************************************************************

@OnWebServerPrint()
{
//
// Obtener e imprimir el numero de cadena solicitada por el servidor.
//

switch(WebServerGetPrintNum())
{
//
// Procesar cadenas relacionadas a inputs.shtml
//

case 10:
WebServerPrintStr("%d", DinValue(DIN1))
case 11:
WebServerPrintStr("/l%d.gif", DinValue(DIN1))

// código agregado por mi para prueba
case 30:
//WebServerPrintStr("%3.3f", Corriente*12558)// Así lo muestra con 3 decimales
//WebServerPrintStr("%3.0f", Corriente*12558000)// Así lo muestra sin decimales
         WebServerPrintStr("%3.3f", Corriente)// Así lo muestra sin decimales en miles de litros
         //WebServerPrintStr("%3.0f", Corriente*12558)// Sensor nuevo FMK
case 31:
//{
WebServerPrintStr("%3.1f", V_alim_sens*12.25) //%f muestra un float con 1 decimales por defecto. Pág 67 de AN030
//cont_prom=1;
//V_alim_prom=0;
//V_alim_sens=0;
//}

//
// Procesar cadenas relacionadas a outputs.shtml
//

//         Bomba 1
case 20:
if(DoutValue(DOUT1) == 0)
{
WebServerPrintStr("checked")
}
case 21:
if(DoutValue(DOUT1) == 1)
{
WebServerPrintStr("checked")
}
//         Bomba 2
case 22:
if(DoutValue(DOUT2) == 0)
{
WebServerPrintStr("checked")
}
case 23:
if(DoutValue(DOUT2) == 1)
{
WebServerPrintStr("checked")
}
//         Bomba 3
case 24:
if(DoutValue(DOUT3) == 0)
{
WebServerPrintStr("checked")
}
case 25:
if(DoutValue(DOUT3) == 1)
{
WebServerPrintStr("checked")
}
//         Bomba 4
case 26:
if(DoutValue(DOUT4) == 0)
{
WebServerPrintStr("checked")
}
case 27:
if(DoutValue(DOUT4) == 1)
{
WebServerPrintStr("checked")
}
//         Bomba 5
case 28:
if(DoutValue(DOUT5) == 0)
{
WebServerPrintStr("checked")
}
case 29:
if(DoutValue(DOUT5) == 1)
{
WebServerPrintStr("checked")
}

case 40:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT1))
case 41:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT2))
case 42:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT3))
case 43:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT4))
case 44:
WebServerPrintStr("/l%d.gif", DoutValue(DOUT5))
}
}

// --------------------------------------------------------------------------------
// EOF
// ------------------------------

« Última Modificación: abril 22, 2016, 21:06:29 pm por Soporte »

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Re:Entrada Analógica 4-20ma
« Respuesta #2 : abril 22, 2016, 15:39:23 pm »
Hola Boris...

Te informo como segui....

La solucion que encontre fue colocar una resistencia de 100 ohms externa cerrando el lazo a masa.... luego ingreso por vin 4 como tension.

Recien vin 4 me dio la caida de voltaje real... ni vin1, vin2 ni vin3... funcionan como lo esperaba.... todas escalan la lectura en la misma medida..... tanto con resistencia interna como externa.....

No me di cuenta de medir el valor de resistencia entre uno de los terminales del jumper y masa para verificar que fueran de 100 ohms....

Aguardo tus comentarios.

Enviado desde mi SM-J110M mediante Tapatalk


Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re:Entrada Analógica 4-20ma
« Respuesta #3 : abril 22, 2016, 22:34:51 pm »
Buenas noches Mariano,

Acabo de realizar una prueba, aplicando 1V a la entrada VIN1 con el jumper J3 puesto, para leer 10 mA, y la lectura fue incorrecta.

Efectivamente, era un problema de firmware interno, pero no de hardware.
No se aplicaba correctamente una escala del amplificador de ganancia 2.5 por un error tipográfico, te pido disculpa por el error.

Pero ya lo corregí, te adjunto la actualización de firmware en el archivo: stx8091-d1-v199.sff

Te pido que actualices el firmware del PLC, para ello podes leer el siguiente documento:

http://slicetex.com/ladder/docs/files/STXLADDER-FU.pdf

A modo de resumen, para actualizar firmware, es muy fácil:

Descarga el archivo que te adjunto stx8091-d1-v199.sff

En StxLadder ir a "PLC > Actualizar Firmware" .

Apretar botón "BOOTLOADER" con el PLC conectado.
Apretar botón "RESET". En este punto el Led PAUSE rojo comienza a parpadear.

Seleccionar firmware con el boton "Abrir" y busca el archivo que te pasé.

Luego apretar el boton "PROGRAMAR" y la transferencia comienza.

Esperar que avise que todo salio correctamente y luego apretar botón "RESET".

En este punto el PLC esta actualizado a la versión "199" que podes verificar desde la configuración del mismo.
También, el led PAUSE no debería estar mas activo.

Luego, carga tu programa, coloca el sensor en la entrada VIN1 con el jumper J3 colocado, y fíjate si medís correctamente la corriente.

Este fin de semana viajo por negocios y vuelvo el Martes, por lo que voy a estar acotado si necesitas alguna prueba extra.

Avísame si queda todo corregido y/o si tenes alguna duda.

Saludos


« Última Modificación: abril 22, 2016, 22:43:54 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re:Entrada Analógica 4-20ma
« Respuesta #4 : abril 22, 2016, 22:41:37 pm »
A modo de ejemplo EXTRA, no hace falta que lo pruebes, es solo didactico, te adjunto un ejemplo en Pawn, que si lo cargas en el PLC, te
muestra la corriente / tension presente en las entradas VIN1, VIN2 y VIN4, sobre el display de VirtualHMI.

Para probarlo:

Coloque jumper J3 y J4.
Coloque tension de 1V en VIN1. ---> EVITE TENSIONES MAYOR A 3.5V QUE PUEDAN QUEMAR EL RESISTOR DE ENTRADA DE CORRIENTE.

Ejecute VirtualHMI, activelo y toque el boton M1.

A partir de ese momento, se podrá ver en la pantalla de VirtualHMI:

VIN1 = 1 [V] / 2055 [BIN]
VIN2 = 0 [V]
VIN4 = XXX [V]
VIN1 = 10.02 [mA]
VIN2 = 00.00 [mA]


Donde efectivamente, hay 10 mA circulando por el resistor de medición de corriente de 100 ohms, por ley de ohm I = V/R.

Obviamente, para que funcione correctamente el firmware debe estar actualizado a la versión 199 o superior.
« Última Modificación: abril 22, 2016, 22:53:51 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Mariano

  • Avanzado
  • ***
  • Mensajes: 106
Re:Entrada Analógica 4-20ma
« Respuesta #5 : abril 24, 2016, 11:48:28 am »
Ok Boris gracias por tu tiempo.... Actualizare el firmware y lo voy a probar en la semana....

Saludos y suerte en esos negocios

Enviado desde mi SM-J110M mediante Tapatalk