Vai al contenuto
PLC Forum


M340 - Modbus


Suppalele

Messaggi consigliati

Saluti a tutti.

Dal M340 devo caricare alcuni valori da una decina di devices modbus (7 termoregolatori, 2 inverter altivar, 1 zelio).

Premettendo che sto ancora impostando il programma e non sono ancora davanti all'impianto, e che e' la prima volta che lavoro in modbus, pensavo di fare cosi':

1. (strettamente legato allo Unity) uso la funzione ADDR per creare l'indirizzo e mandarla in pasto a READ_VAR (per leggere)

2. analizzare i dati raccolti.

Ora mi ponevo il problema: ogni quanto fare il polling? Ossia, la richiesta di variabili (circa 6 word) implica un certo "tempo" di attesa per ciascun apparecchio, che moltiplicato per 10 puo' diventare un tempo elevato (rispetto ai tempo di ciclo di un plc).

Fortunatamente non si tratta di valori fondamentali. Come posso gestire? Ossia, lancio ogni 5 secondi una SR in cui interrogo tutti gli slave, oppure lancio ogni 2 secondi una SR per ogni slave?

Grazie a chi vorra' darmi una mano..

--

Lele

Link al commento
Condividi su altri siti


La velocità con cui pui chiedere i dati agli slaves dipende oltre che dalla quantità anche dalla velocita di comunucazione degli slaves che ovviamente devono essere concordanti.

Ti consiglio di fare tanti "Rung" per quanti slaves devi interrogare, intebbloccare la richiesta read var con i bit di diagnostica comunicazione, fare uno sroller delle richieste read var generate da un timer per avere un clok che andrai a calibrare per la massima velocità che puoi ottenere, conviene che parti da richieste con cadenza 1 s per poi accorciarle.

Fare tanti rung diventa semplice e comodo qual'ora sui vari slave chiederai redistri con allocazione diversa e con quantità diverse.

Saluti.

Link al commento
Condividi su altri siti

suppongo che tu non disponga di una NOE per utilizzare il servizio I/O Scanning.

Suppongo altresì che tu sia collegato in seriale RS485 e non in Ethernet.

lancio ogni 5 secondi una SR ....

penso che 5 o 2 secondi sia un po' troppo elevato.

Piuttosto crea una tua routine per cui ad ogni comunicazione terminata passi allo slave successivo. In condizioni medie dovresti leggere tutti gli slave in un secondo o poco più tenuto conto che mediamente uno slave dovrebbe riuscire a rispondere entro i 100ms.

Questa gestione richiede un'indicizzazione degli indirizzi (che tu programerai con la funzione ADDR), l'indicizzazione di tutti i parametri non comuni ai 10 slave (indirizzo dei registri da leggere, ecc.). In questo modo avrai una sola istruzione READ_VAR (e non 10 SR differenti) che lancerà una alla volta consecutivamente e ciclicamente tutte le letture.

per inciso il numero di registri da leggere può anche essere trascurato visto che oltre ad essere esiguo, la tua applicazione non richiede velocità particolari come hai indicato.

E' un'idea, non è detto che sia nè l'unica nè la migliore...

Link al commento
Condividi su altri siti

Grazie per le risposte.

Ecco altre domande e dubbi..

Per RDDIEGO:

Ho il modulo NOE 0100 per la comunicazione con un pannello. Il modbus e' invece su 34 2010, quindi in seriale.

Sto provando a mettere giu' in LD la bozza di comunicazione. Ho un dubbio: dovendo comunicare con termoregolatori ERO, dove vado a mettere il codice di lettura (dovrebbe essere lo 03) dei registri?

Grazie per la disponibilita'.

--

Lele

Link al commento
Condividi su altri siti

34 2010

quindi hai anche una rete CanOpen???

Ho il modulo NOE 0100

Allora ti consiglierei di sfruttare il servizio I/O Scanning della scheda col quale eviterai di scrivere alcuna riga di programma.

Per questo però dovrai mettere di mezzo un Gateway Modbus Ethernet/RS485 e se già non l'hai anche uno switch o hub a cui collegare NOE, Gateway e pannello.

Volendo potresti collegare in seriale il pannello ed il Gateway direttamente alla NOE eliminando lo switch o hub.

Sto provando a mettere giu' in LD la bozza di comunicazione

magari molti non saran d'accordo non so ma per questo tipo di programmazioni (comunicazioni) io eviterei il ladder ed userei ST, ma è uguale non ti preoccupare.

dove vado a mettere il codice di lettura (dovrebbe essere lo 03) dei registri?

il codice è certamente 03 ed è rappresentato dalla stringa '%MW' del parametro OBJ

Volevo fare una nota poichè per M340 per gli indirizzi credo tu debba usare la funzione ADDM e non ADDR

Per la gestione delle letture senza usare timer esterni che complicano la faccenda a mio avviso usa semplicemente il bit di attività della comunicazione che è il bit 0 della prima word delle 4 della tabella di gestione. Quando è =0 puoi lanciare una lettura, finchè è =1 attendi che termini la comunicazione.

Per finire se non conosci I/O Scanning che in ogni caso ti raccomando guarda nell' Hel p di Unity e ti farai un'idea...

Link al commento
Condividi su altri siti

quindi hai anche una rete CanOpen???

No. Onestamente non ricordo perche' ho scelto questa CPU (sapevo dall'inizio di dover usare solo modbus per via dei termoregolatori della ERO)... :P

Per questo però dovrai mettere di mezzo un Gateway Modbus Ethernet/RS485 e se già non l'hai anche uno switch o hub a cui collegare NOE, Gateway e pannello.

Volendo potresti collegare in seriale il pannello ed il Gateway direttamente alla NOE eliminando lo switch o hub.

Lo switch (della Schneider, non ricordo quale, comunque a 4 porte) l'ho gia' previsto. Per il gateway ethernet/RS485, non c'e' modo.. Il quadro e' gia' fatto e non c'e' tempo e modo di integrarlo (sabato sono in cantiere!)... comunque grazie per il consiglio, lo terro' presente per le prossime realizzazioni!

l codice è certamente 03 ed è rappresentato dalla stringa '%MW' del parametro OBJ

Quindi, basta mettere %MW al parametro OBJ e gia' sottintende la lettura di registri... bene!

Leggendo qua e la' (qua=PLCForum, la'=Manuali Modicon) ho trovato che non si possono leggere i singoli coil con il M340 dai dispositivi modbus. Ne sai qualcosa?

Grazie mille per il consiglio della tabella di gestione!

Ps

Non riesco pero' a trovare la corrispondenza tra i codici modbus di codifica delle istruzioni con i valori da mettere in OBJ (ad esempio il precedente '%MW'= codice 03). Non so se mi possono servire, pero'..

PPS

Grazie rrdiego della cortesia e disponibilita'!

Link al commento
Condividi su altri siti

Leggendo qua e la'

guarda, leggiti l'hel p di Unity che è un'ottima guida per tutto quello che c'è da sapere sul plc in questione.

ho trovato che non si possono leggere i singoli coil con il M340 dai dispositivi modbus

ti pregherei di indicarmi esattamente dove è detto questo. La funzione read_var per M340 prevede la lettura di bit interni con codice 01 per un massimo di 2000 bit consecutivi in un'unica lettura

Non riesco pero' a trovare la corrispondenza tra i codici modbus di codifica delle istruzioni con i valori da mettere in OBJ

per M340 sono solo due con l'istruzione read_var:

fc 01 = '%M'

fc 03 = '%MW'

con write_var;

fc 05 / 15 = '%M'

fc 06 / 16 = '%MW'

Link al commento
Condividi su altri siti

  • 3 months later...

Buonasera a tutti,

mi potete spiegare, gentilmente, come faccio a leggere i dati di un PM9C con un M340 in seriale?

Non sono pratico di comunicazione MODBUS ed è un pò che ci stò sbattendo la testa.

..

Grazie

:senzasperanza:

Link al commento
Condividi su altri siti

è un pò che ci stò sbattendo la testa

bene, allora partiamo da quello che hai fatto, dove ti sei fermato?

- verificato il collegamento a due fili (RS485) ?

- impostato i parametri di comunicazione del PM ?

- impostato gli stessi identici parametri sulla porta del PLC ?

Per testare il collegamento puoi utilizzare un simulatore modbus master come ModScan32 o altri.

Le funzioni che userai in Unity sono READ_VAR (letture di registri) WRITE_VAR (scritture di registri)

Ricorda che le misure nel PM sono codificate a 32 bit, quindi per ciascuna misura devi sempre leggere 2 registri (è un'ottima regola, valida sempre, leggere un numero di registri pari in modbus)

se vuoi per esempio leggere dal PM con indirizzo slave 1 la tensione concatenata U12 dovrai puntare all'indirizzo 1008 per 2 registri

indirizzo := ADDM (IN := '0.0.0.1');

READ_VAR (ADR := indirizzo,

OBJ := '%MW',

NUM := 1008,

NB := 2,

GEST := rapporto,

RECP => buffer);

Link al commento
Condividi su altri siti

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...