Beiträge anzeigen

Diese Sektion erlaubt es ihnen alle Beiträge dieses Mitglieds zu sehen. Beachten sie, dass sie nur solche Beiträge sehen können, zu denen sie auch Zugriffsrechte haben.


Themen - Redkanoon

Seiten: [1]
1
Hallo zusammen,

ich werde nicht richtig schlau aus den OSCAT Bausteinen IP CONTROL und IP FIFO, und hoffe das ihr mir helfen könnt.
Ich versuche mit meiner Beckhoff CX5020 meine Fritzbox nach der Anwesenheit verschiedener Devices abzufragen.

Ich habe es bestimmt nicht ganz sauber durchprogrammiert, aber ich habe versucht den POST der hinter GetSpecificHostEntry steckt ( zu finden auf "https://avm.de/service/schnittstellen/" und dort "hostsSCPD.pdf") nach zu programmieren.

Mit einem Device funktioniert das ganze auch nur sobald ich zwei devices abfragen will, sehe ich das immer nur das Kommando für das 2te device versendet wird.

Main
PROGRAM MAIN
VAR
tmrSend: TON;
repeatTime: TIME;

fbOnlineDevice: FB_ONLINE_DEVICE;
fbGetSpecificHostEntry1: FB_GetSpecificHostEntry;
fbGetSpecificHostEntry2: FB_GetSpecificHostEntry;
END_VAR
tmrSend(IN:= NOT tmrSend.Q, PT:=repeatTime);

fbGetSpecificHostEntry1(send:=tmrSend.Q, onlineDevice:= System.phone1);
fbGetSpecificHostEntry2(send:=tmrSend.Q, onlineDevice:= System.phone2);
fbOnlineDevice(onlineDevice:=System.phone1, name:='Phone 1', errorTime:=T#5S);
fbOnlineDevice(onlineDevice:=System.phone2, name:='Phone 2', errorTime:=T#5S);

FB_GetSpecificHostEntry
FUNCTION_BLOCK FB_GetSpecificHostEntry
VAR_IN_OUT
onlineDevice: ONLINE_DEVICE;
END_VAR
VAR_INPUT
send: BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
sendTrig: R_TRIG;
enable: BOOL;
state: BYTE;
ipState: BYTE;
ipID: BYTE;
ipConnection: IP_C;
fbIPControl: IP_CONTROL;
fbIPFIFO: IP_FIFO;

receiveBuffer: NETWORK_BUFFER;
sendBuffer: NETWORK_BUFFER;
END_VAR
sendTrig(CLK:=send);
enable := sendTrig.Q;

CASE state OF
00: (* auf Freigabe warten *)
IF enable THEN
state := 10;
ipState := 1; (* Anmelden *)
END_IF;

10: (* Warten auf Zugriffsfreigabe zum Verbindung aufbauen und Datensenden *)
IF ipState = 3 THEN (* Zugriff erlaubt ? *)

(* IP Datenverkehr einrichten *)
ipConnection.C_PORT := 49000; (* Port-Nummer eintragen *)
ipConnection.C_IP := IP4_DECODE('192.168.1.62'); (* IP eintragen *)
ipConnection.C_MODE := 0; (* Mode: TCP+AKTIV+PORT+IP *)
ipConnection.C_ENABLE := TRUE; (* Verbindungsaufbau freigeben *)
ipConnection.TIME_RESET := TRUE; (* Zeitüberwachung rücksetzen *)
ipConnection.R_OBSERVE := TRUE; (* Datenempfang überwachen *)

(* Empfangslänge rücksetzen *)
receiveBuffer.SIZE := 0;

(* Sendedaten eintragen und Sendelänge eintragen *)
sendBuffer.SIZE := FC_BufferGetSpecificHostEntry(sendBuffer:= sendBuffer, macAddress:=onlineDevice.macAddress);

state := 30;
END_IF;

30: (* Daten- oder Fehlerauswertung durchführen *)
IF ipConnection.ERROR <> 0 THEN
(* Abmelden – Zugriff wieder für andere freigeben *)
ipState := BYTE#4;
state := 00;
ELSIF sendBuffer.SIZE = 0 AND receiveBuffer.SIZE >= 345 THEN
(* Empfangene Daten auswerten *)
FC_EvaluateGetSpecificHostEntry(receiveBuffer:=receiveBuffer, onlineDevice:=onlineDevice);

(* Abmelden – Zugriff wieder für andere freigeben *)
ipState := BYTE#4;
state := 00;
END_IF;
END_CASE;

(* IP_FIFO und IP_CONTROL Zyklisch aufrufen *)
fbIPFIFO(FIFO:=ipConnection.FIFO, STATE:=ipState, ID:=ipID);
fbIPControl(IP_C:=ipConnection, S_BUF:=sendBuffer, R_BUF:=receiveBuffer);

Ich könnte mir vorstellen, dass mein Problem ist, dass ich jetzt zwei Instanzen dieser Baustein aufrufe und somit auch zwei Instanzen von IP_FIFO und IP_CONTROL habe, weis aber nicht ob das erlaubt ist oder nicht und wenn nicht?

Wäre sehr froh wenn mir jemand da mal auf die Sprünge helfen könnte.
Liebe Grüße.

Seiten: [1]