A Conveyor Belt Control System with an Arduino PLC and a Rasberry PI Panel PC HMI

A Conveyor Belt Control System with an Arduino PLC and a Rasberry PI Panel PC HMI

http://www.industrialshields.com

Las cintas transportadoras son muy comunes en la industria: podemos encontrarlas en diferentes industrias como la minería, alimentación y bebidas o productos químicos entre otros. Se utilizan para transportar materiales pesados de un lugar a otro. En este proyecto vamos a hacer un sistema de control basado de una cinta transportadora para la industria alimenticia con un PLC de hardware libre basado en Arduino: el PLC M-Duino que puede ser controlado a través de un software SCADA / HMI.

Introducción

Los requisitos a cumplir para que que la cintra transportadora funciona correctamente son:

  1. Se debe comprobar que la cinta está en funcionamiento todo el rato.
  2. Si un problema ocurre debe avisar al operario de la sección.

Para conseguir los requerimientos la cinta transportadora tiene dispositivos de detección fotoeléctricos y sensores inductivos sensores, luces y relés. Específicamente, los dispositivos de hardware que se programen y su función son los siguientes:

  1. Célula fotoeléctrica: Detectar todos y cada uno de los productos producidos.
  2. Sensor de movimiento inductivo: Detectar el movimiento de la cinta
  3. Salida del relé: Parar el motor de accionamiento de la cinta si un error ocurre.
  4. Luces de aviso: Alerta si se produce una alarma.

El esquema seria como el mostrado a continuación:

picture1Código de programación

En la siguiente parte de este tutorial vamos a programar el M-Duino:

  1. Para la célula fotoeléctrica, vamos a utilizar las interrupciones en el modo ascendente. Cada vez que tenemos una nueva interrupción, un nuevo producto fabricado se ha detectado.
  2. Para detectar que el motor esté en marcha también vamos a utilizar las interrupciones en modo creciente. Cada vez que tenemos una nueva interrupción, podemos contar con un nuevo bucle ciclo detectado.
  3. Vamos a utilizar tres luces de aviso, dos de ellas indicarán alarma si se produce un fallo:
  • Si el motor se ha parado.
  • Si se produce un fallo de la producción, (que significa que no se detecta paso de productos a través de la barrera fotoeléctrica durante más de 30 segundos).

La última luz de aviso vendrá de otra parte de la fábrica e indicará que hay demanda de producto y por lo tanto la cinta transportadora debe estar funcionando. Finalmente comentar que se van a usar relés para parar los motores si una ocurre alguna de las alarmas.

2014111_arduino_code

// Industrial Shields by BOOT & WORK CORP. // Powered by Opiron Electronics -www.opiron.com- // Feb.2015 technical information for newsletter // This sketch demonstrates how to program some // digital input / output signals through an M-Duino // PLC. The sketch is inspired in a real project of a // food plant, where we have to control a conveyor belt. // Keywords: Conveyor Belt, industrial automation. ////////////////////////////// //// PLC: M-DUINO MODULE //// //// Number of inputs: 2 //// Number of outputs: 4 //// you need to configurate the correctly switch position for running like digital / analog or PWM mode ////////////////////////////// //// M-Duino Pins Used: //// Q0.0 — PIN 36 — Digital Output (24Vdc) — Motor Failure Strobe //// Q0.1 — PIN 37 — Digital Output (24Vdc) — Product Demand Strobe //// Q0.2 — PIN 38 — Digital Output (24Vdc) — Product Failure Strobe //// Q0.3 — PIN 39 — Digital Output (24Vdc) — Stop Motor //// I0.0 — PIN 22 — Digital Input (24Vdc) — Photoelectric Barrier sensor, when active, a new product crosses the photoelectric barrier //// I0.1 — PIN 23 — Digital Input (24Vdc) — Inductive sensor, when active, a new loop detected in the motor //Pins defintion #define Motor_Failure_Strobe 36 // Alert if a motor failure alarm occurs #define Product_Demand_Strobe 37 // Alert if a product order is required #define Production_Failure_Strobe 38 // Alert if a production failure occurs #define Stop_Motor 39 // If an alert is detected we will stop the conveyor belt #define Photo_sensor 22 // Photoelectric sensor to detect manufactured products #define Ind_sensor 23 // Inductive sensor to detect the motion in the motor //Thresholds and constant interval times #define MINSPEED_THRESHOLD 500 // We consider that the minimum speed when the motor runs is 500 rpm, if a less speed is detected, we must alert and stop the plant #define time_photo_limit 4500 // We consider an interval of 4,5 seconds as the limit between each product can cross the photoelectric barrier #define rpm_interval 60000 // 1 minute // Variables volatile unsigned int rpm; // Variable to count the speed of the motor, consider rpm as revolutions per minute boolean Alarm; // Variable that says if we are in an alarm state or not unsigned long time_photo; // Variable to count the time between each product cross the photoelectric barrier unsigned long prevTime_rpm; // Variable to count each 60s the rpm of the motor // Functions void speedcount(); void manufacturing(); void setup() // Configuration is here: { // Pin settings pinMode(Motor_Failure_Strobe, OUTPUT); pinMode(Product_Demand_Strobe, OUTPUT); pinMode(Production_Failure_Strobe,OUTPUT); pinMode(Stop_Motor,OUTPUT); pinMode(Photo_sensor, INPUT); pinMode(Ind_sensor, INPUT); // Thresholds settings rpm=MINSPEED_THRESHOLD; // Initial speed value initialized with a higher value of minimun motor speed to disable an initial alarm // Interrupts attachInterrupt(Ind_sensor, speedcount, RISING); // Pin 2 attachInterrupt(Photo_sensor, manufacturing,RISING); // Pin 3 // Variables Alarm=0; } // End setup void loop() // The code in loop() runs repeatedly: { if(millis() – prevTime_rpm > rpm_interval) // Each 60 seconds we reinitialize rpm’s to 0 { prevTime_rpm = millis(); rpm=0; } if (rpm<MINSPEED_THRESHOLD) // Alarms Check I: Motor doesn’t work at the proper speed { digitalWrite(Motor_Failure_Strobe,HIGH); digitalWrite(Stop_Motor,HIGH); Alarm=1; } if(time_photo>time_photo_limit) // Alarms Check II: The manufactured products doesn’t cross the photoelectric barrier { digitalWrite(Production_Failure_Strobe,HIGH); digitalWrite(Stop_Motor,HIGH); Alarm=1; } else if (Product_Demand_Strobe) // Nonmal Conditions { Alarm=0; digitalWrite(Motor_Failure_Strobe,LOW); // The Failure Strobes must be off digitalWrite(Production_Failure_Strobe,LOW); digitalWrite(Stop_Motor,LOW); // The Motor must be running } // End Normal Conditions } // End loop void speedcount() // This function is executed each time that we have a new interrupt { rpm++; // Speed up! } // End speedcount() void manufacturing() // This function is executed each time a new product crosses the photoelectric barrier { time_photo=0; // When a new product crosses the photoelectric cell, the counter must reset } // End manufactuing()

POWERED BY OPIRON ELECTRONICS
Los comentarios están cerrados