# String per Ethernet an Server senden



## Andy082 (13 Mai 2010)

Abend 
...oder für einige andere "guten Morgen".


War mal wieder so dumm und hab mir in der Arbeit ein kleines Nebenprojekt umgehängt. (ja, die Neigung zu jedem Blödsinn des Chefs "Ja und Amen" zu sagen stellt sich bei mir immer mehr ein.....)

Will gleich mal vorausschicken, dass ich ausreichend Programmiererfahrung habe (Step7 - 200er, 300er) aber eben nur in AWL.
Weshalb ich auch versuche meinen WagoController mit CodeSys in AWL zu bezwingen.... (ja, ich hör's schon wieder => ST wäre viel besser und einfacher / ich arbeite daran - versprochen)

Nun näher zu meinem Projekt:
1.) Ich erhalte die aktuell laufende Variante über ein Bitmuster;
2.) wurde die Box eines Produktes zur Gänze gefüllt, so erhalte ich zusätzlich noch ein Startsignal oder nennen wir es ENABLE;
3.) Anhand des Bitmusters und des gesetzten Signals wird nun ein zuvor hinterlegter String per Ethernet an unseren Server gesendet;

Grundlegend ja nicht viel dabei.
Ich verwende aus der OSCAT.lib die Funktion "_STRING_TO_BUFFER"
und zur Kommunikation aus der Ethernet.lib die "ETHERNET_WRITE_PT".

Meine Frage nun aber:
Wie genau parametriere ich diesen beiden Funktionen/Bausteine richtig?
zB die IP-Adresse in ein DWORD klingt für mich unklar.
Außerdem, was kommt tatsächlich am anderen Ende an, wenn ich nun an den Server den String 'Teilevariante Nummer 01' wie oben beschrieben umwandle und versende?
Augenblicklich erhalte ich nach der generierung meines POINTER to ARRAY [0..255] of BYTE nämlich nur <0000000>

Wenn jemand einen einfacheren Weg kennt nen' beliebigen String an nen' Server zu senden, dann bitte raus damit.

Und damit die Geschichte komplett ist, den weiteren Ablauf.....
String wird von Server verarbeitet und dieser gibt einen Druckauftrag an einen Labeldrucker zum Anbringen an die Box.
Interessant hier ist unser Firmenlayout.....
Anlage und Drucker stehen 1m von einander entfernt, Server ist aber 500m weit weg. Aus datentechnischer Sicht so als würde ich von München nach Stuttgard über Hamburg und Berlin fahren.

Mein JA hierzu ist ein eindeutiges Zeichen dafür, dass ich vor 8:00 Uhr und ohne den ersten Kaffeé als unzurechnungsfähig gelte.

So denn, wünsche ich ein schönes verlängertes WE.


mfg,
Andy


----------



## Oberchefe (13 Mai 2010)

> zB die IP-Adresse in ein DWORD klingt für mich unklar.



Wieso, DWORD hat 32 Bit, die IP-Adresse hat 4 Nummern von 0-255, also Byte, 4*8=32.



> Wenn jemand einen einfacheren Weg kennt nen' beliebigen String an nen'  Server zu senden, dann bitte raus damit.



Noch einfacher? VIelleicht jemanden vor Deine Maschine stellen, wenn die Lampe eines Ausgangs angeht läuft er zum Server und tippt den Text ein?



> Augenblicklich erhalte ich nach der generierung meines POINTER to ARRAY  [0..255] of BYTE nämlich nur <0000000>



Online auf der Steuerung oder in der Simulation?


----------



## Andy082 (13 Mai 2010)

Ja, noch einfacher gibt's ja eben schon.....
Aber die Variante ist wenig zuverlässig, da so bereits falsche Labels aufgeklebt wurden. 


Augenblicklich erhalte ich in der Simulation eben nur <0000000> nach der Umwandlung von "String" zu "Pointer to Array [0..255] of Byte"
Etwa normal....?

Gut, das mit der IP-Adresse ist mir nun auch klar....
Klingt so zumindest recht logisch. (es war ja schon recht spät....)

Aber vorerst mal recht herzlichen Dank, Oberchefe.

mfg,
Andy


----------



## Oberchefe (13 Mai 2010)

> Umwandlung von "String" zu "Pointer to Array [0..255] of Byte



Einen String kann man nicht in einen Pointer wandeln, man kann höchstens einen Pointer auf einen String setzen/zeigen lassen. Quelltext bitte!


----------



## Andy082 (13 Mai 2010)

Mein Gesamtmurks mal im *.zip-File.


----------



## Oberchefe (14 Mai 2010)

Du hast in Deinem Programm einen Zeiger, der zeigt aber nirgendwo hin, und es scheint so, dass es das, worauf er zeigen soll noch gar nicht gibt.

Also, erst mal das Ziel für den Zeiger definieren:

```
MeinByteArray:    ARRAY[0..255] OF BYTE;
```

Dann den Zeiger dazu bringen, dass er auch darauf zeigt (AWL ist wirklich widerlich):


```
LD        MeinByteArray
    ADR
    ST        pDATA
```

Dann könnte es klappen. Wobei ETHERNET_WRITE_PT eigentlich einen Zeiger auf ein Byte Array [1..1500] erwartet, aber vielleicht funktionierts ja trotzdem.


----------



## Oberchefe (14 Mai 2010)

Abgesehen davon: das umeinanderkopieren könntest Du Dir auch noch etwas sparen. Beispielsweise kann das ByteArray gleich entsprechend deklariert werden:


```
DATA: ARRAY[0..127] OF STRING(32):= 'keine Variante erkannt',
                                                'Variante Nummer 01',
                                                'Variante Nummer 02',
                                                'Variante Nummer 03',
                                                'Variante Nummer 04',
                                                'Variante Nummer 05',
                                                'Variante Nummer 06',
                                                'Variante Nummer 07',
                                                'Variante Nummer 08',
                                                'Variante Nummer 09',
                                                'Variante Nummer 10',
                                                'Variante Nummer 11',
                                                'Variante Nummer 12',
                                                'Variante Nummer 13',
                                                'Variante Nummer 14',
                                                'Variante Nummer 15',
                                                'Variante Nummer 16';
```

Desweiteren kannst Du den Zeiger auf die erste Arrayposition setzen und abhängig von VAR_Byte einen Offset draufaddieren (abhängig von der definierten Stringlänge), dann brauchst Du gar nichts umeinanderkopieren.


----------



## Andy082 (16 Mai 2010)

Abend Oberchefe.

Danke für die Aufbesserung.
Die direkte Definition meiner Variantennummern wollte ich bereits genau so vornehmen, wie von dir beschrieben.
Nur hat's nicht sofort geklappt, daher hab ich's gleich mal gelassen.

Ob der Rest dann tatsächlich mit der SPS funktioniert, werde ich am MO rausfinden.

Danke nochmals.

Ich geb dann ein entsprechendes Feedback.


mfg,
Andy


----------



## Andy082 (17 Mai 2010)

So....

Hab's nun versucht und bin gar nicht so weit gekommen überhaupt erst einen String zu versenden.

Ich erhalte immer den Error 0xC001 - SOCKAPI_NO_DESCRIPTOR.
Dabei wurde meine Ziel-IP und mein -Port ja definiert, wodurch der Socket ja unbenutzt bleiben sollte.

Hat jemand noch ne' schnelle & kurze Idee?

Anbei der aktuelle Stand meines Konverters.


mfg,
Andy


----------



## Andy082 (18 Mai 2010)

Hallo.

Den Fehler mit dem Socket hab ich eliminiert, indem ich zuerst den FB "Ethernet_Client_Open" ausführe und schon ist der Fehler weg.

Aber dennoch kommt nichts von dem was versendet wird auch tatsächlich an meinem Server an.

Hätte auch schon andere *.lib ausprobiert, aber hier funktioniert die eine Hälfte lt. Beschreibung von WAGO nur mit der 750-841 und die andere nur mit einem entsprechenden Firmwarestand. (kA wie ich den auslese)

Hat schon mal jemand so ne' Aufgabe mit Erfolg bewältigt und könnte mir ein Beispiel zusenden oder hier reinstellen?
Bräuchte einfach nur einen Ansatz wo denn mein Fehler liegen könnte.

Bin für jede Hilfe dankbar....


mfg,
Andy


----------



## Oberchefe (19 Mai 2010)

Stell' doch mal das aktuelle Projekt nochmals online, dann schaue ich mir es nochmals am Wochenende an.


----------



## Andy082 (19 Mai 2010)

Abend Oberchefe.


Mal ein herzliches Danke für deine stetige Hilfe! :s12:

Es hat sich etwas getan:
1.) hab's per String geschafft, was auch immer, an unseren EDV-Techniker zusenden;
Nur sendet mein Programm wohl stetig was raus, obwohl ich das xStart_Send des Ethernet_Client_Open per steigender Flanke triggere.
Zumindest bringe ich das Programm des Kollegen zum Totalabsturtz.
(Wer's also zum Ärgern von Kollegen haben will, einfach melden.)
Weiters war in meinem String trotz Vorgabe unterschiedlicher Daten am Empfangspunkt nichts vorhanden.

2.) Hab ich meinem Kollegen mal die Produkte des Herstellers W&T gezeigt, welche vom Preis her fast gleich mit meiner WAGO-Auswahl sind und zudem auch noch VB können. (fast wäre Ihm beim Durchlesen der Anwendungsbeispiele einer abgeg....)

Damit hat sich für mich das Projekt in gewisser Weise erledigt.

Trotzdem werd ich versuchen das Ding zum Laufen zu bringen und werd's hier reinstellen.

@ Oberchefe:
Ich hoffe ich darf dich per PN anschreiben, wenn's mal wieder irgendwo vollkommen zum Stillstand kommt?

mfg,
Andy


----------

