Comunicazione Profibus-DP e/o Profinet

Buongiorno a tutti.
Sono nuovo del forum e inizio a porvi subito qualche quesito.

Ho cercato in rete ma ho trovato poco quindi pongo la domanda al mondo: esiste la possibilità di collegare un Arduino con un PLC Siemens (S7-300) tramite protocolli Profibus-DP (PLC come master e Arduino come Slave) oppure in Profinet?
La mia ambizione sarebbe quella di poter leggere degli ingressi analogici tramite Arduino e passarli al PLC in modo che possa elaborarli.

Essendo completamente ignorante in materia di protocolli di comunicazione so neppure se la mia domanda è una bestialità oppure qualcosa di fattibile.
Grazie comunque per qualsiasi risposta.

Se non sbaglio il profibus lavora con RS485 quindi dovresti tradurre i livelli usart in RS485 con il max485 e poi studiarti il protocollo in modo da inviare in modo corretto i pacchetti

Ciao, io mi occupo da svariati anni di sviluppo su sistemi siemens s7/pcs7/pmc ecc,

il mio consiglio... non è così semplice come sembra, implementare il protocollo profibus su arduino, si tratta di un protocollo dalla struttura molto complessa, comprendente "firme" dei messaggi inviati/ricevuti, calcoli di CRC sull'integrità dei dati basati sulla struttura del messaggio stesso o sulla lunghezza LEN impostata per lo scambio dati...

secondo me, potresti implementare il sistema di comunicazione modbus su arduino (esistono già delle librerie e degli esempi in rete) sia su RS232 (nativa), sia su RS485/422 (con MAX485/422), sia su Ethernet mediante uno schield ethernet qualsiasi, ed inserire sul tuo sistema S7-300 una scheda 6ES7-341-xxxx-xxxx con licenza modbus master ed il gioco è fatto, inoltre utilizzando opportunamente alcuni circuiti integrati 8xAI 10bit -> I2C puoi estendere il tuo arduino ad altri N canali analogici.

saluti
Alessandro.

Qui le librerie per il modbus:
http://code.google.com/p/modbusmaster/

Per prima cosa grazie a tutti per le pronte risposte.

In effetti speravo poco in qualcosa di funzionante con Profibus-DP e/o Profinet.
Ora andrò a documentarmi partendo dai link che mi avete comunicato.

Mi permetto di porvi ancora qualche domanda di chiarimento.

  1. Se ho ben compreso ciò che ho letto in rete, in Modbus posso collegarmi sia tramite una scheda PtP (CP341) che se non erro dispone di una interfaccia con connettore a vaschetta 9 pin, che tramite un collegamento con connettori RJ45 e viaggiare sul medesimo cavo della Ethernet/Profinet: in questo caso posso utilizzare le CPU con porte RJ45 incorporata.

  2. In entrambi i casi occorre acquistare una licenza per Modbus master da installare sul PLC per poter comunicare e gestire gli slave.

  3. Se utilizzo il connettore a vaschetta mi connetterò (suppongo) ad una delle seriali dell'Arduino mentre, nel caso di connessione RJ45 occorrerà acquistare una scheda di interfaccia tipo "Ethernet shield".

  4. Nel caso di acquisto licenza Modbus occorre acquistarne una per ogni applicazione che intendo realizzare (tipo licenze runtime) oppure è una sola utilizzabile per più applicazioni? Mi spiego meglio: se ho tre o quattro macchine che vanno in posti differenti occorre acquistare una licenza per ogni macchina? Conoscendo Siemens questa mi pare la classica domanda retorica :P).

  5. Per trasmettere solamente dei dati da una CP341 all'Arduino e viceversa: tipo spedire una serie di misurazioni ogni tot minuti. Posso mandare semplicemente una stringa in seriale che poi verrà interpretata sia dall'Arduino che dal PLC? Capisco che è un sistema molto rozzo rispetto al Modbus ma era solo una curiosità per capire se è fattibile.

Grazie ancora per l'attenzione e la pazienza.
Sono agli inizi e se non trovassi qualcuno che mi indirizza nella giusta direzione, mi perderei nel mare della documentazione disponibile. Grazie davvero.

Se non sbaglio il modbus e gratuito, per il resto non so :slight_smile:

  1. Se ho ben compreso ciò che ho letto in rete, in Modbus posso collegarmi sia tramite una scheda PtP (CP341) che se non erro dispone di una interfaccia con connettore a vaschetta 9 pin, che tramite un collegamento con connettori RJ45 e viaggiare sul medesimo cavo della Ethernet/Profinet: in questo caso posso utilizzare le CPU con porte RJ45 incorporata.

si, il protocollo modbus rtu/ascii può interfacciarsi indipendentemente sia su schede seriali, sia su schede ethernet/cpu profinet

  1. In entrambi i casi occorre acquistare una licenza per Modbus master da installare sul PLC per poter comunicare e gestire gli slave.

si, siemens prevede l'acquisto di una licenza modbus master per ogni controllore "master" presente sulla rete

  1. Nel caso di acquisto licenza Modbus occorre acquistarne una per ogni applicazione che intendo realizzare (tipo licenze runtime) oppure è una sola utilizzabile per più applicazioni? Mi spiego meglio: se ho tre o quattro macchine che vanno in posti differenti occorre acquistare una licenza per ogni macchina? Conoscendo Siemens questa mi pare la classica domanda retorica ).

si, ogni licenza, in teoria, dev'essere installata su una singola applicazione, sempre in teoria 8)

  1. Per trasmettere solamente dei dati da una CP341 all'Arduino e viceversa: tipo spedire una serie di misurazioni ogni tot minuti. Posso mandare semplicemente una stringa in seriale che poi verrà interpretata sia dall'Arduino che dal PLC? Capisco che è un sistema molto rozzo rispetto al Modbus ma era solo una curiosità per capire se è fattibile.

si, ma devi interpretare i dati da entrambe le parti, oltretutto realizzeresti una comunicazione punto-punto in RS232, considerando anche l'enorme sbattimento nella gestione di un protocollo personalizzato sia su cpu S7, sia su arduino!!!


in compenso forse ho trovato la soluzione "economica" al tuo problema:

l'idea è di utilizzare un gateway profibus-DP/CANOpen CAN in Automation (CiA): Not found ed un modulo CANOpen/SPI AvrCard.com is for sale | HugeDomains per l'interfacciamento di arduino 8)

utilizzando in aggiunta, come detto nel precedente post, un'interfaccia AD8x12bit -> I2C come questa: http://www.gravitech.us/i2c128anco.html puoi estendere di N porte le AI presenti su arduino mediante comunicazione seriale I2C.

Ti allego anche l'esempio del produttore per l'interfacciamento con arduino, sono proprio 2 righe di codice:

/******************************************************************************
Example program I2C-ADC interface with Arduino.

SETUP:    I2C-ADC => Arduino
          PIN7 => ground, PIN11 => A5(SCL), PIN12 => A4(SDA), PIN14 => +5V
Note:     The program is written for address 0x90 (Arduino address 0x48).
          This program was tested using Arduino Nano
Document: AD7828 datasheet
Updated:  September 4, 2008
E-mail:   support@gravitech.us
          Gravitech
(C) Copyright 2008 All Rights Reserved
*******************************************************************************/

#include <Wire.h> 

/*******************************************************************************
                      Setup
*******************************************************************************/ 
void setup() 
{ 
  Serial.begin(9600);
  Wire.begin();             // join i2c bus (address optional for master) 
  delay(1000);
} 
 
/*******************************************************************************
                      Main Loop
*******************************************************************************/  
void loop() 
{
  const int I2C_address = 0x48;  // I2C write address 
  const byte DAT[8] = {0x8C,0xCC,0x9C,0xDC,0xAC,0xEC,0xBC,0xFC};
                                 // Constant configuration data
  
  byte Adval_High, Adval_Low;    // Store A/D value (high byte, low byte)
  byte i;                        // Counter

  delay(1000);
  
  for (i=0; i<=7; i++)
  {
    Wire.beginTransmission(I2C_address);
    Wire.send(DAT[i]);        // Configure the device to read each CH  
    Wire.endTransmission(); 
    delay(1);
    
    // Read A/D value
    Wire.requestFrom(I2C_address, 2);
    while(Wire.available())          // Checkf for data from slave
    { 
      Adval_High = Wire.receive();   // Receive A/D high byte
      Adval_Low = Wire.receive();    // Receive A/D low byte
    } 
    
    Serial.print("A/D value CH");
    Serial.print(i, DEC);
    Serial.print(" is ");
    Serial.print(Adval_High,HEX);
    if (Adval_Low <= 0x0F)
      Serial.print("0");
    Serial.println(Adval_Low,HEX);
  }  
  Serial.println();
}

spero di esserti stato utile in qualche modo :slight_smile:
se preferisci una comunicazione più immediata, contattami pure tramite messenger: escaflowne_01@hotmail.com

saluti
Alessandro.

Per prima cosa: sempre grazie tante a tutti :slight_smile:

Tenuto conto che la filosofia Siemens è quella di abbandonare il Profibus-DP a favore del Profinet e che, quindi le nuove CPU non saranno più dotate di porte 9 pin per MPI/Profibus, occorrerà inserire una scheda apposita per comunicare in Profibus-DP. Allora tanto vale utilizzare una scheda Can-Open direttamente sul PLC e interfacciarsi all'Arduino tramite il convertitore CAN-SPI (http://www.avrcard.com/products/can_adapter.htm).
In questo modo potrei ottenere una comunicazione direttamente in Can-Open senza ulteriori conversioni e risparmiando un convertitore.

Mamma mia quante opzioni possibili da testare :grin:
Bene! Appena mi arriveranno gli Arduino che ho ordinato inizierò a fare qualche esperimento.

Che sappiate, il CAN-SPI Adapter (http://www.avrcard.com/products/can_adapter.htm) è un progetto open-source come Arduino oppure un prodotto proprietario? Mi preoccupa il fatto di trovarmi un giorno senza la possibilità di fornire ricambi se il fornitore smettesse di produrlo.

Grazie ancora per tutto l'aiuto,
Valerio.