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
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.
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
  PT_SendStr  :POINTERTOARRAY[0..255] OFBYTE;
  PT_TmpStr  :POINTERTOARRAY[0..255] OFBYTE;
  STR_SENDSTR  :STRING(255);
  M_RECVSTR        :BOOL:=FALSE;(*Communicationparamsfor750-65x/003-000only*)
  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   : POINTERTOARRAY[0..255] OFBYTE;
  bERROR    :BYTE :=16#00;
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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!
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
Kann mir jemand sagen, wie das geht bzw. gibt es irgendwo ein Beispielprogramm?
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
Hallo,
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]
Hallo,
ich habe noch eine Frage. Welche die Variablendeklaration hat dein Beispiel?
Danke im voraus
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.
Hallo,
ich habe noch eine Frage:
wie kann ich an den Sensor einen String (z.B. ReadT) schicken?
Danke im voraus
Hallo,
kann mir jemand helfen? Das ist sehr wichtig für mich.
Danke im voraus
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 / ... ?
Vielen Dank für die Antwort!
Sensor LubCos H2O+
Ich habe mir das hier durchgelesen, aber bei mir funktioniert das leider nicht.
Danke im voraus
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]
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!
Hallo Slawa,
ich denke deine Informationen sind unvollständig.
Du wirst wahrscheinlich noch ne Menge Probleme haben.
ist das null also KEINE ?
oder O wie ODD ?
must du evtl. probieren.
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.
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
Hallo Uwe,
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!
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.
Hallo Uwe,
Feldbus-Controller 750-841
Ich habe dir einen E-Mail geschickt.
Vielen Dank für die Hilfe!
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.
Hi,
O.K. - das ist mein Fehler.
Viele Grüssen
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
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
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]
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]
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!
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.