IP_Control mehrere UDP-Teilnehmer

Begonnen von Tounsi, 06. Mai 2014, 11:45:34

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Tounsi

Hallo zusammen,
es ist mein erster Eintrag im Forum. In erste Stelle vielen Dank für die tollen Bibliotheken und Bausteine.
Zu meinem Problem:
Ressourcen (PCworx 6.20 und ILC 151 von Phoenix contact)
Ich benutze den Baustein IP_Control um mit mehreren Devices auf UDP-Basis zu kommunizieren. Die Kommunikation klappt wunderbar (S/R) nur mit dem ersten
Teilnehmer. Obwohl ich IP_CONTROL.IP := newIP   mit einer neuen IP Adresse versorge baut immer wieder eine Verdindung zum ersten Teilnehmer mit der ersten IP-Adresse. Hier einen AUszug aus dem Quellcode.


IF Send_Request THEN
COM_STATE := false;;
SDATA := Telegramm;
SDATA.SIZE:= uint#8;
start:= true;

time_resest:= false;
END_IF;



IP_CONTROL_2.IP         :=  UDP_IP_Adress;
IP_CONTROL_2.PORT      := WORD#11177;
IP_CONTROL_2.TIME_OUT   := TIME#1000ms;
IP_CONTROL_2.IP_C      := COM;
IP_CONTROL_2.S_BUF      := SDATA;
IP_CONTROL_2.R_BUF      := RDATA;

IP_CONTROL_2();


COM                  :=IP_CONTROL_2.IP_C;(**)
SDATA                   :=IP_CONTROL_2.S_BUF;
RDATA                 :=IP_CONTROL_2.R_BUF;




COM.C_MODE              := BYTE#1;
COM.C_ENABLE            := start;
COM.TIME_RESET          := time_resest;
COM.R_OBSERVE           := true;
lage                  := COM.C_STATE;
Fehler               := COM.ERROR;



if SDATA.SIZE = uint#0 then
SDATA.SIZE:= uint#0;
Send_Request:= false; (*nichts mehr senden bis eine ANtwort da ist*)
end_if;

if RDATA.SIZE > uint#0 then

ReceivedTelgramm_1(Starte:= TRUE,receivedBuff:=RDATA.BUFFER);(*Empfangene Daten auswerten*)
RDATA.SIZE := uint#0;

start := false;
Send_Request:= false;
end_if;




if ComMember_ok and lage = byte#0 then (*Wenn Antwort richtig ausgewertet ist, und Verbindung abgebaut ist*)
i:= i + 1;
ComMember_ok := false;
Send_Request:= true;
UDP_IP_Adress :=  UDP_IP_Adress + dword#1 ; (*Erste IP-Adresse ist bereits als Anfangswert initialisiert 16#C0A82401  *)
end_if;
if i = 10 then (*10 devices abgefragt*)
COM_STATE := true;
start := false;
Send_Request:= false;
end_if;

Vielen Dank für eure Hilfe
Gruß
Tounsi

peewit

hi

welche firmware hast du auf deiner ilc ?

kannst du beschreiben was du eigentlich machen willst mit den zwei verbindungen
1. für was wer mit wem , welche verbindungstype, port nummer etc...
2. wie willst es lösen


unter umständen ist es normal das die sps firmware gleiche verbindungsparameter auf eine bestehende verbindung umleitet , da man ja nicht das gleiche zweimal öffnen kann, und man soetwas in der form nicht verarbeiten kann

aber um das zu bewerten muss ich ewrst mehr details haben

eventuell den kompletten code mit beiden instanzen....


Tounsi

Danke erstmals für deine  Antwort Peewit,
ILC Firmware: V. 4.10.07.
2) Eine Steuerung (ILC 151) und mehrere Stromrichter (mit eigenem Steuerteil)
Die Aufgabe besteht darin mit bis zu 50 Geräten (Stromrichter)  zu kommunizieren und vielleicht sogar mehr.
- In erster Stelle muss ich Sollwerte (Leistungssollwerte P) schicken, die von der Steuerung generiert werden. Am Anfang habe ich auf UDP Broadcast gesetzt, was auch funktioniert hat, aber zuverlässig ist das auch nicht weil, man nie weiss ob, die Nachricht angekommen ist oder ob, die richtig verstanden wurde.
- Deswegen auch jetzt  doch die Idee verbindungsorientiert zu arbeiten...Nachteil bist du nicht mehr schnell und hast Totzeiten zwischen dem ersten und dem letzten Gerät.
Es gibt nur eine Instanz, die erste habe ich gelöscht.

Ich darf aber schon mal berichten, dass ich es hinbekommen habe...also es Funktioniert..
Ich habe einfach die Zeile
IP_CONTROL_2.IP   :=  UDP_IP_Adress;
durch folgende ersetzt..
COM.C_IP :=  UDP_IP_Adress; (* COM eine Struktur von oscat_IP_C  *).
Ich konnte 10 Geräte nacheinander abfragen. Mein Problem jetzt, ist die Zeiten zu optimieren und die Kommunikation zu beschleunigen.
Fahrweise:
Verbindungsaufbau--> Anfrage senden--> auf Antwort warten--> Antwort erhalten-->Verbindung abbauen--> Empfangene Bytes zur Auswertung weiter geben
--> IP-Adresse ändern und das ganze fängt von vorne wieder an.

Im Quellcode: CONNECT  in der oscat_network_121 habe ich Delay_Value von 50 ms auf 20 ms reduziert.
Ich benutze einen SPS-Zyklus von 10 ms und komme jetzt laut Wireshark auf ca 120ms zwischen 2 Anfragen. Die Stromrichter antworten sehr schnell (wireshark) 0,5 ms.
WIe kann ich Zeiten noch optimieren ist das überhaupt noch möglich...

Vielen Dank





peewit

hi

eine ilc 151 kann sowieso nur 8 oder 16 eigenständige ethernet verbindungen parallel betreiben
somit musst du bei 50 teilnehmern sowieso dein konzept weiterverwenden (verbindungen / kommunizieren beenden ... nächster teilnehmer das gleiche..


bei einer ilc 1xx brauchst du sowieso für das senden bzw. empfangen eines paketes eine zykluszeit von min. 20ms

das ist normal......

die ip connexct verzoegerungszeit habe ich mal vor langer zeit integriert als es noch probleme mit der firmware gabe, weil hier die daten in der verschiedenene verbindungen vertauscht wurden...... es kann leicht sein das du die zeit auch auf 0 setzen kannst...... einfach mal ausprobieren...