Accueil > Forum > Programmation IEC 61131 (LogicLab) > Affectation FILEP d'un objet SysUdpClient
- Ce sujet a 3 réponses, 2 participants et a été mis à jour pour la dernière fois 4 années, 6 mois da Sergio Bertana.
-
auteurPost
-
Octobre 19, 2019 à 7: 47 am #50229PaulPartecipante
Je devrais développer un bloc fonctionnel pour dialoguer avec des objets selon un protocole orienté ascii. Ce FB intégrerait une logique déjà développée dans un projet connecté à des équipements avec protocole Modbus. J'ai un problème pour assigner le fichier de pointeur au client UDP. Pour résumer, la logique est la suivante.
1- sont déclarés et instanciés n FB SysUdpClient.
2: un FB ModbusMaster est déclaré et instancié.
3- la liste des clients UDP est cyclée, et de temps en temps le ModbusMaster FB est `` connecté '' pour accéder, un par un, aux appareils sur le terrainEn résumé, voici la logique:
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;
Maintenant, je devrais faire quelque chose comme cela, mais remplacer le FB Modbusmaster et maintenir la logique des clients Udp, avec le nouveau FB Tec2000. J'ai déclaré un objet Tec2000 avec
VAR_INPUT Enable : BOOL; SpyOn : BOOL; File : FILEP; //Dichiarazione file pointer Buffer : @USINT;
Octobre 19, 2019 à 8: 02 am #50238Sergio BertanaAdministrateur du forumJe déclare que je n'ai pas bien compris votre problème, ce que vous avez fait dans la déclaration des paramètres de votre bloc fonction est correct. Déclarez un paramètre d'entrée de type FILEP que vous passerez ensuite au FB ModbusMaster que vous avez instancié dans votre bloc fonctionnel.
Vous avez maintenant une erreur lors de la compilation ou le programme ne fonctionne-t-il pas pour vous?
En mdb.Done désactiver le Connect Client UDP. Cela ne sert à rien, UDP n'est pas une socket comme TCP qui "se souvient" des données de connexion, lorsque vous envoyez des données au fichier client UDP, il les envoie à l'autre système puis libère les ressources. Ainsi, vous pouvez toujours le garder en condition Connect active, puisque vous avez défini un LifeTime, si les données ne passent pas sur ce client pendant le temps défini automatiquement, il est désactivé et réactivé après un court laps de temps. Mais dans votre cas, vous avez toujours une communication.
La valeur de IFTime du ModbusMaster sur les communications UDP et TCP puisque les paquets sont petits (<1Kb) donc ils sont envoyés dans une seule trame, il peut être mis à «0» avec des avantages sur le temps de communication.
Octobre 21, 2019 à 6: 27 am #50256PaulPartecipanteLa compilation est OK, le problème réside dans le fait que je suis obligé d’attribuer le FILEP sur
// 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
sinon, dans mon FB FILEP, il s'agit toujours de 0. Maintenant, l'affecter en dehors du SI n'est pas un problème, mais je ne comprends pas pourquoi, dans le cas du FB ModbusMaster, cela n'est pas nécessaire.
en ce qui concerne la recommandation de connexion du client UDP (conservez toujours la connexion sur true), cela s'applique également dans le cas de la réaffectation de PeerAddress avec une adresse différente à chaque fois? ou dans ce cas, doit-il être déconnecté puis reconnecté?
Octobre 21, 2019 à 6: 34 am #50263Sergio BertanaAdministrateur du forumComme je l'ai dit, la connexion client UDP ne fournit pas de mécanismes de synchronisation avec le serveur comme dans le cas des connexions TCP. Donc, dans votre cas, je trouverais bien d'utiliser un seul SysUDPClient pour gérer toutes les connexions, et vous pourriez l'instancier directement dans votre FB. Vous ne transmettez donc au FB que l'adresse IP et le port auquel il doit se connecter.
Concernant le FILEP, lorsque vous activez le FB SysUDPClient, il peut prendre plus de boucles de programme avant la sortie File est évalué. Dans votre programme précédent, vous transmettiez toujours cette sortie au FB ModbusMaster. Cette opération a donc peut-être été effectuée avec quelques boucles sans FILEP correct (si vous consultez le journal, vous constaterez des erreurs), puis, une fois valorisé, le FB fonctionne correctement.
-
auteurPost
- Vous devez être connecté pour répondre à ce sujet.