Vai al contenuto

Assegnazione FILEP di un oggetto SysUdpClient

Home Forum Programmazione IEC 61131 (LogicLab) Assegnazione FILEP di un oggetto SysUdpClient

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #50229
    Paolo
    Partecipante

    Dovrei sviluppare un blocco funzione per dialogare con degli oggetti secondo un protocollo ascii oriented. Questo FB andrebbe ad integrare una logica già sviluppata in un progetto che si collegava a dei dispositivi con protocollo modbus. Ho un problema nella assegnazione del file pointer al client UDP. Per sommi capi la logica è questa.

    1- sono dichiarati ed istanziati n FB SysUdpClient.
    2- è dichiarato e istanziato un FB ModbusMaster.
    3- la lista dei client UDP viene ciclata, e di volta in volta si ‘aggancia’ il FB ModbusMaster per accedere, uno alla volta ai dispositivi in campo

    Questa è in sommi capi la logica:

    IF (SysFirstLoop) THEN
        index:=0;
    
        // Parametrizzo il ModbusMaster.
    
        mbd.SpyOn := FALSE;
        mbd.Type := 0;
        mbd.FCode := 3;
        mbd.IFTime := 1000;
        mbd.Timeout := 800;
        mbd.Delay := 1000;
    
        // Inizializzo strutture con parametri di connessione ai dispositivi
    
        Config[0].IP := ADR(MB_CONF_IP_TANK_01);
        Config[0].Buffer := ADR(MB_Memory_T01);
        Config[0].ConnState := ADR(Tank01_Conn);
        Config[0].Node := ADR(MB_CONF_ID_TANK_01);
        Config[0].Address := ADR(MB_CONF_AD_TANK_01);
        Config[0].Points := ADR(MB_CONF_LN_TANK_01);
        Config[0].Disabled := ADR(MB_Tank01_Disabled);
        Config[0].Type := ADR(MB_CONF_MODEL_TANK_01);
        ....
    END_IF;
    
    // Vengono istanziati i client udp
    
    FOR i:=0 TO 9 DO
        udp[i]();
        udp[i].FlushTm := 200;
        udp[i].LifeTm := 40;
        udp[i].PeerAdd := Config[i].IP;
        udp[i].PeerPort := 1000 +i;
        udp[i].LocalPort:= 1000 +i;
        udp[i].LocalAdd := ADR('0.0.0.0');
        udp[i].RxSize := 128;
        udp[i].TxSize := 128;
        udp[i].Connect := NOT Config[i].@Disabled;
    END_FOR;
    
    // Eseguo il FB ModbusMaster
    
    mbd();
    
    IF (NOT mbd.Enable) THEN
        index := index + 1;
        IF (index > 9) THEN
        index := 0;
    END_IF;
    
    //Associazione al FB per modbus e configurazione parametri.
    
    IF (NOT Config[index].@Disabled) THEN 
        n := Config[index].@Type; // Carico indice tabella in base al modello
        mbd.File := udp[index].File;
        mbd.Buffer := ADR(buffer);
        mbd.Node := TO_BYTE (Config[index].@Node);
        mbd.Address := ADDRES_SETUP[n];
        mbd.Points := POINTS_SETUP[n];
        mbd.Enable := TRUE;
        udp[index].Connect := TRUE;
    ELSE
        Config[index].@ConnState := FALSE;
    END_IF;
    
    IF (mbd.Fault) THEN
        gestisco il fault
    END_IF;
    
    IF (mbd.Done) THEN
        mbd.Enable := FALSE;
        udp[index].Connect := FALSE;
    END_IF;
    
    IF (mbd.Ok) THEN
        //recupero i dati letti
    END_IF;

    Ora dovrei fare qualcosa del genere ma sostituendo al FB modbusmaster e mantenendo la logica dei client Udp, con il nuovo FB Tec2000. Ho dichiarato un ogetto Tec2000 con

    VAR_INPUT
    Enable : BOOL;
    SpyOn : BOOL;
    File : FILEP; //Dichiarazione file pointer
    Buffer : @USINT;
    #50238
    Sergio Bertana
    Amministratore del forum

    Premetto che non ho ben capito il tuo problema, quello che hai fatto nella dichiarazione dei parametri del tuo blocco funzione è corretto. Dichiari un parametro in ingresso di tipo FILEP che poi lo passerai alla FB ModbusMaster che avrai istanziato nel tuo blocco funzione.

    Ora hai un errore in compilazione, oppure non ti funziona il programma ?

    Nel mdb.Done disabiliti il Connect dell’UDP client. Questo è inutile, l’UDP non è un socket come il TCP che si “ricorda” i dati di connessione, quando invii dati al file del UDP client questo li invia all’altro sistema e poi rilascia le risorse. Quindi puoi tenerlo sempre in condizione di Connect attivo, visto che hai definito un LifeTime, se su quel client non passano dati per il tempo definito automaticamente si disabilita e riabilita dopo un piccolo tempo. Ma nel tuo caso tu hai sempre comunicazione.

    Il valore di IFTime del ModbusMaster su comunicazioni UDP e TCP visto che i pacchetti sono piccoli (<1Kb) quindi sono inviati in un unico frame si può impostare a “0” con vantaggi sul tempo di comunicazione.

    #50256
    Paolo
    Partecipante

    La compilazione è Ok il problema risiede nel fatto che sono costretto ad assegnare il FILEP fuori di

    // Controllo se devo accedere al dispositivo ed assegno il FILEP.
    
    IF (NOT Config[index].@Disabled) THEN
        .....
        mbd.File := udp[index].File; //--riga incriminata
        .....
    END_I

    altrimenti nel mio FB FILEP è sempre 0. Ora assegnarlo al di fuori della IF non è un problema ma non capisco perchè nel caso del FB ModbusMaster questo non sia necessario.

    in merito al consiglio del connect del client UDP (mantenere il connect sempre a true), questo vale anche nel caso di riassegnazione del PeerAddress con un indirizzo di volta in volta diverso? o in questo caso va disconnesso e poi riconnesso?

    #50263
    Sergio Bertana
    Amministratore del forum

    Come dicevo la connessione UDP client non prevede meccanismi di sincronizzazione con il server come nel caso di connessioni TCP. Quindi nel tuo caso vedrei bene utilizzare un unico SysUDPClient per gestire tutte le connessioni, e potresti istanziarlo direttamente nella tua FB. Così passi alla FB solo l’indirizzo IP e la porta a cui deve connettersi.

    In merito al FILEP, quando abiliti l’FB SysUDPClient potrebbero essre necessari più loop di programma prima che l’uscita File sia valorizzata. Nel tuo programma precedente tui passavi questa uscita sempre alla FB ModbusMaster, e quindi questa veniva eseguita magari alcuni loop senza FILEP corretto (Se guardi il log avrai degli errori) e poi quando era valorizzato il FB lavorava corettamente.

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Devi essere connesso per rispondere a questo topic.