plc s7-300 programación estructurada

Transcripción

plc s7-300 programación estructurada
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
PLC S7-300
PROGRAMACIÓN ESTRUCTURADA
S7-SCL
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 1/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
PRÓLOGO
Esta documentación forma parte de una serie de manuales que un grupo de profesores de tres institutos de
educación secundaria de Catalunya, como son:
IES-SEP Comte de Rius de Tarragona
IES Palau Ausit de Ripollet (Barcelona)
IES-SEP La Garrotxa de Olot (Girona)
han estado experimentando con diferentes materiales incluidos dentro de la temática de la automatización,
el control y las comunicaciones industriales.
Este equipo de profesores, formaron un grupo de trabajo, llamado EDCAI (Experimentación y
Documentación en Control y Automatización Industrial), reconocido tanto por el Departament d’Educació de
la Generalitat de Catalunya como por la empresa Siemens, con unos objetivos tan sencillos como claros y
que se basaban en la realización de documentación realizada por profesores/as para profesores/as, y que
además, pudiese servir como manual para los alumnos, esto quiere decir que se ha intentado realizar una
documentación que sea fácil de seguir con unas explicaciones paso a paso de los diferentes procesos a
realizar, para de esta manera poder alcanzar el objetivo propuesto en cada ejercicio.
Este grupo de trabajo continúa trabajando en cada uno de los temas para poder ir actualizando día a día
esta documentación, es por ello, que nos podéis enviar vuestras sugerencias a través de la información que
encontrareis en la web dedicada a este grupo de trabajo y que desde aquí os invitamos a participar.
www.iespalauausit.com/edcai/edcai.php
Esperamos que el esfuerzo y dedicación que hemos realizado pueda ayudar a mejorar vuestra labor
educativa.
Los profesores del grupo de trabajo EDCAI
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 2/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
ÍNDICE
1. Introducción.
2. Funciones matemáticas i de conversión.
3. Manejo de datos en listas y matrices.
4. Manejo de datos complejos: UDTs.
5. Problemas complejos de tratamiento de datos.
6. Ejercicios propuestos.
7. Soluciones.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 3/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
1.- Introducción.
La instrucción IEC 1131-3 persigue la normalización de los lenguajes de programación para
autómatas programables, de forma que independientemente de la tecnología elegida, los
programas escritos para un PLC concreto puedan trasladar-se a un PLC de otro fabricante con
poco esfuerzo. Uno de los lenguajes definidos en esta norma es el ST o “structured text” que
es un lenguaje de alto nivel y que como tal tendrá todas las prestaciones de éstos:
instrucciones matemáticas complejas, tipos de datos complejos, tipos de datos definidos por el
usuario, manejo de tablas i matrices, de datos complejos y las estructuras de control clásicas
que poseen todos los lenguajes de alto nivel: IF THEN ELSE, REPEAT UNTIL, WHILE DO, FOR
TO y CASE OF.
SCL “ structured control language “ es el lenguaje de texto estructurado para PLCs de Siemens
y está basado en el lenguaje de alto nivel PASCAL. Permite una fácil integración en el
contexto de una solución global para un problema de automatización ya que un bloque
programado en SCL puede ser llamado desde un bloque escrito en KOP, en grafcet, en AWL o
en FUP y a la inversa, un bloque escrito, por ejemplo en KOP puede ser llamado desde un
bloque escrito en SCL. Al mismo tiempo SCL trata todas las áreas de memoria del PLC como
variables globales, lo que permite, como en el resto de lenguajes, intercalar una dirección
absoluta de memoria (entrada, salida, marca, DB, periferia, etc.) en el área de instrucciones
del bloque como si se tratara de una variable del bloque.
SCL está especialmente indicado para la resolución de los siguientes tipos de problemas:
1. Problemas matemáticos complejos como los siguientes ejemplos:
• Función de normalizado de variables analógicas.
• Cálculo de volúmenes y pesos de depósitos cónico-cilíndricos.
• Cálculo de tiempos de activación o funcionamiento de dispositivos.
2. Problemas de tratamiento de datos, como los siguientes ejemplos:
• Filtrado de una variable analógica
• Determinación de media y valores extremos en un grupo de valores
• Detección de errores repetidos por desviaciones fuera de tolerancia en distintos
instrumentos.
3. Manejo de datos en matrices, como los siguientes ejemplos.
• Determinación de la posición de carga y descarga de piezas en un almacén con
robot cartesiano de dos ejes.
• Mantenimiento de un histórico de eventos en un PLC.
• Impresión de un histórico de valores de producción en un dosificador de colas.
• Gestión de la presentación en pantalla de datos de mantenimiento y funcionamiento
de válvulas y motores.
• Gestión de contadores de producto en máquina plegadora de sábanas.
4. Aplicaciones de tratamiento de grandes cantidades de datos, como los siguientes
ejemplos.
• Mantenimiento de datos de producción de un grupo de máquinas de hilatura.
• Mantenimiento de datos de producción de un grupo de máquinas de inyección.
En el presente documento se pretende, a la par que ir explicando los detalles del trabajo con la
herramienta de programación en SCL ( editor y compilador), diseñar funciones que resuelvan
todos los problemas tipo planteados, forzando al alumno a leer programas diseñados por otros
programadores cosa que necesariamente forma parte del aprendizaje de todo buen
programador. Al final de cada capítulo se van a dar también una colección de ejercicios
propuestos.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 4/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Para terminar con la introducción quisiera hacer unas recomendaciones acerca de la ubicación
de estos contenidos en el ciclo superior de Sistemas de Regulación y Control, de los
conocimientos previos que debe tener los alumnos para sacar el máximo aprovechamiento de
estos contenidos, de las herramientas necesarias para trabajar en SCL y del uso más racional
a mi modo de entender de SCL en una aplicación general de automatización.
Respecto al primer punto, mi opinión es que hay que enseñar diseño, antes que codificación
por lo que habría que seguir el camino clásico consistente, en enseñar las estructuras básicas
de control, las estructuras de datos y la programación en pseudo código de los algoritmos tipo,
antes que entrar en la codificación a cualquier tipo de lenguaje. De otro lado es necesario
tener un buen nivel de autómatas, antes de programar en SCL. Desde mi punto de vista, estos
dos factores hacen que la ubicación más deseable para estos contenidos, sea la de los
módulos de Desarrollo de sistemas secuenciales o de Desarrollo de sistemas de medida y
regulación o de Informática industrial pero siempre que se impartan después de haber dado
conocimientos generales sobre PLCs, que ya está así recomendado en los documentos sobre la
planificación del ciclo formativo.
Sobre las herramientas necesarias para trabajar con SCL mencionar que con disponer del
STEP-7 y de las herramientas SCL y PLCSIM es suficiente puesto que PLCSIM nos permite
depurar todas las funciones que desarrollemos con SCL.
Sobre el último punto y después de escuchar alguna recomendación de técnicos que trabajan
en este campo mi opinión es la siguiente. Ocurre sobretodo en alumnos que provienen de
formación informática, que tienen dificultad relativa en trabajar con diagrama de contactos
KOP, que al conocer SCL quieren resolverlo todo en SCL cosa realmente inadecuada por la
razón que la mayoría de personas (técnicos de mantenimiento, de puesta en marcha, etc.) que
tienen que leer programas de PLC, cambiarlos, depurarlos, etc. Entienden perfectamente KOP
pero pocos de ellos son capaces de entender y menos depurar y testear programas en SCL.
Por ello mi recomendación es que se destine SCL a resolver problemas concretos, muy bien
definidos y que esté muy bien documentado como tienen que funcionar y que se siga
utilizando KOP o FUP para enlazar todas las funciones y para programar la parte básica de la
aplicación.
Antes de abordar la programación en SCL a partir del planteamiento de problemas concretos
comunes en diversas aplicaciones, quisiera abordar la resolución de un sencillo problema para
visualizar la importancia de trabajar o no con parámetros, en las funciones que vayamos a
programar. Ruego al lector que se abstenga de valorar si el ejemplo es idóneo para ser
programado en SCL puesto que éste no es el objetivo de este apartado.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 5/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Supongamos que queremos consultar el estado de la entrada E124.0 para activar o desactivar
la salida A124.0. En KOP o diagrama de contactos es tan simple como esto:
Aceptando que el lector posee conocimientos básicos de programación en lenguaje de alto
nivel, es fácil ver que la solución al problema, escrita en lenguaje algorítmico es:
si (E124.0 = 1) entonces
A124.0 := 1;
sino
A124.0 := 0;
fsi
Este trozo de código, incorporado a una función concreta como FC51, tiene traducción directa
a SCL como:
Dejando aparte la traducción precisa de las distintas estructuras y operadores, del lenguaje
algorítmico a SCL, cuestión que abordaremos progresivamente, esta función deberá llamarse,
por ejemplo desde el OB1, para que sea ejecutada. El aspecto de la llamada será el siguiente:
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 6/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Supongamos ahora, que queremos hacer lo mismo con la entrada E124.1 para activar la salida
A124.1 Evidentemente habrá que modificar el código fuente de la FC51, para incorporar esa
modificación, que pasará a ser:
Con esta modificación la llamada a la función no sufrirá ningún cambio, pero es obvio que
hemos obligado al programador a cambiar el código de una función escrita en SCL. Si quisieran
añadirse mas entradas y salidas que debieran recibir el mismo tratamiento, debería
modificarse de nuevo el código de la función SCL.
En vez de esto proponemos trabajar con parámetros. Un parámetro es asimilable a una
variable, que es cargada con un valor concreto al hacer la llamada a la función. Esto nos
permite escribir la función sin hacer referencia a direcciones absolutas de memoria, usando en
su lugar los parámetros o variables mencionadas, como objetos genéricos. Los parámetros,
pueden ser de entrada ent (solo nos interesa consultar su valor), salida sal (solo nos interesa
darle un valor) y entrada salida ent_sal (Nos interesa consultar i modificar su valor)
Veamos el ejemplo inicial reescrito usando dos parámetros, primero en lenguaje algorítmico.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 7/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
acción actuarSalida(ent entrada: bool,
sal salida: bool)
si (entrada = 1) entonces
salida := 1;
sino
salida := 0;
fsi
facción
En lenguaje algorítmico se distingue entre funciones (solo tienen parámetros de entrada y
retornan un único valor del tipo definido para la función) y acciones (pueden recibir cualquier
tipo de parámetro y no retornan ningún valor).
En SCL traducimos la acción precedente como la función FC 52 quedando como sigue:
Se ha declarado “entrada” como parámetro o variable
de entrada y salida como parámetro o variable de
salida. Cuando llamamos a la función desde el OB1 el
aspecto de la llamada ha cambiado apareciendo en la
misma los parámetros definidos, como se observa en
la siguiente figura:
Es ahí en la llamada cuando asignamos un valor al parámetro formal entrada y una dirección
“puntero” al parámetro formal salida. Trabajando de esta forma no será necesario modificar el
código de la función para actuar sobre una salida adicional, sino que efectuaremos una
segunda llamada asignando nuevos valores actuales a los parámetros. La última versión de la
FC51 en el que actuábamos sobre dos salidas, quedará resuelto con dos llamadas a la FC52,
tal como se muestra a continuación:
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 8/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Es obvio que pueden realizarse llamadas adicionales, de hecho pueden hacerse tantas como
sean necesarias.
Esta forma de trabajar tiene dos ventajas claras: La primera es que reducimos la memoria
ocupada por el programa al duplicar la llamada de la función en vez del código de la misma.
Las ventajas son más evidentes cuantas más veces tengamos que ejecutar la función y cuanto
más código tenga la función. La segunda ventaja hace referencia a la transparencia de la
función en el sentido de que es mucho mas clara una función con parámetros que sin ellos.
Una función con parámetros nos permite observar su funcionamiento viendo los valores de
respuesta, y además la introducción de un parámetro nos permite evitar la modificación del
código de una función para por ejemplo cambiar una dirección de memoria.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 9/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
2.- Funciones matemáticas y de conversión.
2.1.- Función para indicar si una variable está o no dentro de márgenes o fuera de
control.
Se trata de una función de vigilancia de una variable de proceso o de una variable interna del
control, de manera que si su valor está por encima de un máximo, introducido como
parámetro de entrada o por debajo de un mínimo también introducido como parámetro de
entrada nos activa una salida para aviso, alarma o indicación de fuera de control.
Los parámetros necesarios son:
ent
valorProceso: real,
valorMaximo: real,
valorMinimo: real,
sal
alarma: bool,
Podemos plantear una función que nos retorne alarma teniendo como entradas los tres
parámetros o variables mencionados. Escrita en lenguaje algorítmico tendremos:
funcion indicarFueraDeControl(valorProceso, valorMaximo, valorMinimo: real): bool
var
alarma: bool;
fvar
si valorProceso >= valorMaximo or valorProceso <= valorMinimo entonces
alarma := true;
sino
alarma := false;
fsi
retorna alarma;
ffuncion;
Vamos a continuación a explicar por pasos, como programar y probar esta función en SCL.
En primer lugar, hay que crear un proyecto en STEP 7 asociándole únicamente un programa
S7 puesto que no es necesario asignarle un hardware si no trabajamos con una aplicación
concreta. En segundo lugar hay que escribir el código fuente de nuestra función (existe una
traducción precisa de lenguaje algorítmico a SCL), usando para ello el contenedor fuentes de
nuestro proyecto, insertando dentro del mismo una fuente SCL. Por último, hay que compilar
nuestra fuente SCL para traducirla a lenguaje ejecutable por el PLC.
Veamos detenidamente cada uno de estos pasos.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 10/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Creamos el proyecto SCL_01 e insertamos en el un programa S7.
Insertamos dentro de la carpeta fuentes, una fuente SCL con el nombre “fueraDeControl”. Una
fuente SCL puede contener varias funciones así como otros tipos de bloques como OB y DB.
Abrimos la herramienta SCL haciendo doble clic sobre el objeto que acabamos de insertar para
pasar a la edición de nuestra función. Debemos plantearnos con que tipo de bloque S7,
básicamente FC o FB vamos a trabajar para introducir nuestra función, y como traducir la
declaración de variables, las estructuras de control y el resto de elementos contemplados en la
notación algorítmica.
En primer lugar hay que decir que tanto las funciones como las acciones de la notación
algorítmica se corresponden con FCs o FBs al traducirlos a SCL. SCL por tanto, no distingue
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 11/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
entre funciones y acciones y de hecho la única distinción entre ellas se encuentra en la
declaración de variables.
Sobre la cuestión de cuando utilizar un FC o un FB la distinción es la siguiente: Si al ejecutar la
función se genera mucha información adicional, no contemplada en los parámetros de entrada,
que además ha de ser almacenada, el módulo a utilizar será un FB, puesto que toda esta
información adicional se guardará en el DB de instancia del FB. Si por el contrario toda la
información relevante se encuentra en los parámetros de salida de la función, el módulo a
utilizar será claramente un FC.
El aspecto de la herramienta se observa en la figura siguiente:
Para facilitar la edición disponemos de plantillas, tanto de bloques como de parámetros como
de estructuras de control, por lo que empezamos insertando una plantilla de bloque FC.
La plantilla correspondiente nos aparece en la ventana de edición, como muestra la siguiente
figura:
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 12/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
En la línea 2 aparece la declaración de la función, en la cual debemos sustituir xxx por el
número de la FC que vayamos a usar. Por ejemplo FC2. También aparece el tipo de datos
correspondiente al valor de retorno de la función. En la plantilla aparece INT pero puede ser
cualquier tipo de datos o VOID si la función no ha retornar ningún valor.
De las líneas 3 a 8 hay que introducir la declaración de todos los objetos necesarios para la
correcta ejecución de la función.
En
la
figura
pueden
observarse todos los tipos de
objetos
que
pueden
declararse, la sintaxis de la
declaración y el tipo de
módulo de programa S7 que
lo soporta.
También están indicados en
el orden más correcto en que
deben declararse.
Las variables estáticas que
en un FB son las variables
que se salvaguardan en el
DB de instancia, pueden ser
declaradas también en una
FC
aunque
al
compilar
quedaran configuradas como
variables temporales y por
tanto su valor se perderá al
finalizar la ejecución.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 13/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Podemos insertar también una plantilla para la declaración de constantes y parámetros.
SCL distingue entre variables y parámetros. Los parámetros aparecen en la interfase de la
función, al ser llamada. Las variables no aparecen en la interfase y su valor se pierde al
finalizar la ejecución de la función si son temporales o se salvaguarda en el DB de instancia si
son estáticas (solo en caso de FBs).
Finalmente las líneas 9 y 10 de la plantilla de la FC y por supuesto todas las que fueran
necesarias, albergarían el código de la función con todas las estructuras de control necesarias.
La línea 11 asigna a la función el valor constante 100, para que sea su valor de retorno y con
la línea 12 finaliza la función.
Realizamos ahora la declaración de la función indicarFueraDeControl y sus parámetros:
Como solo debemos declarar parámetros de entrada y una variable temporal que se
corresponderá con la variable de retorno de la función, eliminamos el resto de apartados de la
declaración. Observar que la función se ha declarado con nombre simbólico. Esto nos obligará
a declarar una FC con el mismo nombre simbólico en la tabla de símbolos. A la tabla de
símbolos puede accederse directamente desde el menú herramientas. Indicamos FC120.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 14/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Para finalizar la edición de la función completamos el área de instrucciones con la estructura IF
THEN ELSE, que puede si se desea insertarse en el área de edición.
Nos queda compilar la función, programar su llamada en OB1 por ejemplo, y probarla.
Para compilar usamos el siguiente botón de la barra d’herramientas:
Para ver los resultados de la compilación debemos tener activa la opción
Con esto nos aparece en la ventana inferior del área de trabajo.
Que nos indica que no existe ningún error y que nuestro bloque está listo para ser probado.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 15/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Antes hay que programar la llamada a la función. Para ello, desde el contenedor bloques
abrimos el OB1 en KOP e insertamos la FC120 en un segmento.
Aparece el nombre de la función, los tres parámetros de entrada y en el parámetro RET_VAL
aparece el valor de retorno de la función. RET_VAL es por lo tanto una palabra reservada y es
usada como un parámetro de salida del tipo declarado para la función. Si la función se ha
declarado como boleana RET_VAL es bool si la función es declarada como INT RET_VAL es
también de tipo entero, etc.
Para completar la llamada a una función (FC) hay forzosamente que asignar valores a los
parámetros de la función.
En el ejemplo, usamos la
función para controlar una
variable de proceso, cuyo
valor está en MD50 y sobre
la que hay que indicar una
alarma si su valor es menor
de 30 o mayor que 50,5. La
marca M100.0 estará a 1 si
hay alarma y a 0 en caso
contrario.
Arrancamos
el
simulador
desde
el
administrador
simatic y cargamos todos los
bloques en la CPU, para a
continuación colocar en RUN
el conmutador de estado del PLC.
Para probar la función insertamos en el simulador una variable general y le indicamos MD0,
con el formato regulación real, lo que nos permite cambiar su valor entre un mínimo y un
máximo como si fuera un potenciómetro.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 16/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
En las figuras siguientes podemos observar la respuesta de la función para tres valores en
MD0.
En este caso, el valor de MD0 está entre 30 y 50.5 y por lo tanto, M100.0 está en 0 indicando
que la variable se encuentra dentro de márgenes.
En este segundo caso, la variable ha sobrepasado a valorMaximo por lo que el valor de retorno
de la función es 1, indicando alarma de proceso.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 17/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
La misma situación se da cuando el valor en MD0 es inferior a 30, tal como muestra la
siguiente figura.
Con esto podemos hemos comprobado que la función se comporta tal como deseábamos por lo
que la damos por buena.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 18/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
2.2.- Función para convertir un valor real a tiempo simatic.
Supongamos que tenemos un sistema de control de una máquina o proceso donde intervienen
un PLC y una pantalla para la interfase de usuario, conectados por MPI, tal como muestra la
siguiente figura.
En la interfase de usuario
del sistema descrito se ha
previsto una pantalla de
configuración, donde se
desea poder cambiar el
valor de preselección de
varios temporizadores del
proceso.
Los temporizadores de la
gama
del
S7-300/400
utilizan el tipo S5TIME que
no es un tipo de datos
estándar y que tiene el
inconveniente de cambiar
la base de tiempo de manera automática, según el valor de preselección propuesto. Esto
quiere decir que según el intervalo de tiempo deseado para preseleccionar el temporizador
deberíamos cambiar el formato de preselección. Para facilitar la tarea del operador de planta
hemos diseñado la interfase para permitir la entrada directa de tiempos en segundos, en
formato real con dos decimales, por lo que podemos apreciar centésimas de segundo.
Con esto facilitamos la tarea por parte del usuario pero hemos de diseñar una función de
conversión para convertir el tiempo, introducido en formato real a formato S5TIME.
Escrita en lenguaje algorítmico la función tiene el aspecto que sigue. En ella utilizamos varias
funciones de conversión de tipos. En primer lugar disponemos, en la librería estándar de
funciones S7, de la función de conversión timeToS5time, que vamos a utilizar. Con ello
hemos reducido el problema a realizar una conversión realATime que en el ejemplo lo
realizamos del siguiente modo:
• Pasamos entrada de segundos a milisegundos (entrada*1000.0)
• Convertimos el resultado anterior (real) a entero 32 bits (realAEnter)
• Convertimos el resultado del paso anterior a time (entero 32 bits en mseg) con
(enterATime)
funcion realAS5time(entrada: real): s5time
var
aS5T: s5time;
fvar
aS5T := timeAS5time (EnterATime(realAEnter(entrada*1000.0)));
retorna aS5T;
ffuncion;
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 19/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Escrita en SCL la función queda como sigue:
Hemos usado dos funciones de conversión implícitas en SCL como DINT_TO_TIME y
REAL_TO_DINT y hemos usado la función TIM_S5TI que viene incluida en la librería estándar
en el apartado IEC function blocks.
Para probar la función hemos diseñado una pequeña interfase en la pantalla TP270, que
describimos a continuación.
En la columna preselección
hemos incluido tres campos
de entrada con el valor de
preselección en segundos,
en formato real, de tres
temporizadores.
Los botones de comando
de estado de la derecha
nos permiten arrancar o
parar cada uno de los
temporizadores de manera
individual.
Los temporizadores son SE
por lo que al finalizar el
tiempo
el
mismo
temporizador borra el BIT
de arranque asociado al
botón de comando de
estado,
pudiéndolo
observar en la misma
pantalla.
Los tres campos de salida situados bajo la columna Valor actual permitirán observar el valor
actual de cada uno de los temporizadores después de programar la correspondiente función.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 20/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
De momento vamos a probar que la introducción de un valor real en cada uno de los
mencionados campos de preselección se traduce en el correspondiente valor S5TIME de
arranque del temporizador. Para ello programamos los tres temporizadores en el OB1. Debido
a que tanto la preselección como el BIT de arranque se modifican desde la pantalla hemos
definido los siguientes valores en DB10.
Con estas variables la programación de los temporizadores nos queda como sigue:
En primer lugar llamamos a la función REAL_TO_S5TIME a la que damos como entrada el valor
de preselección introducido en el correspondiente campo de entrada de la pantalla comentado
anteriormente. La respuesta de la función la descargamos en “D_TP”.T1_S5T_SP en formato
S5TIME. Este mismo valor, es el que introducimos como preselección del temporizador.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 21/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
El arranque del temporizador lo realizamos con “D_TP”.T1_ON que se activa o desactiva desde
la pantalla. Cuando el temporizador finaliza el tiempo desactiva también el BIT de arranque. En
la siguiente diapositiva vemos el resultado de la función de conversión.
Arrancamos el simulador, cargamos el programa del PLC en el simulador y arrancamos el
runtime del Protool. Al introducir un valor en Tiempo 1 observamos su efecto el segmento 1
pudiendo ver como coincide con el valor S5TIME del temporizador.
Los proyectos descritos en esta práctica y en el resto de prácticas de este manual están
incluidos en el CD que lo acompaña.
Como puede fácilmente intuirse, a menudo se hace necesaria la función contraria para
convertir a real el tiempo transcurrido en el temporizador. Esto podría usarse para visualizar
los tiempos actuales de temporizadores cuando están activados.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 22/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Para construir esta segunda función que vamos a denominar S5TIME_TO_REAL vamos a usar
la función S5TIME_TIME (FC33) del apartado funciones IEC de la librería estándar que
acompaña al paquete STEP 7.
Hay que hacer sin embargo las siguientes salvedades:
• Los tiempos actuales pueden descargarse de los temporizadores usando los
parámetros DUAL, declarado de tipo WORD y que contiene en formato entero el tiempo
que resta para completar la preselección y DEZ declarado también de tipo WORD y al
igual que con DUAL conteniendo el tiempo que resta para completar el tiempo
preseleccionado, pero en formato BCD, de hecho en formato S5TIME. Por este motivo
nuestra función va a leer el tiempo actual del temporizador del parámetro DEZ.
• Vamos a indicar el tiempo transcurrido desde el arranque del temporizador en vez del
tiempo que falta para completar el ciclo, por esto nuestra función va a tener como
parámetro de entrada el valor de preselección del temporizador.
El código de la función escrita directamente en SCL es:
Es una función muy parecida a la anterior pero quiero resaltar dos cosas:
• entrada es el parámetro que va a recibir al valor actual del temporizador del parámetro
DEZ del mismo, que esta declarado como WORD. Sin embargo SCL no dispone de la
conversión WORD_TO_S5TIME, por lo que no podemos traspasar la salida de DEZ a la
entrada de S5TI_TIM. Aunque hay otras soluciones, en nuestro caso lo hemos resuelto,
declarando lo que se denomina una vista sobre una variable. Si observamos el apartado
de variables de entrada vemos la declaración de entrada_S5T AT entrada: S5TIME.
Esto significa exactamente que entrada_S5T contiene lo mismo que entrada pero que
su contenido será interpretado como S5TIME, con lo que podemos pasar entrada_S5T
a S5TI_TIM sin ningún problema. Sin embargo, en la interfase de la función solo nos
aparecerá, entrada.
• Las conversiones aplicadas son: entrada_S5T pasa a formato TIME (miliseg), el
resultado se pasa a DINT y a su vez, este último a REAL. Este resultado se divide por
1000.0 para pasar a segundos y finalmente restamos este resultado del valor
preseleccionado para obtener el tiempo transcurrido en vez del tiempo restante.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 23/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Para probar la función solo nos queda llamarla en el OB1 colocando como salida de la misma
la dirección de DB10 asignada a los campos de salida de la pantalla.
La llamada de la función queda como sigue:
Al parámetro DEZ del
temporizador le asignamos
la variable temporal del
OB1
#A1_W
declarada
lógicamente de tipo WORD.
También le pasamos en SP
el valor de preselección del
temporizador como REAL.
Finalmente la función nos
devuelve en RET_VAL el
valor
actual
del
temporizador en segundos
para
poderlo
visualizar
desde la pantalla.
Como podemos comprobar
en el sinóptico contiguo,
vemos
los
tiempos
transcurridos
desde
el
arranque
de
los
tres
temporizadores en la columna valor actual.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 24/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
2.3.- Función para normalizar o escalar una entrada analógica.
Como se ha dicho en la introducción, la realización de cálculos es una de las aplicaciones
donde SCL toma clara ventaja respecto por ejemplo a KOP o incluso AWL. Para comprobarlo
podemos diseñar el primer ejercicio en KOP y en SCL comparando la extensión del código
generado en el PLC.
La normalización de variables analógicas en Siemens tiene las siguientes particularidades:
Se aplica generalmente la función de la librería estándar FC105 SCALE que aplica una
conversión lineal entre el valor de entrada, variable entre 0 y 27648 si la entrada es de rango
unipolar o entre -27648 y +27648 si la entrada es de rango bipolar y un valor de salida
variable entre LO_LIM y HI_LIM. El valor de entrada proporcionado por las tarjetas analógicas
del S7-300 puede sin embargo sobrepasar el valor 27648 cuando por ejemplo se ha conectado
un sensor de rango de salida 2 a 10 voltios y el sensor está proporcionando 10,5 voltios a la
tarjeta analógica indicando por descontado, que hay un desbordamiento en la variable del
proceso que se está midiendo. En esta situación la función SCALE proporcionada por STEP-7
en la librería estándar daría como salida, el valor HI-LIM cosa que obviamente no proporciona
información acerca de en cuanto está sobrepasado el valor máximo proporcionado por el rango
de medida del sensor.
En la figura anexa puede
verse una llamada a la
FC105 SCALE, con sus
parámetros.
El significado de cada uno
de los parámetros se irá
comentando a lo largo del
ejercicio.
Se pretende por tanto
corregir esta limitación de
la
función
SCALE
haciendo que cuando el
sensor
de
un
valor
superior a 10 voltios, 20
mA, etc. dependiendo de su rango, cosa que significará que en el valor de entrada de la
función se presente un valor entre 27648 y 32767, nuestra función responda también con un
valor que esté por encima de HI_LIM.
Describimos a continuación los puntos clave en el proceso de escalado o normalización de
valor de entrada analógico. En primer lugar el sensor da una señal entre 0-10v, 1-5v, 4-20mA,
etc. cuando la variable en el proceso varía de LO_LIM a HI_LIM. La variable en el proceso
puede variar fuera de los márgenes indicados, provocando que el sensor proporcione una señal
fuera de los rangos de medida indicados. En segundo lugar la tarjeta de entrada analógica
conectada al PLC proporciona en una palabra del área de memoria de periferia de entradas un
valor entero comprendido entre 0 y 27648 si el rango del sensor es unipolar o entre -27648 y
+27648 si el rango del sensor es bipolar. En tercer y último lugar debemos aplicar la función
escalar y dar como salida el valor de la variable del proceso en unidades de ingeniería. Por
supuesto que este valor estará, en condiciones normales, comprendido entre LO_LIM y
HI_LIM.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 25/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Gráficamente:
HI_LIM
VAR_PV
0
INPUT
27648
32767
LO_LIM
El gráfico corresponde a una entrada unipolar. Para un valor “INPUT” cualquiera entre 0 y
27648 la función nos responde con VAR_PV, que se correspondería con el valor de la variable
del proceso. Nótese que la función podría perfectamente dar valores por encima de HI_LIM
cuando INPUT varía de 27648 a 32767.
La formula que hay que aplicar se deduce de la ecuación de una recta que pasa por dos puntos
(x1, y1), (x2, Y2)
y = ((Y2-y1)/(x2-x1))*(x-x1) + y1
Aplicado a nuestro problema los puntos de la recta son (0, LO_LIM), (27648, HI_LIM)
Y la formula para el caso de rangos unipolares es:
VAR_PV = ((HI_LIM-LO_LIM)/27648)*INPUT + LO_LIM
Si el rango es bipolar los puntos son (-27648, LO_LIM), (+27648, HI_LIM) y la formula cambia
a la siguiente expresión
VAR_PV = ((HI_LIM-LO_LIM)/(27648-(-27648)))*(INPUT-(-27648)) + LO_LIM
Estamos ahora en condiciones de resolver el problema usando SCL.
En primer lugar hay que tener un PC con STEP7 y las herramientas PLCSIM y por supuesto
SCL. Si se dispone de STEP7 Professional ambas herramientas de ingeniería vienen incluidas
en el mismo CD del STEP7.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 26/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Creamos el proyecto SCL001 e insertamos un programa S7, tal como muestra la figura
contigua.
A continuación hemos de crear la fuente SCL de nuestra función. Esto significa que cuando
trabajamos con SCL hay que primero escribir el código y luego compilarlo para generar el
bloque ejecutable por el PLC. Así que abrimos la carpeta fuentes y bien con el menú insertar,
bien con el botón derecho del ratón creamos una fuenteSCL(1), a la cual denominaremos
funcionEscalar. En nuestro proyecto existe ya otra fuente denominada volumenDeposito.
Tanto de una forma como de otra es posible insertar dos tipos de objetos relacionados con
SCL, fuente SCL y archivo de control de compilación de SCL. Optaremos por Fuente SCL y más
adelante ya trabajaremos con archivos de control de compilación.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 27/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
A continuación abrimos la fuente que acabamos de insertar haciendo doble clic sobre ella. Se
nos abre la herramienta de trabajo en SCL, que tiene el aspecto de la siguiente figura. Abrimos
directamente el menú Herramientas, Preferencias
Activamos todas las opciones de la ficha compilador.
El menú insertar tiene un apartado interesante, destinado a facilitar la tarea del programador,
denominado insertar plantilla de bloque que vamos a usar inmediatamente. Al seleccionar
insertar, plantilla de bloque, FC aparecen las siguientes líneas en el editor.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 28/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
En primer lugar pide el numero de la FC que
deseamos editar y si esta función va a
devolver algún valor de retorno y si es así el
tipo de datos del valor de retorno. En la
plantilla propuesta la función retorna un
valor entero.
En segundo lugar nos pide la declaración de
variables, en la cual solo presupone que
existan variables temporales, pero además
de temporales las variables, al igual que en
KOP o en FUP, pueden ser de entrada
VAR_INPUT, de salida VAR_OUTPUT, o de
entrada salida VAR_IN_OUT. Si se tratara de
un bloque FB las variables podrían ser
además estáticas.
VAR_INPUT son valores que introducimos en
la función. Desde la función solo podemos
leer estos valores.
VAR_OUTPUT La función entrega valores de salida sobre estos parámetros, pero no puede
consultar su valor mientras se ejecuta.
VAR_IN_OUT La función entrega valores de salida sobre estos parámetros pero además puede
consultar su estado o valor en cualquier momento.
Los tres tipos de variables, VAR_INPUT, VAR_OUTPUT y VAR_IN_OUT, aparecen como
parámetros cuando se invoca a la función desde otro bloque. En ningún caso aparecen las
variables temporales ni las estáticas en el caso de FBs.
Por ultimo deja espacio para el área de instrucciones y acaba con un valor constante de
retorno para la función y la palabra clave END_FUNCTION.
Para concretar nuestra función escalar debemos antes identificar los parámetros o variables
que necesitamos. Pueden deducirse de la propia expresión que antes hemos descrito. Se
tendrán los siguientes parámetros de entrada.
IN: Valor de entrada de la función. Es el valor que nos proporciona la tarjeta
analógica del PLC. Será un valor entero entre 0 - +32767 si el rango es unipolar y –32767 a
+32767 si el rango es bipolar.
HI_LIM: Valor máximo del margen del captador en unidades de ingeniería. Se
corresponde con el valor de la variable del proceso para la máxima señal proporcionada por el
captador: 10v, 20mA, etc. Será un valor real.
LO_LIM: Valor mínimo del margen del captador en unidades de ingeniería. Se
corresponde con el valor de la variable del proceso para la mínima señal proporcionada por el
captador: 0v, 4mA, etc. Será También un valor real.
Bipolar: Bit que indicará a la función que se trata de rangos bipolares si está en 1 o
unipolares si está en 0.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 29/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Y los siguientes parámetros de salida:
RET_VAL: Valor de retorno de la función que indicará distintos estados.
VAR_PV: Valor de la variable de proceso ya escalada o normalizada que se
corresponde con la entrada proporcionada.
No son necesarias en esta función variables de entrada salida, aunque si definiremos la
constante K1 y la variable temporal AR1. De otro lado la función no va a proporcionar valor de
retorno, por lo que indicaremos la palabra clave VOID en la cabecera. Esta y la declaración de
variables quedarían como sigue:
Observar la sintaxis para la
declaración de la constante.
Botón compilar
fuente
Observar también como solo con
la declaración de variables y
constantes se ha realizado una
compilación
para
comprobar
errores sintácticos y no se han
presentado errores.
En la siguiente figura ya
podemos observar el código de
la
función.
Una
pequeña
aclaración antes de ver las
instrucciones. La variable IN es
entera y por tanto hay que
convertirla a real antes de poder
operar con el resto de variables.
En KOP habría que usar las
instrucciones de conversión.
En SCL también hay que hacer
básicamente lo mismo, con la
ventaja de que ya están
definidas en el lenguaje. Es decir
podemos llamar a la función
INT_TO_REAL
sin
otra
preocupación que la de la
correspondencia de tipos.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 30/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Asignando el valor correcto a AR1 usar la misma expresión tanto para rango unipolar como
bipolar, simplificando la función.
Nos falta programar la llamada a la función y probarla. La llamamos desde el OB1 por ejemplo,
como un segmento en KOP. Observar como en la carpeta bloques de nuestro proyecto aparece
la función FC55.
Para comparar nuestra función con la estándar de Siemens vamos a llamar a las dos
simultáneamente comparando resultados con PLCSIM.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 31/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Lo que sigue serian las llamadas de las funciones.
Las dos funciones
tienen los mismos
parámetros de
entrada y distintos
de salida por lo
que podremos
comparar los
resultados.
Después de
transferir el
programa al
simulador
visualizamos en el
propio simulador:
PEW256 para
forzar la entrada y
MD0 y MD4 para
ver los resultados.
En las siguientes
figuras tenemos
resultados para
entrada “0” para
entrada “27648” y
para entrada
“30000”.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 32/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Por último en la diapositiva final se observa la diferencia entre nuestra función y la de
Siemens. Para una entrada 30000 superior a 27648 la función de siemens se queda en HI_LIM
y la nuestra sigue dando el valor de proporcionalidad.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 33/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 34/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
2.4.- Función para calcular el volumen, el peso i el porcentaje de carga de un silo de
forma cónico cilíndrica.
En un silo de forma cónico cilíndrica se mide el nivel de carga con un sensor de ultrasonidos
que nos proporciona una señal proporcional a la altura entre la superficie del líquido o sólido
que contiene y el borde superior del silo hs. Se dan también las medidas del silo que se indican
en el gráfico siguiente.
Para
calcular
el
volumen,
podemos distinguir entre dos
casos, a saber: Que el contenido
sea tal que se supere, o no, la
altura h2.
En el primer caso se tratará de
calcular el volumen de un
cilindro de altura (h-h2) al que
añadiremos el volumen fijo del
cono inferior.
En el segundo caso se tratará de
calcular el volumen de un cono
truncado de altura h y radio R.
Para facilitar los cálculos vamos
a encontrar en primer lugar el
volumen del cono truncado
inferior.
El volumen del trozo de cono
que falta para completar el cono
inferior tiene una altura teórica
hci
que
se
calcula
por
trigonometría a partir de R2, R1
y h2.
hci = R2*h2/(R1-R2)
El
volumen
de
ese
cono
imaginario de radio en la base
R2 es Vci y será:
Vci = 1/3*(∏*R22)*hci
El volumen total del cono final del silo Vc será el volumen del cono con base de radio R1,
menos el volumen del cono con base, de radio R2
Vc = 1/3*(∏*R12)*(h2+hci) - Vci
Con estos datos las fórmulas aplicar serán las siguientes:
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 35/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Caso 1: h > h2
Volumen = Volumen cilindro de altura h-h2 + volumen cono
Volumen = (∏*R12)*(h - h2) + Vc
Caso 2: h < h2
En este caso hay que determinar el radio R correspondiente al círculo donde está la superficie
del producto almacenado. Por trigonometría
R = R2*(h + hci)/hci
Volumen = 1/3*(∏*R2)*(h + hci) - Vci
Con esta introducción podemos ya plantear el diseño de la función que queremos desarrollar.
La función tendrá como parámetros o variables de entrada:
InSensor
Entero con el valor de conversión proveniente de la tarjeta
analógica donde está conectado el sensor.
R1, R2, h1, h2 Reales con valores en metros para fijar las dimensiones del silo.
Densidad
Real con el valor de densidad del producto almacenado.
Como variables de salida tendremos:
Volumen, Peso
Reales con estos valores de respuesta
%CapacidadTotal
Real con el porcentaje de llenado del tanque
Para facilitar los cálculos definiremos también unas variables temporales que usaremos para
almacenar resultados intermedios.
Variables temporales
hci, h, R, Vci, AR1
La secuencia
1.2.desde SCL.
3.4.-
Reales
de operaciones de la función será:
Control de errores en entradas
Escalado de InSensor para obtener h. Con ello practicamos llamadas de funciones
Determinar valores auxiliares.
Determinar Volumen, Peso y %CapacidadTotal
Escribimos el código en la fuente VolumenDeposito que ya habíamos creado.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 36/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
En esta figura vemos completa la declaración de variables:
Hemos añadido una variable temporal denominada error que vamos a usar para la llamada de
la función scale, y hemos declarado h como variable de salida en vez de temporal por
considerarla útil para determinadas aplicaciones.
En la parte del programa, empezamos realizando un control de parámetros de entrada. En
concreto si R1 o h1 son cero. Si eso ocurre asignamos valor nulo a los parámetros de salida y
ponemos 1 en RetValue para indicar fallo en parámetros de entrada. De otro lado si R1 y h1
tienen valores distintos de cero, la función sigue su curso normal.
Para llamar a la función scale lo más fácil es acudir al menú insertar, cogiendo la opción
llamada de bloque. Esto produce los resultados que se observan en las siguientes diapositivas.
En primer lugar se abre por defecto la librería standard.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 37/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
La función scale se encuentra en el grupo TI-S7 Converting Blocks y es la FC105. La
seleccionamos haciendo doble clic, produciendo los efectos que se observan a continuación.
Sale el nombre de la función y entre paréntesis
los parámetros de la misma con indicación en
forma de comentario de si es de entrada, salida o
entrada salida y del tipo de datos asociado al
parámetro.
Al cerrar los paréntesis observamos que hay un
comentario con indicación WORD. Esto hace
referencia a que la función retorna un valor, con
este formato de datos. Como se vio en el primer
ejercicio la fuente para la función scale empezaría
así.
FUNCTION FC105: WORD en vez de
FUNCTION FC105: VOID como hemos visto en la propia FC que estamos desarrollando.
Con esto la llamada a la función
Scale para resolver nuestra función
nos quedaría como sigue.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 38/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
El código completo de la función quedará así:
Si hay valores de
entrada incorrectos
pone a cero las
salidas
e
indica
error en RetValue.
Si los valores de
entrada están en el
rango correcto, da
un cero en RetValue
y
escalamos
la
entrada del sensor
entre 0 y la altura
total del tanque,
h1+h2.
Determinamos
los
valores
auxiliares
que
hemos
comentado en el
planteamiento.
Aplicamos
dos
fórmulas según que
el nivel esté por
encima o por debajo
del cono.
Calculamos el peso,
el volumen total y el
porcentaje
de
llenado.
Nos queda programar la llamada a la función y probarla con PLC_SYM.
La llamada a la función la realizamos en OB1 y queda como sigue.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 39/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Vemos las variables de entrada a las cuales asignamos valores de prueba para comprobar la
función. A la variable InSensor le asignamos el canal analógico PEW256. Por último a las
variables de salida les asignamos registros del área de marcas para observar su valor en el
simulador.
Para finalizar arrancamos el simulador, cargamos el programa y depuramos la función hasta
que nos funcione correctamente.
Podemos al igual que en KOP observar el funcionamiento de la función activando la función
observar. Podemos ver el resultado de la función observar en la figura siguiente: En una
asignación aparecen los valores de cada uno de los operandos y el resultado final.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 40/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Resultados de la prueba para depósito lleno, depósito vacío y con dos valores intermedios.
Tener en consideración que el volumen está en m3, la altura en metros y el peso en Kg.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 41/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Con valores intermedios: 4,78 metros de altura de producto, que representa un 54,82% de
capacidad y con 1,5 metros lo que se traduce en un 5,09% de capacidad.
Cualquiera de los dos ejercicios anteriores puede programarse en KOP aunque el código a
escribir es bastante más extenso.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 42/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
2.5.- Cálculo de tiempos de activación o funcionamiento de dispositivos.
Este es también un problema bastante usual en control de procesos. Debe de controlarse la
duración de un proceso o el tiempo de funcionamiento de un dispositivo que realiza ciclos de
trabajo prolongados de por ejemplo varias horas, piénsese en compresores frigoríficos,
bombas, llenado de tanques, etc. No deben de contabilizarse los tiempos de interrupción
debidos a alarmas de dispositivos, paradas por acciones de operador, etc. sino solo los tiempos
efectivos destinados a la tarea o proceso de la cual se quiere medir el tiempo. Además el valor
de ese tiempo ha de visualizarse en un dispositivo HMI, por lo que debe de actualizarse a
menudo independientemente de su duración que como se ha dicho puede ser de varias horas.
No seria adecuado actualizar el tiempo solo al finalizar el ciclo ya que el valor visualizado
tendría siempre el error del tiempo correspondiente al último ciclo.
La función medirTiempo que se va a desarrollar va a tener como entrada la señal on off del
dispositivo o proceso y otra señal para poder poner a cero los acumuladores cuando se desee.
Esta última podría provenir del terminal de operador o scada y su actuación estar protegida
con un password para evitar que pudieran borrarse los acumuladores de manera accidental.
El formato fecha y hora CPU, (DT date and time) es un formato de datos complejo que ocupa 8
bytes en memoria y por lo tanto deberemos emplear funciones incluidas en la librería estándar
del Step 7 para tratarlo. Como el volumen de datos involucrado en la función va a ser grande
comparado con las dos funciones anteriores, y como además será una función que se podrá
utilizar bastantes veces en un mismo proyecto vamos a desarrollar la función como un FB. Con
ello los parámetros que no se quieran incluir en la interfase se declaran como estáticas y sus
valores actuales van a quedar almacenados en el correspondiente DB de instancia del FB.
Con todo esto, en este ejercicio vamos a practicar con formatos DT, llamadas de funciones en
SCL, llamadas de FB y multiinstancias.
En resumen los parámetros a usar serán los siguientes:
Entrada:
DP_ON_OFF
Señal on off del dispositivo o proceso
DP_RES_ACC
Borrado de acumuladores
Entrada Salida:
DP_NC_ACC
DP_T_ACC
DP_T_UC
Salida:
DP_DT_IUC
DP_DT_FUC
Estáticos
DP_FUP
DP_A_FUP
DP_FDOWN
DP_A_FDOWN
DT_UMIN
Número de ciclos acumulado en dispositivo o proceso
Tiempo acumulado de funcionamiento en dispositivo o proceso
Tiempo último ciclo en dispositivo o proceso
Fecha y hora inicio último ciclo en dispositivo o proceso
Fecha y hora finalización último ciclo en dispositivo o proceso
Flanco de subida para la señal on off del dispositivo o proceso
Auxiliar para la obtención del flanco anterior
Flanco de bajada para la señal on off del dispositivo o proceso
Auxiliar para la obtención del flanco anterior
Fecha y hora del último registro
Empezamos editando nuestra función insertando en la carpeta fuentes del proyecto SCL001 la
fuente SCL medirTiempo. Vamos al editor de SCL e insertamos plantilla para bloque FB y
realizamos la declaración de variables especificada anteriormente.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 43/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
En este ejemplo he declarado las dos variables DP_DT_IUC y DP_DT_FUC como parámetros de
salida si bien podrían muy bien ser consideradas como variables estáticas. Mi opinión es la
siguiente: Si esas dos variables tienen que visualizarse en el sistema HMI, si son declaradas
como parámetros de salida será posible enlazarlas con otras variables de un DB específico para
el sistema HMI. Si por el contrario son declaradas como variables estáticas, el sistema HMI
deberá leerlas del propio DB de instancia del FB. Ambas soluciones son posibles aunque por
estilo de programación prefiero la primera de ellas. Además el hecho de incluirlas como
parámetros de salida nos va a permitir practicar con el formato DT.
El aspecto de la declaración de nuestro FB es el siguiente:
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 44/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Respecto a las tareas en las que podemos dividir nuestra función podemos enumerarlas como
sigue:
• Elaborar flancos de subida y bajada de la señal de marcha del proceso.
• Anotar fecha y hora de inicio de ciclo cuando aparece el flanco de subida, poner a cero
el contador de horas del último ciclo e incrementar el acumulador de maniobras o
ciclos.
• Mientras esté en ON la señal del proceso leer el reloj de la CPU y comparar la fecha y
hora actual con la del último registro para detectar el paso de un minuto. Cuando eso
ocurra incrementar acumuladores y actualizar registro.
•
Cuando aparezca el flanco de bajada anotar fecha y hora de parada e incrementar
acumuladores como en el paso anterior.
•
Borrar acumuladores cuando aparezca la señal de borrado de los mismos.
Comentamos cada uno de los trozos de código correspondientes a esas tareas:
Elaboración de flancos de subida y bajada.
Si está el proceso en ON ponemos a 1 el auxiliar
para flanco de bajada, que vamos a usar
posteriormente. Si no está a 1 el auxiliar para el
flanco de subida, es que estamos en el flanco de
subida y por tanto activamos tanto el flanco de
subida como su auxiliar. Como se puede observar,
en el siguiente ciclo de programa el flanco de
subida pasará a 0 debido a que su auxiliar
permanecerá activado. Si el proceso pasa a OFF
ponemos a 0 el flanco de subida y su auxiliar. Si el
auxiliar para el flanco de bajada está en 1 es que
estamos en el flanco de bajada, por lo que lo
activamos al mismo tiempo que desactivamos el
auxiliar para flanco de bajada. Al igual que antes
en el siguiente ciclo de programa que permanezca
el proceso en OFF se va a poner a 0 el flanco de
bajada.
En el
subida
flanco
de
Incrementamos
el
contador de ciclos o
maniobras. Leemos
la hora del sistema
con
SFC1
y
la
registramos como la
fecha y hora de inicio del último ciclo o maniobra (DP_DT_IUC). Guardamos esta fecha y hora
en DT_UMIN para comparaciones posteriores. Ponemos a cero el contador de horas del último
ciclo.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 45/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Mientras este en ON el proceso.
Leemos el reloj de la CPU con SFC1 y comparamos el DT (date and time) correspondiente, con
el registrado en el inicio del ciclo. Esto último lo hacemos de la siguiente forma: Usamos la FC
34 del apartado funciones IEC de la librería estándar del Step7 para restar dos DT y encontrar
el tiempo transcurrido entre los dos DT. Si el tiempo transcurrido es igual o superior a un
minuto incrementamos los acumuladores de tiempo. Dos aclaraciones: Para la comparación
debemos convertir el formato time a entero y como en realidad contiene el tiempo en
milisegundos comparamos con los milisegundos que tiene un minuto. Para sumar a los
acumuladores pasamos a real el tiempo en milisegundos y lo dividimos por el número de
milisegundos que tiene 1 hora antes de realizar la suma con el acumulador correspondiente.
Por último actualizamos DT_UMIN para posteriores comparaciones.
En el flanco de bajada.
Si estamos en el flanco de bajada, leemos el reloj de la CPU, calculamos el tiempo transcurrido
desde el último minuto y lo sumamos a los acumuladores, convertido a horas.
Si se presenta la señal de borrado de acumuladores
Ponemos a cero tanto el contador de maniobras
como el de tiempo de funcionamiento.
Nos queda llamar al bloque de función y probarlo
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 46/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Como en los casos anteriores lo llamamos desde el OB1 y lo probamos con el simulador.
Al llamar al FB hay alguna diferencia con respecto las llamadas a FCs. En primer lugar la
asignación de valores a los parámetros puede dejarse en blanco. En este caso el FB trabajará
con los valores del DB de instancia, el número del cual se nos pide en la cabecera de la
llamada. Si el número de DB no existe nos pide si queremos generarlo. Finalmente la llamada
quedará como sigue:
Asignamos
las
entradas
E124.0 para la señal ON OFF
del proceso y E124.1 para el
borrado
de
los
acumuladores.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 47/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
3.- Manejo de datos en listas y matrices.
3.1.- Filtrado de una variable analógica.
Los problemas tipo donde hay que manejar una gran cantidad de datos puestos por ejemplo
en un array, también se resuelven ventajosamente en SCL. En el ejemplo que se describe se
trata de resolver un problema bastante usual en los sistemas automáticos donde hay que
tratar con valores analógicos.
La señal que nos llega de un captador lleva un rizado incorporado que puede tener diversas
causas a veces difíciles de eliminar, que nos provoca que el valor numérico de la conversión de
la variable sufra continuas variaciones, que por ejemplo, si la variable es visualizada en una
pantalla provoque un efecto molesto. Para solucionar el problema introducimos un filtro entre
el valor que nos llega directamente de la tarjeta analógica y el valor que damos para la
variable, que finalmente será el que se va a visualizar.
El filtro que se propone consiste en almacenar una determinada cantidad de valores que se va
a entrar como parámetro, calcular la media de estos valores y dar esta media como valor de la
variable.
En este caso dado que necesitamos un array para almacenar los valores que nos van llegando
por la entrada, vamos a usar un FB. De esta forma los parámetros van a quedar en el DB de
instancia del FB.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 48/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
3.2- Determinación de la posición de carga en un robot cartesiano.
Se trata del siguiente problema: Un robot cartesiano ha de almacenar tres tipos distintos de
piezas cilíndricas que se distinguen básicamente por su color, pueden ser negras, naranjas o
de color gris claro, y por que estas últimas son metálicas mientras que las negras y naranjas
son de materiales plásticos.
Las piezas son almacenadas según el tipo, en tres filas de 13 piezas cada fila distanciadas
entre ellas 60mm, según el eje x. El origen se encuentra situado en el extremo superior
derecho del sinóptico que se muestra a continuación y la primera pieza de cada fila está
situada en las coordenadas (100, 250) para las piezas negras, (100, 350) para las piezas
metálicas y (100, 450) para las piezas naranjas.
El tipo de pieza se detecta antes de la entrada al almacén por medio de tres detectores, uno
de capacitivo (detecta cualquier tipo de pieza), otro de inductivo (detecta solo las metálicas) y
otro de reflexión directa que detecta las naranjas y las metálicas pero no las negras. Los tres
detectores se encuentran conectados a las entradas:
E0.0 inductivo
E0.1 capacitivo
E0.2 reflex
La presencia o no de pieza en cada una de las posiciones del almacén se guarda en un array
de bits, almacenado en el DB10, de manera que un 1 en el índice [11, 2] del array significa
que hay una pieza metálica en la posición 11.
Se pide una función que teniendo como entradas las señales de los tres detectores y la tabla
de posiciones del DB nos de cómo salidas el tipo de pieza (negra =1, metálica =2 y naranja
=3) y las coordenadas de la posición de descarga para las funciones de posicionamiento de los
ejes.
Además la función debe avisarnos en caso de fila completa.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 49/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Planteamos la función usando pseudo código.
acción buscarPosicionCarga(ent inductivo, capacitivo, reflex: bool,
entsal tablaPosiciones tabla[13, 3] de bool,
sal posX, posY: real, sal tipoPieza: int, sal filaLlena: bool)
const
delta_x: real = 60.0;
inici_x: real = 100.0;
fconst
var
j: int;
trobat: bool;
coordy tabla[3] de real;
fvar
{Asignamos coordenadas y a tabla}
coordy[1] := 250.0;
coordy[2] := 350.0;
coordy[3] := 450.0;
{Determinar tipo de pieza}
tipoPieza := 0;
si (capacitivo = 1) entonces
si (inductivo = 1) entonces
tipoPieza := 2;
sino
si (reflex =1) entonces
tipoPieza := 3;
sino
tipoPieza := 1;
fsi
fsi
fsi
{Determinar posiciones}
si tipoPieza <> 0 entonces
j:= 1;
filaLlena := 0;
trobat := tablaPosiciones[j, tipoPieza] = 0;
mentre trobat = 0 i j <= 13 fer
trobat := tablaPosiciones[j, tipoPieza] = 0;
j := j+1;
fmentre
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 50/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
{Asignamos coordenadas nulas en caso de fila llena}
posx := 0,0;
posy := 0,0;
si j>13 entonces
filaLlena := 1;
sino
posx := inici_x + desta_x * (j-1);
posy := coordy[tipoPieza];
fsi
fsi
facción
Para probar la función trabajaremos con el proyecto SCL_004, en el cuál hemos insertado la
fuente SCL buscarPosicionesCarga. La traducción de esta función a SCL se muestra a
continuación.
En primer lugar la declaración
de constantes, variables y
parámetros.
Observar como la declaración
incluida en var en el pseudo
código se ha puesto en
VAR_TEMP y como los
parámetros de la acción se
han declarado en VAR_INPUT
para ent, VAR_IN_OUT para
entsal y VAR_OUTPUT para
sal.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 51/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Finalmente el área de instrucciones queda como sigue:
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 52/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Nos falta como siempre, llamar a la función desde por ejemplo el OB1 i probar su
funcionamiento. En este caso, será necesario también crear la correspondiente estructura de
datos en el DB10.
Por pasos, primero declaramos los símbolos necesarios:
A continuación declaramos en el db10 el array de bits de posición:
Y para acabar llamamos a la función desde el OB1.
Por último cargamos la carpeta bloques en el simulador, previamente abierto y activamos
observar viendo los resultados en los parámetros de salida.
En primer lugar probamos los tres tipos de pieza con el almacén vacío. Los resultados pueden
verse en las siguientes figuras.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 53/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
Para pieza metálica nos da el tipo de pieza correcto y la posición de la primera pieza en la fila
correspondiente es también correcta.
Para pieza naranja los resultados son también correctos.
Ahora probaremos con posiciones intermedias.
Para ello insertamos en nuestro proyecto una tabla de datos con los valores de la tabla de
posiciones para poder ocupar posiciones a voluntad.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 54/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
En la situación mostrada, la primera posición libre para piezas negras, es la 9, de coordenadas
(250, 580). Esto es exactamente lo que nos da la función como respuesta, como se observa en
la figura siguiente:
Para dar definitivamente como buena a la función vamos a probarla para la situación de fila
llena. Para ello modificamos la tabla de posiciones como sigue:
La respuesta de la función para este caso es:
La respuesta también es la prevista, al darnos filaLlena = 1. Los registros de posición se ponen
a cero también como estaba previsto.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 55/56
Versión: 1.1
Fichero: S7_SCL
Departament d’Educació
SCL
Introducción a la programación
Electricitat/Electrònica
3.3.- Determinación del recalentamiento de un evaporador frigorífico.
Realizado por:
Josep Cañigueral i Barnes
IES SEP LA GARROTXA
Fecha: 12/01/2007
Página: 56/56
Versión: 1.1
Fichero: S7_SCL

Documentos relacionados