Feeding a packaging machine with a frequency driver with Arduino

Feeding a packaging machine with a frequency driver with Arduino

En la industria lechera, las máquinas de envasado se utilizan para envasar los alimentos en recipientes tales como yogur, leche, etc. Por lo general se integran en sistemas más complejos, y están alimentados por un tanque que contiene el producto (por lo general la leche). En este proyecto vamos a diseñar un sistema compuesto de un tanque con leche, una máquina de envasado, una válvula para abrir y cerrar el camino a la máquina, y un PID formado por un medidor de flujo y una bomba controlada por un controlador de frecuencia. Además, el sistema tiene un timbre para alertar a los operadores de la planta en caso de alarmas. El sistema es como se muestra a continuación (clicar en la imágen para ampliar):

filling system v1


Lógica

La máquina de envasado tiene una salida digital que se conectará al PLC. Siempre que la máquina de embalaje necesita más producto a envasar, la salida digital se activará.

El sistema se basa en dos estados principales:

  1. Solicitud producto de máquina de embalaje. El PLC debe:

         – Abrir la válvula de alimentación.

         – Realizar una regulación de flujo en 800 l / h con un lazo PID.

         – Alerta a través de los timbres a los operadores de la planta.

  1. Ninguna solicitud de máquinas de embalaje del producto. El PLC debe:

         – Cierre la válvula de alimentación.

         – Parar la bomba de alimentación (caudal a 0).

 

Además, independientemente de la situación de la máquina de embalaje, el PLC deberá controlar el nivel del tanque de leche y, si el depósito está vacío, comunicar una alarma. Sin embargo, la parte más interesante de este proyecto desde el punto de vista de programación es el PID para desarrollar con el fin de controlar el flujo que alimenta la máquina de envasado. Veámoslo con una imagen a continuación.

PID

El PLC usado en este caso es un M-Duino que controla el flujo a través de una entrada analógica de 0/10 Vdc, y, basándose en el valor de consigna y el valor medido, se calcula una salida utilizando un algoritmo de PID que se envía a la VFD que controla la bomba.

Código

A continuación proporcionamos el código desarrollado en Arduino:

// Industrial Shields by BOOT & WORK CORP.
// Powered by Opiron Electronics -www.opiron.com-
// Jan.2015 technical information for newsletter
// This sketch demonstrates how to use a PID with 
// an M-Duino PLC. The sketch is inspired in a
// real project of a food plant, where we have to 
// feed a packaging machine with milk.
// PID explanation: The purpose of the pid is to 
// to control a loop with a flowmeter and a pump 
// controlled by a frequency driver. The VFD has
// an analog input where we can send the setpoint
// Keywords: PID, industrial automation, frequency driver
//////////////////////////////
//// PLC: M-DUINO MODULE ////
//// Number of Digital inputs: 3 
//// Number of Digital outputs: 2
//// Number of Analog inputs: 1
//// Number of Analog outputs: 1
//// 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) --- Open order to Feed Valve 
//// Q0.4 --- PIN 40 --- Digital Output (24Vdc) --- Buzzer ON / OFF
//// I0.0 --- PIN 22 --- Digital Input (24Vdc) --- Feed Valve Opened Ok 
//// I0.3 --- PIN 25 --- Digital Input (24Vdc) --- Low Switch Level Sensor
//// I0.4 --- PIN 26 --- Digital Input (24Vdc) --- Product Demand from Packing Machine
//// I0.9 --- PIN A2 --- Analog Input (0/10Vdc) --- Feed Flowmeter signal
//// I0.10 --- PIN A3 --- Analog Output (0/10Vdc) --- Setpoint to VFD
//libraries
#include
//Pins defintion
#define Valve_Output 36 // Open order to Feed Valve
#define Buzzer 40 // Buzzer ON/OFF
#define Valve_Input 22 // Feed Valve Opened Ok
#define LSL 25 // Low Switch Level Sensor
#define Product_Demand 26 // Product Demand from Packing Machine
#define FlowMeter A2 // Feed Flowmeter
#define FrequencyDriver A3 // Setpoint to Frequency Driver
// Other constants
#define intervalValve 10000
// Variables
unsigned long Valvetime; // We use time to check if Valve opens when we have sent an Open Order
unsigned long Pumptime; // We use time to check if Pump starts when we have sent a Run Order 
double Setpoint, Input, Output; // PID Values
unsigned long PIDwindowStartTime; // Use it to compare PID Window Time
unsigned long ValvewindowStartTime; // Use it to compare Valve Opening time
boolean valvefail; // 0 = Valve OK, 1=Valve fails
// Objects
PID FlowPID(&Input, &Output, &Setpoint,kp,ki,kd, DIRECT);
void setup() 
{ //Configuration is here:
//Pin settings
 pinMode(Valve_Output, OUTPUT);
 pinMode(Buzzer,OUTPUT);
 pinMode(Valve_Input ,INPUT);
 pinMode(LSL, INPUT);
 pinMode(Product_Demand, INPUT);

 //turn the PID on
 FlowPID.SetMode(AUTOMATIC);
 Setpoint=800;
 // Ini variables

 valvefail=0;

} // End setup
void loop() { // The code in loop() runs repeatedly:
if (LSL) // Alarms check I: LSL
{
 digitalWrite(Valve_Output,LOW);
 digitalWrite(Buzzer, HIGH);
}
else if (valvefail) // Alarms check II: Valve can't be opened
{
 digitalWrite(Valve_Output,LOW);
 digitalWrite(Buzzer, HIGH);
}
else if (Product_Demand) // If no alarm exists, we can send product 
 {
 digitalWrite(Buzzer,LOW);
 Input = analogRead(FlowMeter);
 FlowPID.Compute();
 analogWrite(FrequencyDriver, Output);
 digitalWrite(Valve_Output,HIGH);
 if (Valve_Input==0) //We wait for the Opened confirmation from the valve
 {
 if(millis() - ValvewindowStartTime>intervalValve) //We count 10s until the Valve is Opened. If the Valve doesn't return the opened confirmation, we send an alarm 
 { 
 ValvewindowStartTime += intervalValve;
 valvefail=1;
 }
 } // end If Valve_Input
 else if (Valve_Input==1)
 {
 valvefail=0; 
 } // end Valve_Input==1
 } // end If Product Demand
} // end loop

POWERED BY OPIRON ELECTRONICS
Los comentarios están cerrados