En la útlima actualización de
StxLadder y
firmware, se puede acceder a la memoria como un archivo a través del servidor web del PLC.
El ejemplo para el PLC en lenguaje Pawn se puede descargar desde el siguiente enlace:
www.slicetex.com/docs/an/an030/files/EepromWeb1.zipLeer archivo
info.txt incluido en el proyecto para más información.
LEER MEMORIA EEPROM DESDE PÁGINA WEBEste proyecto ejemplifica como leer o recuperar datos de memoria EEPROM utilizando el servidor web integrado al PLC, para luego poder acceder desde un navegador.
En el navegador podrá descargar la memoria EEPROM como un archivo, en su totalidad o parcialmente de acuerdo al bloque de datos seleccionado.
Está nueva característica le permitirá descargar datos de un Data-Log de forma simple para posterior procesamiento, o también utilizar la memoria para mostrar información de texto.

Para leer la memoria EEPROM, debe utilizarse en una página dinámica (extensiones actuales: .BIN, .SHTML y .JSON) el COMANDO CGI:
$! EepromRead Address Quantity $DONDE:
- Address: Dirección inicial a leer en memoria EEPROM.
- Quantity: Cantidad de bytes a leer desde la dirección inicial.
Ejemplo 1) Leer 600 bytes de memoria a partir de dirección 0
$! EepromRead 0 600 $
Ejemplo 2) Leer toda la memoria EEPROM (su poniendo que capacidad sea 32*1024=32768 bytes)
$! EepromRead 0 32768 $
Ejemplo 3) Pedir dos bloques de datos de memoria diferentes
$! EepromRead 0 600 $$! EepromRead 1000 400 $
En este caso se piden 600 bytes desde dirección 0, y a continuación se piden otros 400 bytes a partir de dirección 1000, contabilizando 1000 bytes en total.
Note como ambos comandos se pegan a continuación uno del otro, sin espacios, esto es necesario para no inyectar en el flujo de datos caracteres extras. Lo mismo que al final del comando, evite colocar una nueva línea, presionando "ENTER". Esto no implica error, simplemente que si lo hace, también recibirá dichos caracteres, y puede ser indeseado (o no, dependiendo del objetivo).
TIPOS DE ARCHIVOSEL navegador web (Chrome, Firefox, Edge, Opera, etc...) procesan las páginas web de forma diferente de acuerdo al tipo de datos o formato de las mismas. Esto se conoce como Media Type o tipos MIME, y es enviado desde el Servidor Web, al navegador.
Por ejemplo, cuando el navegador accede a un archivo .HTML o .SHTML, el servidor del PLC le dice al navegador que el archivo que está abriendo tiene formato web, por lo tanto el navegador imprime en pantalla texto e imágenes de la página.
Si el navegador accede a un archivo .BIN, el servidor del PLC le dice al navegador que el tipo de archivo es binario. En este caso, el navegador por defecto intenta descargarlo o abrirlo con la aplicación predeterminada por el usuario en su computadora. Pero no intenta imprimir en pantalla texto como si fuera una página web ni genera perdida de bytes al procesarlo.
Muchas veces, por seguridad, los navegadores tratan con cuidado estos archivos, para evitar que se descarguen virus, pero eso depende de cada configuración y pueden advertir al usuario.
Entonces, si su idea es descargar el contenido binario de la memoria EEPROM para posterior análisis en un software particular, lo ideal es utilizar la extensión .BIN para los archivos y colocar el comando CGI adentro de dicho archivo. Ver en este ejemplo, archivos "
eeprom.bin", "
eeprom_block.bin" y "
eeprom_blocks.bin".
Por otro lado, si en memoria EEPROM guarda cadenas con texto (caracteres), puede ser útil leerlas con el navegador directamente, para ello debe usar el comando CGI en un archivo con extensión SHTML.
De esta manera, el servidor web inyecta en el flujo de datos del archivo SHTML los bytes almacenados en memoria EEPROM, y como son caracteres, el navegador los imprime normalmente en pantalla.
Ver ejemplo en archivo "
eeprom_html.shtml". Donde se leen 250 bytes a partir de dirección 300 de la memoria EEPROM, que según el ejemplo, en
PlcMain.p, se guardan cadenas de texto.
Notar que si la memoria contiene valores aleatorios diferentes a cero o basura, en el navegador web se imprimirá basura también.
Otro caso especial es los archivos con extensión .JSON, generalmente, estos archivos son tratados como texto por los navegadores web y se imprimen en pantalla sin ser procesados como HTML. Puede probar también utilizar el comando CGI para memoria EEPROM en dicho archivos.
CÓDIGO PAWN DEL EJEMPLOEste proyecto habilita el servidor web para ser utilizado en el PLC, se crean unas cuantas páginas de prueba y algunas rutinas de incialización, esto se explica correctamente en la nota de aplicación AN030, que puede descargar desde nuestra pagina Web.
Partiendo del ejemplo explicado en nota
AN030, se han agregado los siguientes archivos al servidor web:
- eeprom.bin: Descarga el contenido binario de toda la memoria EEPROM.
- eeprom_block.bin: Descarga el contenido binario de los primeros 600 bytes.
- eeprom_html.shtml: Inyecta 250 bytes de memoria a partir de dirección 300 en el flujo de la página HTML.
- eeprom_blocks.bin: Descarga el contenido binario de dos bloques de datos por separado, direcciones 0 a 599, y 1000 a 1399.
Puede acceder a los mismos desde la página principal del servidor, y/o ver su contenido desde el "Explorador de proyecto". El contenido fue explicado en las secciones anteriores.
El código que altera la memoria EEPROM para este ejemplo se encuentra en el archivo "
PlcMain.p", y es muy simple y directo. Básicamente incializa la memoria EEPROM escribiendo valores para luego poder verlos o descargarlos desde el servidor web, código es el siguiente:
// Limpiar memoria.
// Escribir 'EepromSize()' bytes de memoria con valor '0' a partir de dirección '0'.
EepromMemSet(0, 0, EepromSize())
// Escribir una cadena de texto a partir de dirección 0 (inicio de la memoria).
EepromWriteString(0, "Hola Mundo!!!")
// Escribir otra cadena con formato HTML a partir de dirección 300.
// Nota: Esto nos permitirá leer la cadena fácilmente en un navegador.
EepromWriteString(300, "<p>Hola soy un texto!<br><strong>Con formato web</strong>!</p>")
// Escribir un valor de 32-bits en dirección 1000, luego leerlo.
EepromWriteCell(1000, 7849365)
EepromReadCell(1000, Value)
// Escribir un valor float en dirección 1004.
EepromWriteFloat(1004, 75.43)
// Leer valor float almacenado en dirección 1004.
// Nota: A diferencia de el resto de las funciones para EEPROM, el retorno de esta función
// es el valor leído.
FloatValue = EepromReadFloat(1004)
// Escribir un byte con el valor 66 en la última dirección de la mamoria EEPROM.
EepromWriteByte(EepromSize()-1, 66)
// Leer byte en la última dirección de la mamoria EEPROM.
EepromReadByte(EepromSize()-1, ByteValue)
// Escribir cadenas con formato HTML en EEPROM y con valores de variables.
EepromWriteString(400, "<p>Address 1000 = %d</p>", Value)
EepromWriteString(450, "<p>Address 1004 = %f</p>", FloatValue)
EepromWriteString(500, "<p>Address %d = %d</p>", EepromSize()-1, ByteValue)
Notar como se utiliza la función EepromMemSet() para incializar todo el contenido de la memora a 0, esto puede ser útil para partir con una memoria "limpia" sin datos previos guardados. Pero dicha operación puede tardar varios segundos, dependiendo del tamaño de la memoria (para 32KB, unos 3-4 segundos).
Puede utilizar
EepromMemSet() para limpiar o incializar solamente una porción de memoria y agilizar velocidad.
Luego "
EepromWriteString(0, "Hola Mundo!!!")" escribe el texto "Hola Mundo!!!" a partir de la dirección 0 de la memoria.
Esto puede leerse normalmente desde una página web como texto, o incluirlo en una sección HTML con formato particular.
Si necesitamos que el texto tenga formato propio, podemos hacer:
EepromWriteString(300, "<p>Hola soy un texto!<br><strong>Con formato web</strong>!</p>")
Se agregaron "TAGS" HTML de formato, como <p> y <strong>, esto tiene la desventaja de consumir bytes extras y entorpecer la lectura de código, pero puede ser útil.
En la pagina "eeprom_html.shtml" se inyectan los bytes de memoria EEPROM a partir de dirección 300, lo que resulta que el navegador imprima la cadena anteriormente mencionada.

También se escriben variables/constantes enteras, bytes y floats:
EepromWriteCell(1000, 7849365)
EepromWriteFloat(1004, 75.43)
EepromWriteByte(EepromSize()-1, 66)
Debe notar, que estos números no están en formato texto, simplemente códificados en binario, por lo tanto, si descarga el archivo binario, deberá decodificarlos correctamente, para obtener su valor original.
Ejemplo, como un entero (cell) o float tiene 4 bytes, luego deberá leer en el archivo descargado:
Bytes 1000 a 1003 para obtener el entero 7849365.
Bytes 1004 a 1007 para obtener el float 75.43.
Recuerde hacer la conversión correcta o cast en su lenguaje favorito. El bytes menos significativo, se encuentra en la posición más baja de memoria (orden de byte little-endian).
Ejemplo, para obtener el entero 7849365 en nuestra computadora, luego de descargar el archivo ".BIN" y leerlo como un binario desde el lenguaje de programación (por ejemplo C o C#), haríamos:
int Word;
Word = Byte[1000];
Word |= ((int) Byte[1001]) << 8;
Word |= ((int) Byte[1002]) << 16;
Word |= ((int) Byte[1003]) << 24;
Notar que declaramos a Word, como un entero con signo, ya que Pawn por defecto utiliza enteros con signo.
Además esto nos permite guardar números negativos.
El array "Byte[]" es un array con todos los datos binarios del archivo "
eeprom.bin" que previamente se cargo en el el programa.
Puede entender como los datos se codifican en memoria, descargando el archivo "
eeprom.bin" y leyéndolo con un editor hexadecimal (por ejemplo
HxD, link
https://mh-nexus.de/en/hxd).
ERRORESSi la memoria EEPROM está ocupada justo al momento de ser accedida por página web y se excede el tiempo de espera, el servidor devuelve "
EEPROM Error: I2C Busy", si hay otro error diferente devuelve "
EEPROM Error: X", donde X es un número con el código de error.
MAS INFORMACIÓNPara documentación y ejemplos de uso del servidor web, descargue la nota de aplicación
AN030 desde nuestra pagina Web.
Saludos!