Real über UDP versenden

cali
2009-09-17
2009-09-25
  • cali - 2009-09-17

    Hallo,

    ich möchte gemessene Temperaturen per UDP versenden und verwende dazu den Baustein UDP_Client. Dieser funktioniert auch schon und versendet fleißig Daten. Der Baustein erwartet einen Pointer auf ein Array of Bytes (Byte 8Bit). Meine Werte liegen aber wie gesagt als Real (32Bit) vor. Welche Möglichkeit gibt es die Werte einfach und effektiv zu übertragen? Gibt es eine oder muss ich den Realwert in mühevoller Arbeit scheibchenweise versenden?

    Grüße

    Cali

     
  • r.freund - 2009-09-17

    Ich gehe so vor:

    In der Steuerung, die die Daten senden soll:

    1. In den Zielsystemeinstellungen unter "Netzfunktionen" UDP zufügen.

    2. Eine neue globale Variablenliste erzeugen. Hier kann man jetzt über den Button "Netzwerkverbindung hinzufügen" die Liste für UDP deklarieren.

    3. "Vor übersetzen exportieren" wählen und Dateinamen vergeben; nur "Schreiben" anwählen und "Übertragung bei Änderung".

    4. Variablen eintragen.

    Es ist zu beachten, dass die Variablen in einem zyklischen Task beschrieben werden müssen. Ebenso muss für jede globale Variablenliste eine unterschiedliche COB-ID angegeben werden.

    In der Steuerung, die die Daten lesen soll, ist folgendermaßen vorzugehen:

    1. UDP aktivieren.

    2. Neue globale Variablenliste erzeugen; Netzwerkverbindung hinzufügen.

    3. "Vor übersetzen importieren" wählen und Datei auswählen; nur lesen anwählen.

    Jetzt wird die Datei bei jedem Kompilat eingelesen und man hat immer alle Variablen zur Verfügung, die Steuerung 1 sendet.

    Auch hier ist zu beachten, dass die Variablen in einem zyklischen Task abgefragt werden (sonst gibt es eine Fehlermeldung).

    Vorteil (zumindest bei meiner Steuerung: SABO) ist, dass ich keine weiteren Bausteine benötige.

    Ich hoffe, man kann das Vorgehen nachvollziehen

    MfG,

    Roger

    Edit: so kann man natürlich jetzt von jeder Steuerung im Netzwerk Daten versenden. Man muss aber immer darauf achten, jeder Liste eine unterschiedliche COB-ID zu vergeben.

     
  • J Schohaus - 2009-09-18

    Hallo

    Du kannst auch ein POINTER auf einer beliebigen Strucktur oder ARRAY übergeben.

     
  • cali - 2009-09-18

    Danke für die Tipps. Ich habe vergessen zu erwähnen, dass ich die Daten mit einem selbstgeschrieben Programm auswerten möchte und nicht 2 Steuerungen miteinander koppeln möchte.

    @J Schohaus: der Baustein möchte aber ein Array of Byte und ich möchte Realwerte versenden.

    Grüße

    Cali

     
  • cmoeller - 2009-09-24

    Hallo cali,

    was J Schohaus sagt ist:

    Du kannst mit der Funktion ADR(rMyRealVariable) die Addresse deiner Real-Variablen holen und direkt an den UDP_Client übergeben.

    Das geht weil der Speicher sowieso "byteorientiert" aufgebaut ist.

    Im zweiten Schritt must du nur noch bestimmen wie viele Bytes gesendet werden sollen. Für einen REAL-Wert wären das diBytesToSend := 4

    ptSendBuffer := ADR(rMyRealVariable);
    diBytesToSend := 4; (* oder auch SIZEOF(rMyRealVariable) *) 
    

    Ich würde dir empfehlen das erstmal mit einem STRING-Variablen zu probieren, da dieser in deiner Anwendung besser zu lesen ist als die durch 1 Bit Vorzeichen, 8 Bit Exponent und 23 Bit Mantisse.

    ptSendBuffer := ADR(sMyStringVariable);
    diBytesToSend := LEN(sMyStringVariable);
    

    Gruss cmoeller

     
  • cali - 2009-09-25

    Danke cmoeller,

    also ich werde meine Real-Variabel in einen String umwandeln und diesen per Pointer versenden. Im PC-Programm kann ich den String dann wieder in einen Double o.ä. wandeln.

    Probiere es am Wochenende aus.

    Vielen Dank für den Tip.

     

Log in to post a comment.