Buenas tardes Cristian,
La forma más simple de hacer un log es mediante la función:
DiskWriteLogString(Options, PathStr[], FormatStr[], ...)Donde:- Options: Opciones para el log, usar DISK_WRITELOG_OPT_DEFAULT para opciones por defecto.
- PathStr: Ruta al archivo, por ejemplo "log.txt"
- FormatStr: Cadena con formato, por ejemplo "Hola Mundo!" o "Temperatura %f" (%f será remplazado por un valor float de la lista de argumentos variables.
- ...: Argumentos con variables separadas por coma (opcional).
Ejemplo:// Agregar mensaje de log con la temperatura del sistema.
DiskWriteLogString(DISK_WRITELOG_OPT_DEFAULT, "/log.txt", "Sistema listo, temperatura %f [C]", SysTempRead())
El código anterior creará una entrada similar a la siguiente si la temperatura es de 25.4 °C:
03/11/2022 19:45:03 Sistema listo, temperatura 25.4 [C]Para que el ejemplo funcione, se debe montar una sola vez la tarjeta Micro-SD antes de utilizarla, por ejemplo al iniciar el PLC con el siguiente código:
// Montar disco Micro-SD.
DiskMount()
Ejemplo completo:
www.slicetex.com/docs/an/an036/files/examples/DiskExample1.zip
El método anterior no define la longitud del archivo, ni su tamaño máximo, lo cual, para log extensos, puede llenar la memoria o hacer archivos gigantes. Una forma más eficiente es utilizar las funciones
DiskLog.
Primero montamos el disco como vimos antes:
DiskMount()
Luego inicializamos el canal número 1 de DiskLog (este número lo usaremos luego para loguear cada entrada) para que permita hasta 9 archivos de log, con un máximo de 100000 entradas cada uno, con un prefijo "log" de nombre y extensión "txt". El archivo se almacena en la raiz del disco "/".
DiskLogInit(1, "log", "txt", "/", 100000, 9, DISKLOG_OPT_PPPPPPPX|DISKLOG_OPT_CIRCULAR|DISKLOG_OPT_FAST_WRITE)
Los archivos resultantes serán: log1.txt, log2.txt y así hasta log9.txt. Cuando se llega a log9.txt, se vuelve a log1.txt porque está colocada la opción DISKLOG_OPT_CIRCULAR. Cada archivo tendrá un máximo de 100000 entradas.
Finalmente, para agregar una entrada de texto al log, utilizamos la función DiskLogAddString() pero especificando el canal 1 del DiskLog:
// Agregar mensaje de log con la temperatura del sistema.
DiskLogAddString(1, "Sistema listo, temperatura %f [C]", SysTempRead())
El código anterior creará una entrada similar a la siguiente si la temperatura es de 25.4 °C:
1 03/11/2022 19:45:03 Sistema listo, temperatura 25.4 [C]
2 03/11/2022 19:46:03 Sistema listo, temperatura 25.4 [C]
3 03/11/2022 19:47:03 Sistema listo, temperatura 25.4 [C]
Notar como al comienzo de cada entrada está el número de entrada.
Usar DiskLog con la opción DISKLOG_OPT_FAST_WRITE es más rápido para escribir en memoria que la función DiskWriteLogString() vista anteriormente.
Ejemplo completo:
www.slicetex.com/docs/an/an036/files/examples/DiskSamplerLog1.zip
Finalmente, contestando a tu consulta para enviar un valor float como entero por la red, sin usar desplazamientos, es sencillo. Utilizamos un entero como si tuviera un punto fijo y no flotante. Si multiplicamos por 100 antes de enviar, es como mover la coma dos posiciones hacia la derecha.
Por ejemplo:new Float: Temperatura = 25.59
new Entero
new DataBytes[4]
// Multiplicamos temperatura por 100 para preservar dos decimales y luego convertimos a entero.
Entero = FloatToInt(Temperatura * 100.0)
// Enviamos el valor "Entero" por la red, byte a byte desde el array DataByte[].
DataByte[0] = Entero & 0xFF
DataByte[1] = (Entero >> 8) & 0xFF
DataByte[2] = (Entero >> 16) & 0xFF
DataByte[3] = (Entero >> 24) & 0xFF
Al recibir en Visual Basic armamos el entero (sugerido):
Dim Entero As Integer
Dim DataByte(3) As Byte ' Array de 4 bytes
' Opción #1
Entero = (DataByte(0)) Or (DataByte(1) << 8) Or (DataByte(2) << 16) Or (DataByte(3) << 24)
' Opción #2
Entero = BitConverter.ToInt32(DataByte, 0)
Posteriormente, en Visual Basic el valor "Entero" lo convertimos a "float" y dividimos por 100 para obtener los dos decimales, es decir, movemos la coma decimal hacia la izquierda.