Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Wago 750-841, RS232, Sensor

Slawa
2008-08-11
2008-08-26
1 2 > >> (Page 1 of 2)
  • Slawa - 2008-08-11

    Hallo,

    ich habe einen digitalauslesbaren Temperatursensor. Dieser ist über die serielle Schnittstelle RS232 angeschlossen. Um die Temperatur auszulesen muss ich an den Sensor einen String schicken (z.B.: „ReadT“), auf den der Sensor dann mit der aktuellen Temperatur antwortet.

    http://www.wago.com/wagoweb/document...9/a110901d.htm, aber ich habe noch einige Fragen:

    Für den Block 750-650/003-000 und der Sensor ist an COM2 angeschlossen. Mit dem unten gezeigten Code funktioniert das jedoch nicht. Ich kann den Fehler nicht finden, könnten Sie mir dabei helfen?

    Ich habe so geschrieben:

    PROGRAM PLC_PRG

    VAR

    wBaudRate : WORD := 960;

    bDataBits : BYTE := 8;

    bParity : BYTE := 0;

    StopBits :BYTE:=1;

    bFlowControl : BYTE := 0;

    COM2 : SERIAL_INTERFACE;

    xOpenPort : BOOL := TRUE;

    xInitPort2 : BOOL;

    xSendActive : BOOL;

    SendString2 : STRING := 'Msg from COM2';

    ReceiveBuffer : typRing_Buffer;

    ReceiveBuffer2OldIndex : INT;

    ReceiveString2 : STRING(255);

    pReceiveStr2 : POINTER TO ARRAY[0..255] OF BYTE;

    help2Idx : INT;

    iTo2 : INT;

    i: INT;

    END_VAR

    Aber habe ich vielleicht Falsch geschrieben.

    Danke im voraus

     
  • Slawa - 2008-08-11

    Kann mir jemand sagen, wie das geht bzw. gibt es irgendwo ein Beispielprogramm?

     
  • Bewareofthis - 2008-08-11

    Servus,

    ist die Variablendeklaration alles? Wie sieht der Bausteinaufruf aus?

    Generell kann man sich grob an die Beispiele von Wago halten, allerdings muss man für die "Empfangs-String-Auswertung" eine eigene Routine je nach Protokoll des Kommunikationspartners zusammenbasteln

    Hier mal ein einfacheres Beispiel aus einem meiner Projekte: ```

    ( Send and Receive for COM2 )
    COM(   bCOM_PORT_NR    := INT_TO_BYTE(in_COM_Port),
          cbBAUDRATE       := wBaudRate,
          cbsBYTESIZE      := bDataBits,
          cpPARITY      := bParity,
          csSTOPBITS      := STOPBITS_1,
          cfFLOW_CONTROL   := bFlowControl,
          utRECEIVE_BUFFER := ReceiveBuffer,
          ptSEND_BUFFER   :=PT_SendStr,
          xINIT         := xInitPort,
        xOPEN_COM_PORT    := xOpenPort,
          iBYTES_TO_SEND   :=I_LENGTH,
          xSTART_SEND      := M_SENDSTR);
    bERROR:=COM.bERROR;
    IF pReceiveStr = 0 THEN (Empfangspuffer mit Adresse von Empfangsstring initialisieren)
          pReceiveStr := ADR( ReceiveString );
    END_IF;
    IF  ReceiveBuffer.Index>0 THEN (Neue Daten empfangen)
       IF  ReceiveBuffer.Data[  ReceiveBuffer.Index-1 ] = 16#0A  THEN (16#0A=LF(Linefeed) )
             FOR i:=0 TO 255 DO
                pReceiveStr^[i]:=16#00;  (Empfangspuffer löschen)
             END_FOR;
             FOR i:=0 TO ReceiveBuffer.Index-1 DO
                pReceiveStr^[i] :=  ReceiveBuffer.Data[ i ]; (Ringpufferdaten in Empfangspuffer kopieren)
             END_FOR;
             M_RECVSTR:=TRUE;
             ReceiveBuffer.Index:=0; (Index des Ringpuffers zurücksetzen)
       END_IF;
    END_IF;

    ```

    HTH

    Bewareofthis

     
  • Slawa - 2008-08-12

    Hallo,

    Zitat:
    ist die Variablendeklaration alles?

    Das ist alles. Ist das Richtig für die Variablendeklaration? Oder muss ich noch etwas schreiben?

    Danke für die Hilfe.

    CoDeSys.doc [64 KiB]

     
  • Slawa - 2008-08-12

    Hallo,

    ich habe noch eine Frage. Welche die Variablendeklaration hat dein Beispiel?

    Danke im voraus

     
  • Bewareofthis - 2008-08-12
       PT_SendStr   :POINTER TO ARRAY[0..255] OF BYTE;
       PT_TmpStr   :POINTER TO ARRAY[0..255] OF BYTE;
       STR_SENDSTR   :STRING(255);
        M_RECVSTR            :BOOL:=FALSE;
    (* Communicationparams for 750-65x/003-000 only*)
       wBaudRate      : WORD := 960;
       bDataBits      : BYTE := 8;
       bParity         : BYTE := 2; (*2=EVEN*)
       bFlowControl    : BYTE := 1; (*1=XON/XOFF*)
       i             : INT;
    (* COM  ********************************************)
       COM         : SERIAL_INTERFACE;
       xOpenPort      : BOOL := TRUE;
       xInitPort         : BOOL;
       xSendActive      : BOOL;
       ReceiveBuffer   : typRing_Buffer;
       ReceiveBufferOldIndex   : INT;
       ReceiveString    : STRING(255);
       pReceiveStr     : POINTER TO ARRAY[0..255] OF BYTE;
       bERROR      :BYTE :=16#00;
    
     
  • Slawa - 2008-08-13

    Hallo,

    danke für die Hilfe. Ich habe noch einige Fragen:

    iBYTES_TO_SEND :=I_LENGTH,

    xSTART_SEND :=M_SENDSTR

    Wozu brauchen wir die Variablen I_LENGTH und M_SENDSTR? In den Variablendeklaration habe ich sie leider nicht gefunden. Und Variable STR_SENDSTR :STRING(255) - wie kann ich sie benutzen?

    P.S. Entschuldigung für meine Fragen. Aber ich erlerne CoDeSys nur eine Woche.

     
  • Slawa - 2008-08-13

    Hallo,

    ich habe noch eine Frage:

    wie kann ich an den Sensor einen String (z.B. ReadT) schicken?

    Danke im voraus

     
  • Slawa - 2008-08-14

    Hallo,

    kann mir jemand helfen? Das ist sehr wichtig für mich.

    Danke im voraus

     
  • Uwe - 2008-08-14

    Schau mal unter folgendem Link

    http://www.wago.com/wagoweb/documentation/app_note/libdoku/ml00700d.pdf

    Dort findest du die Beschreibung zum Baustein Serial_Interface.

    Ist eigentlich recht einfach.

    Was hast du überhaupt für nen Sensor ?

    Hersteller ?

    genauer Typ ?

    hast du vielleicht auch nen Link auf das Handbuch des Sensors ?

    und

    Welche Programmiersprache verwendest du ?

    FUP / ST / KOP / ... ?

     
  • Slawa - 2008-08-14

    Vielen Dank für die Antwort!

    Zitat:
    Was hast du überhaupt für nen Sensor ?

    Sensor LubCos H2O+

    Zitat:
    Schau mal unter folgendem Link
    http://www.wago.com/wagoweb/documentati ... 00700d.pdf

    Ich habe mir das hier durchgelesen, aber bei mir funktioniert das leider nicht.

    Zitat:
    Welche Programmiersprache verwendest du ?
    Für mich ist besser FUP. Könnten Sie mir dabei helfen?

    Danke im voraus

     
  • Uwe - 2008-08-14

    Ich habe ein Beispiel in FUP angefügt.

    Wenn in dem Beispiel die Variable Eingang eine positive Flanke hat, dann wird 'ReadT' gesendet.

    Du mußt evtl. die Parameter Baudrate, Parität, Datenbits, Stopbits anpassen.

    Welche Baudrate und Parität hat dein Sensor ?

    Woher weisst du das du ReadT senden mußt ?

    Hast du ein Handbuch mit diesen Informationen als PDF ?

    Im Internet bei ARGO-HYTOS habe ich darüber nichts gefunden.

    Beispiel_Serial_Interface.pro [29.05 KiB]

     
  • Slawa - 2008-08-14

    Hallo Uwe,

    es gibt leider kein Handbuch als PDF nur als Papier. Dort steht:

    BaudRate - 9600, Parity - 0, DataBits - 8, StopBits - 1.

    Ich muss auch an den Sensor ReadT, ReadC, ReadTime usw. schicken.

    Danke im Voraus für deine Hilfe!

     
  • Uwe - 2008-08-15

    Hallo Slawa,

    ich denke deine Informationen sind unvollständig.

    Du wirst wahrscheinlich noch ne Menge Probleme haben.

    1. Parity - 0

    ist das null also KEINE ?

    oder O wie ODD ?

    must du evtl. probieren.

    1. Ich glaube eigentlich nicht das du nur 'ReadT'

    schicken must.

    Meistens gibt es noch zusätzliche Steuerzeichen wie z.B.

    <ret><lf> am Ende oder nur <ret> oder <stx> am Anfang</stx></ret></lf></ret>

    und <etx> am Ende.</etx>

    Ohne Steuerzeichen wird es schwierig für deinen Sensor

    ReadT von z.B. ReadTime zu unterscheiden.

    1. Selbst wenn dein Sensor dich versteht

    und dir auch antwortet, verstehst du ihn ?

    Wie sieht die Antwort aus ?

    Der Empfangsbuffer ist zunächst nur ein Ringbuffer in

    dem die empfangenen Bytes stehen.

    Du must also diese Bytes entnehmen und so umformen wie du sie brauchst.(INT, STRING, REAL, ...)

    Aber wenn du da durch bist, dann hast du die erste und die zweite Hürde

    zum CoDeSys'ler genommen

    Viel Glück

     
  • Slawa - 2008-08-15

    Hallo Uwe,

    Zitat:
    1. Parity - 0
    ist das null also KEINE ?

    Parity: None

    Flow control: None

    Noch Frage. Bei mir steht: Fehler 3740, Unbekanter Typ 'Serial_Interface'. Wenn ich Bibliothek 'serial_interface 01' benutze, bekomme ich sofort eine Antwort: Fehler 3760 'Fehlerhafter Initialwert'?

    Wo kann ich die Beschreibungsadatei für das Modul 'Module.Root' finden?

    Was ist passiert?

    Danke im Voraus für deine Hilfe!

     
  • Uwe - 2008-08-15

    Was für einen Controller benutzt du ?

    In dem Beispielprojekt must du

    -> den entsprechenden Contoller in den Zielsystemeinstellungen einstellen

    -> in die Steuerungskonfiguration wechseln

    -> im Menu Extras die Standardkonfiguration anwählen

    -> im Baum unter Hardwarekonfiguration / K-Bus deine Module anhängen

    (ich kenne deinen Aufbau nicht -> zuwenig Information)

    -> im Menu Fenster / Bibliotheksverwalter am besten alle Bibliotheken entfernen und dann neu in dieser reihenfolge folgende Bibliotheken einbinden

    SerComm.lib

    Serial_Interface_01.lib

    Standard.lib

    -> im Menu Projekt / Alles bereinigen ausführen

    -> im Menu Projekt / Alles übersetzen

    sollte auch bei dir funktionieren

    sonst schick doch mal ne mail mit deinem Program und Problembeschreibung an den Herstellersupport e support@wago.com e

    Die sind nach meiner Erfahrung immer recht hilfsbereit.

     
  • Slawa - 2008-08-15

    Hallo Uwe,

    Zitat:
    Was für einen Controller benutzt du ?

    Feldbus-Controller 750-841

    Ich habe dir einen E-Mail geschickt.

    Vielen Dank für die Hilfe!

     
  • Uwe - 2008-08-15

    Hi,

    du kannst mir keine mail schicken weil du meine email-adresse nicht kennst

    und ich diese auch nicht öffentlich ins Forum stelle.

    Und die PM's sind in diesem Forum deaktiviert -> geht also auch nicht.

    Also ich weiss nicht wo du ne mail hingeschrieben hast,

    jedenfalls nicht mir.

     
  • Slawa - 2008-08-15

    Hi,

    Zitat:
    du kannst mir keine mail schicken weil du meine email-adresse nicht kennst
    und ich diese auch nicht öffentlich ins Forum stelle.

    O.K. - das ist mein Fehler.

    Viele Grüssen

     
  • Slawa - 2008-08-15

    Hallo Uwe,

    jetzt funktioniert ohne Fehler, aber wie kann ich eine Antwort sehen, wenn ich an den Sensor einen String 'ReadT' schicke? Oder muss ich zuerst die Visualisierung erstellen?

    Vielen Dank im Voraus

     
  • Uwe - 2008-08-15

    Wenn du online bist, dann kannst du in der Variablendeklaration (oberes Fenster) auf das + vor dem ReceiveBuffer clicken.

    Danach siehst du die Strukturkomponente Index mit einem Wert.

    Dieser Wert zählt bei jedem empfangenen Zeichen 1 weiter.

    Darunter siehst du die Komponente Data mit einem + davor.

    Auf dieses + kann man auch einmal clicken.

    Nun öffnet sich Data und man kann die empfangenen Bytes sehen.

    Auf die einzelnen Bytes kannst du im Programm mit

    ReceiveBuffer.Data[0]

    ReceiveBuffer.Data[1]

    ReceiveBuffer.Data[2]

    u.s.w. zugreifen.

    so ich wünsch dir nun ein schönes Wochenende

    bis Montag

     

    Related

    Talk.ru: 1
    Talk.ru: 2

  • Slawa - 2008-08-18

    Hallo Uwe,

    ich habe eine Visualisierung erstellt und das Programm funktioniert jetzt. Danke für die Hilfe.

    Aber ich habe noch Frage. Sieh Dir bitte meine neue Datei an.

    Wenn ich mein Sensor aus- und einschalten, bekomme ich die richtige Antwort, weil ReceiveBuffer leer ist.

    Wie kann ich mein ReceiveBuffer leer machen?

    Danke im Voraus für deine Hilfe!

    W1.pro [32.07 KiB]

     
  • Uwe - 2008-08-18

    Ich habe es ein wenig gekürzt

    Probiers mal so.

    Übrigens etwas grün im Programm sieht einfach toll aus.

    Ich finde es passt so gut zum Variablenschwarz und Schlüsselwortblau

    W1.pro [31.1 KiB]

     
  • Slawa - 2008-08-19

    Hallo Uwe,

    das Programm funktioniert bei mir so:

    Wenn ich 'Start' drucke, bekomme ich einen komischen Wert in ReceiveString2 - '?$R$N'.

    Wenn ich mein Sensor aus- und einschalten (und 'START'), bekomme ich die richtige Antwort.

    Was passiert?

    Vielen Dank im Voraus!

     
  • Uwe - 2008-08-19

    Hallo Slawa,

    '?$R$N' ist kein komischer Wert.

    Es steht für ? <ret><lf></lf></ret>

    Auf jeden Fall sind es drei Zeichen die der Sensor gesendet hat.

    Es ist schwierig dir ohne Unterlagen aus der Ferne zu helfen.

    Ich würde es so interpretieren (ohne es wirklich zu wissen) denn

    ich kenne deinen Sensor nicht und habe nicht deine Informationen

    (Handbuch zum Sensor) :

    Der Sensor hat dich gehört aber nicht verstanden.

    Und nu fragt er : Hä ?

    Vielleicht ist deinen Anfrage mit 'ReadT$R' nicht ausreichend.

    Vielleicht möchte der Sensor die Anfrage auch mit <ret><lf> abgeschlossen haben.</lf></ret>

    Probier doch mal 'ReadT$R$N' als Anfrage.

     
1 2 > >> (Page 1 of 2)

Log in to post a comment.