Kommunikation über TCP-IP

AlexR
2009-06-29
2009-07-01
  • AlexR - 2009-06-29

    Hallo zusammen,

    ich habe erst vor einigen Wochen ein neues Projekt begonnen, bei dem ich mich in Codesys einlesen und einarbeiten musste. Also bin ich erst noch im Anfangsstadium. Aber hierzu war dieses Forum schon des öfteren sehr hilfreich. Also schon mal ein dickes Danke an der Stelle.

    Momentan bin ich an der Umsetzung einer TCP-IP Kommunikation mit einem Beamer, der sich im selben Netzwerk befindet wie mein IPC, auf dem Codesys läuft. Hier kann ich bereits über die SysLibSockets.lib meine 3 gewünschten Meldungen absetzen

    • eine zum Einschalten

    • eine zum Ausschalten

    • und eine um den Status abzurufen

    Beim Status-Abruf des Beamers sendet er mir unmittelbar die Meldung zurück:

    -1d 00 00 (Hex) entspricht OFF

    -1d 01 00 (Hex) enstpricht On

    -1d 02 00 (Hex) entspricht COOL DOWN

    Leider bekomme ich es gerade programmierseitig nicht hin, diese Meldung auch wirklich zu empfangen. Könnt ihr mir hier helfen?

    Mein Versuchsprojekt, das ich später noch in mein Hauptprogramm implementieren werde habe ich angehängt.

    Grüße

    TCPIPTest3.pro [93.19 KiB]

     
  • Erik Böhm - 2009-06-29

    Moin

    Du solltest vielleicht irgendwo den Receive aufrufen...

    TcpReceiveData:= SysSockRecv(diSocket, pbyData, diDataSize, 0);

    Gruß

    Erik

     
  • AlexR - 2009-06-29

    Hallo Erik,

    erst mal danke für die schnelle Antwort. Dass ich die FUN SysSockRecv verwenden sollte war mir schon irgendwie klar.

    diDataSize müsste dann ja bei mir vermutlich 3 sein. Aber TCPReceiveData liefert mir dann ja auch nur ne 3 und nicht den von mir gewünschten Array [0..2] of Byte.

    Mein Hauptproblem ist hier, wo ich den Recv-Aufruf in mein Programm einbaue und wie ich überprüfe ob ich alle Daten erhalten habe.

    Auch wie ich dann an meine gewünschten Daten in Form eines Arrays komme, ist mir noch nicht ganz klar.

    Vielleicht kannst du mir hier nochmal auf die Sprünge helfen.

    Gruß

    Alex

     
  • Erik Böhm - 2009-06-29

    Hi

    Hast du die Beschreibung von SysSockReceive schon mal gelesen ?

    Die Datentypen zu meinem Beispiel sehen so aus:

    diSocket: DINT; ( Socket-ID )

    pbyData: DWORD; ( Address of data buffer )

    diDataSize: DINT; ( Size of data to receive )

    Der Pointer auf die Daten kann auch genausogut auf ein ByteArray zeigen.

    Also z.B.

    abyRecvData: ARRAY[1..100] of BYTE;

    pbyData := adr(abyRecvData[1]);

    Dann werden die Daten auch gleich ins ARRAY geschrieben.

    Gruß

    Erik

     

    Related

    Talk.ru: 1

  • Erik Böhm - 2009-06-29

    Hab ja noch was vergessen...

    Size of data to receive ist die Größe des Empfangspuffers in Byte an.

    Also in unserem Beispiel 100.

    Du kannst der Funktion ja (in den meisten Fällen) nicht im voraus sagen wie viele Bytes kommen werden.

    Gruss

    Erik

     
  • AlexR - 2009-06-29

    Ok, soweit so gut.

    Hatte die Beschreibung auch schon gelesen, bin nur nicht ganz damit klar gekommen.

    Du hast geschrieben:

    pbyData := adr(abyRecvData[1]);

    Heist das nicht, dass die Adresse der erhaltenen Daten (die ja in pbyData liegt) mit der Adresse des leeren Arrays überschrieben wird?

    In der Beschreibung heist es, dass pbyData die 'Adresse des Speichers, von dem empfangen werden soll' sein soll. Und mit dem konnte ich bisher eben nichts anfangen.

    Irgendwie steh ich gerade auf dem Schlauch, sorry.

     

    Related

    Talk.ru: 1

  • Erik Böhm - 2009-06-29

    Mahlzeit

    In pbyData gibts du die Adresse des Speicherbereichs an in den die empfangenen Daten geschrieben werden sollen.

    In diDataSize wird die Grösse des Empfangspuffers in Byte angegeben.

    Die Funktion schreibt dann direkt in diesen Puffer.

    Gruss

    Erik

     
  • AlexR - 2009-06-29

    Hallo Erik,

    danke!! Beim letzten Versuch, hab ich nun die gewünschte Meldung erhalten!! Ich denke, dass ich die Implementierung dann auch umgesetzt bekomme. Sonst melde ich mich nocheinmal.

    Grüße

     
  • AlexR - 2009-07-01

    Hallo,

    ich hab mal noch ne Frage bezüglich der Anzahl der Sitzungen, die bei Codesys möglich sind. Auf meinem IPC läuft eben ne Visu, gleichzeitig ist aber auch ne Webvisu möglich. Gibt es eine Möglichkeit, die Anzahl der Zugriffe/Sitzungen auf/in Codesys zu erhalten, in Form einer Variablen?

    Ich hab mir gerade überlegt, was passiert, wenn jemand über die Webvisu die Verbindung zum Beamer herstellt, somit ein Socket öffnet, und dieses Socket dann nicht mehr geschlossen wird, da einfach irgenwann der Browser geschlossen wird. Da wird dann vielleicht irgendwann ein Socketmaximum oder ein Socketüberlauf erreicht.

    Ich hoffe ich konnte die Frage verständlich formulieren. Gibts hier Möglichkeiten?

    Gruß

    Alex

     

Log in to post a comment.