Cómo almacenar el MAC de tu PLC Arduino en el EEPROM (memoria no volátil)
Almacenamiento de datos en el EEPROM (memoria no volátil) de tu PLC Arduino
29 octubre, 2019 por
Cómo almacenar el MAC de tu PLC Arduino en el EEPROM (memoria no volátil)
Boot & Work Corp. S.L., Support Team


      Introducción

      Todos los controladores lógicos programables industriales basados en Arduino tienen 3 tipos diferentes de memorias:

      • Flash: no volátil, donde grabamos el sketch (incluyendo el gestor de arranque).

      • SRAM (Memoria estática de acceso aleatorio): volátil, donde las variables se almacenan durante su funcionamiento. 

      • EEPROM: no volátil, que podemos usar para guardar información entre reinicios. 

      Si almacenamos valores en la memoria flash o SRAM, estos se perderan una vez que el  controlador industrial PLC se reinicie, aunque a veces queramos que se mantengan determinados valores entre reinicios. Por ejemplo, identificadores únicos, valores de calibración, medidas y fechas o tiempos para hacer dataloggers (registrador de datos), guardar un contador, o saber cuál era el estado del procesador cuando se quedo sin energía, entre muchos otros. 

      En esta ocasión, guardaremos la dirección MAC en nuestro EEPROM, pero el proceso para guardar cualquier otro tipo de datos en el EEPROM es el mismo.

      Memoria EEPROM
                          Requisitos

                          Requisitos

                          Requisitos de Hardware:  

                          Todos nuestros PLCs Arduino tienen un EEPROM interno, puedes consultar toda la gama de nuestros controladores indsutriales para automatización que te permiten almacenar datos en el the EEPROM:

                          Requisitos de Software: 


                          Características de las memorias en un PLC Arduino

                          • Memoria Flash (espacio de programa) es donde se almacena el sketch de Arduino.

                          • SRAM (Memoria estática de acceso aleatorio) es donde el sketch crea y manipula variable cuando se está ejecutando.

                          • EEPROM es un espacio de memoria que los programadores pueden utilizar para almacenar información a largo plazo.


                          Flash memory and EEPROM memory are non-volatile (the information persists after the power is turned off). SRAM memory is volatile and will be lost when the power is cycled.

                          Los tamaños de las memorias son diferentes según el modelo de PLC Arduino que se tenga

                          Para los modelos de la familia Ardbox: 

                           Flash 32k bytes (de los cuales 4k se usan para el gestor de arranque)
                           SRAM 2,5k bytes
                           EEPROM 1k byte

                          Para los modelos de la familia M-Duino:

                           Flash 256k bytes (de los cuales 8k se usan para el gestor de arranque)
                           SRAM 8k bytes
                           EEPROM 4k bytes

                          Características de las memorias en un PLC Arduino
                          Características principales de la memoria EEPROM

                          Principales características de la memoria EEPROM

                          La memoria EEPROM tiene sus propias características y peculiaridades que lo diferencian de las otras memorias. Principalmente, tal y como hemos visto antes, no es volátil, por lo tanto mantiene los valores almacenados cuando la energía se termina.

                          Una desventaja de la memoria EEPROM es que es mucho más lenta que la memoria SRAM. El proceso de escribir una celda (byte) cuesta alrededor de 3.3 ms. El proceso de lectura es mucho más rápido (aunque sigue siendo más lento que la SRAM), leer 1024 bytes cuesta alrededor de 0.3ms, es decir, 10,000 veces más rápido que escribir.

                          Another peculiarity of EEPROM memory is that it has a limited life, which is reduced with each write operation. There are no limits for reading operations. 

                          Las especificaciones garantizan que cada celda tenga una vida útil de al menos 100,000. Aunque en la práctica puede ser mucho más alta, incluso hasta un millón de operaciones, alrededor de  100,000 de ellas no están garantizadas. 

                          Cabe mencionar que la memoria EEPROM ha sido diseñada para escribir con tiempos prolongados entre cada operación, no para hacer un uso constante de ello


                          Software

                          El Arduino estándar IDE incorpora una biblioteca  EEPROM.h que contiene las funciones necesarias para manipular la memoria no volátil del Arduino.

                          Las funciones más senzillas son la función Leer y la función Escribir que, respectivamente, leer y escribir un byte en una dirección de memoria. La dirección de memoria puede tener valores de 0 a N-1, donde N es el número de bytes disponibles (de 0 a 1023 en los modelos de la familia Ardbox y de 0 a 4095 en los modelos de la familia M-Duino).

                          Software

                          Las siguientes funciones registran un solo byte al EEPROM

                          //Reads a unique byte from address "addr"
                          EEPROM.Read(addr);
                          //Writes a unique byte from address "addr"
                          EEPROM.Write(addr);

                          A menudo, necesitaremos guardar variables que sean más grandes que un byte. Para esto tenemos las funciones Put, Get y Update, que son las que utilizaremos con más frecuencia.

                          // Functions for complete variables (takes into account the size of the variable)
                          EEPROM.Put(address, variable)

                          // Read a variable in the address addr
                          EEPROM.Get(address, variable) 

                          //Update the value of a variable, that is, read it first, and only save it if its value is different from the one we are going to save. This favors reducing the number of writes, and extending the useful life of the memory.
                          EEPROM.Update(addr,variable)

                          Ejemplo de Sketch

                          La dirección MAC aleatoria se genera en el primer arranque. En cada arranque subsiguiente, es decir, después del primero, se volverá a leer desde EEPROM para asegurar de que se mantiene igual.

                          #include <SPI.h>
                          #include <Ethernet.h>
                          #include <EEPROM.h>
                          
                          byte mac[6] = { 0xBA, 0xBE, 0x00, 0x00, 0x00, 0x00 };
                          char macstr[18];
                          
                          void setup() {
                            Serial.begin(9600);
                            // Random MAC address stored in EEPROM
                            if (EEPROM.read(1) == '#') {
                              for (int i = 2; i < 6; i++) {
                                mac[i] = EEPROM.read(i);
                              }
                            } else {
                              randomSeed(analogRead(0));
                              for (int i = 2; i < 6; i++) {
                                mac[i] = random(0, 255);
                                EEPROM.write(i, mac[i]);
                              }
                              EEPROM.write(1, '#');
                            }
                            snprintf(macstr, 18, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
                          
                            // Start up networking
                            Serial.print("DHCP (");
                            Serial.print(macstr);
                            Serial.print(")...");
                            Ethernet.begin(mac);
                            Serial.print("success: ");
                            Serial.println(Ethernet.localIP());
                          }
                          
                          void loop() {
                          
                          }
                          Cómo almacenar el MAC de tu PLC Arduino en el EEPROM (memoria no volátil)
                          Boot & Work Corp. S.L., Support Team
                          29 octubre, 2019
                          Compartir
                          Archivar

                          ¿En busca de tu PLC ideal?

                          Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

                          Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


                          Comparativa PLC industrial >>

                          ¿Quieres más información?

                          ¡Rellena el formulario!

                          ¡Cuéntame más!