Vai al contenuto
PLC Forum


ModBus TCP s7 1200


Frank681

Messaggi consigliati

Salve

 

Sto sviluppando la lettura dei dati da inverter DSP SOLEIL tramite gateway DATEXEL DAT3580 , se unso un programma windows per leggere i dati dai due inverter tutto OK , se usa la FC per leggere i dati niente da fare finche' leggo il solo dato di un inverter funziona appena ciclicamente cerco di leggerne 2 mi da errore ti timeout 80C8.

 

Di seguito codice  , Grazie per qualsiasi aiuto

 

//Controllo limiti step comunicazione
IF "MB_TCP_STATUS_DIAG_FV".STEP_TCP < 1 OR "MB_TCP_STATUS_DIAG_FV".STEP_TCP > "MB_TCP_STATUS_DIAG_FV".STEP_TCP_MAX THEN
    "MB_TCP_STATUS_DIAG_FV".STEP_TCP := 1;
END_IF;

//Imposta nodo dispositivo
//N.B.: in questo esempio si stanno leggendo dati utilizzando un gateway Modbus TCP --> Modbus RTU.
//L'indirizzo IP rimane quindi invariato (quello del gateway), e si deve impostare
//il parametro MB_UNIT_ID col numero di nodo del dispositivo Modbus RTU.
//In caso di normale utilizzo di Modbus TCP, MB_UNIT_ID non va usato. Si deve invece
//impostare il quarto ottetto dell'indirizzo IP del dispositivo.
CASE "MB_TCP_STATUS_DIAG_FV".STEP_TCP OF
    1:
        // INV 1
        "MB_CLIENT_DB_FV_DIAG".MB_UNIT_ID := 65;
    2:
        // INV 2
        "MB_CLIENT_DB_FV_DIAG".MB_UNIT_ID := 66;
END_CASE;

//Lettura dati
//I dati letti vengono sempre depositati in un'area di "parcheggio" PRK.
//Quest'area deve essere una struttura o un array di un DB "non ottimizzato".
//Se la lettura è terminata in modo corretto, i dati vengono successivamente
//trasferiti nella loro destinazione definitiva.
//La destinazione deve essere una struttura o un array identico a quello di "parcheggio".
//In questo esempio, la destinazione è un array di strutture identiche a PRK.
//In alternativa, si potrebbero depositare i dati direttamente nella destinazione
//definitiva. In questo caso, il DB ""MOD_TCP_RDATA" dovrebbe essere "non ottimizzato".

"MB_CLIENT_DB_FV_DIAG"(REQ:="MB_TCP_STATUS_DIAG_FV".REQ,
                       DISCONNECT:=FALSE,
                       CONNECT_ID:=3,
                       IP_OCTET_1:=192,
                       IP_OCTET_2:=168,
                       IP_OCTET_3:=1,
                       IP_OCTET_4:=100,
                       IP_PORT:=502,
                       MB_MODE:=0,
                       MB_DATA_ADDR:=42001,
                       MB_DATA_LEN:=30,
                       DONE => "MB_TCP_STATUS_DIAG_FV".DONE,
                       BUSY => "MB_TCP_STATUS_DIAG_FV".BUSY,
                       ERROR => "MB_TCP_STATUS_DIAG_FV".ERROR,
                       STATUS => "MB_TCP_STATUS_DIAG_FV".STATUS,
                       MB_DATA_PTR:= "MOD_TCP_PARK_FV_DIAG".PRK );

//SET richiesta lettura
//Attivare la richiesta lettura dopo il richiamo di MB_CLIENT, in modo che
//MB_CLIENT legga per una scansione lo stato FALSE di REQ
"MB_TCP_STATUS_DIAG_FV".REQ := TRUE;

//Lettura andata a buon fine: copia dati da "Parcheggio" a destinazione definitiva
IF "MB_TCP_STATUS_DIAG_FV".DONE THEN
    "MB_TCP_STATUS_DIAG_FV".STATUS_MEM := 0;
    "MOD_TCP_RDATA_FV_DIAG".Device["MB_TCP_STATUS_DIAG_FV".STEP_TCP] := "MOD_TCP_PARK_FV_DIAG".PRK ;
    "MB_TCP_STATUS_DIAG_FV".STEP_TCP := "MB_TCP_STATUS_DIAG_FV".STEP_TCP + 1;
    "MB_TCP_STATUS_DIAG_FV".REQ := FALSE;
END_IF;

//Lettura andata a buon fine o terminata con errore: incrementare Step e resettare REQ
IF "MB_TCP_STATUS_DIAG_FV".DONE OR "MB_TCP_STATUS_DIAG_FV".ERROR THEN
    // MEM ERR
    "MB_TCP_STATUS_DIAG_FV".STATUS_MEM := "MB_TCP_STATUS_DIAG_FV".STATUS;
    //"MB_TCP_STATUS_DIAG_FV".STEP_TCP := "MB_TCP_STATUS_DIAG_FV".STEP_TCP + 1;
    "MB_TCP_STATUS_DIAG_FV".REQ := FALSE;
END_IF;

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