Beckhoff - RS232 Schnittstelle mit unterschiedlichen Datentypen?

Geisterkarle

Level-2
Beiträge
126
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Ich muss mit einer Beckhoff Steuerung (C6930) über die entsprechend am Controller vorhandene RS232 Schnittstelle einen Trumpflaser ansteuern.
Wenn ich das nicht falsch verstehe muss ich dafür dem Laser verschiedene "TLV-Kommandos" schicken. Diese Kommandos sind aufgebaut:
Tag (Befehlscode): 4 Byte
Length (Datenlänge): 4 Byte
Value (Daten): max. 64kbyte
TLV mit ersten Buchstaben :)

Aber ich habe das Problem, das ich irgendwie nicht kapiere, wie ich Tag und Length mit meiner Value verheirate... das sind ja so im Prinzip "Doppelwort" - "Doppelwort" - "String". Ich kann die Doppelwörter natürlich zu String konvertieren, aber dann sind sie ja keine 4 Byte mehr (je nach Zahl).

Ich habe die Beckhoff Bibliothek für die Kommunikationsschnittstellen und würde mit "SerialLineControl" arbeiten, um meine Daten auf die Schnittstelle zu schreiben und ich glaube muss mit "SendData" arbeiten. Oder brauche ich was anderes? Oder wie gehe ich da vor? Hab grad bisle geistiges Blackout...

Für Tipps Dankbar!
Geisterkarle
 
Hallo ...

So, wie ich deine Beschreibung verstehe, IST Tag und Length je ein Doppelwort. Value ist dann vermutlich etwas, dass zu der Tag-Zuordnung passt. Alles zusammen wäre für mich dann ein Array of Byte in der entsprechenden Größe, dass du dann an die Schnittstelle übergeben müßtest. Das heißt, dass du eine weitere Sicht auf den Übertragungsdatenbereich machen müßtest.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Danke für die Antwort.
Ja, hast du richtig verstanden.
Array of Byte ist die Frage ob ich den dann direkt in meinen Kommunikationspuffer schreiben kann ... illustererweise kann ich mit "SendData" kein Array of Byte and den ComBuffer schicken. Obwohl der ComBuffer anscheinend ein Array of Byte ist :)
Zudem blicke ich noch nicht ganz, wie ich dann im Fall der Fälle den DINT halbwegs vernünftig in das array schiebe...

Hat wer ne Ahnung, wie genau das "SendData" funktioniert? Werden die Daten direkt an die Schnittstelle gesendet oder erst mit dem Aufruf der "SerialLineControl" abgesetzt? Also könnte ich mir aus mehreren Send-Befehlen selber das zusammen bauen?

Code:
SendenMarkLaserD(pSendData:=StringTag ,TXbuffer:= TxBuffer);
SendenMarkLaserD(pSendData:=StringLength ,TXbuffer:= TxBuffer);
SendenMarkLaser(SendString:=StringValue , TXbuffer:=TxBuffer);
Könnte ich mir so das Ganze direkt zusammen bauen lassen? Oder sendet der das dann einzeln?

Leider ist mein Laser noch nicht angeschlossen und ich mache hier gerade Offline rum, da würde ich gern mal rumspielen wollen...

grüße
 
Eines fällt mir dazu gerade noch ein :
Erwartet dein Laser als Tag und Length den Übergabewert wirklich als Doppelwort ? Oder (das habe ich auch schon gesehen) als ASCII-Zeichen ?
Beispiel für Tag : Der Parameter, den du anstossen möchtest ist 27. Ggf. soll hier dann "0" + "0" + "2" + "7" übergeben werden.
Das würde vielleicht auch erstmal checken.

Des weiteren : ich weiß nicht, wie der Sende-Baustein genau arbeitet - ich könnte mir aber vorstellen, dass deine 3 Sendebefehle nicht aneinandergehängt werden sondern sie sich sogar gegenseitig überschreiben könnten. Um das auszuschliessen würde ich den TxPuffer grundsätzlich komplett erzeugen und dann dem Sendebaustein übergeben.

Gruß
Larry
 
@Geisterkalle.

Das Prinzip der Kommunikationsbibliothek/Architektur ist der HW geschuldet.
Die HW hat einen kleines Interface (3, 5, 22 oder 64 Byte) um Daten zu erhalten/auszutauschen. Dieses Interface interessiert dich absolut nicht bis auf dass du die HW mit der SPS verknüpfen musst.
In der PLC wird die Schnittstelle "nach unten" über den "SerialLineControl"-Baustein verwaltet. Nach "oben hin" gibt es dann jeweils einen 300 Byte Ring-Puffer (Send/Receive). Auf diesem arbeiten dann die Bausteine wie z.B. SendString.
Ob du nun einen String verschickst (SendString) oder ein Byte-Array (SendData)ist physikalisch identisch da jeder "Character" im String auch nur ein Wert darstellt.

Was du nun verschicken musst ist letzendlich abhängig von der Gegenstelle - da mische ich mich nicht mit ein. Doku lesen ist dort angesagt.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also Trumpf will Tag + Lenght + Value in einem Telegramm, daher solltest du nicht alle 3 Dinge gleichzeitig schicken.
Der einfache Weg ist, dir eine Struktur zu basteln

Code:
TYPE TrumpfTLV :
STRUCT
	Tag		:DWORD;
	Length	:DWORD;
	Value		:ARRAY [1..200] OF BYTE;
END_STRUCT
END_TYPE

1. Tag - Das sind feste Kommandos (steht alles sehr in der Doku von Trumpf)
2. Lenght - Eben die Länge des Telegramm (Berechnung, Offsets - bitte schau in de Doku, weiß es nicht mehr ausm Kopf)
3. Value - Das sind einfach nur Strings, aber ASCII (!!!) Codiert

Beispiel (Laden einer Markierdatei):

Tag = 20401
Lenght = Länge des Speicherpfades (+Nullterminierung)
Value = C:\Test\Versuch.vlf

Die ASCII Codierung von Value kannst du recht leicht mit String-Zerlegung und F_ToASC machen (Schleife mit Stringlänge und mit MID Befehl einzelne Buchstaben rausziehen).

Dann kopierst du die ganze struktur mit Memcpy in ein Array Of Byte und haust es auf RS232 Schnittstelle.
 
Hallo!
Hm, scheint du hast sowas schonmal gemacht! Das ist natürlich von Vorteil hier :)
Danke! hat mich auf jeden Fall mal vorran gebracht! Wobei ich aktuell an deiner letzten Zeile scheitere!
Den array habe ich erfolgreich zusammengebaut. Aber wie schiebe ich den auf die Schnittstelle?
Versuche gerade dies:
Code:
VAR:
    SendenMarkLaser: SendData;
END_VAR

FlankeStartSenden(CLK:=tastedummy);
IF FlankeStartSenden.Q OR SendenMarkLaser.Busy THEN
    SendenMarkLaser(pSendData:=ADR(testarray), length:=SIZEOF(testarray) , TXbuffer:=MarkLaser_TxBuffer);
END_IF

Aber scheint nichts zu machen; mein TXbuffer bleibt leer ... Error ist aber auch 0...
Muss ich das anders angehen? Oder sieht man hier den Fehler (der jetzt wohl weniger mit dem Ursprungsproblem, als mit allgemein RS232 zu tun hat)
Fast da :)

grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sollte hoffentlich sein! Mache das ja zum ersten Mal, daher nicht 100% sicher, was die "Hintergrundkommunikation" ist.

Globale Variablen:
Code:
(* ++++++++++++  COM 2 Schnittstellen  von Beckhoff Rechner +++++++++++ *)(* Markierungslaser*)
    MarkLaser_InData                AT %I*    : PCComInData;
    MarkLaser_OutData                AT %Q*    : PCComOutData;
    MarkLaser_RxBuffer:                ComBuffer;                        
    MarkLaser_TxBuffer:                 ComBuffer;
Und allgemeiner Aufruf:
Code:
VAR
    MarkLaserControl: SerialLineControl;                
    MarkLaserControl_Error: BOOL;
    MarkLaserControl_ErrorID: ComError_t;
END_VAR

MarkLaserControl    ( Mode:= SERIALLINEMODE_PC_Com_port,
                            pComIn:= ADR(MarkLaser_InData),                    
                            pComOut:= ADR(MarkLaser_OutData),                
                            SizeComIn:= SIZEOF(MarkLaser_InData),            
                            TxBuffer:= MarkLaser_TxBuffer,                        
                            RxBuffer:= MarkLaser_RxBuffer,                        
                            Error=> MarkLaserControl_Error,
                            ErrorID=> MarkLaserControl_ErrorID );

Wenn ich statt SendData ein SendString nutze, kommt das auf meiner Schnittstelle an (wenn ich meinem Prozessabbild glauben darf). Aber String hilft mir hier ja nicht weiter :(
 
Ah, sorry für Doppelpost, aber Kommando zurück: Funktioniert!
Ich hab mit sizeof() den ganzen Bereich geschickt und am Ende sind natürlich 0en! Deshalb sah meine nur 66Byte große Schnittstelle entsprechend leer aus, wenn dann Byte 200+ als letztes angezeigt wird! Da ich vermutlich nicht länger werden muss hab ich mir das einfach mal Ansichtstechnisch auf 66 begrenzt.

Das Ganze kommt noch nicht beim Laser an, aber die Beckhoffseite ist erstmal erledigt (*glaub*)
Danke an alle Tipps!
 
Zurück
Oben