Variables en Step 7 (I) – Marcas y DB

Variables en Step 7 (I) – Marcas y DB

 Tipos de variables en Step 7

variables step 7 marcas DB

Las variables son áreas de memoria donde podemos almacenar información. A estas variables se le pueden asignar diferente tipos de datos.

Hay variables que ya están predefinidas como pueden ser las entradas (E/I) o las salidas (A/O) o las marcas. Pero el usuario puede definir otro tipo de variables donde almacenar otro tipo de datos, como fechas o cadenas de caracteres por ejemplo. Este tipo de variables por lo general se almacenarán y gestionarán a través de DB

Por otro lado tendremos temporizadores y contadores. Con mucha diferencia se usan más los temporizadores que los contadores como ya veremos.

Comencemos en la entrada de hoy, con las marcas y  los DB

Marcas y DBs en Step  7

Las marcas (M) son bits internos a la CPU. El tamaño del área de marcas dependerá de la CPU ya que dependiendo del modelo tiene más memoria interna o menos.

Las marcas pueden en forma de:

-Bit, por ejemplo M0.0

-Byte (8bits), por ejemplo MB0

-Word o palabra(16bits), por ejemplo MW0

- Doble palabra (32bits), por ejemplo MD0

Todos los bits de marca están en estado nulo cuando se arranca la CPU (se pasa de estado STOP a RUN). Esto es así salvo que se haya configurado la CPU para que parte de las marcas sean remanentes, esto es, que mantengan su valor aun parando el programa o incluso apagando la CPU (mientras que dure la batería de esta).

Los Bloques de Datos (DBs) pueden ser utilizados en el programa para salvar información en la CPU. Tienen una capacidad de memoria de hasta 8 KBytes ( 8192 Bytes ).Existen dos tipos de Bloques de Datos. DBs Globales , en los cuales todos los OBs, FBs y FCs pueden guardar o leer datos y DBs de Instancia, los cuales se encuentran asignados a un FB en particular.

En los DBs, se pueden almacenar diferentes tipos de datos (p.e. BOOL o WORD ) de manera aleatoria. La estructura de un DB se genera a través de la herramienta Editor KOP/ AWL//FUP.

Los tipos de datos que se pueden almacenar en un DB son muy variados pueden ir desde boolenas, bytes o Word a almacenar tiempos o fechas pasando por números reales o caracteres.

Como puedes observar la variedad de tipos de variables es mayor en un DB que el uso de las marcas. En futuras entradas veremos más en profundidad qué se pueden hacer con los DB ya que son una herramienta muy potente para el almacenamiento de datos.

En general, y bajo mi punto de vista, las marcas han de ser usadas para la parte puramente de programación, como  variables globales pero temporales y que no necesitan estar estructurados (como pueda ser una receta del proceso).

En un porcentaje muy alto, vas a usar las marcas en su estado de bit, como entero o real, y en menor medida el resto de sus usos (Word, BCD etc).

Los DB me parecen más adecuados para el almacenamiento de datos del proceso como pueden ser almacenamiento de la receta (donde habrá cadenas de caracteres) o de los estados de la máquina (temperatura, presiones etc) que luego vayan a ser mostradas en una pantalla HMI.

También será oportuno usar los DB para intercambio de información entre PLC ya que al ser en general un gran volumen de datos, es más fácil de mantener. Por otro lado seguramente vas a intercambiar datos de todo tipo (cadenas de caracteres, tiempos…) cosa que es mucho más fácil de gestionar a través de un DB.

En futuras entradas veremos los diferentes usos que se pueden dar y cómo usar cada uno de ellos.

Un saludo,

Referencias:

Comentarios (22)

jano
Estimado Siempre me ha llamado la atencion, el aprender a programar con DB globales y de instancias, sin embargo, cuando he definido un listado de datos en un DB y luego necesito modificarlo o eliminar alguno de la lista, las que estan hacia abajo se modifica la numeracion del resto de mis variables mi pregunta es ¿ Como usa este potente funcion? saludos
Iñigo Gútiez
Hola Una vez generado el DB, no puedes cambiar la estructura sin tener en cuenta esos cambios y lo que implica. Imagina que creas un DB con 1 real y un entero. Cuando tu accedes al DBW4, El PLC no sabe si es un entero o no. El solo ve 16 bits. Que sea tratado como un INT solo depende de ti. Quiero decir con ello, que tu puedes hacer tranquilamente un L DBD2 cogiendo los dos ultimos bytes del real y los dos bytes del entero, lo cual si lo tratas como un número es una auténtica aberración para ti, pero al PLC no se le cambia el color. Con ello quiero decir, que una vez creada la estructura no se puede deshacer sin implicar muchos cambios, porque cuando tu accedes al DW10, al PLC no le importa si has cambiado la estructura y has borrado variables por delante o si has añadido nuevas... simplemente es una dirección de memoria y ejecutará las instrucciones sobre el DW que tu le indiques. Es decir, y por no meter más rollo, las acciones se realizan sobre las direcciones absolutas, no sobre el nombre simbolico. Así que no puedes insertar variables nuevas o quitar intermedias sin afectar el resultado. Un saludo
Gabriel Páez
Hola los DB son muy utiles si utilizas programación por simbolos no importa que modifiques tus DB, por ejemplo yo utilizo en gran medida programación en SCL y me direcciono por medio de simbolos no de direcciones absolutas. Un gran uso que he encontrado con los DB es utilizarlos para intercambiar informacion con un HMI/ SCADA , estos manejan una forma ordenada obtener los datos y facilitan la creacion de tags desde la HMI. Como consejo cuando estes llenando un DB deja espacio entre simbolos. Por ejemplo el que en un DB quieras guardar la informacion de 4 Equipos , Escribe los simbolos del primero y deja espacios de memorias en espera entre cada unos de ellos. y que entre ellos exista la misma diferencia de espacios al momento de pasar estos simbolos a TAGS veras que es más facil pues sabes que entre cada equipo hay un salto de n Bytes y si requieres agregar mas datos para uno de ellos tienes espacio disponible entre ellos.. Yo acostumbro a estos espacios ponerles un nombre como "SPAREXX en DW" y coloco tantos como sea necesarios para que los siguientes simbolos empiezen en una direccion facil de recordar.
robert tejeda
hola gabriel como estas. me gustaria agregarte al facebook
Iñigo Gútiez
Hola Grabiel, Estoy contigo, lo mejor es dejar espacio libre en los DB para futuras ampliaciones. Un saludo
David
Hola, una pregunta, una marca configurada como remanente (ejemplo MB0), se comportaría de la misma manera que una variable de un DB?
Iñigo Gútiez
Correcto! Sí. Al apagar el PLC y al encenderlo (salvo que se quede sin batería los más antiguos), se deberían comportar igual.
Gonzalo
Hola, tengo un problema, ando trabajando con una 313C-2DP y usando FC's, lo que pasa es que las variables locales que genero, no las manipula mi programa, que debería hacer para solucionar eso?. Saludos,
Iñigo Gútiez
Hola Gonzalo, Con la información que aportas poco te puedo ayudar. En cualquier caso os pido una vez más que useis el foro para realizar consultas. Gracias y un saludo.
Edgar raul
Hola qué tal. Creo tener el mismo problema. Creo DBs para trabajar con boleanos, enteros y reales. Cuando quiero ocupar esa Db solo me deja direccionar boleanos pero no reales ni enteros. Espero su apoyo. Saludos
Iñigo Gútiez
Repasa lo que estás haciendo porque manipular booleanos, enteros o reales no tienen 'truco'. Defines la variable como entero, por ejemplo, y luego apuntas a su dirección del dw pertinente
OSCAR
Buenas, Tengo una duda respecto a la velocidad de acceso a memoria. ¿Es cierto que el acceso a las marcas es más rápido que a los DBs? Siempre he trabajado con marcas y DBs por igual, pero ahora mismo, donde trabajo actualmente no utilizan prácticamente marcas y he notado que las pantallas HMI son un poco lentas, cosa que no había visto hasta ahora. También es cierto que he pasado de trabajar con la gama 300 a la 1200. Un saludo y gracias.
Iñigo Gútiez
Siempre he tenido entendido que efectivamente el acceso a los Db es algo más lento que las marcas. Pero no para que se note en un Scada. Yo más lo achacaría a que es un 1200 y no un 300. Un saludo
robert tejeda
buenos días , cordial saludo. aun me cuesta entender cuándo y porqué debo usar un OB,FC,FB,DB. yo normalmente antes de conocer sobre programación estructurada, hacia todo el programa en cascada . aca en tia portal uso el OB 1 y hay hago toda la programación ejemplo el arranque de 5 motores . pero realmente no se cuando debo usar un FC,FB,DB y porque debo de usarlos .. en un video que vi , analice que para usar temporizadores debo usar un DB . entonces pregunto solo los temporizadores o contadores o otras funciones se pueden usar en el DB ? te agradezco una ayuda para poder entender este tema que me enreda un poco.
Miguel Muñoz O.
Robert, hola un saludo. Mira en SIEMENS lo que llaman OB otros lo llaman "PROGRAMA" (PG), FC "FUNCIÓN" y FB "BLOQUE DE FUNCIONES". Te recomiendo que estudies sobre Recursos, Task, Programas, Bloque de Funciones y Funciones. En el orden que te lo dije, por decirlo así, es un orden jerárquico de ejecución. (quizá te lo termino explicando todo). Mira el Recurso hace referencia al procesador físico de un PLC... dentro de los recursos se administran "núcleos" por así decirlo que pueden ser seccionados para ejecutar códigos, a estas secciones se les llama TASK y pueden tener prioridades (según el compilador y modelo de PLC puede variar), pero va de 0 (mayor prioridad) a 30 (menor prioridad), ahora existen diferentes tipos de TAKS (Default, Cíclico, Evento y no recuerdo el otro) pero simplemente, es "cuando y cómo" se ejecutará el TASK! AHORA! Dentro de los TASK se asocian los programas, y a esto se le llama INSTANCIACIÓN, es decir, que cuando un objeto (POU) es INSTANCIADO significa que efectivamente parte del procesador físico computará dicha información (ya que pueden existir POU's declarados, pero que nunca son ejecutadas). Respecto a las prioridades de las Taks, por ejemplo si son cíclicas tu les defines la prioridad y el "SCAN", lo cual viene siendo el "interval" (en otro modelos) y significa cada cuanto tiempo tu le dices a la TASK que se ejecute, por ejemplo. Task 1. Interval 10ms, WhatchDog 100ms (prioridad 0 - máxima-). Significa que cada 10ms tu Task será ejecutada (y con ella los POUS que estén instanciados dentro de ella). Y que si la Task por alguna razón se tarda más de 100ms en ejecutar el código el PLC debería pasar a STOP y arrojarte un error... Ahora es muy importante que el INTERVAL sea mayor que la duración de la EJECUCIÓN de tu código, ya que son cosas distintas. Me explico, imagina que yo te llamo a tí cada 30 minutos para una tarea que a tí te toma 10 minutos ejecutar, entonces no hay problema, sin embargo, si yo te comienzo a llamar cada 29 minutos, seguramente te cansarás más, porque la tarea que yo te estoy pidiendo no es lo ÚNICO que tu tienes que ejecutar en el día, analogandolo al PLC, esas tareas extras pueden ser web servers, bases de datos o la ejecución de otros TAKS y que si le vas dejando "poco tiempo" al PLC para hacer sus "cosas" la exigencia de la CPU también irá subiendo, si esta sobrepasa o se acerca mucho al 100% también se pondrá en STOP y arrojará un error... ya que como dije, dentro de un recursos, por lo general, puedes tener varias TASK (en función de las capacidades del PLC). Entonces si tienes dos Task, Task 1 y Task2 y ambas son cíclicas y debes velar que su prioridad sea distinta y que exista un espacio de tiempo donde la Task de menos prioridad pueda ser ejecutada. (Si buscas en google "TASK PLC" o algo similar, en imágenes, podrás encontrar un gráfico donde se vé la ejecución según Interval y Prioridad). AHORA ! El programa (PG) es el que se instancia finalmente... Pero dentro del programa se incluyen los FB's como los FC's. En resumen, los FC's funciones... tienen multiples entradas y sólo una salida, mientras que los FB's Bloques de funciones tienen multiples entradas e igual múltiples salidas, Las funciones no necesitan ser declaras, son efímeras en la ejecución del programa, mientras que los FB's necesitan ser declarados dentro del POU en el que son utilizados. Puedes leer mucho más y cómo administrar mejor googleando los conceptos que te he dicho. Y deberías entender además sobre el uso de variables tales como: Var_input, Var_output, Variable Global. Espero te sea de ayuda. Saludos.
Nicolas Antonelli
Buenas tardes, quisiera saber si la única diferencia entre tener una marca como variables o en un bloque de datos es el tema de optimización de memoria y facilidad a la hora de enviar de información o hay algún otra diferencia, muchas gracias.
Iñigo Gútiez
Las diferencias fundamentales es que las marcas ya existen, y no ocupan memoria de trabajo, mientras que los DB sí. Además, debido al tipo de memoria que es, es más rápido para la CPU trabajar con las marcas que con los DB, si bien eso hoy en día no es un inconveniente. Por otro lado, con los DB puedes declarar muchos más tipos de datos (existentes de fábrica o no) que con las marcas no puedes.
Paulo Ponce de León
Hola, acá hubo algún texto? Y de ser así en dónde podría encontrarlo? Tienes muy buen contenido, espero pronto terminar de empaparme con lo básico y probar alguno de sus cursos.
Elena Nani Torrosa
buenas , no se que canal utilizar para mis etapas con el step7. Me podrias decir que variable se utiliza ?
Iñigo Gútiez
Lo siento, pero no he entendido la pregunta.
Juanfrancisco
Muy buenas Iñigo Estoy intentando declarar una variable en un db de datos, le doy de nombre por ejemplo Real1, tipo REAL y cuando le doy a intro, no me coge por defecto ningún valor inicial, creándome un error, cambiando a rojo el nombre y el tipo de struct, que puedo estar haciendo mal? ya que esto también me pasa cuando declaro un BYTE, no me coge ningún valor inicial por defecto. con los demás tipos no tengo ese problema. Un saludo
Iñigo Gútiez
Ponle tu un valor por defecto que sea acorde al tipo de variable.