Variables Permanentes

  • 11 Respuestas
  • 5575 Vistas

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Variables Permanentes
« : febrero 05, 2014, 22:06:16 pm »
Cómo hago para que el valor de una variable no se borre al desconectar el plc? Gracias
« Última Modificación: febrero 07, 2014, 11:11:02 am por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2230
  • Soporte Técnico
Re: Variables Permanentes
« Respuesta #1 : febrero 06, 2014, 06:53:41 am »
Buen dia Jose, eso podes realizarlo utilizando las funciones para almacenar datos de variables en la memoria EEPROM (no volatil)
y luego recuperandolos en variables nuevamente cuando lo necesites.

No estoy en mi oficina, pero en el transcurso del dia te paso un ejemplo.

Que estas utilizando, lenguaje Ladder o lenguaje Pawn ?.
« Última Modificación: febrero 07, 2014, 11:11:16 am por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re: Variables Permanentes
« Respuesta #2 : febrero 06, 2014, 07:32:13 am »
Buen día Boris, estoy utilizando el Ladder. Gracias
« Última Modificación: febrero 07, 2014, 11:11:46 am por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2230
  • Soporte Técnico
Re: Variables Permanentes
« Respuesta #3 : febrero 07, 2014, 11:01:08 am »
Buen dia Jose,

Fíjate en el siguiente link, subimos un ejemplo en Ladder para utilizar la EEPROM:

http://slicetex.com/ladder/examples/files/EepromBasic.zip

Cuando abras el proyecto en StxLadder, mira los comentarios para comprender como funciona.
También lee el archivo info.txt que se incluye dentro del ejemplo.

Podes cargar el ejemplo al PLC y probarlo.

Básicamente guarda un array de 4 elementos en la memoria EEPROM cuando DIN2=1 y
luego con DIN3=1 podes recuperar los valores de la EEPROM y mostrarlos en el display.

Dichos valores permanecen si desconectas la energía del PLC.

Con DIN1=1, podes incrementar los valores del array para probar almacenar diferentes valores.

Cualquier duda, avísame.
« Última Modificación: febrero 07, 2014, 15:35:22 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re: Variables Permanentes
« Respuesta #4 : febrero 09, 2014, 19:55:59 pm »
Anduvo fenómeno. Muchas gracias

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re: Variables Permanentes
« Respuesta #5 : febrero 10, 2014, 20:17:40 pm »
Seguí el ejemplo adaptándolo a mi proyecto y anduvo fenómeno. Sin embargo como las variables que tengo que preservar son unas cuantas (logré reducirlas a 18) me ocupan mucho espacio. Intenté manejarlo con código Pawn y mientras cargo la variable array con números anda bien, pero no logro cargarla con variables. Por ej. con tres variables int32 gato, perro y rata y una variable int32_Array de 3 elementos llamada PRUEBAW, hago gai_PRUEBAW = {2,30,21} y anda bien pero si pongo gai_PRUEBAW = {gi_gato, gi_perro, gi_rata}, ahí ya no funciona.
¿Qué se puede hacer? Muchas gracias

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2230
  • Soporte Técnico
Re: Variables Permanentes
« Respuesta #6 : febrero 10, 2014, 20:38:35 pm »
La forma correcta de cargar variables en un array seria:

Suponiendo que gai_PRUEBAW fue creado en Ladder:

// Asignar a cada elemento el valor de una variable.
// Notar que el primer elemento se indexa desde 0.

gai_PRUEBAW[0] = gi_gato
gai_PRUEBAW[1] = gi_perro
gai_PRUEBAW[2] = gi_rata


El error que tenias es que intentas inicializar un array, utilizando una sintaxis incorrecta.

Cuando utilizas gai_PRUEBAW[3] = {2, 30, 21} estas creandolo en memoria.

Para asignar a un array ya creado en memoria, debes hacer igual que en el caso anterior

gai_PRUEBAW[0] = 2
gai_PRUEBAW[1] = 30
gai_PRUEBAW[2] = 21


Cualquier duda, avisanos.
« Última Modificación: febrero 10, 2014, 20:44:42 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re: Variables Permanentes
« Respuesta #7 : febrero 11, 2014, 18:52:43 pm »
Andan muy bien. Muchas gracias

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re: Variables Permanentes
« Respuesta #8 : febrero 11, 2014, 23:46:52 pm »
Ejemplo de variables remanentes aplicando el modo arriba indicado por ustedes. Funciona fenómeno. Gracias.

PRUEBAW y PRUEBAR son variables Int32_Array las demás son Int32. Unas y otras variables Ladder.

Escritura en EEPROM:

if(CurrentFlow)
{
  gai_PRUEBAW[0]= gi_CEM1
  gai_PRUEBAW[1]= gi_CEM2
  gai_PRUEBAW[2]= gi_CEM3
  gai_PRUEBAW[3]= gi_AGUA1
  gai_PRUEBAW[4]= gi_AGUA2
  gai_PRUEBAW[5]= gi_AGUA3
  gai_PRUEBAW[6]= gi_AR1R1
  gai_PRUEBAW[7]= gi_AR2R1
  gai_PRUEBAW[8]= gi_AR3R1
  gai_PRUEBAW[9]= gi_AR4R1
  gai_PRUEBAW[10]= gi_AR1R2
  gai_PRUEBAW[11]= gi_AR2R2
  gai_PRUEBAW[12]= gi_AR3R2
  gai_PRUEBAW[13]= gi_AR4R2
  gai_PRUEBAW[14]= gi_AR1R3
  gai_PRUEBAW[15]= gi_AR2R3
  gai_PRUEBAW[16]= gi_AR3R3
  gai_PRUEBAW[17]= gi_AR4R3
  EepromWrite(0, 18, gai_PRUEBAW)
}

Lectura de EEPROM:

if(CurrentFlow)
{
  EepromRead(0, 18, gai_PRUEBAR)
  gi_CEM1 = gai_PRUEBAR[0]
  gi_CEM2 = gai_PRUEBAR[1]
  gi_CEM3 = gai_PRUEBAR[2]
  gi_AGUA1 = gai_PRUEBAR[3]
  gi_AGUA2 = gai_PRUEBAR[4]
  gi_AGUA3 = gai_PRUEBAR[5]
  gi_AR1R1 = gai_PRUEBAR[6]
  gi_AR2R1 = gai_PRUEBAR[7]
  gi_AR3R1 = gai_PRUEBAR[8]
  gi_AR4R1 = gai_PRUEBAR[9]
  gi_AR1R2 = gai_PRUEBAR[10]
  gi_AR2R2 = gai_PRUEBAR[11]
  gi_AR3R2 = gai_PRUEBAR[12]
  gi_AR4R2 = gai_PRUEBAR[13]
  gi_AR1R3 = gai_PRUEBAR[14]
  gi_AR2R3 = gai_PRUEBAR[15]
  gi_AR3R3 = gai_PRUEBAR[16]
  gi_AR4R3 = gai_PRUEBAR[17]
}

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2230
  • Soporte Técnico
Re: Variables Permanentes
« Respuesta #9 : febrero 12, 2014, 16:14:01 pm »
Muy bien Jose.

Un solo comentario, tene en cuenta que la memoria EEPROM tiene un limite de escritura,
solo puede escribirse 1.000.000 de veces, por lo tanto, asegurate que
escribas en la misma solo cuando tu programa lo necesite.

Para ello, podes utilizar un Bool que bajo cierta condicion ejecute el codigo de escritura, y luego
cuando termine, resetea el flag para que luego no se ejecute mas ese fragmento de codigo.

De lo contrario, cada vez que se ejecute el diagrama en el PLC escribirias sobre la EEPROM inecesariamente,
acortando su vida util.

A lo mejor ya lo estas haciendo, pero solo por si no lo tenias en cuenta.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re: Variables Permanentes
« Respuesta #10 : febrero 12, 2014, 19:25:31 pm »
Muy oprtuno el consejo sobre la vida de la EEPROM. En el programa que estoy haciendo la escritura en la memoria se efectúa sólo si lo admite un N/A de una variable booleana Set/Reset de programación de las recetas (PROGR en este caso), sin embargo sería bueno cargar la receta en memoria sólo cuando esté completa y no como ahora que se carga con cada item. Si hago este cambio y reseteo a PROGR luego de cargar la memoria, alcanzaría? La lectura sólo se efectúa en el arranque del programa porque está en el diagrama de Inicio. Gracias

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2230
  • Soporte Técnico
Re: Variables Permanentes
« Respuesta #11 : febrero 12, 2014, 19:53:38 pm »
Claro, si usas el flag PROG=1 para habilitar el codigo de escritura en EEPROM, luego de escribir los datos
debes resetear el flag a PROG=0. De esta forma, cuando compruebes el flag y sea 0, no se ejecutaria
la escritura de la EEPROM.

Cargar en EEPROM cuando tengas todo completo puede ser mas eficiente, pero solo influye si neceitas
realizar muchos cambios en los items durante la operacion del PLC. Si el operario lo cambia seguido,
entonces conviene.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com