ILC 150 ETH mit AVR NET IO via Ethernet verbinden

ZiTho

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wie im Titel beschrieben, würde ich gerne eine AVR NET IO (die von Pollin) mit der ILC 150 ETH auslesen bzw. die Ausgänge setzen. Aus sämtlichen Foren und Beiträgen habe ich gesehen, dass es mit der S7 funktionieren soll. Nach verschiedenen Tests mit PCWorx und der AVR habe ich leider feststellen müssen, dass es trotz mehreren verschiedenen Vorgehensweisen nicht klappte. Mein Vorgehen war wie folgt:

Der IP_CONNECT-Baustein baut Verbindung auf.

- Versuch 1: AVR-Befehle mit STRING-Variable senden. Dabei ist das CRLF einfach "\r\n". Das funktioniert aber nicht.
- Versuch 2: ebenfalls mit STRING, bloß dass das CRLF aus BYTE_TO_STRING(ASCII_Wert) und dann mit CONCAT an den STRING anfügen. Das funktioniert aber nicht
- Versuch 3: Jedes Zeichen als BYTE in einem ARRAY zu senden. Das funktioniert aber nicht.
- Versuch 4: Mithilfe des PureBasic-Beispiels Verbindung aufbauen und Daten auslesen. Das geht sehr gut. Aber ich kann leider nicht die Daten an die SPS weitergeben. Ich konnte in einem seperaten Test eine Verbindung von SPS <-> PureBasic-Programm aufbauen und Daten senden. Doch leider waren die Daten, die bei der SPS angekommen sind der Wert der Länge, der zu sendenden Daten. D.h. wenn ich drei BYTE an die SPS gesendet habe, dann kam als Information der Wert "3" an. War die Anzahl der zu sendenden BYTE 8, so war die ankommende Information "8".
Ich finde das alles schon äußerst merkwürdig. Hat jemand noch Ideen und Anregungen, was man ausprobieren kann oder welche Software dazu geeignet wäre.

Vielen Dank vorab für die Hilfe
 
Hallo ZiTho,

wenn du mit dem AVR NET IO über offene TCP/IP Kommunikation die Daten austauschen möchtest, so muss im ersten Wort der Daten die Länge der nachfolgenden Nutzdaten übermittelt werden.

Als Beispiel: Du hast ein Bytearray, in dem deine Nutzdaten enthalten sind (z.B. arr_b_0_20 : ARRAY [0..20] OF Byte; ) so würde in den ersten beiden Bytes keine Nutzdaten enthalten sein, sondern z.B. eine 18dez für die folgenden 18 Byte.
Am einfachsten ist es, wenn du dir eine neue Struktur anlegst, in der du als erstes Element eine Variable vom Typ INT nutzt. In dieser kannst du dann später direkt die Länge angeben. Als zweites Element würdest du dann die Datenstruktur anlegen (z.B. String, falls deine Gegenstelle einen String versteht)
Die Struktur sehe dann wie folgt aus:

TYPE
SendeDaten :
STRUCT
LaengeDerNutzdaten : INT;
Nutzdaten : STRING;
END_STRUCT;
END_TYPE

Die Länge deines STRINGs kannst du über den Baustein LEN ermitteln.

Wenn du weitere Fragen zu der IP-Kommunikation hast, kannst du dich auch gerne auf unserer Hotline melden.

Mit freundlichen Grüßen
Ulrich Kleinschmidt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also beim FB IP_USEND musste ich noch keine Länge angeben in den ersten zwei Bytes. Nur bei IP_URCV steht die Anzahl der Bytes drin.
Und das CRLF mach ich immer so:
Code:
text := CONCAT(text, BYTE_TO_STRING(BYTE#16#0D,'%c'));
text := CONCAT(text, BYTE_TO_STRING(BYTE#16#0A,'%c'));
 
Hallo Mobi,

wenn du die Bausteine aus unserer Firmware Bibliothek verwendest und nicht die 61131-5 Kommunikation nutzt, so musst du in den ersten zwei Bytes defenitiv die Längenangabe der nachfolgenden Bytes angeben.

Ob du die 61131-5 Kommunikation verwendest, erkennst du an deinem Partner-String vom IP_Connect Baustein. Wenn dort ein ACTIVE bzw PASSIVE angelegt ist, so verwendest du entweder TCP/IP oder UDP. In diesem Fall muss die Längenangabe vorausgestellt werden.

Mit freundlichen Grüßen
Ulrich Kleinschmidt
 
Ach sorry, hast ja recht. Hatte es verwechselt mit der anderen Seite. Wenn man jetzt was zur ILC sendet braucht man die Länge nicht angeben. Wie z.B. vom AVR aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ulrich,
ich möchte mich noch einmal sehr herzlich für Deine Hilfe bedanken. Nun funktioniert es hervorragend. Habe auch schon einen FB erstellt, der mir die Daten ausliest.
Ich hätte da nur noch eine Frage. Wenn ich jetzt den Baustein mehrfach aufrufe, d. h. ich habe beispielsweise 5 AVR angeschlossen und bau 5 verschiedene Verbindungen auf, wird dann nicht die Zykluszeit zu groß? Gibt es Möglichkeiten so einen Prozess - TCP/IP-Verbindung - auch als EVENT_TASK auszuführen?
Vielen Dank für die Unterstützung!
 
Hallo ZiTho,

du wirst durch 5 aufrechterhaltene TCP/IP Verbindungen keine Probleme mit der Zykluszeit deiner ILC bekommen. Das senden selber gibst du ja über den REQ-Eingang des IP_USEND Basuteins vor.

Die ILC 1xx können leider keine EVENT-Tasks verarbeiten. Wenn du deinen Baustein aber nur zu bestimmten Events aufrufen möchtest, so kannst du bei deinem Baustein eine vorgeschaltete IF_Schleife einbauen. dies könnte dann in ST wie folgt aussehen:

IF IN_xActivate THEN
...
...
...
END_IF;

Bei weiteren Fragen kannst du dich auch gerne bei uns auf der Hotline melden.

Mit freundlichen Grüßen
Ulrich Kleinschmidt
 
Zurück
Oben