Inicio > Foro > Programación IEC 61131 (LogicLab) > Asignación de FILEP de un objeto SysUdpClient
- Este tema tiene 3 respuestas, 2 participantes y se actualizó por última vez 4 años, hace 5 meses da Sergio Bertana.
-
autorPublicación
-
Octubre 19, 2019 en 7: 47 am #50229Paulpartícipe
Debería desarrollar un bloque de funciones para dialogar con objetos de acuerdo con un protocolo orientado a ASCII. Este FB integraría una lógica ya desarrollada en un proyecto que estaba conectado a dispositivos con protocolo Modbus. Tengo un problema al asignar el archivo de puntero al cliente UDP. Para resumir, la lógica es esta.
1- se declaran e instancian en FB SysUdpClient.
2: un ModbusMaster FB se declara y se instancia.
3- se cicla la lista de clientes UDP, y de vez en cuando se 'engancha' el ModbusMaster FB para acceder, uno a la vez, a los dispositivos en el campoEsto es, en pocas palabras, la lógica:
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;
Ahora debería hacer algo como esto, pero reemplazar el modbusmaster FB y mantener la lógica de los clientes Udp, con el nuevo FB Tec2000. Declaré un objeto Tec2000 con
VAR_INPUT Enable : BOOL; SpyOn : BOOL; File : FILEP; //Dichiarazione file pointer Buffer : @USINT;
Octubre 19, 2019 en 8: 02 am #50238Sergio BertanaAdministrador del foroDeclaro que no entendí bien su problema, lo que hizo en la declaración de los parámetros de su bloque de funciones es correcto. Declare un parámetro de entrada de tipo FILEP que luego pasará al FB ModbusMaster que ha instanciado en su bloque de funciones.
¿Ahora tiene un error al compilar o el programa no funciona para usted?
en mdb.Done deshabilitar el Connect Cliente UDP. Esto es inútil, UDP no es un socket como TCP que "recuerda" los datos de conexión, cuando envía datos al archivo del cliente UDP, los envía al otro sistema y luego libera los recursos. Por lo tanto, siempre puede mantenerlo en condición de conexión activa, ya que ha definido un LifeTime, si los datos no pasan a ese cliente durante el tiempo definido automáticamente, se deshabilita y se vuelve a habilitar después de un corto tiempo. Pero en tu caso siempre tienes comunicación.
El valor de IFTime del ModbusMaster en comunicaciones UDP y TCP dado que los paquetes son pequeños (<1Kb) por lo que se envían en una sola trama se puede configurar en “0” con ventajas en el tiempo de comunicación.
Octubre 21, 2019 en 6: 27 am #50256PaulpartícipeLa compilación está bien, el problema radica en el hecho de que me veo obligado a asignar el 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
de lo contrario, en mi FB FILEP siempre es 0. Ahora asignarlo fuera del IF no es un problema, pero no entiendo por qué en el caso del ModbusMaster FB esto no es necesario.
con respecto a la recomendación de conexión del cliente UDP (siempre mantenga la conexión a verdadero), esto también se aplica en el caso de la reasignación de PeerAddress con una dirección diferente cada vez? o en este caso, ¿debería desconectarse y luego reconectarse?
Octubre 21, 2019 en 6: 34 am #50263Sergio BertanaAdministrador del foroComo dije, la conexión del cliente UDP no proporciona mecanismos de sincronización con el servidor como en el caso de las conexiones TCP. Entonces, en su caso, vería bien usar un solo SysUDPClient para administrar todas las conexiones, y podría instanciarlo directamente en su FB. Entonces le pasa al FB solo la dirección IP y el puerto al que debe conectarse.
Con respecto a FILEP, cuando habilita SysUDPClient FB, es posible que se necesiten más bucles de programa antes de la salida File es valorado En su programa anterior, siempre pasaba esta salida al FB ModbusMaster y, por lo tanto, esto se realizó tal vez algunos bucles sin FILEP correcto (si mira el registro, tendrá errores) y luego, cuando se valorizó, el FB funcionó correctamente.
-
autorPublicación
- Debe iniciar sesión para responder a este tema.