Vamos a repasar una serie de conceptos generales de programación aplicados en un entorno de Simatic S7.
Lamento que la primera lección sea una pequeña chapa teórica y que no vayas a ver ni una línea de código, pero por muchas vueltas que le he dado, es que es necesario unos mínimos.
Pero míralo de una forma positiva, así ya lo damos por zanjado y pronto comenzaremos a escribir líneas y líneas de código (el que no se conforma es porque no quiere).
Los elementos de un autómata como bien sabes son dos: el hardware (el aparato en sí con sus tarjetas, cableado etc) y el software (los programas). Dentro de los programas tendremos dos partes a su vez:
- El SO del autómata
- El programa de usuario que tú vas a desarrollar y que desempeñará las funciones para las cuales se ha ideado.
El SO del autómata será el que se encargue por un lado de interpretar y ejecutar el programa que has diseñado además de otras funcionalidades como pueden ser el diagnóstico de alarmas y errores, administrar la memoria, comunicación con otros elementos, exploración de las entradas y la transmisión de órdenes a las salidas entre otras muchas que sabemos que hace, pero poco nos importa ahora el saber cómo.
Programacion en Step 7
El programa de usuario es sobre lo que versa este curso.
En este programa vas a poder determinar las condiciones con las que arrancará el autómata, tratará datos y señales del proceso para finalmente dar unas órdenes de actuación sobre los diferentes actuadores y elementos de la instalación.
Estructura de la memoria.
A grandes rasgos la memoria del autómata va a ser dividida en las siguientes partes:
- Imagen de las E/S.
- E/S de la periferia
- Marcas
- Valor y estado de temporizadores y contadores
- Módulos de datos (DB)
- Datos temporales que se pierden al final de cada ciclo.
Imagen de E/S
Las imagenes de las entradas y las salidas no son mas que las señales E o A que se usan en el programa.
Son eso, imágenes, ya que no leemos el valor instantáneo de la entrada o forzamos instantáneamente la salida, sino que leemos en el caso de las entradas el valor de la entrada física cuando se refrescó la imagen de las entradas antes de comenzar el nuevo ciclo del OB1 (programa principal).
Igualmente en el caso de las salidas, cuando el programa pone a uno o a cero una salida no lo está haciendo inmediatamente, sino que está dando valor a la imagen de la salida, y esta imagen de la salida será volcada a las salidas reales antes de comenzar un nuevo ciclo del OB1.
E/S de la periferia.
A diferencia del caso anterior, se puede leer directamente el valor actual de cualquier sensor.
Para ello debemos leerlos en bytes (PEB), word (PEW) o doble word (PED) ya que el acceso no puede ser directo a un bit en concreto (a diferencia de las imagenes de E/S).
Igualmente pasa con las salidas, que podemos forzar el estado de las salidas de forma inmediata accediendo a las salidas de periferia (PAB,PAW,PAD)
Marcas
Las marcas son variables indexadas y globales, por tanto no hay que declararlas, pero si es conveniente darles un nombre y tipo (entero, doble,real..).
Se les puede dar valor dentro de cualquier parte del programa. Dependiendo de la CPU este área es mayor o menor. Los valores pueden ser remanentes tras el apagado del PLC o volátiles (se pierden tras apagar el PLC). Su acceso puede ser desde bit hasta un áncho indeterminado si se usan punteros de área.
Temporizadores y contadores.
La programacion en Step7 tiene la peculiaridad de tener temporizadores de dos tipos: por software (IEC) y temporizadores S7 (o llamados también de S5 ya que existían ya en la versión anterior).
Estos últimos son temporizadores hardware y son limitados dependiendo de la CPU (por ser hardware), no así los IEC que por ser creados por software, la limitación es la propia memoria disponible, pero no hay un número determinado de ellos. Los contadores pues son eso, elementos usados para contar o decontar cantidades.
Módulos de datos (DB).
Son áreas de memoria que a diferencia de las marcas, está definidas por el usuario. Pueden ser de longitudes dispares y con contenidos de todo tipo.
Las variables contenidas en los DB son remanentes por defecto al apagado del PLC.
Variables temporales.
Son variables que se declaran dentro de los módulos que sirven para realizar cálculos intermedios y locales que no necesitan ser usados más allá del módulo en cuestión y en el ciclo en el que son llamadas o tratadas.
Te dejo con el primer vídeo del curso...
Actualización (23/09/13): Como bien han apuntado en los comentarios, las variables temporales no se re-inicializan como yo he comentado en el vídeo. El valor inicial de la variable temporal es el valor último que tomo esa variable, lo cual no deja de ser tremendamente peligroso ya que si no le das valor antes de leerla el contenido de dicha variable es indeterminado, especialmente si la función es llamada varias veces a lo largo del programa y la variable va tomando valores dispares.
Módulos
Para acceder y tratar los datos almacenados en las áreas de memoria, existen diferentes tipos de módulos cuyas caracteristicas serán diferentes para cada requerimiento que sea necesario:
- Módulos de organización (OB)
- Funciones (FC).
- Bloques de función (FB).
- Bloques de memoria (DB)
- Módulos de sistema (SFC,SFB,SDB)
Módulos de organización
Lo primero que has de saber de estos módulos es su especifidad, sólo sirven para lo que han sido diseñados y no se llamarán desde otros bloques sino que será el propio autómata quien gestiona las llamadas a estos módulos en función de sus características.
Hay varios tipos de módulos de organización:
- OB de arranque (OB100-102): Son bloques con los que se arranca el PLC en función del tipo de arranque y depende del tipo de CPU para que tenga todos los tipos o sólamente el OB100, que es el arranque completo. Sólo se ejecuta una vez, en el arranque. Una vez terminado pasa al principal.
- El OB1: Es un tipo es sí mismo y es el principal. Se ejecuta de forma recurrente y desde él se hace llamadas a los FC y FB del programa
- OB cíclicos: También se pueden hacer llamadas a otros FC o ejecutar código desde estos OB. Tienen la peculiaridad frente al OB1 que se ejecutan a tiempo fijo (por ejemplo el OB35).
- OB Horarios: Son OB que dependen de la fecha y hora. Se pueden realizar tareas desde en un momento concreto a ser cíclicos cada x tiempo (desde minutos a todos los años en un momento concreto)
- OB de fallo (OB85, OB86, OB121 etc). Son OB predefinidos para cada tipo de fallo y son llamados cuando el fallo es detectado. Dentro de cada OB se puede tratar el fallo y tomar las decisiones pertinentes en cada caso.
Todos los OB tienen la peculiaridad de tener reservados 20bytes de memoria local donde podrás hallar variables específicas de cada OB. Así podrás tener información de en qué momento ha sido llamado o la frecuencia de llamada en el caso del OB35 por poner un ejemplo.
Los más usados con una diferencia notable con el resto:
- OB100: Arranque desde cero. En el daremos las condiciones y valores iniciales (si procede) en el arranque.
- OB1: Programa principal (lógico)
- OB35: Programa cíclico por excelencia ya que hay otros pero que no están disponibles en todas las CPU. Puedes programar tareas a tiempo fijo facilitando contajes y mediciones que sean necesarias conocer su periodicidad.
Luego están los de fallo que dependiendo de la aplicación usarás unos u otros o ninguno. Pero con estos 3 tienes el 80% de las necesidades de los OB cubiertos.
Funciones (FC)
Las funciones son bloques que pueden ser llamados desde OB, FC o FB y se usan fundamentalmente para:
- Estructurar el código de tal forma que no esté todo metido en el OB1 sino que se hace de forma arbórea e inteligible dividiendo el programa por zonas, máquinas, submáquinas...
- Usarlos como funciones que traten unos valores de entrada y den como resultado unos valores de salida. Lógicamente la idea de esto es por un lado dar claridad y por otro lado permite la reutilización de la función.
Tienen la peculiaridad de poder definir de forma interna variables temporales con las que jugar dentro del bloque pero que no tienen remanencia y el valor de estas variables se pierde de ciclo de ejecución a ciclo de ejecución, es decir, al inicio de la ejecución del FC valdrá cero, y aunque al final de la ejecución del FC la variable valga 100, en el siguiente ciclo de scan, la variable volverá a valer cero por esta falta de remanencia.
Por ejemplo, podemos crear un FC1 y un FC2. En el FC1 desarrollar un programa que sume a +b y nos de c. En el FC2, hacer varias llamadas al FC1 para que nos haga varias sumas.
El bloque FC1 denominado "sumar" lo reutilizamos y contendrá variables de entrada y salida mientras que el FC2 simplemente lo usaremos llamándolo desde el OB1 y lo denominaremos "todas_las_sumas" haciendo una única llamada desde el OB1 a este bloque. No tiene ninguna importancia la falta de remanencia de las posibles variables intermedias ya que lo que realiza es un cálculo matemático en cada ciclo.
Bloques de función (FB)
Los bloques de función son parecidos a los anteriores con la particularidad que tienen variables internas llamadas estáticas que dan remanencia de ciclo a ciclo. Para lograr esta remanencia tendrán asociado un bloque de memoria (DB) llamados para estos casos de instancia. Los FB pueden ser llamados desde los OB, FC o FB además de poder ser usados dentro de las estáticas de otros FB (multiinstancias). En definitiva son los módulos que usaremos para una programación orientada a objetos de otros lenguajes ya que podremos realizar un módulo que nos gestione por ejemplo un transportador y podremos crear tantos transportadores como queramos pudiendo desentendernos de cómo funcionan internamente una vez sepamos depurado el código del FB.
Módulos de datos(DB)
Los módulos de datos pueden ser der de tipo global o de instancia. Los de instancia los hemos visto que son necesarios para la ejecución de los FB y toman la estructura de la declaración de las variables del propio FB. Los DB globales son módulos declarados por el usuario y pueden contener variables de todo tipo definiendo estructuras complejas.
En ambos casos el acceso a la información es global ya que incluso se puede acceder a la información de un DB de instancia desde otro bloque.
Módulos de sistema.
Al igual que en los casos anteriores existen una serie de FC y FB que están integrados en el propio sistema operativo del PLC. Pueden ser llamados y consultados para obtener o tratar información. Al igual que pasa con los FB, los SFB necesitan de su correspondiente SDB. Por ejemplo con el SFC0 podrás consultar la hora del reloj del PLC.
CICLO DEL PROGRAMA
Como ya he ido adelantando existen unos módulos que son los encargados de ejecutar los programas de usuario. En el siguiente esquema puedes ver de forma gráfica cómo es la ejecución cíclico del programa (ya visto anteriormente aquí)
Procesamiento cíclicoComo puedes imaginar, ejecutar todas las instrucciones conllevará un tiempo denominado tiempo de ciclo:
El tiempo de ciclo es el tiempo medido en ms que se necesita para ejecutar completamente todas las instrucciones y llamadas realizadade desde el OB1, la ejecución de otros OB llamados (si fuera el caso) y actividades del SO (actualizar las imágenes de E/S por ejemplo).
El tiempo no es constante ya que no todos los ciclos tienen la misma carga de trabajo bien porque no siembre se hacen las llamadas de OB cíclicos o porque no se hacen llamadas a todos los bloques en función de las circunstancias y valores de las diferentes variables.
Este tiempo está vigilado por un watchdog (típicamente fijado en 150ms fijado en la configuración del hardware) y si se supera, el PLC se irá a estado de STOP.
¿Cómo se puede superar este tiempo?
Pueden ser por varias causas, pero una típica es programar mal un bloque haciéndolo sin salida (un lazo infinito) con lo que irremediablemente se va a STOP aunque hay otras como pueden ser un programa eXcesivamente largo.
También se puede ir el PLC a STOP debido a los tiempos de ejecución por llamadas a OB cíclicos en tiempos muy cortos con cargas de trabajo muy altas. Por ejemplo, programando el OB35 a 2ms y si su carga de trabajo es muy alta, puede que con la siguiente llamada aún no haya terminado las operaciones del ciclo anterior, y el PLC se coja la baja.
Bromas a parte, veamos más en concreto en qué orden ejecuta las diferentes tareas durante este tiempo de scan.
En primer lugar cuando arranca el PLC ejecuta los OB de arranque. El más habitual es el OB100.




