scieee AI-readable full text Open interactive document viewer

Plataforma de práctica para PLC simulado

Gómez Díaz, Álvaro

Abstract

Este trabajo tiene como objetivo facilitar a los estudiantes practicar con la programación de PLCs, el control de sistemas continuos simulados en Matlab y diseño de SCADAS mediante la interconexión de diferentes plataformas (Vijeo, Matlab, SoMachine...) con licencia disponible o gratuita y protocolos de comunicación abiertos como OPC y Modbus, haciendo así que se puedan dar prácticas de forma no presencial o complementar alguna práctica presencial ya existente. En el proyecto se ha intentado maximizar la flexibilidad y facilidad a la hora de implementar las plataformas en los ordenadores de los estudiantes, de forma que no se necesite comprar ningún tipo de hardware o software.

Full text

Proyecto Fin de Carrera Ingeniería de Telecomunicación Formato de Publicación de la Escuela Técnica Superior de Ingeniería Autor: F. Javier Payán Somet Tutor: Juan José Murillo Fuentes Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2013 Trabajo Fin de Grado Ingeniería de Tecnologías Industriales Plataforma de práctica para PLC simulado Autor: Álvaro Gómez Díaz Tutor: David Muñoz de la Peña Sequedo Dpto. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Trabajo Fin de Grado Ingeniería de Tecnologías Industriales Plataforma de práctica para PLC simulado Autor: Álvaro Gómez Díaz Tutor: David Muñoz de la Peña Sequedo Catedrático Dpto. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Agradecimientos Quiero agradecer este proyecto a todas las personas que estuvieron ayudándome y guiándome durante mi vida y que estuvieron ahí en los momentos más necesarios. Sin ellos esto no sería posible. Álvaro Gómez Díaz Sevilla, 2020 I Resumen Este trabajo tiene como objetivo facilitar a los estudiantes practicar con la programación de PLCs, el control de sistemas continuos simulados en Matlab y diseño de SCADAS mediante la interconexión de diferentes plataformas (Vijeo, Matlab, SoMachine...) con licencia disponible o gratuita y protocolos de comunicación abiertos como OPC y Modbus, haciendo así que se puedan dar prácticas de forma no presencial o complementar alguna práctica presencial ya existente. En el proyecto se ha intentado maximizar la flexibilidad y facilidad a la hora de implementar las plataformas en los ordenadores de los estudiantes, de forma que no se necesite comprar ningún tipo de hardware o software. III Abstract This work aims to facilitate students to practice with the programming of PLCs, the control of continuous systems simulated in Matlab and SCADA design through the interconnection of different platforms (Vijeo, Matlab, SoMachine ...) with available or free license and open communication protocols such as OPC and Modbus, thus enabling non-face-to-face practices to be given or to complement an existing face-to-face practice. The project has tried to maximize flexibility and ease when it comes to implementing the platforms on the students’ computers, so that it is not necessary to buy any type of hardware or software. V 2 Pruebas realizadas Antes de dar con los programas idóneos y con la arquitectura necesaria para lograr los objetivos planteados, se han realizado un conjunto de pruebas hasta encontrar el modelo y los programas más convenientes para nuestra plataforma. Dividiremos estas pruebas en lo referente al apartado de control del sistema, a la comunicación de ambos programas, la sincronización de éstos y la visualización del mismo. 2.1 Control Para el control, se empezó probando el programa de Schneider llamado SoMachine 4.3. Una vez se descargue el programa tendremos unos 21 días de prueba, aunque se podrá usar de forma ilimitada una vez nos registremos en la página web de Schneider [ 5 ], que se puede descargar en el enlace que se encuentra más abajo, es posible simular para un amplio número de controladores Logic como por ejemplo los dispositivos M221, M238, M241, M251, M258 o HMI, Drive o Motion. También dispone de varios tipos de lenguajes para usarlos en los POUs (bloques programables), entre ellos lenguajes como LD, ST, SFC, FBD, CFC u otras menos usados a la hora del aprendizaje con los PLCs como IL. Aparte de los POUs, también se pueden crear acciones y transiciones para éstos con cualquiera de los lenguajes que se han comentado antes. Adicionalmente, cuenta con variables globales y locales para todos los POUs y bastantes herramientas para ayudar a la hora de realizar el control como pueden ser alarmas, operadores o fórmulas. https://schneider-electric.box.com/s/35g7f6zz5mr8spyka0695hge7j2l3qdy Figura 2.1 SoMachine 4.3. Para poder simular con este programa sin usar un PLC físico, es decir, simulando en nuestro propio ordenador, nos hará falta pasar a modo simulación. Una vez hecho esto compilaremos y simularemos nuestro programa sin ningún tipo de problema. 3 4Capítulo 2. Pruebas realizadas Figura 2.2 Simulación sin PLC SoMachine 4.3. Fijándonos en el manual, vemos como se puede conectar mediante OPC con programas como CodeSys. Sin embargo, no nos es posible comunicarnos con Vijeo debido a que nos hará falta la licencia del mismo. También no nos es posible comunicarnos con MATLAB ® mediante Modbus, como se puede observar en el libro [4]. Es por esto último que se decide utilizar otro programa. Después de este programa, se probó a usar otro programa de Schneider llamado EcoStruxure Machine Basic, el cual sí era posible comunicarlo con MATLAB ® (se hablará en el siguiente apartado). Usamos la versión gratuita que se consigue una vez te registras y tiene un tiempo ilimitado. Esta versión gratuita tiene algunas limitaciones como se puede ver en la siguiente página [ 2 ] entre ellas algunos comandos no disponibles en la depuración o la imposibilidad de cambiar el programa estando en línea. Dentro de este programa se pueden usar diferentes tipos de lenguajes, sin embargo es más limitado que SoMachine 4.3, ya que solo se pueden usar los lenguajes SFC, LD e IL, aunque con posibilidad de usar bloques de ST en LD. Figura 2.3 Ejemplo de bloque de ST en LD. En el programa de EcoStruxure se pueden usar diferentes objetos entre ellos variables de software simples, como bits de memoria y palabras, direcciones de las entradas y salidas digitales o analógicas, variables internas del controlador, como palabras y bits del sistema, funciones predefinidas del sistema o bloques de funciones, como temporizadores y contadores. Aparte de la tarea maestra también se pueden crear tareas periódicas las cuales podrán tener un periodo de entre 1 a 255 ms. Por la parte de los controladores a usar, solo tendremos la posibilidad de simular con controladores M221. Toda esta información queda recogida en la siguiente manual colgado en la web por Schneider [3] Al principio se intentó usar para controlar una de estas funciones predefinidas que creaba PID directamente, sin embargo, esta opción solo era posible usarla si se tiene consigo un PLC de forma física. 2.1 Control 5 Figura 2.4 Herramienta PID. Al no poder usar esta herramienta, fuimos a crear un controlador en LD utilizando bloques de ST. Para probar su funcionamiento, primero creamos un control P para controlar un sistema con un tiempo de muestreo de 0.2s (este tiempo de muestreo indicará cada cuanto se envía la acción de control), para esto recogíamos tanto la variable a controlar como la referencia y restábamos una con la otra. A continuación, guardábamos en una variable el resultado anterior y en otra el valor de nuestra constante Kp (en este caso de valor 7), para luego multiplicarlas entre ellas y obtener así la acción de control. Aquí se puede ver el código del programa. Figura 2.5 Código control Kp. Con este controlador intentamos controlar un sistema simple: 1 s+1 . Este sistema se simuló en Simulink (más tarde se verá como se comunican ambos programas) y quedó así. 6Capítulo 2. Pruebas realizadas Figura 2.6 Control P. Si se utiliza un controlador PID directamente en simulink usando el bloque de PID discreto con los mismos valores mencionados anteriormente, se puede observar bastantes similitudes entre ambas gráficas. Figura 2.7 Control P usando bloque PID de Simulink. Por lo tanto, para arreglar este error en régimen permanente decidimos utilizar un control por PI. Como consecuencia de esto, se tuvieron que añadir más líneas de código a nuestro POU. Primero, se creó una nueva variable llamada Ki (la cual tendrá un valor de 12) y otra llamada error acumulado. Este error acumulado sería igual al error acumulado en el ciclo anterior más el error actual multiplicado por el tiempo de muestreo. Una vez hecho esto, cambiaremos el valor de la acción de control igualándola al error multiplicado por Kp más el error acumulado por Ki. Aquí el pseudocódigo del programa y una imagen de como sería la gráfica de la simulación. 2.1 Control 7 Figura 2.8 Control PI. Figura 2.9 Diagrama control PI. Ahora lo volvemos a comparar con el control usando el bloque PID de Simulink y con los mismos valores en las constantes. 8Capítulo 2. Pruebas realizadas Figura 2.10 Control PI usando bloque PID de Simulink. Como se puede apreciar, la respuesta del sistema sobreoscila demasiado al principio. Para solucionar este problema tendremos dos opciones. Una de ellas es limitar el efecto de la integral, esta herramienta se le llama compensación anti windup. Sobre todo, este tipo de compensación es usada en sistemas reales donde la salida puede llegar a saturarse y, al no poder aumentar más la salida, el error acumulado no pare de incrementarse. Para hacer esto, limitaremos los valores máximos y mínimos del error acumulado (-500, 500). Consecuentemente, la gráfica nos quedará así. Figura 2.11 Control PI con anti wind up. La otra forma es variar ese tiempo de muestreo, que como habíamos dicho antes era el tiempo que nos indicará cada cuanto cambia la acción de control que se envía al sistema. En el anterior caso era de 0.2s pero si se baja ese tiempo a 0.1s se puede ver una mejora en el control. 2.1 Control 9 Figura 2.12 Control PI con tiempo de muestreo menor. Volvemos a mostrar como sería usando el bloque PID de Simulink con el mismo tiempo de muestreo y datos. Figura 2.13 Control PI con tiempo de muestreo menor usando bloque PID de Simulink. Por último, juntando ambos conceptos, el sistema se controla mucho mejor, aquí la gráfica. Figura 2.14 Control PI con tiempo de muestreo menor y anti windup. Otro dato muy importante acerca del programa de control EcoStruxure, es que cada variable que se vaya a 10 Capítulo 2. Pruebas realizadas usar tiene que estar separada de otras, ya que si está se vuelve negativa o excede sus limites puede provocar cambios en otras que se encuentren cercanas a ella. Por ejemplo, como se puede observar en la siguiente imagen, al cambiar el valor de%MD5 y ponerlo negativo se cambia el valor de%MD6 Figura 2.15 Solapamiento de valores entre variables adyacentes en la memoria. 2.2 Comunicación 11 2.2 Comunicación Al principio del trabajo se comentó que ambos programas se iban a comunicar mediante OPC. Sin embargo, en la bibliografía que teníamos a nuestra disposición no había información al respecto de como conectar ambos programas mediante este método. Es por esto y porque se revisó información de otras pruebas anteriores, como las que se pueden ver en los siguientes libros [ 6 ] [ 1 ], que se decidió escoger como método de comunicación Modbus TCP/IP usando para esto funciones ya incluidas en el mismo Matlab. Este método es fácil de usar y no hace falta instalación aparte alguna lo cual es idóneo para nuestro proyecto, ya que éste va orientado a estudiantes y cuanto más fácil sea la preparación previa a la practica más tiempo se podrá dedicar a la misma. Para utilizar este tipo de comunicación hemos usado las siguientes tres funciones: 1. Función modbus : sirve para crear un objeto MODBUS que se usará para comunicar ambos programas. Esta función recibirá los siguientes argumentos: Transport: Este argumento habrá que rellenarlo con el tipo de transporte que en este caso será "tcpip" DeviceAddress: Habrá que añadir la dirección IP con la que se quiere comunicar, en este caso al simular desde nuestro propio ordenador utilizaremos la dirección 127.0.0.1. Port: Este argumento indicará el puerto remoto con el que se comunicará, este argumento es opcional ya que por defecto se añade el puerto 502, que es el puerto que está reservado para comunicación MODBUS. 2. Función read : esta función se usará para leer un valor usando el objeto MODBUS antes creado con la función modbus. Los argumentos que utiliza esta función son los siguientes: M: Hace referencia al objeto MODBUS que ya fue creado anteriormente. Target: Es el tipo de dato que vamos a leer, en este caso se pondrá en este argumento ’holdingregs’ que hace referencia a los registros de retención de EcoStruxure. Address: El tercer argumento es la dirección del valor por el que se empieza a leer, por ejemplo si se quiere leer el dato MW7 se deberá poner 7 en este apartado. Count: El cuarto argumento es el número de datos a leer, si se añade un 8 a este argumento se leerán los 8 valores empezando por el primer valor dado por el argumento address. Precision: El quinto argumento es el formato del dato que esta siendo leído. Este puede ser uint32, double, int16... 3. Función write : Esta función tiene como objetivo escribir un dato usando el objeto MODBUS antes creado. Los argumentos que utiliza son los siguientes: M: Tiene la misma función que en read, sirve para añadir el objeto MODBUS con el que vamos a trabajar. Target: Tiene la misma función que en read, sirve para indicar el tipo de dato que se va a escribir. Address: El tercer argumento hace referencia a la dirección donde se va a escribir (al igual que en la funcion read) Values: El cuarto argumento es la variable o constante que se va mandar como dato Precision: El quinto argumento indica el formato del dato que esta siendo enviado. Puedes ser uint32, int, double... A pesar de esto, se encuentran ciertos inconvenientes a la hora de la comunicación por medio de Modbus: 1. Su memoria es limitada, ya que como bien se ha dicho es un registro de 16-bits por lo que como mucho se podrá enviar datos de valor máximo de 65535 (216). 2. No es posible enviar datos decimales, solo se podrán enviar y recibir datos enteros. 3. Tampoco es posible enviar datos con valores negativos. 18 Capítulo 2. Pruebas realizadas Figura 2.29 Interfaz de MATLAB®GUI. Esta herramienta no tiene tantos elementos como puede tener el programa nombrado anteriormente, Vijeo Designer, sin embargo, incluye todo lo necesario para la visualización que se pide. Para crear esta interfaz usando MATLAB ® GUI habrá que escribir en la ventana de comando la palabra GUIDE. Una vez hecho esto nos dará la opción de crear una interfaz nueva o editar una ya creada anteriormente. Después podremos añadir todos los elementos que se precise a nuestra interfaz de usuario. Una vez hayamos terminado de crear nuestra interfaz, se creará una serie de funciones asociadas a la misma. Esta serie de funciones indicarán que se hará cuando se abra la interfaz o cuando el usuario interactúe con la misma, es decir, si por ejemplo se quiere que se ejecute un programa en el momento que el usuario pulse en un botón, entonces iremos a la función ’Callback’ de ese elemento y añadiremos la función que queramos que se haga. Al principio, al intentar usar este tipo de herramienta, se intentó implementar directamente en el archivo de Simulink con un bloque de la función en Matlab. Sin embargo, esto no nos servía ya que lo que hacía era crear una nueva interfaz por cada ciclo del archivo de simulink, por lo que no nos dejaba interactuar con la interfaz. Aquí se veía como lo intentamos implementar en el archivo de Simulink. Figura 2.30 MATLAB®GUI en bloque de Simulink. Después de esto, se buscó información sobre como acceder a las variables y datos de un archivo de Simulink en proceso. Esto resultaba complicado ya que no se disponían de muchas herramientas debido a que se 2.4 HMI 19 obtienen los datos de las simulaciones en Simulink normalmente cuando ya ésta ha terminado. enviándolos al Workspace. A pesar de esto, se consiguió acceder a estos datos utilizando las funciones get_param y set_param . Con estas funciones podríamos obtener el valor de uno de los bloques de Simulink y si se añadía el argumento ’RuntimeObject’ lo podíamos ver en ese instante. También se intentó poner en bucle las funciones anteriores ( get_param y set_param ) para que no parasen de mandar y recibir información, pero una vez entraba en dicho bucle infinito la simulación se detenía hasta que dicho bucle terminase. Figura 2.31 Simulación pausada a causa del bucle en MATLAB®GUI. Por lo tanto, no tuvimos más opción que refrescar los datos de la interfaz del MATLAB ® GUI cada vez que el usuario presionase algún botón, sin usar bucle alguno para no pausar la simulación en ningún momento. 3 Arquitectura final Para crear nuestra plataforma, después de haber hecho las pruebas necesarias, tomaremos la siguiente arquitectura. Figura 3.1 Arquitectura del proyecto. Como se puede ver en la imagen, utilizaremos en total dos programas diferentes: MATLAB ® y EcoStruxure. En el primero representaremos el sistema a simular con la herramienta de Simulink, para ello pondremos su ecuación o función de transferencia. Después de esto, añadiremos la función de comunicación que conecta EcoStruxure con MATLAB ® , esta función tendrá como entradas el tiempo local de Simulink (t), el set point o referencia (R(t)) y la variable a controlar (Y(t)) y como salida tendrá la acción de control (U(t)) que se le pasará a la función de transferencia. Por lo tanto, nuestra arquitectura dentro del archivo de Simulink quedaría tal como se puede observar en la siguiente imagen 21 22 Capítulo 3. Arquitectura final Figura 3.2 Representación del archivo de Simulink. Adicionalmente, pondremos un step size del archivo de Simulink relativamente bajo, lo recomendable es que sea en torno a 0.01 para su correcto funcionamiento. Para hacer esto iremos a los parámetros de Simulink, cambiaremos a Variable Step-size y en max step size el 0.01 que se ha comentado antes. También se podrá usar el bloque Zero Order Hold para cambiar el step size indirectamente. Como se puede ver en el diagrama anterior, el archivo de Simulink le enviará el tiempo local de la simulación al programa de EcoStruxure, el cual lo guardará en una variable, pero será el programa del EcoStruxure el que decidirá cuando mandar la acción de control, es decir, decidirá el tiempo de muestreo. Esto lo hace mediante un código simple en LD que se compone de una variable y un bloque de comparación en ST. En el código se ve cuando el tiempo local que se nos pasa es múltiplo de nuestro tiempo de muestreo. Para ello usamos la función REM que ve el resto de una división, si este resto es cero significa que es múltiplo por lo cual se cambiará la acción de control. Aquí se ve el código. Figura 3.3 Tiempo de muestreo usando tiempo local de Simulink. Después de haber hecho esto, se dará pie a mandar la acción de control mediante el flanco de subida de la variable%M5, como se puede ver en la siguiente imagen. Figura 3.4 Flanco de subida vairable%M5. Además, también se debe añadir a la línea del error acumulado un bloque de comparación para que no se coja error acumulado antes de empezar a controlar. 23 Figura 3.5 Bloque de comparación tiempo local>0. Todo esto se hace debido a que Simulink, como ya bien antes dijimos, no trabaja en tiempo real, por lo que necesariamente tenemos utilizar el tiempo local del programa y mandárselo al controlador del EcoStruxure para poder tener la misma escala de tiempo en ambos programas. Por último, volvemos a poner el código de implementación final. Figura 3.6 Código de controlador. 4 Guía instalación 4.1 Instalación de EcoStruxure Para empezar dicha instalación utilizaremos el siguiente enlace de descarga para obtener el ejecutable de dicho programa: https://download.schneider-electric.com/files?p_enDocType=Software+-+Released&p_File_Name=MachineExpertBasic_ V1.0_SP2_build64454.exe&p_Doc_Ref=Machine_Expert_Basic Una vez hecho esto, pasaremos a instalar el programa como se puede ver en la siguiente imagen Fig 5.9 Figura 4.1 Ejecutable EcoStruxure. Lo siguiente será escoger el idioma con el que trabajará el programa, en nuestro caso elegiremos el español Fig 4.2 Figura 4.2 Elección de idioma. 25 26 Capítulo 4. Guía instalación Después de esto pulsaremos en siguiente y luego rellenaremos los datos que nos piden Schneider, al solo necesitar la versión gratuita de la aplicación no nos tenemos que preocupar de licencias asi que tampoco importa lo que rellenemos en los siguientes campos. Fig 4.3 Figura 4.3 Elección de idioma. Seguidamente continuaremos aceptando los términos y condiciones de uso del programa como se puede ver en Fig 4.4 Figura 4.4 Términos y condiciones de uso. A continuación, seleccionamos la carpeta donde se guardará el programa Fig 4.5, lo instalaremos Fig 4.11 y por último abriremos el programa. 4.1 Instalación de EcoStruxure 27 Figura 4.5 Carpeta del programa. Figura 4.6 Instalación programa. Una vez dentro del programa, si nos damos cuenta nos dará fallo al ejecutar un proyecto. Para cambiar esto, deberemos irnos al apartado de propiedades y luego al subapartado de protección de la aplicación, como se puede ver en la imagen Fig 4.7 34 Capítulo 5. Ejemplo de demostración 5.2 Control Para el control utilizaremos un controlador de tipo PI, como se veía en el apartado de pruebas realizadas. Aquí se recuerda la ecuación de dicho controlador: K p +Ki ·Ts(1 z−1)(5.10) Los valores de dichas constantes serán los siguientes: Kp =20 (5.11) Ki =50 (5.12) Aparte también añadiremos una compensación anti wind up, al igual que cuando se probó anteriormente en las pruebas realizadas. Para realizar dicha compensación añadiremos un límite de 200 y -200 al error acumulado, de esta forma no se disparará la acción de control y no se producirá tanta sobreoscilación. También cambiaremos el signo de la acción de control si ésta es negativa volviéndola a poner positiva, a la vez que hacemos esto cambiaremos también el valor de la variable que indicará el signo de la acción de control al archivo de Simulink. Como se dijo en los apartados anteriores, pasaremos el tiempo local de Simulink al controlador y este enviará cada 100 ms la acción de control. Una vez realizado todos estos pasos, nos quedaremos con el siguiente programa en EcoStruxure: Figura 5.5 Pseudocódigo del programa. POU Tarea maestra Tarea maestra 1 - Nuevo POU Rung0 Variables utilizadas: %M5 TIEMPO_LOCAL%MD70 Rung1 Variables utilizadas: TIEMPO_MUESTREO%MD11 Rung2 Variables utilizadas: KP%MD3 KI%MD5 Rung3 Leyenda: %MD17 := %MD7 - %MD9 1 Variables utilizadas: SET_POINT%MD7 ALTURA%MD9 ERR0R%MD17 14/20 09/07/2020 - 09:46 Nombre del proyecto: Nuevo proyecto Rung4 Leyenda: %MD25 := %MD17 * %MD31 Variables utilizadas: KP%MD3 ERR0R%MD17 KPERR%MD25 Rung5 Leyenda: %MD25 + (%MD15 * %MD5) / 10 < 01 %MD25 + (%MD15 * %MD5) / 10 > 02 %MD1 := %MD25 + (%MD15 * %MD5) / 103 %MD1 := 0 - (%MD25 + (%MD15 * %MD5) / 10) 4 Variables utilizadas: %M5 SALIDA%MD1 SIGNO_SALIDA%MD28 Rung6 Leyenda: %MD15 := %MD15 + %MD17 * %MD111 Variables utilizadas: %M5 ERROR_CUM%MD15 TIEMPO_LOCAL%MD70 Rung7 Variables utilizadas: ERROR_CUM%MD15 15/20 09/07/2020 - 09:46 Nombre del proyecto: Nuevo proyecto Rung8 Variables utilizadas: ERROR_CUM%MD15 16/20 09/07/2020 - 09:46 Nombre del proyecto: Nuevo proyecto SÍMBOLOS ComentarioSímboloDirecciónUtilizado SALIDA%MD1X KP%MD3X KI%MD5X SET_POINT%MD7X ALTURA%MD9X TIEMPO_MUESTREO%MD11X ERROR_CUM%MD15X ERR0R%MD17X KPERR%MD25X SIGNO_SALIDA%MD28X TIEMPO_LOCAL%MD70X 17/20 09/07/2020 - 09:46 Nombre del proyecto: Nuevo proyecto 5.3 Comunicación 39 Por último, aquí se puede observar la repuesta del sistema y la acción de control. Figura 5.6 Respuesta final. Figura 5.7 Acción control final. 5.3 Comunicación Para comunicar ambos programas usaremos el protocolo Modbus mediante las funciones de MATLAB ® , las cuales ya fueron probadas en apartados anteriores. Primero se creará la conexión una vez se haya puesto en marcha el programa EcoStruxure usando la función modbus . Después de esto, pondremos una función dentro de nuestro archivo en Simulink el cual contendrá las funciones necesarias para la comunicación. Dicho programa, como ya hemos comentado anteriormente, tendrá tres entradas: altura, setpoint y tiempo local. Estas variables las multiplicaremos por 100 y seguidamente las redondearemos para poder enviarlas usando el protocolo MODBUS, de esta forma enviaremos datos enteros y a la vez cogeremos hasta las centésimas de las variables de entrada. Una vez hecho esto, recogeremos el valor de la acción de control y su signo. Por último, cambiaremos el signo de la acción de control en función del valor de la variable signo y reescalaremos a su dimensión original la acción de control dividiéndola entre 100. La frecuencia de ejecución de esta función depende del step size del archivo de Simulink. Este step size puede cambiarse mediante el bloque Zero Order Hold, como se explicó anteriormente. Aquí el código de dicha función: Código 5.1 Función lectura_escritura. function[K]=lectura_escritura2(entrada) 40 Capítulo 5. Ejemplo de demostración global m entrada(1)=entrada(1)*100; entrada(1)=round(entrada(1)); entrada(2)=entrada(2)*100; entrada(2)=round(entrada(2)); entrada(3)=entrada(3)*100; entrada(3)=round(entrada(3)); empieza=1; write(m,’holdingregs’,7,entrada(2),’int32’); write(m,’holdingregs’,9,entrada(1),’int32’); write(m,’holdingregs’,70,entrada(3),’int32’); write(m,’holdingregs’,21,empieza,’int32’); MVi=read(m,’holdingregs’,1,1,’int32’); signo=read(m,’holdingregs’,28,1,’int32’); if (signo==100) K=-MVi/100; else K=MVi/100; end end Aquí se puede ver como se le llama a la función de la comunicación en el archivo de Simulink. Figura 5.8 Bloque de comunicación en Simulink. 5.4 Visualización En nuestra interfaz añadiremos en total dos gráficas, una para dibujar el tanque de agua y otra para dibujar la gráfica de todo el proceso una vez este haya terminado. Adicionalmente, crearemos un texto estático para introducir el valor del setpoint y cinco botones sin retención, sus funciones serán las siguientes: Iniciar la simulación, terminar la simulación, cambiar el setpoint una vez se introduzca dicho valor en el texto editable, refrescar el dibujo del tanque y dibujar la gráfica del desarrollo de la respuesta del sistema. Nuestra interfaz por lo tanto quedaría así: 5.4 Visualización 41 Después de haber creado nuestra interfaz, iremos a las funciones asociadas a ésta que se crearán automáticamente. Dentro de éstas, cambiaremos las llamadas o ’Callbacks’ de algunos elementos de la interfaz. Por una parte, editaremos la llamada del botón ’Empieza’ de modo que cuando este se pulse empiece la simulación. Para ello, usaremos la función set_param() , esta función cambia los parámetros de un bloque o de un modelo especifico. Los argumentos de dicha función son los siguientes, set_param(Object,ParameterName,Value) . Object hace referencia al modelo que vamos a editar, ParameterName al parámetro que se quiere cambiar y Value el valor nuevo que se le quiere dar. Para la llamada del botón empieza usaremos esta función con los siguientes argumentos para iniciar la simulación set_param() Código 5.2 Empieza_Callback. % --- Executes on button press in Empieza. function Empieza_Callback(hObject, eventdata, handles) % hObject handle to Empieza (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set_param(’pruebaconexionbuena’,’SimulationCommand’,’start’); Para la llamada del botón ’Acaba’ usaremos la misma función cambiando el último argumento y poniendo Stop, para que así se acabe la simulación. Código 5.3 Acaba_Callback. % --- Executes on button press in Acaba. function Acaba_Callback(hObject, eventdata, handles) % hObject handle to Acaba (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set_param(’pruebaconexionbuena’,’SimulationCommand’,’stop’); En la llamada del botón ’Cambia Setpoint’, primero leeremos lo que haya escrito el usuario en el texto editable utilizando la función get() , lo guardaremos en una variable llamada res y por último volveremos a usar la función set_param para cambiar el valor del bloque de simulink con el valor del setpoint. Código 5.4 Cambiaref_Callback. 42 Capítulo 5. Ejemplo de demostración % --- Executes on button press in Cambiaref. function Cambiaref_Callback(hObject, eventdata, handles) % hObject handle to Cambiaref (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) res=get(handles.edit1,’String’); load_system(’pruebaconexionbuena’); find_system(’Name’,’pruebaconexionbuena’); open_system(’pruebaconexionbuena’); set_param(’pruebaconexionbuena/const1’,’Value’,res{1}); En la llamada del botón ’Grafica’, representaremos con una función el desarrollo de la simulación en la segunda gráfica (axes2), para ello usaremos la información que nos devuelve uno de los Scopes que se encuentra dentro de nuestro modelo de Simulink. Solo comentar también que para obtener dicha información almacenada en el Workspace hará falta usar la función evalin(). Código 5.5 Grafica_Callback. % --- Executes on button press in Grafica. function Grafica_Callback(hObject, eventdata, handles) % hObject handle to Grafica (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) ScopeData = evalin(’base’, ’ScopeData’); axes(handles.axes2); plot(ScopeData.time(:),ScopeData.signals.values(:)); Por último, dentro de la llamada del botón ’Visualizar’, representaremos con un dibujo como varía la altura del tanque en tiempo real, para ello primero usaremos la función get_param . Esta función tiene el objetivo contrario a la función set_param , ya que ésta en vez de editar un parámetro, recoge el valor de uno. Como primer argumento pondremos el parámetro del que queremos recoger su valor y como segundo argumento pondremos ’RuntimeObject’, de esta forma se recogerá el valor que tiene en ese momento dicho parámetro durante la simulación. En nuestro caso recogeremos el valor de un bloque que tendrá la información de la altura del tanque de agua. A continuación, utilizaremos otro subprograma para representar dicho tanque llamado water. Código 5.6 Visualizar_Callback. % --- Executes on button press in Visualizar. function Visualizar_Callback(hObject, eventdata, handles) % hObject handle to Visualizar (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % end axes(handles.grafica); rto = get_param(’pruebaconexionbuena/Gain’,’RuntimeObject’); water(rto.OutputPort(1).Data); Este subprograma llamado water recibirá como argumento la altura del tanque de agua. El subprograma dibujará líneas en la gráfica para representar el tanque de agua y creará un rectángulo de color azul con dicha altura para representar el nivel del agua. Cada vez que se vuelva a ejecutar el subprograma se borrará el rectángulo anterior antes de crear el siguiente para que así no haya solapamiento entre uno y otro. Código 5.7 Función water. function water(altura) delete(findobj(’type’, ’patch’)); 5.4 Visualización 43 line([0 1.25 1.25],[14 14 12],’LineWidth’,2,’Color’,’black’); line([0 1.35 1.35],[14.5 14.5 12],’LineWidth’,2,’Color’,’black’); patch([0 1.35 1.35 1.25 1.25 0 0], [14.5 14.5 12 12 14 14 14.5],’blue’,’ EdgeColor’,’none’); line([1.3 1.2],[12 10],’LineWidth’,2,’Color’,’blue’); line([1.3 1.3],[12 10],’LineWidth’,2,’Color’,’blue’); line([1.3 1.4],[12 10],’LineWidth’,2,’Color’,’blue’); line([1 1 2 2], [11 1 1 11],’LineWidth’,2,’Color’,’black’); axis([0 3 0 16]); patch([1 1 2 2 1], [1 altura+1 altura+1 1 1],’blue’,’EdgeColor’,’none’); title("Tanque agua") axis off; drawnow; Por último, vemos como quedaría la visualización una vez simulado el sistema. Figura 5.9 HMI una vez simulado. Índice de Códigos 4.1. Ventana de comando de Matlab para establecer la comunicación 29 5.1. Función lectura_escritura 39 5.2. Empieza_Callback 41 5.3. Acaba_Callback 41 5.4. Cambiaref_Callback 41 5.5. Grafica_Callback 42 5.6. Visualizar_Callback 42 5.7. Función water 42 51 Bibliografía [1] Javier García Caballero y Antonio Nuevo García Juan Manuel Escaño González, Integración de sistemas de automatización industrial, 1ªed., Paraninfo, 2019. [2] Schneider, Licencias ecostruxure machine expert - basic. [3] , Manual ecostruxure machine expert - basic. [4] , Manual somachine. [5] , Registro de somachine. [6] Juan Manuel Escaño González y José María Maestre Torreblanca, Sistemas de medida y regulación, 1 ª ed., Paraninfo, 2018. 53 Índice alfabético 55