Assegnazione FILEP di un oggetto SysUdpClient
Home › Forum › Programmazione IEC 61131 (LogicLab) › Assegnazione FILEP di un oggetto SysUdpClient
- Questo topic ha 3 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 5 anni, 6 mesi fa da
Sergio Bertana.
-
AutorePost
-
Ottobre 19, 2019 alle 7:47 am #50229
Paolo
PartecipanteDovrei 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 campoQuesta è 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;
Ottobre 19, 2019 alle 8:02 am #50238Sergio Bertana
Amministratore del forumPremetto 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.
Ottobre 21, 2019 alle 6:27 am #50256Paolo
PartecipanteLa 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?
Ottobre 21, 2019 alle 6:34 am #50263Sergio Bertana
Amministratore del forumCome 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.