Convertir voltaje a unidades de ingeniería en C#

  • 3 Respuestas
  • 1346 Vistas

Isaac

  • Principiante
  • Mensajes: 1
Convertir voltaje a unidades de ingeniería en C#
« : junio 17, 2022, 16:41:58 pm »
De acuerdo  al ejemplo DiskSamplerLog4 que nos mandado.

-¿Cómo podemos cambiar de valores analógicos (Ej. 0 - 10v) a valores de ingeniería de rango (Ej. 0 a 100°C) para que se refleje en el archivo .CSV?

Porque nos da los valores en voltaje pero queremos cambiarlos a unidades de ingeniería

Ej.:
17/06/2022   11:39:04 a. m.   4.9976   0.5518
Encontramos en el foro un ejemplo (http://www.slicetex.com/foro/smf/index.php?topic=128.0):
gi_SampleScaled = ((gi_Sample*100)/1023) * 800
gi_SampleScaled = gi_SampleScaled / 100

Pero en nuestro programa como podemos hacerlo  ya que se usa Arrays  para almacenar los valores de las muestras como se muestra a continuación.
for(new Ch=1; Ch <= SAMPLERS_CH; Ch++)
   {
      VioInitVin(Ch, VIO_TYPE_VIN_SINGLE, VIO_VIN_RANGE_0V_10V, VIO_VIN_SAMPLES_NONE
   }
DiskLogAddArray(1, VinBuf, 0, SAMPLERS_BUF_SIZE*SAMPLERS_CH)

Adjuntamos el programa


« Última Modificación: junio 20, 2022, 21:13:47 pm por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Convertir voltaje a unidades de ingeniería
« Respuesta #1 : junio 17, 2022, 18:20:47 pm »
Buenas tardes Isaac,

En el ejemplo DiskSamplerLog4, el PLC al muestrear los canales analógicos almacena las lecturas en valores de voltaje con formato binario. Como la visualización final es a través de un archivo CSV que convertís de binario a texto con la computadora, no tiene sentido hacer la conversión a unidades de ingeniería en el PLC.

Lo que conviene es realizarlo en la utilidad de conversión "SampleBinToText". Esto además trae otra ventaja, y es que el PLC no tiene que hacer cálculos extras liberándolo para que aproveche todo el procesador en muestrear y guardar en memoria.

Ahora, hay varias formas de encarar lo que querés hacer.

Una es modificando la aplicación SampleBinToText con Microsoft Visual Studio para convertir voltaje a temperatura al hacer la conversión para obtener el CSV.

La otra opción, es que si es temperatura lo que necesitás leer, al ser una señal lenta, no veo que sea necesario que le apliques un muestreo rápido de 200 muestras por segundo, con que lo hagas a una muestra por segundo es más que suficiente. En ese caso, podés almacenar directamente la temperatura por separado en otro archivo CSV con el PLC, sin necesidad de usar la aplicación de conversión (ya que lo almacenás como texto, no en binario). En este caso utilizarías otro canal DiskLog.

Por ejemplo, si tenés señales rápidas en los canales VIN1 a VIN3, y otras señales lentas en los canales VIN4 a VIN6, podés por un lado aplicar el muestreo de 200 muestras por segundo a VIN1:VIN3 y almacenar en un archivo binario, y por otro lado un muestreo lento a VIN4:VIN6 que almacenás en un archivo de texto CSV directamente. Esto ahorra también memoria en la tarjeta Micro-SD ya que el muestreo rápido genera muchos datos de almacenamiento.

Avisáme qué opción te parece mejor, si almacenar por separado la temperatura, o todo junto y convertir desde Visual Studio, y te guío para que puedas hacerlo.

Saludos!

PD: El ejemplo DiskSamplerLog4 es al más avanzado y complejo de todos los ejemplos, quizás te conviene partir del ejemplo DiskSamplerLog3 que es más simple y específico.
« Última Modificación: junio 20, 2022, 19:39:12 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Victor Olguin

  • Principiante
  • Mensajes: 2
Re:Convertir voltaje a unidades de ingeniería
« Respuesta #2 : junio 20, 2022, 13:09:30 pm »
Buen día

Soy del mismo Equipo de Isac y Miguel  y ya revisamos las opciones y queremos hacerlo a través de la aplicación SampleBinToText editandolo con visual studio  para que en el archivo csv  ya aparezcan los rangos de loas canales en unidades de ingeniería, primero de 0 a 100% como primera practica y después quisiéramos implementar que estos rangos sean editados a través del programa SampleBinToText para que cada canal pueda tener diferente rango y se pueda modificar rápidamente.

Ya hemos hecho practicas con visual studio, pero aun no hemos logrado un resultado.

De antemano le agradecemos su apoyo estaré al pendiente por mi chat gracias
« Última Modificación: junio 20, 2022, 21:12:15 pm por Soporte »
Victor Olguin

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re:Convertir voltaje a unidades de ingeniería
« Respuesta #3 : junio 20, 2022, 20:46:48 pm »
Ya revisamos las opciones y queremos hacerlo a través de la aplicación SampleBinToText editandolo con visual studio  para que en el archivo CSV ya aparezcan los rangos de los canales en unidades de ingeniería, primero de 0 a 100% como primera práctica y después quisiéramos implementar que estos rangos sean editados a través del programa SampleBinToText para que cada canal pueda tener diferente rango y se pueda modificar rápidamente.

Buenas tardes Víctor,

Convertir a unidades de ingeniería en el programa "SampleBinToText" es fácil, ya que tenés el valor de voltaje.

Lo primero que debés realizar es un escalamiento matemático, es decir, convertir por ejemplo valores de voltaje de 0 a 10V a temperatura de 0 a 100 °C.

Para ello podés utilizar crear la siguiente función (método se le dice) en Visual C#:

Código: (C#) [Seleccionar]
        private float MathScale(float InValue, float InMin, float InMax, float OutMin, float OutMax)
        {
            float ScaledValue;

            // Convertir valor utilizando la ecuación de la recta que pasa por dos puntos.
            ScaledValue = ((((InValue) - InMin) / (InMax - InMin)) * (OutMax - OutMin) + OutMin);

            // Return.
            return ScaledValue;
        }

El método escala el valor 'InValue" entre 'InMin' y 'InMax' para el rango de salida especificado por 'OutMin' y 'OutMax'.
Donde "InValue" es el valor de voltaje.

Por ejemplo, volviendo al ejemplo de temperatura, si los valores de voltaje de 0 a 10V corresponden a temperatura de 0 a 100 °C, hacemos:

Código: (C#) [Seleccionar]
MathScale(VoltajeActual, 0, 10, 0, 100)

Y el método MathScale() devolverá la temperatura correspondiente entre 0 y 100 °C, para un voltaje entre 0 y 10V.
Una forma rápida de entenderla, es que a 0V le corresponden 0°C y a 10V le corresponden 100°C. Podés utilizarla para cualquier tipo de unidad de ingeniería (temperatura, presión, etc) y valor de entrada (voltaje o corriente).

Entonces, ahora que ya tenemos el método de conversión a unidades de ingeniería vamos al código del programa "SamplesBinToText" y buscamos la parte dónde obtenemos el voltaje (señalado en rojo):

    // Convertir muestra de canal de binario a analógico (float).
    // Nota: Cada muestra de canal está separada a SamplersBufSize*4 bytes del canal actual.
    Value = BitConverter.ToUInt32(LogEntryData, (int)(DataIndex + Ch*SamplersBufSize*4));
   
    VinValue = VinBinaryToVoltage(Value, VinRangeSelected, false);

    // Agregar a la línea de texto.
    // Nota: Imprimir valor con máximo 4 decimales.
    TextLines.AppendFormat(";{0:0.####}", VinValue);


El valor "VinValue" es el voltaje y le aplicamos el método MathScale() para convertir a unidades de ingeniería:

Código: (C#) [Seleccionar]
EngValue = MathScale(VinValue, 0, 10, 0, 100)

El valor EngValue será un valor entre 0 y 100, que es la temperatura correspondiente a 0 y 10V. Este valor ahora se guarda en el archivo CSV.

Para simplificar, te paso el ejemplo modificado, deberías ver una pantalla similar a la siguiente:



Observar en la imagen superior, la parte resaltada en amarillo, como podés configurar cada canal VIN, en este caso se muestra que -3V corresponde a 0, y 3V corresponde a 100.

Luego en el código fuente se toman estos valores de configuración para MathScale() para cada canal VIN.

Podés descargar desde este mensaje el código del proyecto modificado: SampleBinToTextEngUnits_v001.zip

Avisáme si hay algo puntual que no se entienda en el programa.

Saludos!


« Última Modificación: junio 23, 2022, 16:57:49 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com