Solucionado PLC I/O-ZONE-583 por Arduino en maquina de estados

Hola foro en español, quiero remplazar PLC, por un mega, porque el PLC se corrompió el código, y esta descontinuado ese modelo, y nadie a podido activarlo, me pidieron que intente remplazarlo con Arduino, el hardware ya casi lo tengo listo, solo falta que lleguen unos módulos que vienen en camino, lo que no se deja es el código, empece con uno muy simple, ya hace la secuencia de encendido de los reles pero le falta mas cosas. si me pueden echar una manita (como decimos en México cuando necesitamos ayuda), subo toda la información que tengo, intentare explicar me lo mas claro que me sea posible, para no hacer les perder el tiempo.
Saludos.

Este es el susodicho PLC que tengo que reemplazar por el mega.

#include "max6675.h"

const byte thermoDO  = 6;
const byte thermoCS  = 5;
const byte thermoCLK = 3;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const unsigned long intervalfiltro     = 10000;
const unsigned long intervalventilador = 15000;
const unsigned long intervalvalvula    = 20000;
const unsigned long intervalcombustion = 25000;
const unsigned long intervalEspera     = 30000;

const byte gndPin    = 2;
const byte vccPin    = 3;


#define R1filtro      8
#define R2ventilador  9
#define R3valvula    10
#define R4combustion 11

#define sensorfiltro     22
#define sensorventilador 24
#define sensorvalvula    26
#define sensorcombustion 28

enum estado {INICIO, FILTRO, VENTILADOR, VALVULA, COMBUSTION};
estado estados;
unsigned long tiempofiltro;
unsigned long tiempoventilador;
unsigned long tiempovalvula;
unsigned long tiempocombustion;
unsigned long tiemponuevointento;
unsigned long intervalolecturas = 2500UL;

bool estadosensorfiltro;
bool estadosensorventilador;
bool estadosensorvalvula;
bool estadosensorcombustion;
float temp;
void setup() {

  Serial.begin(9600);
  pinMode(R1filtro,     OUTPUT);
  pinMode(R2ventilador, OUTPUT);
  pinMode(R3valvula,    OUTPUT);
  pinMode(R4combustion, OUTPUT);

  pinMode(sensorfiltro,     INPUT_PULLUP);
  pinMode(sensorventilador, INPUT_PULLUP);
  pinMode(sensorvalvula,    INPUT_PULLUP);
  pinMode(sensorcombustion, INPUT_PULLUP);

  digitalWrite(R1filtro,     HIGH);
  digitalWrite(R2ventilador, HIGH);
  digitalWrite(R3valvula,    HIGH);
  digitalWrite(R4combustion, HIGH);

  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);
  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
}
void loop() {


  if (millis() - intervalolecturas > 3000UL) {
    temp = thermocouple.readCelsius();
    intervalolecturas = millis();

    switch (estados) {
      case INICIO:      
      case FILTRO:
      case VENTILADOR:
      case VALVULA:
      case COMBUSTION:
        if (millis() - tiempofiltro <= intervalfiltro) {
          bool estadosensorfiltro = digitalRead (sensorfiltro);
          if (estadosensorfiltro == HIGH) 
            digitalWrite(R1filtro,  LOW);
           if (estadosensorfiltro == LOW)
            digitalWrite(R1filtro, HIGH);
          
        }
        break;
      
        if (millis() - tiempoventilador >= intervalventilador) {
          bool estadosensorventilador = digitalRead (sensorventilador);
          if (estadosensorventilador == HIGH) 
            digitalWrite(R2ventilador, LOW);
           else 
            digitalWrite(R2ventilador, HIGH);
          
        }
        break;
      
        if (millis() - tiempovalvula >= intervalvalvula) {
          bool estadosensorvalvula = digitalRead (sensorvalvula);
          if (estadosensorvalvula == HIGH){ 
            digitalWrite(R3valvula, LOW);
          } else{ 
            digitalWrite(R3valvula, HIGH);
          }
        }
        break;
      
        if (millis() - tiempocombustion >= intervalcombustion) {
          bool estadosensorcombustion = digitalRead (sensorcombustion);
          if (estadosensorcombustion == HIGH) 
            digitalWrite(R4combustion, LOW);
           else 
            digitalWrite(R4combustion, HIGH);          
        }
        break;
    }
  }
  

}

Esta es un intento de meterlo en un switch, case, break, y ya no paso del renglón 82, el código que si hace la secuencia solo reconoce los sensores de forma individual, y tiene que ser secuencial, si no esta en HIGH filtro no debe continuar la secuencia de ventilador, y así sucesivamente para todos los reles, el PLC usaba thermistores para controlar la temperatura, ahora sera con una sonda tipo K, el PLC se controlaba con una pantalla que se encuentra a 30 mts. del equipo, eso no va a poder ser con el mega.

Se alimenta con 12vdc, gnd, Rnet+ y Rnet- ni idea como opera ese tipo de comunicación, es un cable blindad con 4 hilos, 30 mts. de distancia del equipo, dentro de esa caja, también esta uno de los thermistores, que controla el apagado y encendido del equipo, se ajusta la temperatura que le programe con los botones no tiene histeresis se vuelve a encender 2 grados por debajo del setpoint.

Hola foro, intentare explicar el diagrama de flujo de un control para un sistema de calefacción:
Arranque : tenemos un protector de filtro en la entrada de aire frió, que permanece cerrado mientra no opera el equipo, el cual debe cerrarse al alcanzar la temperatura deseada por el setpoint después de apagarse la turbina 24.5° centígrados, para evitar la entrada de aire frió o insectos a la habitación, mientras esta apagado deberá ser lo primero que se active, abriéndose antes de que se encienda el turbina, de lo contrario se generaría un vació entre la turbina y el filtro, se abre o cierra con un moto reductor de (momento desconozco el tiempo que tarda en abrir) tiene dos micro switch de limite máximo que indican al PLC su posición una vez abierto, debe empezar a operar la turbina (jaula de ardilla de aproximada mente un 1.20 mts. por 90ctm Con un motor de 5 HP.), una vez que la turbina a alcanzado su velocidad de operación un par de sensores de flujo de aire en serie, le indican al PLC cuando esta operando la turbina, seguido activa un modulo de control de llama (honeywell de la serie 7800), que a su vez controla dos electro válvulas en serie, en ese momento el PLC también activa un modulo conversor, (PWM a 0 - 10 volts) que a su vez controla, a una tercera electro válvula proporcional, (al 100% fuego alto y a 50% fuego bajo) el fuego alto inicia si la temperatura es inferior 10° a la establecida en el setpoint, fuego bajo cuanto es inferior a 2° del setpoint una vez alcanzada la temperatura del setpoint se apagara el equipo, se reinicia hasta que la temperatura sea inferior 5° respecto al ajuste del setpoint, (de momento sera via PC que se programe el setpoint), el sistema de medir la temperatura es por thermintores uno en la salida del equipo, y otro en mando de control (que se ubica a 30 metros del equipo) y ajuste. el otro thermistor es de emergencia, si por algún motivo sobre pasa la temperatura establecida por el PLC y el otro se encuentra en la pantalla de control o zona de confort.
Flujo inicio: activar moto reductor de filtro, espera de 30 segundos en lo que abre las persianas, inicia el arranque de la turbina, espera de 60 segundos para permitir alcanzar su velocidad de operación, y arrastre de partículas, seguido se activara el control de flama (honeywell serie 7800) y simultanea mente activa 2 electro válvulas que están en serie, simultáneamente activa el control de señal proporcional, que controla una válvula flujo proporcional, si el modulo consigue encender los quemadores en sus tres intentos, tomara el control el setpoint de la operación hasta alcanzar la temperatura establecida establecida en el.
Flujo de apagado: sera des energizado el modulo serie 7800 al alcanzar el setpoin establecido, al mismo tiempo sera des energizado el modulo con señal proporcional para desactivar la válvula proporcional, quedando activa la turbina y filtro abierto, hasta reducir la temperatura del área de combustión a temperatura ambiente, 120 segundos después se apagara la turbina y tendrá un tiempo de espera de 240 segundos para que la velocidad de inercia llegue a cero y así iniciara el cierre del filtro, hasta que el switch de limite máximo se lo Indique al PLC , no se reiniciara la puesta en marcha, hasta que la temperatura caiga 5° por debajo de lo establecido en el setpoint.
Espero y puedan dar una idea de lo que deseo creo que me embarque en una obra mas grande de lo pensado tengo una semana recabando información y preparando el hardware, que ya esta listo esperando que termine el código.
Saludos.

#include "max6675.h"

const byte thermoDO  = 6;
const byte thermoCS  = 5;
const byte thermoCLK = 3;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const unsigned long intervalfiltro     = 10000;
const unsigned long intervalventilador = 15000;
const unsigned long intervalvalvula    = 20000;
const unsigned long intervalcombustion = 25000;
const unsigned long intervalEspera     = 30000;

const byte gndPin    = 2;
const byte vccPin    = 3;


#define R1filtro      8
#define R2ventilador  9
#define R3valvula    10
#define R4combustion 11

#define sensorfiltro     2
#define sensorventilador 3
#define sensorvalvula    4
#define sensorcombustion 5

enum estado {INICIO, FILTRO, VENTILADOR, VALVULA, COMBUSTION};
estado estados;
unsigned long tiempofiltro;
unsigned long tiempoventilador;
unsigned long tiempovalvula;
unsigned long tiempocombustion;
unsigned long tiemponuevointento;
unsigned long intervalolecturas = 2500UL;

bool estadosensorfiltro;
bool estadosensorventilador;
bool estadosensorvalvula;
bool estadosensorcombustion;
float temp;
void setup() {

  Serial.begin(9600);
  pinMode(R1filtro,     OUTPUT);
  pinMode(R2ventilador, OUTPUT);
  pinMode(R3valvula,    OUTPUT);
  pinMode(R4combustion, OUTPUT);

  pinMode(sensorfiltro,     INPUT_PULLUP);
  pinMode(sensorventilador, INPUT_PULLUP);
  pinMode(sensorvalvula,    INPUT_PULLUP);
  pinMode(sensorcombustion, INPUT_PULLUP);

  digitalWrite(R1filtro,     HIGH);
  digitalWrite(R2ventilador, HIGH);
  digitalWrite(R3valvula,    HIGH);
  digitalWrite(R4combustion, HIGH);

  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);
  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
}
void loop() {


  if (millis() - intervalolecturas > 3000UL) {
    temp = thermocouple.readCelsius();
    intervalolecturas = millis();


    if (millis() - tiempofiltro >= intervalfiltro) {
      bool estadosensorfiltro = digitalRead (sensorfiltro);
      if (estadosensorfiltro = HIGH){
        digitalWrite(R1filtro,  LOW);
    } else{
        digitalWrite(R1filtro, HIGH);
    }
  }
  if (millis() - tiempoventilador >= intervalventilador) {
    bool estadosensorventilador = digitalRead (sensorventilador);    if (estadosensorventilador == HIGH) {
      digitalWrite(R2ventilador, LOW);
    } else
      digitalWrite(R2ventilador, HIGH);
  }
}
if (millis() - tiempovalvula >= intervalvalvula) {
  bool estadosensorvalvula = digitalRead (sensorvalvula);
  if (estadosensorvalvula = HIGH) {
    digitalWrite(R3valvula, LOW);
  } else {
    digitalWrite(R3valvula, HIGH);
  }
}
if (millis() - tiempocombustion >= intervalcombustion) {
  bool estadosensorcombustion = digitalRead (sensorcombustion);
  if (estadosensorcombustion = HIGH) {
    digitalWrite(R4combustion, LOW);
  } else {
    digitalWrite(R4combustion, HIGH);
  }
}
}

Hola @Surbyte, este es el que tiene una secuencia, empieza por rele R1 y progresiva mente aumenta hasta el R4 pero no tiene switch case, por cierto acabo de ver que hay un hilo tuyo con el tema de switch case ya no lo leí tengo mucho sueño ya sera mañana,
Saludos.

No me he leido todo el código pero en la línea 79 creo que el temporizador está mal:

if (millis() - tiempofiltro <= intervalfiltro)

Debería ser ">=" en vez de "<=" para que funcione.

De todas formas veo que ninguna de las variables de tiempo (tiempofiltro, tiempoventilador, tiempovalvula, tiempocombustion) no se actualizan con el valor de millis por lo tanto siempre valen 0. El código debería ser similar a esto:

if ( millis() - temporizador >= tiempo ) {
  // Que hace el temporizador.
  temporizador = millis();
}

Creo que ya te rocomendamos que seas tranquila en el foro. Y ya empiezas a escribir deprisa y corriendo, he estado escribiendo esto y has posteado 3 veces.

Se tranquila y ten paciencia

Ahora me toca leer el "diagrama de flujo" y entenderlo.

No me quedan muchas cosas claras en el flujo que has puesto.

Lo que yo haría:

Identificar el motor de "filtro", ver como se conecta para abrir y para cerrar. Buscaría los finales de carrera para saber exactamente si está abierto o cerrado y usaría un tiempo a modo de seguridad, por ejemplo, si no se ha abierto en X tiempo
dejo de alimentar el motor, doy un fallo y paro el proceso.

Luego se debe encender la turbina/ventilador. En este punto tu dices dos cosas: una que existen dos sensores de flujo que indican si la turbina está operando y luego dices de esperar un minuto que alcance la velocidad. Estudiar los sensores de flujo puede servir para prevenir fallos, ¿qué ocurre si no se alcanza la velocidad?.

A partir de aquí me pierdo. Por un lado dices:

seguido activa un modulo de control de llama (honeywell de la serie 7800), que a su vez controla dos electro válvulas en serie.

¿Quién controla las dos valvulas en serie el PLC o el control de llama.?

Pero también dices:

Si el modulo consigue encender los quemadores en sus tres intentos...

Eso significa que a lo mejor no se encienden. Ese "control de llama" debe tener alguna salida para indicar si hay exito o fallo al encender la llama. Esto es un tema de seguridad importante, si la llama no se enciende y luegos abres la válvula proporcional que controlará la salida de gases puede haber un escape de gas que haga volar la instalación

Así que hay que tratar de averiguar cómo se enciende la llama y como saber si esta encendida para poder continuar el siguiente paso.

Luego dices que el plc toma el control de la válvula proporcional. Hay una consigna de temperatura que son 25.4º, si la temperatura es inferior en 10º se pone la valvula proporcional al 100% y cuando alcance el setpoint-2º se pondrá al 50%.

Luego pones una rutina de apagado que consiste en cerrar las valvulas y apagar la llama, y hay que esperar a que baje la temperatura a la del ambiente. Bien, no se que temperatura es la de ambiente..., y esperas 120s...

Luego apagas el ventilador y esperas 240s para de deje de girar... no será mejor esperar a que los sensores de flujo esten por debajo de un valor pequeño o cero.

Y luego cierras el filtro...

El proceso se vuelve a repetir si la temperatura baja 5º del setpoint.

Hasta ahi lo que he visto. Intentaré ver la máquina de estados y como enfocarla pero me gustaría que me aclarases algo mejor el diagrama. Ten en cuenta, que casi todos los del foro trabajamos y no tenemos mucho tiempo para dedicar al foro.

Hola @victorjam, si tienes razón no e cerrado los ciclos de secuencia de encendido, con su millis correspondiente, y si a sido corriendo, la intención de ese código es para poder hacer las pruebas de campo, hasta hora no e puesto en marcha el equipo, sol e estado energizando el ZONE 583 pero definitiva mente esta muerto.
Para poder determinar tiempos, y sobre todo implementar las medidas de seguridad para evitar cualquier accidente, hoy voy a la planta y solo tengo planeado abrir y cerrar filtro, y revisar rodamientos y posibles obstrucciones en turbina, para ver que tipo de valores arrojan los sensores de filtro y turbina, y por la noche subo al foro la información mas detallada de esos componentes.
Nunca he sido muy diestra para explicarme y con tus comentarios veo que estoy a una eternidad de la forma de explicarse @IgnoranteAbsoluto, veo que eres un buen observador encostraste varias contradicciones que intentare resolver para evitar perdidas de tiempo algo que esta época de la modernidad es escaso.
Saludos.

Una recomendación, haz fotos y documenta todo lo que haya en la planta, no sólo nos ayudará a nosotros, te ayudará más a ti.

Hola @victorjam si la empresa que me contrata me dio para comprar una cámara para endoscopia, para documentar los interiores sin tener desarmar, mi teléfono tiene muy baja resolución ya estando en la planta me prestaran uno. ya le agregue los millis. pero no consigo que los sensores activen o des activen los reles.


#include "max6675.h"

const byte thermoDO  = 6;
const byte thermoCS  = 5;
const byte thermoCLK = 3;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const unsigned long intervalfiltro     = 10000;
const unsigned long intervalventilador = 15000;
const unsigned long intervalvalvula    = 20000;
const unsigned long intervalcombustion = 25000;
const unsigned long intervalEspera     = 30000;

const byte gndPin    = 2;
const byte vccPin    = 3;


#define R1filtro      8
#define R2ventilador  9
#define R3valvula    10
#define R4combustion 11

#define sensorfiltro     2
#define sensorventilador 3
#define sensorvalvula    4
#define sensorcombustion 5

enum estado {INICIO, FILTRO, VENTILADOR, VALVULA, COMBUSTION};
estado estados;
unsigned long tiempofiltro;
unsigned long tiempoventilador;
unsigned long tiempovalvula;
unsigned long tiempocombustion;
unsigned long tiemponuevointento;
unsigned long intervalolecturas = 2500UL;

bool estadosensorfiltro;
bool estadosensorventilador;
bool estadosensorvalvula;
bool estadosensorcombustion;
float temp;
void setup() {

  Serial.begin(9600);
  pinMode(R1filtro,     OUTPUT);
  pinMode(R2ventilador, OUTPUT);
  pinMode(R3valvula,    OUTPUT);
  pinMode(R4combustion, OUTPUT);

  pinMode(sensorfiltro,     INPUT_PULLUP);
  pinMode(sensorventilador, INPUT_PULLUP);
  pinMode(sensorvalvula,    INPUT_PULLUP);
  pinMode(sensorcombustion, INPUT_PULLUP);

  digitalWrite(R1filtro,     HIGH);
  digitalWrite(R2ventilador, HIGH);
  digitalWrite(R3valvula,    HIGH);
  digitalWrite(R4combustion, HIGH);

  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);
  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
}
void loop() {


  if (millis() - intervalolecturas > 3000UL) {
    temp = thermocouple.readCelsius();
    intervalolecturas = millis();


    if (millis() - tiempofiltro >= intervalfiltro) {
      bool estadosensorfiltro = digitalRead (sensorfiltro);
      if (estadosensorfiltro = HIGH){
        digitalWrite(R1filtro,  LOW);
    } else{
        digitalWrite(R1filtro, HIGH);
    }
    tiempofiltro = millis();
  }
  if (millis() - tiempoventilador >= intervalventilador) {
    bool estadosensorventilador = digitalRead (sensorventilador);
    if (estadosensorventilador = HIGH) {
      digitalWrite(R2ventilador, LOW);
    } else {
      digitalWrite(R2ventilador, HIGH);
  }
  tiempoventilador = millis();
}
if (millis() - tiempovalvula >= intervalvalvula) {
  bool estadosensorvalvula = digitalRead (sensorvalvula);
  if (estadosensorvalvula = HIGH) {
    digitalWrite(R3valvula, LOW);
  } else {
    digitalWrite(R3valvula, HIGH);
  }
  tiempovalvula = millis();
}
if (millis() - tiempocombustion >= intervalcombustion) {
  bool estadosensorcombustion = digitalRead (sensorcombustion);
  if (estadosensorcombustion = HIGH) {
    digitalWrite(R4combustion, LOW);
  } else {
    digitalWrite(R4combustion, HIGH);
  }
  tiempocombustion = millis();
}
}
}

sera debo usar if en lugar de bool para leer los sensores

Has olvidado que en C++ una comparación es con dos signos iguales...

if ( estadosendorfiltro == HIGH ) 
  digitalWrite(R1filtro, LOW);
else
  digitalWrite(R1filtro, HIGH);

Y lo has hecho en todas partes...

Hola @victorjam, en filtro si le pongo == ni siquiera se activa el relé en los otros 3 si esta funcionando, los pongo, HIGH se activan los pongo LOW se desactivan estoy revisando las declaraciones para ver por que filtro no admite el == y los demás ventilador válvula combustión si, de momento no e dado con el error

Nota: solo faltaba declarar INICIO por eso no estraba filtro

if (millis() - tiempofiltro >= intervalfiltro) {
  bool estadosensorfiltro = digitalRead (sensorfiltro);
  if (estadosensorfiltro == HIGH) {
    digitalWrite(R1filtro,  LOW);
  } else {
  digitalWrite(R1filtro, HIGH);
  }
  tiempofiltro = millis();
}

Has hecho lo mismo en los cuatro casos, así que con explicar uno vale.

Este código está dentro del if principal de las lecturas y se ejecutan cada
3 segundos.

Pongamos que intervalfiltro es de 5 segundos. Pues cada 5 segundos lee el estado
del sensor y lo plasma en el filtro R1, es decir, a los cinco segundos si el sensor
está activo se enciende el filtro, si esta a low se apaga el filtro.

Ni por asomo es lo que quieres.

Hola @victorjam, esto es solo para hacer pruebas hoy no es para nada un sistema de control.
Saludos.
Nota: ya me voy mi cita es a las 14:00 horas nos vemos mas tarde.

Necesito aclaración, según mi análisis la máquina de estados debe resultar algo como esto:

  • INICIO

Si la temperatura es menor que el setpoint-5 se inicia el proceso.

  • FILTRO_ABRIR

Se pone en marcha la apertura del filtro, hay que esperar a que llegue al final de carrera de abierto. Es recomendable usar una variable de tiempo no para pasar al siguiente paso, si no que se tiene que utilizar como control: si el filtro no está abierto en un tiempo debe dar un error.

  • TURBINA_ENCENDER

Cuando está abierto el filtro se pone en marcha la turbina, aquí o esperamos un
tiempo o esperamos a que los sensores de flujo de aire digan que hay suficiente para
empezar. Al igual que en el caso anterior usaría un tiempo para determinar si se ha alcanzado un flujo suficiente y si no daría error.

  • ENCENDIENDO.

Aquí hay que abrir las válvulas 1 y 2. Ordenar al honeywell que encienda la chispa.
Hay que ver de que manera detecta la llama y como nos informa de ello. Si no hay llama
debemos dar error. Este proceso para mi es el mas importante, así que nada de hacer mas si no sabemos detectar la llama, me niego a tener un escape de gas.

  • CALENTANDO.

La llama esta encendida y controlamos la válvula proporcional con los valores de
temperatura. Si es menor que setpoint-10 la ponemos al 100%, si es menor que setpoint-2 la ponemos al 50%. Cuando se alcanza la temperatura deseada se
empieza a apagar todo.

  • APAGANDO:

Se cierran las tres válvulas y se apaga el honeywell.

  • TURBINA_APAGANDO.

Hay que esperar a que el flujo de aire sea mínimo para seguir con el siguiente paso.

  • FILTRO_CERRAR.

Empezamos a cerrar el filtro. Cuando termina debe ir a INICIO.

Consideraciones:

  • En alas de la seguridad no me gusta trabajar con tiempos cuando hay una final de carrera o sensor que te dice la posición. Imagina que lo haces por tiempo y cuando estas abriendo el filtro, se rompe el motor o se avería la bobina del relé que lo comanda.. ¿Qué ocurre? que el filtro está cerrado y tu no lo sabes, pones en marcha la turbina y sepa dios que pasará. También se puede averiar el final de carrera o sensor pero eso se puede controlar.

  • Me falta un boton de marcha y otro de paro, para poder detener el proceso cuando se desee. Además de alguna que otra cosa.

  • Yo dejaria tres pines libres para dotar al arduino de comunicación modbus, es opcional.

  • Y los ruidos electricos qué?... Cerca de un motor de 5HP... uff... ruidos a mansalva... y eso sin contar los demás aparatos que no sabemos como se van a portar...
    Aquí @Surbyte me puede resolver una duda si lo ha probado puesto que yo no lo he hecho. ¿Cómo se porta el max6675 ante ruidos? Supongo que la parte del SPI no será mucho problema pero por el termopar pueden venir cosas raras.

Aquí ya es prácticamente de noche (España) y si allí son las dos casi pues tenemos un desfase de 6 horas practicamente, con lo cual yo cuando me levante veré tus respuestas. Un saludo.

Filtro abrir

Sepone en marche apertura de filtro

Creo que debe ser controlada por el fin de carrera y despues de fin de carrera le de la señal a mega que haya un tiempo y si si en determinado tiempo no hay señal de fin de carrera debe indicar que hay un error en la apertura

TURBINA ENCENDER

Una vez encendida esperar a los sensores de flujo de aire indiquen que la presion del aire los haya activado esperar un tiempo antes de pasar al siguiente proceso

ENCENDIO DE MODULO 7800

Ya que Arduino haya confirmado que turbina esta funcionando correcta mente energizamos modulo 7800 y modulo proporcional el 7800 se encarga de abrir 2 electrovalvulas de 24vac y el modulo proporcional abre una tercera valvula proporcional el 7800 por su propia naturaleza es muy seguro el sensa la flama con receptor untravioleta que si no hay flama en x segundos espera 90 para evuacuar todo el gas del primer intento reinica el encendido repite la operacion 3 intentos sino esto no sucede envia una señal de error que Arduino puede usar para reportar un error al usuario

CALENTANDO

Si fi 7800 consiguio encender la flama avisa que el sistema esta operando de forma correcta que las dos primeras valvulas estan abiertas que existe flama con normalidad.

PROPORCIONAL

Este mudulo tiene cierta independencia su propia fuente de alimentacion su inicio no es controlado por 7800 el Arduino es quien lo controla si la temperatua esta por debajo de setpoint 10° grados ordena al modulo establecer la abertura de la valvula a 100% si la temperatura llega a 2° por debajo del setpoint le ordena al modulo proporcional que abra la valvula al 50% este mudulo se debe encender y apagar al mismo tiempo que el 7800

Nota aduntare imagen del modulo.

APAGANDO

Si debe ser activado filtro por los finales de carrera pero si e bueno un tiempo entre la señal de fin de carrera y el siguiente paso

Si el boton es buena idea pero solo para poder acceder a ese boton hay que abrir una puerte que para poder abrirla es obigatorio desenergizar el equipo sino se desenegiza hay un mecanismo que impide abrir la puerta con fiens de mantenimiento si es util ese boton

MODBUS

Nunca e usado la comunicación modbus su implementacion seria muy didatica para mi

RUIDO ELECTRICO

La son K es delica al ruido si su diseño es con punta aterrizada sino es casi envulnerable al ruido yo para evitar el ruido por campos magneticos si es de tipo aterrizada las forro con termo cantractil el arduino esta dentro de una caja que evita el ruido en mi experiencia personal el ruido e afecta a mas a las pantalla LCD que a otra cosa.

SONDA K

Existe la posibilidad de que tenga que poner la sonda en el area de confor en ese caso para evitar problemas por la distancia y ruidos electrico (que abundan) enviaria la señal por via corriente usando modulo conversor 4-20 mA osto no esta definido.

Que pases buena noche.


Control proporcional 0 a 10 volts

Espero poder usar este shields (llego hace unos minutos), tiene 5 salidas con re levadores perfectas para voltajes de 24vac, tiene 6 entradas de 5-28vdc hubiese sido perfecto que sus entradas también recibiesen 24vac, (es mucho pedir por 300.00 pesos mexicanos) le queda bien al meg,a solo que ahora tengo que cambiar todos los pines al código para poner el max6675 en otro lugar, ahora ya tengo funcionando el código en el mega, también le puse unos millis a los reles ahora que ya me entiendo mejor con ellos.
Saludos.



#include <max6675.h>
#include<Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20 , 4);


const byte thermoDO  = 6;
const byte thermoCS  = 5;
const byte thermoCLK = 4;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const byte vccPin     = 3;
const byte gndPin     = 2;

const unsigned long intervalfiltro     = 1000;
const unsigned long intervalventilador = 1000;
const unsigned long intervalvalvula    = 1000;
const unsigned long intervalcombustion = 1000;
const unsigned long intervalEspera     = 300;

const unsigned long horacicloR1filtro     = 2000;
const unsigned long horacicloR2ventilador = 2000;
const unsigned long horacicloR3valvula    = 2000;
const unsigned long horacicloR4combustion = 2000;
const unsigned long  ciclo R1,R2,R3,R4    = 600;


#define R1filtro      8
#define R2ventilador  9
#define R3valvula    10
#define R4combustion 11

#define sensorfiltro     22
#define sensorventilador 24
#define sensorvalvula    26
#define sensorcombustion 28

enum estado {INICIO, FILTRO, VENTILADOR, VALVULA, COMBUSTION};
estado estados;
unsigned long tiempoinicio;
unsigned long tiempofiltro;
unsigned long tiempoventilador;
unsigned long tiempovalvula;
unsigned long tiempocombustion;
unsigned long tiemponuevointento;
unsigned long intervalolecturas = 2500UL;

unsigned long cicloinicio;
unsigned long cicloR1filtro;
unsigned long cicloR2ventilador;
unsigned long cicloR3valvula;
unsigned long cicloR4combustion;


bool estadoinicio;
bool estadosensorfiltro;
bool estadosensorventilador;
bool estadosensorvalvula;
bool estadosensorcombustion;
float temp;

void setup() {
  Serial.begin(9600);

  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" advenn air");
  lcd.setCursor(0, 1);
  lcd.print(" MAU-01-04 ");
  delay(3000);

  pinMode(R1filtro,     OUTPUT);
  pinMode(R2ventilador, OUTPUT);
  pinMode(R3valvula,    OUTPUT);
  pinMode(R4combustion, OUTPUT);

  pinMode(sensorfiltro,     INPUT_PULLUP);
  pinMode(sensorventilador, INPUT_PULLUP);
  pinMode(sensorvalvula,    INPUT_PULLUP);
  pinMode(sensorcombustion, INPUT_PULLUP);

  digitalWrite(R1filtro,     HIGH);
  digitalWrite(R2ventilador, HIGH);
  digitalWrite(R3valvula,    HIGH);
  digitalWrite(R4combustion, HIGH);

  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);
}
void loop() {
  ///////////////////////////////////////////////////////////////////////FILTRO
  unsigned long instanteAnterior;
  Serial.println( thermocouple.readCelsius());

  if (millis() - horacicloR1filtro >= cicloR1filtro) {
    if (millis() - tiempofiltro >= intervalfiltro) {
      bool estadosensorfiltro = digitalRead (sensorfiltro);
      if (estadosensorfiltro == HIGH) {
        digitalWrite(R1filtro,  LOW);
      } else {
        digitalWrite(R1filtro, HIGH);
      }
      tiempofiltro = millis();
      cicloR1filtro = millis();
    }
  }
  ///////////////////////////////////////////////////////////////////////VENTILADOR
  if (millis() - horacicloR2ventilador >= cicloR2ventilador) {
    if (millis() - tiempoventilador >= intervalventilador) {
      bool estadosensorventilador = digitalRead (sensorventilador);
      if (estadosensorventilador == HIGH) {
        digitalWrite(R2ventilador, LOW);
      } else {
        digitalWrite(R2ventilador, HIGH);
      }
      tiempoventilador = millis();
      cicloR2ventilador = millis();
    }
  }
  /////////////////////////////////////////////////////////////////////////////VALVULA
  if (millis() - horacicloR3valvula >= cicloR3valvula) {
    if (millis() - tiempovalvula >= intervalvalvula) {
      bool estadosensorvalvula = digitalRead (sensorvalvula);
      if (estadosensorvalvula == HIGH) {
        digitalWrite(R3valvula, LOW);
      } else {
        digitalWrite(R3valvula, HIGH);
      }
      tiempovalvula = millis();
      cicloR3valvula = millis();
    }
  }
  ////////////////////////////////////////////////////////////////////////////////COMBUSTION
  if (millis() - horacicloR4combustion >= cicloR4combustion) {
  if (millis() - tiempocombustion >= intervalcombustion) {
    bool estadosensorcombustion = digitalRead (sensorcombustion);
    if (estadosensorcombustion == HIGH) {
      digitalWrite(R4combustion, LOW);
    } else {
      digitalWrite(R4combustion, HIGH);
    }
    tiempocombustion = millis();
    cicloR4combustion = millis ();
  }
  }
  PRINT_LCD ("Temperatura");
  delay (1000);
}
void PRINT_LCD (String linea) {
  Serial.println( thermocouple.readCelsius());
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(linea);
  delay(500);
  lcd.setCursor(4, 2);
  lcd.print("C = " + String (thermocouple.readCelsius()));
  lcd.print((char)223);
}

Este es para mega 2560 los sensores estan 22-24-26-28
saludos


Control apertura y cierre de filtro.

Micro switch control apertura cierre.
En realidad no e descifrado como funciona activo un relé RE57 abre filtro, cuando abre en su totalidad inicia el ventilador, sin que yo haga nada, activo otro relé RE34 se escucha el clik de otro relé no identificado, y no pasa nada, activo otro relé RE28 y enciende el 7800 pasado 40 segundos abre válvulas inicia la chispa, pasan un par de segundos y inicia la combustión RE34 al parecer solo energiza a RE28.
Des energizo relé RE28, 7800 se apaga la combustión, desactivo relé RE34 y no solo se des energiza rele RE28, sigue activo ventilador y filtro des energizo Re57 apaga ventilador y filtro inicia cerrado como no lo se. RE90 ni lo he tocado.

Les adjunto un esquema.


en el juego de resistencias que terminan en in3 del zone583 es donde terminan los cables procedentes de apertura y cierre de filtro

por si alguien tiene deseos y tiempo de ver algo mas de filtro.
Saludos.

termostato digital th6220d1002 vac o vdch
Hola @victorjam, el problema de control y visualización de temperatura ya esta resuelto, con el control de la imagen, es un termostato digital de muy buena calidad el no requiere de alimentación, (funciona con baterias AA, con 2 años de operación) tiene una entrada común, a 5 micro relés yo ahora solo tengo 4 cables, (blindados cal 18) y ayer confirme, 40 mts. de distancia, desde el equipo hasta el lugar donde donde estaba el antiguo termostato,(termostato segunda imagen del post # 1), lo puede hacer operar como lo hacia con el PLC original del equipo, con el arduino y modulo de 4 canales, y el código que ayudaste a terminar, solo ventilador o ventilador y calefacción, hoy logre que funcionara, la apertura y cierre del filtro la hace el mismo servo motor, si hay energía se abre si no hay energía se cierra, las sondas K ya no son necesarias, el termostato de limite máximo con el que cuanta el equipo es muy confiable, apaga el equipo en caso de sobre pasar 160° (es ajustable de 100° a 200°) esa parte también esta resuelta, (requiere monitorio por parte de Arduino), también el servo motor del filtro, por supuesto el control 7800, (Tiene salida de error), información que Arduino pudiese mostrar los errores en una pantalla lcd i2c instalada en el equipo, para que el equipo de mantenimiento ve el error pueda corregirlo, o llamar al técnico. ahora el código debe tener la función de que si llega la señal por el digital 12 solo funcione ventilador y si llega la señal por el digital 11 sea ventilador y calefacción
Los componentes del hardware serian:
Arduino mega
shields PLC
pantalla LCD con i2c
conversor 4-20mA
adc1115
modulo relés 4 canales
modulo resistencias pullup
conversor de señal de PWM 0-10 volts
termostato honeywell TH6220D1002 Focus Pro
cables calibre 20 diferentes colores
gabinete metal para exterior 20x25x15

Creo que los 42 metros de ida al focus pro, y 42 de regreso, no sean problema en 24vcd, seria mejor en vca pero el shield plc no admite vca, el conversor de corriente a voltaje de la lista, es porque deduzco que el servomotor del filtro envía una señal de corriente de 4-20 mA, por eso el arreglo de resistencias, para convertir la señal de corriente a voltaje, para que pudiese ser leído por el PLC ZONE-586 lo único que no me cuadra es el calibre de los cables, ya no te doy mas lata por hoy.
Nota personal de que región de España eres yo estuve en Cantabria de niña ya casi no recuerdo nada solo que todo era muy bonito.
Saludos,

Hola @victorjam, se han reducido las funciones de Arduino pero ahora las veo mas complejas, no tengo la mas mínima idea de como seria el código si son dos procesos diferentes solo e visto la operación ternaria pero con un solo pin para cambiar el proceso tu tienes idea de si eso es posible.

INICIO:
VENTILADOR CALEFACCIÓN.
Si pin digital D7 esta en HIGH
Se verifica estado de sensores pin digital D22 si sensor filtro esta HIGH Arduino enciende relé RE57 desde el pin digital D2 esperar a que final de carrera indique que servomotor ha terminado de abrir persiana de filtro pin digital 8 está en HIGH Arduino verifica apertura en HIGH sino y sigue en LOW declara error si se indica HIGH Arduino enciende relé RE34 desde pin digital D3 para iniciar funcionamiento de ventilador 30 segundos sin importar el estado de sensores de presión verificando el estado de sensores de presión pin digital D9 primero 0.4 PSI y después 1.25 PSI si sensores indican LOW declara error y si indican HIGH Arduino encenderá el relé RE28 desde su pin digital D4 que pone en marcha Modulo 7800 si no consigue encender la combustión LOW declara error si consigue activar la combustión HIGH Arduino inicia la lectura de sensor de límite máximo pin digital D10 y si esta en HIGH continua con la operación sino declara error si esta en HIGH le termostato pin digital D7 si indica LOW apaga el equipo.
INICIO:
VENTILACIÓN:
Si pin digital 12 está en HIGH solo encenderá filtro y ventilador
Saludos.
Nota veo poco clara mi explicación. de momento no se me ocurre de otra forma ya estoy declarando pines en relación a las entradas y salidas del shields PLC me imagino que surgirán muchas dudas y preguntas yo saldré un rato, a comprar un modulo, que de una señal PWM de Arduino, la convierte en una señal de 1 a 10 volts para el control de la válvula proporcional,solo por un par de horas por si vienes por el foro para responder a tus preguntas.
Saludos.

Buenas, créeme, estoy intentando analizar la información pero me es imposible entender nada.

Lo que tu llamas filtro me parece que de filtro no tiene nada. En realidad es una cámara de combustión y tiene mas controles de lo que parece.

Veo que tienes esquemas, si puedes compartirlos puede que consiga entender mejor el sistema. O en su defecto intenta aclararme mejor el funcionamiento.

PD. Provincia de Cuenca

Hola @victorjam, si es un área donde hay unos paneles filtrantes, la cámara de combustión esta después, ese es el esquema que existe el PDF es un manual de instalación, el servomotor no e conseguido autorización para desarmarlo y ver su interior, algunos equipos iguales no tienen calefacción solo filtro y turbina no hay PLC y la persiana del filtro se abre al energizar y se cierra al des energizar, el funciona de forma autónoma o automática como le quieras llamar, el al terminar de abrirse pone en marcha el ventilador, por intermedio de un contactor o relé,
no hay nada mas ningún otro componente cable sensor estoy hablando de equipo que no tiene calefaccion pero si filtro y ventilador.
Saludos.