Acasă > forum > Programare IEC 61131 (LogicLab) > Alocarea FILEP a unui obiect SysUdpClient
- Acest subiect are 3 răspunsuri, 2 participanți și a fost actualizat ultima dată 4 ani, acum 6 luni da Sergio Bertana.
-
AutorPost
-
Octombrie 19, 2019 la 7: 47 am #50229Paulparticipant
Ar trebui să dezvolt un bloc de funcții pentru dialog cu obiectele conform unui protocol orientat ascii. Acest FB ar integra o logică deja dezvoltată într-un proiect care a fost conectat la dispozitive cu protocolul modbus. Am o problemă la alocarea fișierului pointer clientului UDP. Pentru a rezuma, logica este aceasta.
1- sunt declarate și instanțiate n FB SysUdpClient.
2 - un ModbusMaster FB este declarat și instanțiat.
3- lista clienților UDP este ciclată și, din când în când, ModbusMaster FB este „conectat” pentru a accesa, unul câte unul, dispozitivele din câmpAceasta este, pe scurt, 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;
Acum ar trebui să fac ceva de genul acesta, dar înlocuind modbusmaster FB și menținând logica clienților Udp, cu noul FB Tec2000. Am declarat un obiect Tec2000 cu
VAR_INPUT Enable : BOOL; SpyOn : BOOL; File : FILEP; //Dichiarazione file pointer Buffer : @USINT;
Octombrie 19, 2019 la 8: 02 am #50238Sergio BertanaAdministrator al forumuluiAfirm că nu am înțeles bine problema dvs., ceea ce ați făcut în declararea parametrilor blocului de funcții este corect. Declarați un parametru de intrare de tip FILEP pe care îl veți trece apoi la FB ModbusMaster pe care l-ați inițiat în blocul de funcții.
Acum aveți o eroare la compilare sau programul nu funcționează pentru dvs.?
în mdb.Done dezactivați funcția Connect Client UDP. Acest lucru este inutil, UDP nu este un socket ca TCP care „reține” datele conexiunii, atunci când trimiteți date către fișierul client UDP, acesta le trimite către celălalt sistem și apoi eliberează resursele. Așadar, îl puteți menține oricând în stare de conectare activă, deoarece ați definit un LifeTime, dacă datele nu sunt transmise clientului respectiv pentru timpul definit automat, acesta este dezactivat și reactivat după un timp scurt. Dar în cazul tău ai întotdeauna comunicare.
Valoarea lui IFTime a ModbusMaster pe comunicațiile UDP și TCP deoarece pachetele sunt mici (<1Kb), deci sunt trimise într-un singur cadru, acesta poate fi setat la „0” cu avantaje în ceea ce privește timpul de comunicare.
Octombrie 21, 2019 la 6: 27 am #50256PaulparticipantCompilația este OK Problema constă în faptul că sunt obligat să aloc FILEP
// 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
altfel în fișierul meu FB este întotdeauna 0. Alocarea în afara IF nu este o problemă, dar nu înțeleg de ce în cazul FB ModbusMaster acest lucru nu este necesar.
cu privire la recomandarea de conectare a clientului UDP (păstrați întotdeauna conectarea la adevărat), aceasta se aplică și în cazul reasignării peerAddress cu o adresă diferită de fiecare dată? sau în acest caz ar trebui deconectat și apoi reconectat?
Octombrie 21, 2019 la 6: 34 am #50263Sergio BertanaAdministrator al forumuluiAșa cum am spus, conexiunea client UDP nu oferă mecanisme de sincronizare cu serverul ca în cazul conexiunilor TCP. Așadar, în cazul dvs. aș vedea bine să folosesc un singur SysUDPClient pentru a gestiona toate conexiunile și l-ați putea instanția direct în FB. Deci, treceți către FB doar adresa IP și portul la care trebuie să se conecteze.
În ceea ce privește FILEP, atunci când activați SysUDPClient FB, este posibil să fie necesare mai multe bucle de program înainte de ieșire File este apreciat. În programul anterior ați transmis întotdeauna această ieșire către FB ModbusMaster și, prin urmare, acest lucru a fost efectuat poate unele bucle fără FILEP corect (Dacă priviți jurnalul veți avea erori) și atunci când a fost valorizat FB a funcționat corect.
-
AutorPost
- Trebuie să fiți autentificat pentru a răspunde la acest subiect.