Introducción
Nuestra familia de PLCs Raspberry se programa a través de Bash Scripts por defecto, aunque se puede programar con otros lenguajes de programación como Python. Esto puede ser muy útil porque Python es un lenguaje de programación de alto nivel y permite hacer cosas más complejas con menos líneas de código. Te mostramos cómo hacerlo en el siguiente tutorial. En este post verás un ejemplo de cómo programar las entradas de interrupción del PLC de la Raspberry con Python.
Requisitos
Los puntos clave que debes tener en cuenta son los siguientes:
Familia PLC Raspberry
Acceso al PLC: shh. Puedes encontrar nn tutorial sobre cómo acceder al dispositivo a través de Linux o Windows en la Guía del usuario del PLC Raspberry.
Python instalado
Enlaces relacionados
Conceptos básicos sobre salidas digitales del PLC industrial Raspberry
Leer >>
Cómo encontrar tu PLC industrial ideal
Leer >>
Interrupción externa mediante un sensor de etiquetas capacitivo con un PLC industrial basado en Arduino
Productos dela familia PLC Raspberry
Leer >>
Ejemplo de código
Para este ejemplo, necesitas importar las librerías que puedes ver al principio del código, teniendo en cuenta que "signal", "sys" y "RPi.gpio" son imprescindibles para trabajar con entradas de interrupción en Python con un PLC Raspberry. El INT_GPIO debe ser el GPIO de la Raspberry que vas a configurar como entrada de interrupción, en este caso el 13, que es el INT. Si no conoces el mapeo entre los GPIOs de la Raspberry y las E/S de tu PLC, puedes echar un vistazo a estas tablas, incluidas también en el Ficha técnica y la Guía de Usuario.
Para continuar con la explicación, debes saber que una señal es una interrupción de software entregada a un proceso. El sistema operativo utiliza las señales para informar de situaciones excepcionales a un programa en ejecución.
La primera función es signal_handler, una función que tiene que ser llamada si se anticipa un evento que desencadena una señal, y se le puede decir al sistema operativo que la ejecute cuando llegue ese tipo de señal en particular. En este caso, este handler hace un GPIO.cleanup() y un sys.exit(0) cuando detecta un CTRL+C (comando que envía un SIGINT).
La segunda función se llama int_activated_callback y, dentro de ella, puedes poner el código que quieres que se ejecute cuando se active la interrupción..
Por último, está el GPIO.setmode, configurándolo siguiendo la disposición de los GPIOs del BCM, el GPIO.setup, configurándolo con el número de las entradas de interrupción del GPIO, si el flanco de activación va a ser el FALLING o el RISING, el callback de activación y el bouncing time (que es el periodo que no se va a activar ninguna interrupción para evitar el rebote de la señal). El signal.signal es la función para activar el signal_handler, explicado anteriormente. El último bucle infinito es simplemente para probar que puedes estar ejecutando otros procesos en tu código mientras la interrupción está lista para ser activada.
Así, si ejecutas este código, realizará impresiones de "Trabajo" indefinidas hasta que se active la interrupción. Cuando detecte un flanco descendente en la señal, las impresiones anteriores se detendrán, la interrupción se activará y verás la impresión "INT activada" una vez, luego las impresiones de "Trabajo" continuarán hasta que se active otra interrupción (siempre respetando el tiempo de rebote de 1000 ms).
/* Copyright (c) 2019 Boot&Work Corp., S.L. All rights reserved This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */
import signal import sys import time import RPi.gpio as gpio import BUTTON.GPIO as gpio INT_GPIO = 13 def signal_handler(sif, frame): GPIO.cleanup() sys.exit(0) def int_activated_callback(channel): print("INT activated") if __name__ == '__main__': GPIO.setmode(GPIO.BCM) GPIO.setup(INT_GPIO, GPIO.FALLING, callback=int_activated_callback, bouncetime=1000) signal.signal(signal.SIGINT, signal_handler) while 1: print ("Work") time.sleep(0.1)
La interrupción tiene que ser provocada por una activación de la señal de entrada, ya sea por un flanco ascendente o un flanco descendente. Para probarlo, puedes conectar el GND del sensor al GND optoaislado de la entrada que vas a utilizar ((-)IX.5) y la salida del sensor a la señal de entrada de interrupción(IX.5/INT). Cuando el sensor digital se active, verás la activación de la interrupción también. Aquí tienes un ejemplo de una de las entradas de interrupción del PLC, con el pin GND y el pin SIGNAL::