Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Velocità Connessione Mpi S7-cpu226 S7-cpu313


Messaggi consigliati

Inserito:

Ciao a tutti.

In una rete di tipo S7-Connections con un PC di supervisione che fa anche da master di rete e 3 nodi S7-200, vengono aggiunti altri 6 nodi S7-200 e un S7-300. Il 300 viene aggiunto esclusivamente perchè i nuovi nodi 200 comandano via profibus alcuni inverter.

Dal 300 leggo e scrivo vari dati nei 6 nodi 200 con le funzioni X_PUT e X_GET, la rete è impostata ad una velocità di 187.5 Kbit/s, e come struttura del software ho preso ampiamente spunto da uno degli esempio della simens installati con lo Step7. Tutto funziona, ma ad una velocità non esaltante, quando da un 200 do un comando ad un inverter il comando viene ricevuto in circa 2-2,5 secondi. Considerando che sulla stessa rete ci girano i pacchetti del master e quelli del 300 questa "velocità" è giustificata oppure normalmente dovrebbe essere più veloce la comunicazione?

Spero di essermi spiegato bene.

Grazie a tutti.


Inserita:

No non è chiaro , gli inverter che hai aggiunto sono comandati localmente dal s7200 in USS o cosa ?

Oppure il 300 (in questo caso 31x 2dp) fa da 'concentratore - ponte' tra una rete MPI e una rete profibus ?

Se così fosse devi anche considerare le risorse di comunicazione della cpu che hai usato

e se i collegamenti che utilizzi sono superiori a quelli possibili non puoi tenere la comunicazione sempre

attiva ma gestirla dinamicamente il che comporta comunque un sovratempo per la creazione-cancellazione del collegamento

Saluti

Inserita:

Il 300 fa da ponte tra la rete pc <-> 200 e la rete profibus dp degli inverter..

La comunicazione viene chiusa tutte le volte perchè altrimenti mi rimane occupata da alcuni nodi, ed altri non non riescono a comunicare. Comunque ho telefonato all'assistenza Siemens ed un loro tecnico che questa "velocità" è normale. Ti risulta?

Ciao e grazie.

Gabriele Corrieri
Inserita:

Ciao

quanto è la frequenza di scansione dei dati su S7-200? (ossia, ogni quanti ms interroghi lo stesso S7-200)

Ciao

Inserita: (modificato)

Quando finisce lo scambio dati con un 200 (che sia in lettura od in scrittura) ne inizia un'altro.

La fine della comunicazione mi viene data del flag di delle funzioni X_PUT X_GET. Ogni volta che finisce una comunicazione incremento un indice che mi permette di saltare alla prossima funzione di comunicazione.

Ciao, Andrea

Modificato: da drei
Gabriele Corrieri
Inserita:

Ciao Andrea

Quando finisce lo scambio dati con un 200 (che sia in lettura od in scrittura) ne inizia un'altro.

La fine della comunicazione mi viene data del flag di delle funzioni X_PUT X_GET. Ogni volta che finisce una comunicazione incremento un indice che mi permette di saltare alla prossima funzione di comunicazione.

spero che tu capisca che hai detto poco o niente ... il mio scopo è di capire ogni quanto tempo riesci a rileggere o riscrivere il 200.

Hai la rete con 9 S7-200, parti icon l primo XGET, poi XPUT .... nono XGET, nono XPUT, quando ritorni a leggere e scrivere il primo S7-200 quansi mS sono passati?

Altro discorso ... la tua rete mi pare un po' affollata, ci sono 11 dispositivi, di cui 2 master (PC e S7-300) controlla che gli indirizzi siano contigui senza buchi, lascia solo 0,1 e 2 liberi e parti dal 3 fino al termine dei nodi, controlla che gli HSA (high station address sia al valore prossimo al numero massimo di indirizzo (13) in tutti i device), controlla ogni quanto interviene il PC di supervisione in rete, se interviene spesso (leggendo dati che non necessitano di letture rapide) ruba banda ad altri pacchetti, spero che tu conduca le prove senza PG online in quanto saresti il terzo master di rete e rallenteresti la rete e non poco, da ultimo prova a vedere il tempo di reazione della CPU S7-300, ossia provando a lavorare con i comandi dagli I/O locali quanto tempo impiega ad azionare gli inverters.

Ciao

Inserita: (modificato)

Hai ragione, ti chiedo scusa. Allego la sorgente del blocco che gestisce la comunicazione in modo da rendere più chiaro il funzionamento del programma:

FUNCTION "Write_Read" : VOID
TITLE =
VERSION : 0.1


VAR_TEMP
  Init_Get : BOOL; 
END_VAR
BEGIN
NETWORK
TITLE =

//Interrogazione, quale SFC à attiva al momento?

// ID13
      L     MW    50; //SFC X_GET con indirizzo 16 è attiva?
      L     1; 
      ==I ; 
      SPB   m001; //Salto a SFC X_GET
      L     MW    50; //SFC X_PUT con indirizzo 16 è attiva?
      L     2; 
      ==I ; 
      SPB   m002; //Salto a SFC X_PUT
      L     MW    50; //SFC X_ABORT con indirizzo 16 è attiva?
      L     3; 
      ==I ; 
      SPB   m003; //Salto a SFC X_ABORT

// ID15
      L     MW    50; //SFC X_GET con indirizzo 16 è attiva?
      L     7; 
      ==I ; 
      SPB   m007; //Salto a SFC X_GET
      L     MW    50; //SFC X_PUT con indirizzo 16 è attiva?
      L     8; 
      ==I ; 
      SPB   m008; //Salto a SFC X_PUT
      L     MW    50; //SFC X_ABORT con indirizzo 16 è attiva?
      L     9; 
      ==I ; 
      SPB   m009; //Salto a SFC X_ABORT

//ID16
      L     MW    50; //SFC X_GET con indirizzo 16 è attiva?
      L     10; 
      ==I ; 
      SPB   m010; //Salto a SFC X_GET
      L     MW    50; //SFC X_PUT con indirizzo 16 è attiva?
      L     11; 
      ==I ; 
      SPB   m011; //Salto a SFC X_PUT
      L     MW    50; //SFC X_ABORT con indirizzo 16 è attiva?
      L     12; 
      ==I ; 
      SPB   m012; //Salto a SFC X_ABORT

//ID17
      L     MW    50; //SFC X_GET con indirizzo 16 è attiva?
      L     13; 
      ==I ; 
      SPB   m013; //Salto a SFC X_GET
      L     MW    50; //SFC X_PUT con indirizzo 16 è attiva?
      L     14; 
      ==I ; 
      SPB   m014; //Salto a SFC X_PUT
      L     MW    50; //SFC X_ABORT con indirizzo 16 è attiva?
      L     15; 
      ==I ; 
      SPB   m015; //Salto a SFC X_ABORT

// ID18
      L     MW    50; //SFC X_GET con indirizzo 16 è attiva?
      L     16; 
      ==I ; 
      SPB   m016; //Salto a SFC X_GET
      L     MW    50; //SFC X_PUT con indirizzo 16 è attiva?
      L     17; 
      ==I ; 
      SPB   m017; //Salto a SFC X_PUT
      L     MW    50; //SFC X_ABORT con indirizzo 16 è attiva?
      L     18; 
      ==I ; 
      SPB   m018; //Salto a SFC X_ABORT
      BEA ; 
NETWORK
TITLE =Legge i dati dei nodi

// ID13
m001: CALL "X_GET" (
           REQ                      := "Dati_ID13".flagStartLettura,// Attiva lettura
           CONT                     := FALSE,
           DEST_ID                  := W#16#D,// Indirizzo da cui leggere
           VAR_ADDR                 := P#DB1.DBX3000.0 BYTE 2,// Puntatore all'area da leggere dal PLC remoto
           RET_VAL                  := "Dati_ID13".StatoLettura,// Stato della lettura
           BUSY                     := "Dati_ID13".flagStatoLettura,// 1 = Lettura non ancora teminata
           RD                       := "Dati_ID13".Letture.RD1_Segnali);//Area in cui scrive i dati letti dal PLC

// Esito della lettura
      U     "Dati_ID13".flagStatoLettura; 
      FN    M    100.0; 
      SPB   m101; 
      BEA ; 

// ID15
m007: CALL "X_GET" (
           REQ                      := "Dati_ID15".flagStartLettura,// Attiva lettura
           CONT                     := FALSE,
           DEST_ID                  := W#16#F,// Indirizzo da cui leggere
           VAR_ADDR                 := P#DB1.DBX350.0 BYTE 26,// Puntatore all'area da leggere dal PLC remoto
           RET_VAL                  := "Dati_ID15".StatoLettura,// Stato della lettura
           BUSY                     := "Dati_ID15".flagStatoLettura,// 1 = Lettura non ancora teminata
           RD                       := P#DB1.DBX12.0 BYTE 26);//Area in cui scrive i dati letti dal PLC

// Esito della lettura
      U     "Dati_ID15".flagStatoLettura; 
      FN    M    100.2; 
      SPB   m107; 
      BEA ; 


// ID16
m010: CALL "X_GET" (
           REQ                      := "Dati_ID16".flagStartLettura,// Attiva lettura
           CONT                     := FALSE,
           DEST_ID                  := W#16#10,// Indirizzo da cui leggere
           VAR_ADDR                 := P#DB1.DBX350.0 BYTE 26,// Puntatore all'area da leggere dal PLC remoto
           RET_VAL                  := "Dati_ID16".StatoLettura,// Stato della lettura
           BUSY                     := "Dati_ID16".flagStatoLettura,// 1 = Lettura non ancora teminata
           RD                       := P#DB2.DBX12.0 BYTE 26);//Area in cui scrive i dati letti dal PLC


// Esito della lettura
      U     "Dati_ID16".flagStatoLettura; 
      FN    M    100.4; 
      SPB   m110; //Salto all'incremento del merker di comunicazione 
      BEA ; 

// ID17
m013: CALL "X_GET" (
           REQ                      := "Dati_ID17".flagStartLettura,// Attiva lettura
           CONT                     := FALSE,
           DEST_ID                  := W#16#11,// Indirizzo da cui leggere
           VAR_ADDR                 := P#DB1.DBX320.0 BYTE 12,// Puntatore all'area da leggere dal PLC remoto
           RET_VAL                  := "Dati_ID17".StatoLettura,// 1 = Lettura non ancora teminata
           BUSY                     := "Dati_ID17".flagStatoLettura,// Stato della lettura
           RD                       := P#DB3.DBX12.0 BYTE 12);//Area in cui scrive i dati letti dal PLC

// Esito della lettura
      U     "Dati_ID17".flagStatoLettura; 
      FN    M    100.6; 
      SPB   m113; 
      BEA ; 

// ID18
m016: CALL "X_GET" (
           REQ                      := "Dati_ID18".flagStartLettura,// Attiva lettura
           CONT                     := FALSE,
           DEST_ID                  := W#16#12,// Indirizzo da cui leggere
           VAR_ADDR                 := P#DB1.DBX320.0 BYTE 12,// Puntatore all'area da leggere dal PLC remoto
           RET_VAL                  := "Dati_ID18".StatoLettura,// Stato della lettura
           BUSY                     := "Dati_ID18".flagStatoLettura,// 1 = Lettura non ancora teminata
           RD                       := P#DB4.DBX12.0 BYTE 12);//Area in cui scrive i dati letti dal PLC

// Esito della lettura
      U     "Dati_ID18".flagStatoLettura; 
      FN    M    101.0; 
      SPB   m116; 
      BEA ; 
NETWORK
TITLE =Scrive i dati nei nodi

// ID13
m002: CALL "X_PUT" (
           REQ                      := "Dati_ID13".flagStartScrittura,// Attiva scrittura
           CONT                     := FALSE,
           DEST_ID                  := W#16#12,// Indirizzo in cui scrivere
           VAR_ADDR                 := P#DB1.DBX3010.0 BYTE 4,// Puntatore all'area da scrivere dal PLC remoto (VB3010 per 2 Words)
           SD                       := P#DB5.DBX64.0 BYTE 4,// Area in cui legge i dati da scrivere
           RET_VAL                  := "Dati_ID13".StatoScrittura,// Stato della scrittura
           BUSY                     := "Dati_ID13".flagStatoScrittura);// 1 = scrittura non ancora teminata

      U     "Dati_ID13".flagStatoScrittura; 
      FN    M    100.1; 
      SPB   m102; 
      BEA ; 

// ID15
m008: CALL "X_PUT" (
           REQ                      := "Dati_ID15".flagStartScrittura,// Attiva scrittura
           CONT                     := FALSE,
           DEST_ID                  := W#16#F,// Indirizzo in cui scrivere
           VAR_ADDR                 := P#DB1.DBX300.0 BYTE 24,// Puntatore all'area da scrivere dal PLC remoto
           SD                       := P#DB1.DBX64.0 BYTE 24,// Area in cui legge i dati da scrivere
           RET_VAL                  := "Dati_ID15".StatoScrittura,// Stato della scrittura
           BUSY                     := "Dati_ID15".flagStatoScrittura);// 1 = scrittura teminata

      U     "Dati_ID15".flagStatoScrittura; 
      FN    M    100.3; 
      SPB   m108; 
      BEA ; 

// ID16
m011: CALL "X_PUT" (
           REQ                      := "Dati_ID16".flagStartScrittura,// Attiva scrittura
           CONT                     := FALSE,
           DEST_ID                  := W#16#10,// Indirizzo da cui leggere
           VAR_ADDR                 := P#DB1.DBX300.0 BYTE 24,// Puntatore all'area da scrivere dal PLC remoto (VB300 per 4 Words)
           SD                       := P#DB2.DBX64.0 BYTE 24,// Area in cui legge i dati da scrivere
           RET_VAL                  := "Dati_ID16".StatoScrittura,// Stato della scrittura
           BUSY                     := "Dati_ID16".flagStatoScrittura);// 1 = scrittura non ancora teminata

      U     "Dati_ID16".flagStatoScrittura; 
      FN    M    100.5; 
//      S     M    150.2                  // Fine comunicazione con indirizzo 16
      SPB   m111; 
      BEA ; 


// ID17
m014: CALL "X_PUT" (
           REQ                      := "Dati_ID17".flagStartScrittura,// Attiva scrittura
           CONT                     := FALSE,
           DEST_ID                  := W#16#11,// Indirizzo in cui scrivere
           VAR_ADDR                 := P#DB1.DBX300.0 BYTE 10,// Puntatore all'area da scrivere dal PLC remoto (VB300 per 4 Words)
           SD                       := P#DB3.DBX64.0 BYTE 10,// Area in cui legge i dati da scrivere
           RET_VAL                  := "Dati_ID17".StatoScrittura,// Stato della scrittura
           BUSY                     := "Dati_ID17".flagStatoScrittura);// 0 = scrittura teminata

      U     "Dati_ID17".flagStatoScrittura; 
      FN    M    100.7; 
      SPB   m114; 
      BEA ; 

// ID18
m017: CALL "X_PUT" (
           REQ                      := "Dati_ID18".flagStartScrittura,// Attiva scrittura
           CONT                     := FALSE,
           DEST_ID                  := W#16#12,// Indirizzo in cui scrivere
           VAR_ADDR                 := P#DB1.DBX300.0 BYTE 10,// Puntatore all'area da scrivere dal PLC remoto (VB300 per 4 Words)
           SD                       := P#DB4.DBX64.0 BYTE 10,// Area in cui legge i dati da scrivere
           RET_VAL                  := "Dati_ID18".StatoScrittura,// Stato della scrittura
           BUSY                     := "Dati_ID18".flagStatoScrittura);// 1 = scrittura non ancora teminata

      U     "Dati_ID18".flagStatoScrittura; 
      FN    M    101.1; 
      SPB   m117; 
      BEA ; 
NETWORK
TITLE =Abort delle comunicazioni

// Chiude la comunicazione con indirizzo 13
m003: CALL "X_ABORT" (
           REQ                      := "Dati_ID13".flagStartScrittura,
           DEST_ID                  := W#16#D,
           RET_VAL                  := MW   200,
           BUSY                     := M    110.0);

// Finito abort indirizzo 13
      UN    M    110.0; 
      SPB   m103; 
      BEA ; 

// Chiude la comunicazione con indirizzo 15
m009: CALL "X_ABORT" (
           REQ                      := "Dati_ID15".flagStartScrittura,
           DEST_ID                  := W#16#F,
           RET_VAL                  := MW   202,
           BUSY                     := M    110.1);

      UN    M    110.1; 
      SPB   m109; 
      BEA ; 

// Chiude la comunicazione con indirizzo 16
m012: CALL "X_ABORT" (
           REQ                      := "Dati_ID16".flagStartScrittura,
           DEST_ID                  := W#16#10,
           RET_VAL                  := MW   204,
           BUSY                     := M    110.2);

      UN    M    110.2; 
      SPB   m112; 
      BEA ; 

// Chiude la comunicazione con indirizzo 17
m015: CALL "X_ABORT" (
           REQ                      := "Dati_ID17".flagStartScrittura,
           DEST_ID                  := W#16#11,
           RET_VAL                  := MW   206,
           BUSY                     := M    110.3);

      UN    M    110.3; 
      SPB   m115; 
      BEA ; 

// Chiude la comunicazione con indirizzo 18
m018: CALL "X_ABORT" (
           REQ                      := "Dati_ID18".flagStartScrittura,
           DEST_ID                  := W#16#12,
           RET_VAL                  := MW   208,
           BUSY                     := M    110.4);

// Finito abort indirizzo 18
      UN    M    110.4; 
      SPB   m118; 
      BEA ; 
NETWORK
TITLE =Incrementa puntatore per comunicazione

m101: L     2; //Incremento durante l'elaborazione di X_GET
      T     MW    50; 
      BEA ; 
m102: L     3; //Incremento durante l'elaborazione di X_PUT
      T     MW    50; 
      BEA ; 
m103: L     7; 
      T     MW    50; //Incremento durante l'elaborazione di X_ABORT
      BEA ; 
m107: L     8; //Incremento durante l'elaborazione di X_GET
      T     MW    50; 
      BEA ; 
m108: L     9; //Incremento durante l'elaborazione di X_PUT
      T     MW    50; 
      BEA ; 
m109: L     10; 
      T     MW    50; //Incremento durante l'elaborazione di X_ABORT
      BEA ; 
m110: L     11; //Incremento durante l'elaborazione di X_GET
      T     MW    50; 
      BEA ; 
m111: L     12; //Incremento durante l'elaborazione di X_PUT
      T     MW    50; 
      BEA ; 
m112: L     13; 
      T     MW    50; //Incremento durante l'elaborazione di X_ABORT
      BEA ; 
m113: L     14; //Incremento durante l'elaborazione di X_GET
      T     MW    50; 
      BEA ; 
m114: L     15; //Incremento durante l'elaborazione di X_PUT
      T     MW    50; 
      BEA ; 
m115: L     16; 
      T     MW    50; //Incremento durante l'elaborazione di X_ABORT
      BEA ; 
m116: L     17; //Incremento durante l'elaborazione di X_GET
      T     MW    50; 
      BEA ; 
m117: L     18; //Incremento durante l'elaborazione di X_PUT
      T     MW    50; 
      BEA ; 
m118: L     1; // Da abilitare in cantiere
//m118: L     7                           // Da togliere in cantiere
      T     MW    50; //Incremento durante l'elaborazione di X_ABORT
      BEA ; 

END_FUNCTION

I vari flag tipo "Dati_ID13".flagStartLettura", o "Dati_ID17".flagStartLettura" sono sempre ad ON. Le funzioni di Abort in realtà non si attivano mai (il flag di funzionamento rimane sempre ad OFF) quindi esco da quella parte di codice senza aspettare la conclusione del suo "lavoro".

I 200 in rete hanno degli indirizzi che vanno dal 10 al 20 (compresi alcuni che verranno montati in futuro), l'HSA è imposato al valore di default , ma se serve lo metto a 21.

Le prove le ho fatte sia con il PG attaccato che senza PG, da quando lancio un comando per un inverter a quando questo lo riceve passa un tempo variabile che comunque non supera 2 - 2,5 secondi.

Il PC di supervisione affolla non poco la rete perchè deve fare delle letture continue di varie aree da tutti i plc in rete per effettuare visualizzazioni e letture di eventuali allarmi.

Grazie mille, ciao.

Modificato: da drei
Gabriele Corrieri
Inserita:

Ciao

beh ... cidenti ... con 150 byte (se non ho perso i conti) scambiati di continuo più la supervisione che scassa l'anima ... 2 o 2,5 secondi credo che ci stiano dentro.

Le migliorie non è che si possono inventare su due piedi: o limi tutto il limabile sui dati scambiati, come quantità intendo, come frequenze di scambio le devi fare "rolling" altrimenti peggiora ancora, oppure se hai le cpu bi-porta, ti appoggi a quelle, oppure terza chance è di montare un EM277 su ogni cpu S7-200, e a quel punto saranno anche loro slaves profibus, a quel punto tiri la rete PB anche a 12mbit e leggi gli slaves 200 e scrivi gli inverter e viceversa tutto solo sul 300, che bontà sua, dovrebbe reggere lo sforzo, consentendoti tempi di comando e feedback molto più veloci.

Ciao

Inserita:

E pensa che ci devo infilare alri 3 200 con almento 30 byte...

Solo per curiosità, una rete come questa per quale quantità di dati viene usata normalmente?

Grazie mille per i suggerimenti, ciao.

Gabriele Corrieri
Inserita:

Ciao

30 byte cadauno? Cidenti, 240byte :D:lol:

Non è che c'è un numero di unità o di byte, è sempre in relazione a quello che si vuole ottenere, in un processo lento, 2 o anche 5 secondi possono essere trascurabili, in un processo veloce si guarda anche ai millisecondi, e in secondo luogo è in relazione alla rete com'è strutturata, un master solo sicuramente fa meno fracasso di due che si contendono il bus, un master che legge sporadicamente fa meno fracasso di uno che legge a ripetizione.

Se comunque quando avrai la rete al completo vorrai segnalare la soluzione adottata in modo da permettere anche ad altri una valutazione sui limiti e le possibili soluzioni.

Ciao

  • 2 weeks later...
Inserita: (modificato)

Sarebbe sicuramente meglio riprogettare tutto ma non è possibile. Quando ho saputo che tipo di rete era stata progettata ormai avevano già comprato tutto e montato 2 quadri.

Comunque ci ho lavorato un po' e snellito la rete di un 30% dei byte che usavo. Ora non ho tutto i plc per provare (sono gia stati quasi tutti mandati in cantiere) ma dovrei aver guadagnato qualcosa in termini di velocità.

Modificato: da drei

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...