Modbus TCP - Non riesco a leggere valori provenienti da PLC

Salve a tutti,

dopo un pò di mesi di inattività, sono ritornare a sperimentare la comunicazione tra Arduino (Mega) e un PLC Siemens S7-1200.

Il PLC fa da Client, mentre Arduino fa da Server.

In pratica, il PLC invia 3 Int ad Arduino e questi invìa un quarto Int al PLC.

Nel PLC tutto sembra funzionare bene, non ho codici di errore e lo stato dei blocchi MB_Client conferma che i dati sono stati inviati e ricevuti.

Tuttavia, in Arduino qualcosa non va: non legge e non scrive i dati dei registri.

Allego il software:

/* Ottiene i comandi di START, STOP D'EMERGENZA e RESET dal Siemens S7-1200 e scrive tempo sensore nel registro dedicato */

#include <ModbusEthernet.h>

const int START_REG = 40001;  // definisce 3 registri per variabili digitali (101, 102 e 103) e 1 per variabile analogica (40001)
const int EM_STOP_REG = 40002;
const int RESET_REG = 40003;
const int SENSOR_REG = 40021;

int startRobot;  // definisce le variabili associate ai registri
int emStopRobot;
int resetRobot;
int sensorTime;

ModbusEthernet mb;

void setup() {

  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  byte ip[] = { 192, 168, 0, 101 };

  mb.config(mac, ip);

  mb.addIreg(START_REG, 111);  // assegna i registri e li inizializza a 0
  mb.addIreg(EM_STOP_REG, 222);
  mb.addIreg(RESET_REG, 333);
  mb.addHreg(SENSOR_REG, 666);

  Serial.begin(9600);
}


void loop() {

  mb.task();

  startRobot = mb.Ireg(START_REG);  // riscrive le variabili ad ogni ciclo sulla base dei valori del registro, ottenuti dal PLC
  emStopRobot = mb.Ireg(EM_STOP_REG);
  resetRobot = mb.Ireg(RESET_REG);
  sensorTime = mb.Hreg(SENSOR_REG);

  Serial.print("Valori da PLC: ");
  Serial.print(startRobot);
  Serial.print("\t");
  Serial.print(emStopRobot);
  Serial.print("\t");
  Serial.print(resetRobot);
  Serial.print("      Valori verso PLC: ");
  Serial.print("\t");
  Serial.print(sensorTime);
  Serial.println();
}

Questo è invece quello che vedo nel serial monitor, ovvero sempre e solo i valori preimpostati nel sfotware Arduino. Mi aspettavo nei “Valori da PLC” i valori che imposto manualmente nei registri del PLC, mentre il “Valore verso PLC” mi aspettavo di leggerlo nei registri del PLC. INvece nulla di tutto ciò.

Non riesco a capire dove possa essere l’errore. Qualcuno più esperto può darmi una mano ad uscire da queste empasse?

Grazie!

Pasquale

Quale libreria di preciso ? Se ne trovano molte in rete.

Se questa: "GitHub - epsilonrt/modbus-ethernet: A library that allows your Arduino to communicate via Modbus protocol, acting as a slave. Over TCP/IP implementation for Arduino Ethernet shield."
c'e' una nota:
" In the current version the library allows the Arduino operate as a slave , supporting Modbus over TCP."

Sì, la libreria è questa.

Arduino nel mio impiantino fa da slave al PLC che è il master. in pratica il siemens invia ad arduino tre comandi per gestire un braccio robotico e arduino invia al plc una distanza rilevata da una sonda a ultrasuoni.

Non riesco a capire dove sta l’errore…

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