Mensajes recientes

Páginas: 1 ... 8 9 [10]
91
STX8180 / Re:Creacion archivo bin despues de un log
« Último mensaje por Soporte junio 23, 2022, 11:45:32 am »
Buenos días Miguel,

En el siguiente link te paso el ejemplo modificado para descargar:

www.slicetex.com/docs/an/an036/files/examples/DiskSamplerLog3B.zip

Este ejemplo es derivado del ejemplo "DiskSamperLog3", teniendo como principal diferencia el nombre de los archivos de logs, que en este caso incluyen la fecha en el nombre (YYYYMMDD.bin, donde YYYY=Año, MM=Mes, DD=Día). Además se lista cada log nuevo en un archivo llamado "loglist.htm" que es cargado por la página web "log.shml" para un acceso rápido.

Las principales diferencias son:

ARCHIVO SAMPLERS.P

En la función SamplersInit() utilizamos:

Código: (Pawn) [Seleccionar]
DiskLogInit(1, "", "bin", "/web", 100000, 1, DISKLOG_OPT_YYYYMMDD|DISKLOG_OPT_CIRCULAR|DISKLOG_OPT_FAST_WRITE)

El canal 1 de DiskLog está configurado para que los datos se guarden en un archivo con el siguiente nombre "YYYYMMDD.bin", donde YYYY=Año, MM=Mes, DD=Día, por ejemplo 20220623.bin. Cada archivo puede almacenar hasta 100000 entradas de log (configurable) por archivo. Como todos los días se crea un archivo nuevo, si en el mismo día se pasan las 100000 entradas, se sobreescribe el archivo desde el comienzo, perdiendo el contenido previo (esto es porque se utiliza la opción DISKLOG_OPT_CIRCULAR en DiskLogInit()). Puede eliminar la opción DISKLOG_OPT_CIRCULAR si no quiere este comportamiento circular o aumentar el número de entradas por archivo.

En la función SamplersStart() agregamos el siguiente código al inicio:

Código: (Pawn) [Seleccionar]

   new Year, Month, Day
   new File[31]
   
   //
   // Agregar un link del archivo de log actual si no existe el archivo con lista de logs "/web/loglist.htm".
   //
   
   // Obtener fecha del reloj.
   RtcGetDate(Day, Month, Year)
   
   // Crear una cadena con el nombre del archivo del log correspondiente a este día.
   // Nota: %02d, es un código para imprimir un entero anteponiendo como máximo dos ceros,
   // por ejemplo: "1" se imprime como "01".
   StrFormat(File, 31, false, "/web/%04d%02d%02d.bin", Year, Month, Day)
   
   // Verificar si no existe el archivo de log actual o la lista de logs.
   // Nota: Esto permite agregar solo agregar el enlace cuando hay un archivo de log nuevo, o cuando
   // la lista de logs no existe.
   if(DiskFileExist(File) == 0 || DiskFileExist("/web/loglist.htm") == 0)
   {
      // No existe, agregar enlace a archivo en otro archivo llamado /web/loglist.htm
      // Nota: La opción DISK_WRITELOG_OPT_NO_DATE evita colocar fecha/hora en el archivo.
      DiskWriteLogString(DISK_WRITELOG_OPT_NO_DATE, "/web/loglist.htm", "<a href=\"%s\" target=\"_blank\">%s</a><br>", File, File)
   }


Comenzamos obteniendo fecha/hora con RtcGetDate() para formar una cadena con StrFormat() que tenga el mismo nombre que el archivo de log del día, es decir del tipo YYYYMMDD.bin. Esto nos permitirá comprobar si el archivo YYYYMMDD.bin del día existe con DiskFileExist().

Si no existe, con DiskWriteLogString() escribimos una línea de texto en el archivo "/web/loglist.htm" que cotiene un link a YYYYMMDD.bin, de esta manera, luego podremos acceder desde la página web  a una lista con todos los archivos log generados.

También comprobamos si "/web/loglist.htm" no existe, en ese caso, también agregamos el link a YYYYMMDD.bin.

ARCHIVO LOG.SHTML

Finalmente, en la página web dinámica agregamos un comando para cargar el contenido del archivo con la lista de enlaces a los logs: "/web/loglist.htm"

Esto lo hacemos con el comando:

Código: (CGI) [Seleccionar]
$!+ /web/loglist.htm $

Resultando el código HTML de la página web completo como:

Código: (HTML) [Seleccionar]
$!+ /header.html $

<section>

<h1>Logs Disponibles</h1>

<p>Click en archivo para descargar log.</p>

<!-- Cargar contenido de archivo en la página. -->
$!+ /web/loglist.htm $

</section>

$!+ /footer.html $

Cada log nuevo será listado en la página web "log.shtml" que a su vez carga el archivo con enlaces "/web/loglist.htm".

Más información sobre comandos web en la nota de aplicación AN030.

Podés probar generar diferentes archivos logs del tipo YYYYMMDD cambiando la fecha/hora interna del PLC con diferentes días desde menú "PLC > Configurar PLC".

Saludos!




92
quedó claro! ya vimos como controlar este tema.
93
STX8180 / Re:Creacion archivo bin despues de un log
« Último mensaje por Miguel Gomez junio 22, 2022, 22:41:39 pm »
Hola que tal,
Implemente el reemplazo de la linea para poder tener el nombre del archivo bin con YYYYMMDD, pero aún lo veía y se descrgaba como vinxxx.bin,  creo es asunto de actualizar en el codigo de las paginas web, correcto?

Y creo que respondi en otro mensaje, pero si puedes ayudarnos a ejemplificar la escritura de archivo a tarjea con un link al log.

saludo cordial
94
STX8180 / Re:Relación SAMPLER BUFF SIZE con segundo de adquisición en DiskSamplerLog4
« Último mensaje por Soporte junio 22, 2022, 18:15:29 pm »
Observamos en el log ya en excel que en 1 segundo hay un total de 127 ineas y en otro segundo vemos 254 lineas, es aleatorio. Pudieses ampliarnos el tema del buffer size? Queremos tener claro puesto que el usuario final esperaria, si le digo que muestreo 200 x segundo, ver en el log las 200 muestras del segundo. Para tener bien el argumento del funcionamiento.

Hola Miguel.

Cuando el PLC muestrea a 200 muestras por segundo, esto es, una muestra cada 0.005 segundos, el PLC no las escribe inmediatamente en el archivo binario, sino que espera que se llene un buffer interno, que en este caso tiene el tamaño SAMPLERS_BUF_SIZE = 127.

Entonces, transcurren 0.005 * 127 = 0.635 segundos antes de que se escriban las muestras a un archivo (en este momento se llama al evento @OnVinBufFullA() en "Samplers.p", y escribe las muestras con DiskLogAddArray()).

Por lo tanto, supongamos que se comienza a muestrear justo en el segundo exacto "0", tendremos el siguiente log cada 0.635 segundos:

  • 0.635 segundos: se escriben 127 muestras
  • 1.27 segundos: se escriben 127 muestras
  • 1.905 segundos: se escriben 127 muestras
  • 2.54 segundos: se escriben 127 muestras
  • 3.175 segundos: se escriben 127 muestras
  • 3.81 segundos: se escriben 127 muestras
  • 4.445 segundos: se escriben 127 muestras
  • 5.07 segundos: se escriben 127 muestras

Notar como las líneas marcadas en rojo pertenecen al mismo segundo, porque el log estuvo espaciado cada 0.635, y la sumatoria hace que algunos logs queden en el mismo segundo, pero el espacio de tiempo siempre es el mismo. En esos casos, verá 127+127 = 254 muestras asociadas a un mismo segundo.

Como la menor unidad de tiempo para fecha/hora es el segundo en el reloj del PLC, el tiempo asociado solo contiene el segundo, pero no las milésimas de segundo. Sin embargo, el muestreo es correcto, el espaciado entre cada muestra es de 0.005 segundos.

Si no se entiende la explicación, me avisa.

Saludos!
95
STX8180 / Re:Creacion archivo bin despues de un log
« Último mensaje por Miguel Gomez junio 22, 2022, 17:44:01 pm »
Puedes ejemplificar  para ver el listado de archivos bin generados y se pueda accesar?

saludos
96
STX8180 / Re:Creacion archivo bin despues de un log
« Último mensaje por Soporte junio 22, 2022, 17:30:20 pm »
Tomando como ejemplo Disksample3, para el muestreo de canales (hasta 200 muestras/s), ¿es posible que se creen archivos bin por cada evento con el titulo de la fecha y hora enque se creo el log para ese evento en específico? digamos que cada el evento dure de 30 a 60 segundos. algo como
                 h  m  s
log220622_113915
log220630_120012

Buenas tardes Miguel,

Los nombre de archivos tienen un límite de 8 caracteres en el PLC, por lo tanto no tiene la longitud suficiente para poder colocar fecha y hora en el log en el nombre del archivo.

Lo que puede hacer es que tenga fecha, mes y día el nombre, por ejemplo: "YYYYMMDD.bin"
Donde YYYY=Año, MM=Mes y DD=Día.

Para configurarlo de ese modo, en DiskSamperLog3, vaya al archivo "Samplers.p" y busque la línea:

Código: (Pawn) [Seleccionar]
DiskLogInit(1, "vin", "bin", "/web", 10000, 500, DISKLOG_OPT_PPPPPXXX|DISKLOG_OPT_CIRCULAR|DISKLOG_OPT_FAST_WRITE)

Remplácela por:

Código: (Pawn) [Seleccionar]
DiskLogInit(1, "", "bin", "/web", 10000, 1, DISKLOG_OPT_YYYYMMDD|DISKLOG_OPT_CIRCULAR|DISKLOG_OPT_FAST_WRITE)

La nueva constante utilizada es: DISKLOG_OPT_YYYYMMDD que le da el nombre de archivo el año, mes y día.
En el segundo argumento colocamos "" (sin prefijo de nombre de archivo), y en el sexto argumento '1' ya que se genera un solo archivo por día.

y se puedan observar en el webpage

¿Un listado en la página con todos los archivos "YYYYMMDD.bin" generados?.

Se me ocurre que una forma de realizarlo, es que cada vez que se genere un log por día nuevo, se escriba un archivo en la tarjeta con un link al log. Luego al cargar una página web, se cargue este archivo que muestre la lista.

Si esto busca, puedo ejemplificarle.

Saludos!

97
STX8180 / Relación SAMPLER BUFF SIZE con segundo de adquisición en DiskSamplerLog4
« Último mensaje por Miguel Gomez junio 22, 2022, 13:54:28 pm »
Que tal.
Hemos usado el disksample4 con un total de 7 canales como entrada (VIN), activando el log y convirtiendo el archivo bin. Observamos en el log ya en excel que en 1 segundo hay un total de 127 ineas y en otro segundo vemos 254 lineas, es aleatorio. Pudieses ampliarnos el tema del buffer size? Queremos tener claro puesto que el usuario final esperaria, si le digo que muestreo 200 x segundo, ver en el log las 200 muestras del segundo. Para tener bien el argumento del funcionamiento.

saludo
98
STX8180 / Creación de archivo bin de log con fecha en el nombre
« Último mensaje por Miguel Gomez junio 22, 2022, 13:45:56 pm »
Hola que tal.
Tomando como ejemplo Disksample3, para el muestreo de canales (hasta 200 muestras/s), ¿es posible que se creen archivos bin por cada evento con el titulo de la fecha y hora enque se creo el log para ese evento en específico? digamos que cada el evento dure de 30 a 60 segundos. algo como
                 h  m  s
log220622_113915
log220630_120012

y se puedan observar en el webpage
99
STX8180 / Re:Calibrar voltajes analógicos de entradas flotantes
« Último mensaje por Soporte junio 20, 2022, 21:06:55 pm »
Simulando el rango bajo en los canales 1 y 3 El resultado en el archivo SCV  es:
1   20/06/2022   10:33:18   1.0107   0.5518   0.874   0.5444   0.5469
como puedo obtener 0 en los otros canales que no se usan y si estos se pueden calibrar

Hola Víctor,

Te edité el título y una parte del contenido del mensaje, ya que la consulta estaba duplicada respecto a la conversión de unidades de ingeniería, que fue respondida en otro hilo de mensajes.

Para mantener cierto orden, favor de realizar consultas en diferentes hilos cuando los temas de consultas sean muy diferentes entre sí. También, puede modificar sus mensajes y editar el texto sin necesidad de duplicarlos en caso de querer corregir algo.

Volviendo a la consulta, si necesitas calibrar un valor, lo que te conviene hacer es sumar o restar un "offset" al valor medido. Esto lo podés hacer al convertir el archivo CSV desde Visual C#, ya que allí obtenés el voltaje y podés hacer la corrección hasta lograr el valor deseado.

Por otro lado, si la entrada está desconectada, sin conexión, y querés que el valor esté fijo en un valor cercano a 0V, lo que podés hacer es colocar un resistor (resistencia) de 100K a 1Mega Ohm, entre el terminal VIO y A1G, como te muestro en la siguiente figura:



El resistor "R" mostrado en la imagen superior permitirá tener un voltaje cercano a 0V cuando no haya señal conectada en VIO2. Esto debe repetirse por cada canal.

En mi opinión, a menos que sea necesario, no debería hacerte falta, ya que siempre le conectarás una señal de entrada al canal VIO para el cliente final, sería lo correcto. Si el cliente no usa una entrada, pero la quiere tener disponible, desde Visual C#, deberías darle la opción a que no imprima en el archivo CSV las mediciones de un canal determinado, evitando que vea mediciones de entradas desconectadas. De esta manera te ahorrás conexionado extra.

Saludos!
100
STX8180 / Re:Convertir voltaje a unidades de ingeniería
« Último mensaje por Soporte 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!


Páginas: 1 ... 8 9 [10]