variable desde arduino a PLC s-1200 por modbus

estuve haciendo una bascula y los datos los enviaba a un s7-1200 y funcionaba bien por comunicación modbus
y ahora estoy intentando pasar los datos de una cámara pixy la posición X, Y al s7-1200 y funciona bien el problema es que el s7-1200 con los datos de la bascula era instantáneo y los datos de la cámara tardan unos 7 segundos cuando tendrían que ser instantáneos y no se por que tarda tanto en recibir los datos si alguien sabe por que pasa esto le agradecería su ayuda

#include <EtherCard.h>   
#include <Modbus.h>
#include <ModbusIP_ENC28J60.h>

#include <Pixy2.h>

int posicion_X = 0;
int posicion_Y = 0;

Pixy2 pixy; 



const int Sensor_IREG1=60;
const int Sensor_IREG2=70;

ModbusIP mb;
long ts;

void setup() {
 

  Serial.begin(9600);
 

  byte mac[] = { 0xE0, 0xDC, 0xA0, 0x11, 0xAA, 0x54 }; 
  byte ip[] = { 192, 168, 0, 3 };
  mb.config(mac,ip);
 
  mb.addIreg(Sensor_IREG1);
  mb.addIreg(Sensor_IREG2);
  ts = millis();
  pixy.init();

}
 
void loop() {

     
      int i; 
  posicion_X = (pixy.ccc.blocks[i].m_x);
  posicion_Y = (pixy.ccc.blocks[i].m_y);
  pixy.ccc.getBlocks();
 
  if (pixy.ccc.numBlocks)
   
  {
    
    Serial.println(pixy.ccc.numBlocks);
    delay (200);
    
      Serial.print("  block ");
      Serial.print(i);
      Serial.print(": ");
      pixy.ccc.blocks[i].print();
  }
  
     mb.task();
     if (millis()>ts+20)
        {
          ts = millis();
        
          mb.Ireg(Sensor_IREG1, posicion_X);
          mb.Ireg(Sensor_IREG2, posicion_Y);
           
     Serial.print(" posicion x: ");
     Serial.println( posicion_X );
     Serial.print(" posicion y: ");
     Serial.println( posicion_Y ); 
    }  
  }

arduino es este

No entiendo para que le envías cada 20 mseg datos mas alla que los reciba o no.
Esta claro que no lo hace. Amplia ese tiempo a digamos un conservador 1 seg = 1000 mseg a ver el comportamiento.

Solo observo eso.

NOTA menor:
Otra cosa a futuro que en este caso no modifica en nada tu código es que ts (la variable que comparas con millis() ) debe ser unsigned long no como la has definido del tipo long.

gracias por contestar he probado a poner 1000 ms y con 2000ms pasa lo mismo

tengo un HMI KTP400 de siemens se podría conectar directamente el arduino al HMI sin tener que pasar por un PLC de siemens y mandar datos y recibirlos

Descarto que cuando miras directamente los datos del Pixy éstos llegan a la velocidad que los consultas no? En este caso cada 200 mseg tienes coordenadas nuevas, es así?

Puedes poner el código de tu báscula como para comparar a ver que hay de diferente mas allá de la toma de datos.

si en el monitor serial se actualiza cada 200 mseg el problema es cuando los tiene que enviar por modbus que tarda unos 8 segundos en actualizarse

Coloca el código que usaste para la báscula para poder comparar.

el código de la bascula es este

#include <EtherCard.h>   
#include <Modbus.h>
#include <ModbusIP_ENC28J60.h>
#include "HX711.h"
#define DEBUG_HX711
#define CALIBRACION 2032.2
 

byte pinData = 3;
byte pinClk = 2;
const int Sensor_IREG=50;
int dato = 0;
int tara = 8;
int valorO = 0;  
ModbusIP mb;
long ts;
 
HX711 bascula;

 
void setup() {
 

  Serial.begin(9600);
  pinMode(tara, INPUT);
   
  Serial.println("[HX7] Inicio del sensor HX711");
  bascula.begin(pinData, pinClk);
  bascula.set_scale(CALIBRACION);
  bascula.tare();

  byte mac[] = { 0xE0, 0xDC, 0xA0, 0x11, 0xAA, 0x54 }; 
  byte ip[] = { 192, 168, 0, 3 };
  mb.config(mac,ip);
  mb.addIreg(Sensor_IREG);
  ts = millis();
  
}
 
void loop() {

   
  dato = bascula.get_units() * 100;
  
  mb.task();
     if (millis()>ts+2000)
        {
          ts = millis();
          mb.Ireg(Sensor_IREG, dato);
        }

                             
    valorO = digitalRead(tara);
    char temp = Serial.read();                      
    if (temp == 't' || temp == 'T' || valorO == HIGH )                 
    {
      bascula.tare();                                
      Serial.println(" Balanza calibrada");            
    }
        
    
  
  Serial.print("peso:  ");
  Serial.print(bascula.get_units(), 2);
  Serial.print(" gramos");
  Serial.print(" --dato_PLC--");
  Serial.println(dato);
  
  
}

Primer diferencia

 mb.task();
     if (millis()>ts+2000)
        {
          ts = millis();
          mb.Ireg(Sensor_IREG, dato);
        }

Acá actualizas cada 2 segundos y en el módulo Pixy cada 20 mseg. Ya recuerdo que lo cambiaste y el problema seguía.

Otra cosa que ahora observo es esta. Estas pidiendo cada 20 mseg y luego envias e imprimes. Como te dije en otro post cambia a 1000 o 2000 mseg pero la actualización de ts debes hacerse al final no mientras.
algo asi

     mb.task();
     if (millis()>ts+2000UL)     {
          mb.Ireg(Sensor_IREG1, posicion_X);
          mb.Ireg(Sensor_IREG2, posicion_Y);
         
         // estas presentaciones las haría por fuera de esta parte de código  
         Serial.print(" posicion x: ");
         Serial.println( posicion_X );
         Serial.print(" posicion y: ");
         Serial.println( posicion_Y );
         ts = millis();
    }

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.