Que tal buenas noches, una disculpa de antemano si por alguna razón cometo un error, soy nuevo en esto de los foros pero requiero de su apoyo.
Estoy realizando un proyecto en el cual necesito establecer una comunicación entre un PLC LOGO y Arduino, mediante el protocolo TCP/IP. El Logo se usara para controlar un compresor industrial, dicho compresor tiene una válvula que se encarga de la "Carga" y "Descarga" de aire comprimido, y esta válvula no es mas que un motor a pasos y un encoder. Como con el Logo no puedo manejar el motor a pasos (hasta donde yo se), requiero de la ayuda de un Arduino. En fin, sin tanto rollo, anexare capturas de la programación de ambos controladores.
Este es el código para el Arduino, en el cual lo que busco es poder transmitirle valores análogos (En este caso solo 1 como método de prueba) al Logo, y a su vez poder recibir o leer ordenes del PLC, esto como si el Arduino estuviera reportando posición del encoder y que al mismo tiempo el PLC pueda decirle al Arduino girar el Motor a pasos hacia un lado o hacia el otro para abrir o cerrar la válvula, en este caso lo simulo con un potenciómetro conectado al A0, para entregar un valor analogo al PLC y un Led conectado al pin 9 para poder encenderlo y apagarlo según mande el LOGO.
#include <SPI.h>
#include <Ethernet.h>
#include <Modbus.h>
#include <ModbusIP.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 22 };
//Modbus Registers Offsets (0-9999)
const int SENSOR_IREG = 50;
const int sensorPin = A0;
const int LED_COIL = 30;
const int PinLed = 9;
int Sensor1 = 0;
int coil = 0;
//ModbusIP object
ModbusIP mb;
long ts;
void setup() {
Serial.begin(115200);
mb.config(mac, ip);
pinMode(PinLed,OUTPUT);
// Add SENSOR_IREG register - Use addIreg() for analog Inputs
mb.addIreg(SENSOR_IREG);
delay(500);
mb.addCoil(LED_COIL);
ts = millis();
}
void loop() {
//Call once inside loop() - all magic here
mb.task();
Sensor1 = analogRead(sensorPin);
coil = mb.Coil(LED_COIL);
digitalWrite(PinLed, coil);
if (millis() > ts + 150) {
mb.task();
mb.Ireg(SENSOR_IREG, Sensor1);
Serial.print("Valor Enviado por IREG 50 :"); Serial.println(Sensor1);
Serial.print("Valor Recibido por COIL 30 :"); Serial.println(coil);
ts = millis();
}
}
Ahora bien, lo siguiente es una captura del Logo Soft comfort, en donde leo el registro de entrada IR mandado por el Arduino con el valor análogo en el registro 50 (51 en Logo ya que su base es diferente al del Arduino), y busco que al mismo tiempo el PLC pueda escribir en un Coil, ya sea un 1 o un 0, con la intención de que el Arduino prenda o apague el led.
Ahora bien, así como esta en la imágenes, logro recibir perfectamente el valor del potenciómetro en el Logo, pero al activar la salida de red en el Logo, no recibo nada en el Arduino. Cabe mencionar que cuando quito la entrada analoga de red (IR) en el programa del Logo, y dejo solo la salida (Coil), en ese momento si la puedo recibir en el Arduino, osease, solo logo leer un registro a la vez, y no ambos simultáneamente.
No se si logre explicarme, agradecería mucho su apoyo. Saludos.