Hilfe bei mehreren UDP Verbindungen mit IP_Control und IP_FIFO

Begonnen von lf, 03. August 2015, 15:25:13

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

lf

Hallo zusammen,

ich möchte drei Wenglor WeQube Kameras via UDP an meine CoDeSys V2.3 Steuerung anbinden. Da bei allen Kameras der UDP Sendeport fest auf 32002 eingestellt ist, muss ich mich der Reihe nach mit den Kameras verbinden, auf Daten warten, dann mit der nächsten verbinden, usw.

Dazu wollte ich die Bausteine IP_Control und IP_Fifo verwenden, werde jedoch nicht ganz schlau daraus.
Was mache ich denn falsch?

CASE iCameraStep OF

5: (* Ressourcen anfragen *)
byID := 1;
byFifoState := 1;
iCameraStep := 10;

10: (* Warte auf Freigabe *)
IF (byFifoState = 3) THEN
(* Verbindungsparameter *)
sIpAdress := '192.168.10.207';
stIP_C.C_ENABLE := TRUE;
stIP_C.TIME_RESET := TRUE;
stIP_C.R_OBSERVE := TRUE;
stR_BUF.SIZE := 0;

(* Sendedaten einrichten *)
stS_BUF.SIZE := 0;
stS_BUF.BUFFER[0] := 0;
iCameraStep := 15;
END_IF

15: (* Fehler abfangen *)
IF (stIP_C.ERROR <> 0) THEN
xErrorClient := 1;
ELSIF (stS_BUF.SIZE = 0) AND (stR_BUF.SIZE >= 0) THEN
byClient1Data1 := stR_BUF.BUFFER[0];
byClient1Data2 := stR_BUF.BUFFER[1];
byClient1Data3 := stR_BUF.BUFFER[2];

(* Abmelden *)
byFifoState := 4;
stIP_C.C_ENABLE := FALSE;
stIP_C.R_OBSERVE := FALSE;
iCameraStep := 17;
END_IF

17:
IF (byFifoState = 5) THEN
iCameraStep := 20;
END_IF


20: (* Ressourcen anfragen *)
byID := 2;
byFifoState := 1;
iCameraStep := 25;

25: (* Warte auf Freigabe *)
IF (stIP_C.C_STATE = 3) THEN
(* Verbindungsparameter *)
sIpAdress := '192.168.10.205';
stIP_C.C_ENABLE := TRUE;
stIP_C.TIME_RESET := TRUE;
stIP_C.R_OBSERVE := TRUE;
stR_BUF.SIZE := 0;

(* Sendedaten einrichten *)
stS_BUF.SIZE := 0;
stS_BUF.BUFFER[0] := 0;
iCameraStep := 30;
END_IF

30: (* Fehler abfangen *)
IF (stIP_C.ERROR <> 0) THEN
xErrorClient := 1;
ELSIF (stS_BUF.SIZE = 0) AND (stR_BUF.SIZE >= 0) THEN
byClient1Data1 := stR_BUF.BUFFER[0];
byClient1Data2 := stR_BUF.BUFFER[1];
byClient1Data3 := stR_BUF.BUFFER[2];

(* Abmelden *)
byFifoState := 4;
stIP_C.C_ENABLE := FALSE;
stIP_C.R_OBSERVE := FALSE;
iCameraStep := 35;
END_IF

35:
IF (byFifoState = 5) THEN
iCameraStep := 5;
END_IF


END_CASE

stIP_C.C_MODE := 3; (* UDP passiv mit IP und Port *)
stIP_C.C_PORT := 32002;


fbIPControl(
IP:= IP4_DECODE(sIpAdress),
PORT:= ,
TIME_OUT:= ,
IP_C:= stIP_C,
S_BUF:= stS_BUF,
R_BUF:= stR_BUF);

fbIpFifo(
FIFO:= stIP_C.FIFO,
ID:= byID,
STATE:= byFifoState(*stIP_C.C_STATE*));


Vielen Dank schon mal für die Hilfe!

lf

peewit

hi

du brauchst den fifo baustein nicht

du kannst mit jeder kamera gleichzeitig kommunizieren
da jede kamera eine andere ip-adresse hat spielt es keine rolle wenn jede kamera den gleichen (ziel) port verwendet.

lf

Hallo peewit,

danke für deine schnelle Antwort und sorry, dass ich mich jetzt erst melde ... war stressig.

Das heißt, dass ich mich einfach in einer Schrittkette mit einer Kamera verbinde, auf Daten warte, die Verbindung trenne, mich mit der nächsten Verbinde, usw.?


CASE iCameraStep OF

5: (* Ressourcen anfragen *)
IF stIP_C.C_STATE = 0 THEN
stModuleData_Out.xInfeedCameraConnected := FALSE;
stModuleData_Out.xOutfeedCameraConnected := FALSE;
stIP_C.C_STATE := 1;
sIpAdress := '192.168.10.10';
stIP_C.C_IP := IP4_DECODE(sIpAdress);
stIP_C.C_ENABLE := FALSE;
stIP_C.TIME_RESET := FALSE;
stIP_C.R_OBSERVE := FALSE;
iCameraStep         := 10;
END_IF

10: (* Warte auf Freigabe *)
stIP_C.C_IP := IP4_DECODE(sIpAdress);
stIP_C.C_ENABLE := TRUE;
stIP_C.TIME_RESET := TRUE;
stIP_C.R_OBSERVE := TRUE;
stR_BUF.SIZE := 0;

(* Sendedaten einrichten *)
stS_BUF.SIZE := 0;
IF stIP_C.C_STATE = 255 THEN
stModuleData_Out.xInfeedCameraConnected := TRUE;
iCameraStep := 15;
END_IF

15: (* Fehler abfangen *)
IF (stIP_C.ERROR <> 0) THEN
(* Abmelden *)
stIP_C.C_ENABLE := FALSE;
stIP_C.R_OBSERVE := FALSE;
stIP_C.C_STATE := 0;
iCameraStep := 5;(*17;*)
xErrorInfeedCamera :=  TRUE;
ELSIF (stS_BUF.SIZE = 0) AND (stR_BUF.SIZE > 0) AND (IP4_TO_STRING(stIP_C.C_IP) = '192.168.10.10') THEN
sInfeedCameraDataString := FUN_ByteArrayToString(stR_BUF.BUFFER);

IF NOT stR_BUF.BUFFER[0] = 68 THEN (* 'D' from 'DeviceState, which is beeing sent every 5 sec *)
IF sInfeedCameraDataString = 'true' THEN
stModuleData_Out.xInfeedCameraProdOK := TRUE;
stModuleData_Out.xInfeedCameraProdNOK := FALSE;
ELSE
stModuleData_Out.xInfeedCameraProdOK := FALSE;
stModuleData_Out.xInfeedCameraProdNOK := TRUE;
END_IF
END_IF

stR_BUF.SIZE := 0;
stS_BUF.SIZE := 0;
FOR j := 0 TO 200 DO
stR_BUF.BUFFER[j]:= 0;
stS_BUF.BUFFER[j]:= 0;
END_FOR

(* Abmelden *)
stIP_C.C_ENABLE := FALSE;
stIP_C.R_OBSERVE := FALSE;
stIP_C.C_STATE := 0;
iCameraStep := 20;
END_IF

20: (* Und hier das gleiche für die nächste IP Adresse *)


Oder soll ich einfach für jede Kamera eine Instanz des IP_CONTROL FBs, von der IP und Data-Struktur anlegen und dann geht's auch?

Danke schon mal für die Hilfe!

lf

peewit

für jede kamera nimmst du eine eigene ip_control istanz mit den jeweiligen kamera parameter
dann brauchst du keine fifo baustein und auch nicht ständerung zwischen den verbindungen wechseln



lf

Hallo peewit,

ich kriegs nicht hin. Ich habe nun zwei Instanzen von IP_CONTROL, zwei Instanzen der Kontrollstruktur IP_C und der Datenstrukturen. Dann habe ich jeweils separate Schrittketten für zwei Kameras. Wenn ich beim ersten UDP "Master" das Senden starte, empfängt der richtige IP_CONTROL Baustein auch was. Wenn ich nun den zweiten UDP Master starte, empfägt das auch der Baustein, der als erstes verbunden war. Der andere dreht sich in der Timeout-Schleife zwischen Schritt 5 und 10.


CASE iInfeedCameraStep OF

5: (* Ressourcen anfragen *)
IF stIP_C.C_STATE = 0 THEN
stModuleData_Out.xInfeedCameraConnected := FALSE;
stIP_C.C_STATE := 1;
sIpAdressInfeed := '192.168.10.205';
stIP_C.C_IP := IP4_DECODE(sIpAdressInfeed);
stIP_C.C_ENABLE := FALSE;
stIP_C.TIME_RESET := FALSE;
stIP_C.R_OBSERVE := FALSE;
stR_BUF.SIZE := 0;
FOR j := 0 TO 200 DO
stR_BUF.BUFFER[j]:= 0;
END_FOR
iInfeedCameraStep := 10;
END_IF

10: (* Warte auf Freigabe *)
stIP_C.C_IP := IP4_DECODE(sIpAdressInfeed);
stIP_C.C_ENABLE := TRUE;
stIP_C.TIME_RESET := TRUE;
stIP_C.R_OBSERVE := TRUE;
stR_BUF.SIZE := 0;

(* Sendedaten einrichten *)
stS_BUF.SIZE := 0;
IF stIP_C.C_STATE = 255 THEN
stModuleData_Out.xInfeedCameraConnected := TRUE;
iInfeedCameraStep := 15;
ELSIF (stIP_C.ERROR <> 0) THEN
iInfeedCameraStep := 5;
END_IF

15: (* Fehler abfangen *)
IF (stIP_C.ERROR <> 0) THEN
(* Abmelden *)
stIP_C.C_ENABLE := FALSE;
stIP_C.R_OBSERVE := FALSE;
stIP_C.C_STATE := 0;
iInfeedCameraStep := 5;(*17;*)
xErrorInfeedCamera :=  TRUE;
ELSIF (stR_BUF.SIZE > 0) AND (IP4_TO_STRING(stIP_C.C_IP) = '192.168.10.205') THEN
sInfeedCameraDataString := FUN_ByteArrayToString(stR_BUF.BUFFER);

IF NOT stR_BUF.BUFFER[0] = 68 THEN (* 'D' from 'DeviceState, which is beeing sent every 5 sec *)
IF sInfeedCameraDataString = 'true' THEN
stModuleData_Out.xInfeedCameraProdOK := TRUE;
stModuleData_Out.xInfeedCameraProdNOK := FALSE;
ELSE
stModuleData_Out.xInfeedCameraProdOK := FALSE;
stModuleData_Out.xInfeedCameraProdNOK := TRUE;
END_IF
END_IF

stR_BUF.SIZE := 0;
FOR j := 0 TO 200 DO
stR_BUF.BUFFER[j]:= 0;
END_FOR
END_IF

END_CASE

stIP_C.C_MODE := 3; (* UDP passiv mit IP und Port *)
stIP_C.C_PORT := 32002;

fbIPControlInfeed(
IP:= IP4_DECODE(sIpAdressInfeed),
PORT:= ,
TIME_OUT:= UINT_TO_TIME(uiTimeout),
IP_C:= stIP_C,
S_BUF:= stS_BUF,
R_BUF:= stR_BUF);


zweite Kamera


CASE iOutfeedCameraStep OF

5: (* Ressourcen anfragen *)
IF stIP_C_outfeed.C_STATE = 0 THEN
stModuleData_Out.xOutfeedCameraConnected := FALSE;
stIP_C_outfeed.C_STATE := 1;
sIpAdressOutfeed := '192.168.10.207';
stIP_C_outfeed.C_IP := IP4_DECODE(sIpAdressOutfeed);
stIP_C_outfeed.C_ENABLE := FALSE;
stIP_C_outfeed.TIME_RESET := FALSE;
stIP_C_outfeed.R_OBSERVE := FALSE;
stR_BUF_outfeed.SIZE := 0;
FOR j := 0 TO 200 DO
stR_BUF_outfeed.BUFFER[j]:= 0;
END_FOR
iOutfeedCameraStep := 10;
END_IF

10: (* Warte auf Freigabe *)
stIP_C_outfeed.C_IP := IP4_DECODE(sIpAdressOutfeed);
stIP_C_outfeed.C_ENABLE := TRUE;
stIP_C_outfeed.TIME_RESET := TRUE;
stIP_C_outfeed.R_OBSERVE := TRUE;
stR_BUF_outfeed.SIZE := 0;

IF stIP_C_outfeed.C_STATE = 255 THEN
stModuleData_Out.xOutfeedCameraConnected := TRUE;
iOutfeedCameraStep := 15;
ELSIF (stIP_C_outfeed.ERROR <> 0) THEN
iOutfeedCameraStep := 5;
END_IF

15: (* Fehler abfangen *)
IF (stIP_C_outfeed.ERROR <> 0) THEN
(* Abmelden *)
stIP_C_outfeed.C_ENABLE := FALSE;
stIP_C_outfeed.R_OBSERVE := FALSE;
stIP_C_outfeed.C_STATE := 0;
iOutfeedCameraStep := 5;
xErrorOutfeedCamera := TRUE;
ELSIF (stR_BUF_outfeed.SIZE > 0) AND (IP4_TO_STRING(stIP_C_outfeed.C_IP) = '192.168.10.207') THEN
sOutfeedCameraDataString := FUN_ByteArrayToString(stR_BUF_outfeed.BUFFER);

IF NOT stR_BUF_outfeed.BUFFER[0] = 68 THEN (* 'D' from 'DeviceState, which is beeing sent every 5 sec *)
IF sOutfeedCameraDataString = 'true' THEN
stModuleData_Out.xOutfeedCameraProdOK := TRUE;
stModuleData_Out.xOutfeedCameraProdNOK := FALSE;
ELSE
stModuleData_Out.xOutfeedCameraProdOK := FALSE;
stModuleData_Out.xOutfeedCameraProdNOK := TRUE;
END_IF
END_IF

stR_BUF_outfeed.SIZE := 0;
FOR j := 0 TO 200 DO
stR_BUF_outfeed.BUFFER[j]:= 0;
END_FOR
END_IF

END_CASE

stIP_C_outfeed.C_MODE := 3; (* UDP passiv mit IP und Port *)
stIP_C_outfeed.C_PORT := 32002;

fbIPControlOutfeed(
IP:= IP4_DECODE(sIpAdressOutfeed),
PORT:= ,
TIME_OUT:= UINT_TO_TIME(uiTimeout),
IP_C:= stIP_C_outfeed,
S_BUF:= stS_BUF_outfeed,
R_BUF:= stR_BUF_outfeed);


Was mache ich falsch?

peewit

hi

struktur und aufbau

man programmiert einen funktionsbaustein der von aussen mit parametern versorgt wird.
und nicht den code zweimal redundant schreiben....

die handhabung des ip_control ohne ressourcensharing (fifo) kann man viel einfacher machen

aber das ist nicht das technische problem !


versuche für die zweite kamera einen anderen port zu verwenden

ansonsten senden anscheinend beide kameras an die ip der sps an den gleichen port
ein ip_control verbindet sich mit einen angegebenen port und empfangt dann die daten von beiden kameras


lf

Da ist das Problem: Der Zielport ist in der Kamera nicht veränderbar. Ich habe mich bei meinem ersten Post nicht deutlich genug ausgedrückt, da ich nur vom Sendeport gesprochen habe. Sowohl Sende- als auch Zielport ist bei diesen Kameras fest auf 32002 eingestellt und nicht veränderbar.

Ich habe mir jetzt so beholfen, dass jede Kamera eine eindeutige Präambel schickt, anhand derer ich unterscheiden kann, von welcher Kamera die Daten gerade kommen. Bin nicht ganz glücklich damit, scheint aber nicht anders zu gehen...

Wenn es keine andere Lösung gibt, werde ich wohl den Kunden darauf hinweisen müssen, beim nächsten Mal andere Kameras zu verwenden.

lf

lf

Achja, zu meiner Verteidigung  :D: Das mit den zwei getrennten Schrittketten stammt noch aus der Zeit, als ich dachte, mich sequentiell mit den Kameras verbinden zu müssen. Also Verbindung zur 1. aufbauen, Daten empfangen, Verbindung trennen, Verbindung zur 2. aufbauen, ...

Ist also nur ein Relikt.

Ich hatte gehofft, der IP_CONTROL Baustein kann auch die Sende-IP Adresse unterscheiden, wenn auf Port 32002 was ankommt...