Beckhoff TwinCAT2/ LCD ansteuern über RS232

Onkelweed

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

ich hab ein tolles Problem und weis keinen Rat mehr.

Ich soll über eine EL6002 (RS 232-Klemme) ein Textdisplay ansteuern.
Nach zwei Tagen habe ich es geschafft, dass ich Nachrichten endlich über Tx senden kann (Die Maske für den realen COM ist im Gegensatz zum virtuellen COM eine Katastrophe!)

Das Display wird über diese Platine mit der RS 232 verbunden:

http://fab.cba.mit.edu/classes/4.140/people/joseph.morrow/SerLCD_V2_5.pdf

und ab Kapitel 2 gehen die Steuerbefehle los.
Und genau da liegt mein Problem!
Wie sage ich TwinCAT, dass es die Steuersignale übertragen soll?
Ich hab es mit %FEx, %xFE, $FE und 16hex254 und dann noch (0x)01 in verschiedensten Formen dazu versucht, um das Display zu löschen oder eine andere Konfiguration einzustellen, aber es Zeigt weiterhin fröhlich die Zahlen und Symbole an.

Vielleicht kann mir ja einer Helfen. Danke im Voraus!
 

Anhänge

  • Programmcode.JPG
    Programmcode.JPG
    465,6 KB · Aufrufe: 57
Zuletzt bearbeitet:
Hi,

ich würde anders an die Sache herangehen:
a) Erst einmal vom PC aus mit einem Terminalprogramm wie HTerm versuchen das Display anzusteuern.

b) Klappt alles ? Dann die RS232 in der PLC konfigurieren.

zu a)
Hier kannst du losgelöst von dem ganzen Heck Meck auf der Beckhoff Seite testen. Das geht weitaus schneller. Zudem bist du dir dan deiner Sache sicher wie das Display auf die Steuerbytes reagiert.

zu b)
Hast du schon mal eine RS232 aus der Beckhoff Welt bedient?
Dort sind ein paar Sachen wichtig, wie der schnelle Task der die Kommunikationsbausteine aufruft.
Oder auch die Parametrierung der im System Manager.


Gruß
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Daniel,

a) Erst einmal vom PC aus mit einem Terminalprogramm wie HTerm versuchen das Display anzusteuern.

Das haben Wir gemacht und es hat auch 1A funktioniert. Jetzt will ich aber im normalen Betrieb das Display löschen, bevor ich einen neuen Text drauf schreiben, da sonst der Text da anfängt wo der andere aufhörte.

Hast du schon mal eine RS232 aus der Beckhoff Welt bedient?
Dort sind ein paar Sachen wichtig, wie der schnelle Task der die Kommunikationsbausteine aufruft.
Oder auch die Parametrierung der im System Manager.

Nein, aber wir haben es ja schon zum laufen bekommen, nur das ich das mit dem Text (siehe oben) schön machen muss, du weist doch, das Auge der Chefs und der MA wünscht Perfektion.
 
Du versuchst einen Hex-Wert mit SendString zu senden. SendString sendet, wie der Name schon sagt, einen String also '16#01'. Um Bytes zu senden gibt es entweder die schöne Funktion "SendByte" um ein einzelnes Byte zu übertragen oder "SendData" um ein ganzen Feld von Bytes zu senden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo MasterOhh,

ja, dass hab ich mir dann auf dem Weg nach Hause auch überlegt.
Aber leider klappt das doch nicht wie gedacht.
Kann mir bitte jemand sagen, was in meinem "SendData" - Code falsch ist?

VAR
SendData2: SendData;
Length : UDINT;
SendBusy2: BOOL;
SendErrorID2: ComError_t;
END_VAR

SendData2(
pSendData:= POINTER TO BYTE (16#01),
Length:= Length,
TXbuffer:= TXBuffer2,
Busy=> SendBusy2,
Error=> SendErrorID2);

Ich hab mich dabei an diesen Beitrag gehalten:
http://www.sps-forum.de/beckhoff-codesys-iec61131/43992-rs232-datenkommunikation.html

Danke!
 
Zuletzt bearbeitet:
pSendData ist die Speicheradresse einer Variablen. Ich nehme an, dass Du den Bytewert 16#01 senden willst. Dazu musst Du eine Variable mit diesem Wert deklarieren
Code:
VAR
   Value_to_Send:BYTE:=16#01;
END_VAR
und ihre Adresse beim Aufruf von SendData2 übergeben
Code:
SendData2(
pSendData:=ADR(Value_to_Send),
...
 
Danke StructuredTrash,

aber leider geht das noch immer nicht.
Der Code sieht jetzt so aus:

VAR
SendData2: SendData;
Sendewert:BYTE:=16#01
Length : UDINT;
SendBusy2: BOOL;
SendErrorID2: ComError_t;
END_VAR

SendData2(
pSendData:= ADR(Sendewert),
Length:= Length,
TXbuffer:= TXBuffer2,
Busy=> SendBusy2,
Error=> SendErrorID2);

Aber auf dem LCD passiert nichts.
Es muss doch einer doch schon mal so etwas gemacht haben!? :cry:
 
Die Variable Length muss natürlich auch den richtigen Wert haben, in Deinem Fall also 1.

Also ich fasse das jetzt nochmal zusammen, da mein Hirn bei der Hitze gerade schwer von Verständnis ist. :sb7:
Ich will einen zweistelligen Hex-Code senden (01, F7, usw.), der besteht aus zweimal 4 Bits -> 8 Bits =1 Byte.
Die Variable Length auf 1 sagt nun dem FB "SendData" das der Code den ich senden will jeweils 1 Byte groß ist?
Also muss ich die Variable Length nur einmal auf 1 setzen und kann dann jeden zweiwertigen Hex-Code senden den ich will!?
 
Die Variable Length auf 1 sagt nun dem FB "SendData" das der Code den ich senden will jeweils 1 Byte groß ist?
Also muss ich die Variable Length nur einmal auf 1 setzen und kann dann jeden zweiwertigen Hex-Code senden den ich will!?
Ja, so sollte es gehen. Genau für diesen Fall gibt es aber, wie MasterOhh schon weiter oben geschrieben hat, den einfacheren FB "SendByte". Wenn Du auch nach der Test- und Bastelphase nur einzelne Bytes senden willst, wäre der wohl die bessere Wahl.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, jetzt Funktioniert es so wie gewünscht :ROFLMAO:, nur das die Platine selbst nicht richtig mitspielt! :sad:

Ja, so sollte es gehen. Genau für diesen Fall gibt es aber, wie MasterOhh schon weiter oben geschrieben hat, den einfacheren FB "SendByte". Wenn Du auch nach der Test- und Bastelphase nur einzelne Bytes senden willst, wäre der wohl die bessere Wahl.


Später sollen dann noch ein paar andere HD-Hex-Befehle übertragen werden und andere Platinen über RS232 angesteuert werden, also bleib ich da doch lieber bei "SendData".;)

Danke noch mal an alle für die Hilfe!!
 
Ich habe auch an einer Anlage LC-Displays die ich über RS232 (EL6001) ansteuere. Ich habe mir dafür einfach eine Pufferstruktur erstellt, die nichts weiter als ein Byte-Array für die Daten und einen Int-Wert als Zähler, an welcher Position im Array weitergeschrieben werden muss, enthält.
Dann habe ich für alle Steuerbefehle die ich für das Display brauche einen Funktionsblock geschrieben. Z.B. der FB "FB_TextModus" hat als Eingangsvariablen Modus:Byte und Muster:Byte. Pufferstruktur schleife ich als IN_OUT durch den FB durch.
Im FB werden dann die entsprechenden Kommandos für das LCD und die Werte für Modus und Muster in das Array der Pufferstruktur geschrieben. Und zwar beginnend bei der Zählerposition. Am Ende wird dann noch der Zähler um die Anzahl der geschriebenen Bytes erhöht.

Die Pufferstruktur kann ich dann durch mehrere Funktionsbausteine durchleiten. (Ich schreibe auch den Text als Byte-Werte, weil ich z.B. Umlaute umcodieren muss bei dem Display, außerdem gibt mir das mehr Freiheiten beim Formatieren (einrücken usw.)) Jeder FB schreibt dann seine Daten immer ab der letzte Position weiter. (Ich habe auch noch eine Funktion die prüft ob die Daten überhaupt noch in das Array rein passen)
Am Ende schicke ich dann das Array mit SendData an das Display (der Zähler ist dabei gleich den Längenwert, den man für SendData braucht), setze den Zähler zurück auf 0 und kann wieder von vorne mit dem Schreiben beginnen .....
 
Zurück
Oben