Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Beckhoff - RS232 Schnittstelle mit unterschiedlichen Datentypen?

  1. #1
    Registriert seit
    17.04.2009
    Beiträge
    15
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Beckhoff - RS232 Schnittstelle mit unterschiedlichen Datentypen?  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.201
    Danke
    389
    Erhielt 2.296 Danke für 1.910 Beiträge

    Standard

    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

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Geisterkarle (19.01.2016)

  4. #3
    Geisterkarle ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.04.2009
    Beiträge
    15
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  5. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.201
    Danke
    389
    Erhielt 2.296 Danke für 1.910 Beiträge

    Standard

    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

  6. #5
    Registriert seit
    10.08.2012
    Beiträge
    128
    Danke
    0
    Erhielt 40 Danke für 38 Beiträge

    Standard

    @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

  7. Folgender Benutzer sagt Danke zu Guga für den nützlichen Beitrag:

    Geisterkarle (19.01.2016)

  8. #6
    Registriert seit
    04.03.2011
    Beiträge
    77
    Danke
    15
    Erhielt 6 Danke für 6 Beiträge

    Standard

    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.
    Es kommt nicht darauf an, mit dem Kopf durch die Wand zu rennen, sondern mit den Augen die Tür zu finden.

  9. Folgender Benutzer sagt Danke zu Bl000b3r für den nützlichen Beitrag:

    Geisterkarle (19.01.2016)

  10. #7
    Geisterkarle ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.04.2009
    Beiträge
    15
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  11. #8
    Registriert seit
    17.12.2015
    Beiträge
    31
    Danke
    0
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Ist der MarkLaser_TxBuffer vom Typ ComBuffer und läuft die Hintergrundkommunikation?
    http://infosys.beckhoff.com/content/...a.htm?id=24920
    Gruß
    Paulchen

  12. #9
    Geisterkarle ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.04.2009
    Beiträge
    15
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  13. #10
    Geisterkarle ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.04.2009
    Beiträge
    15
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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!

Ähnliche Themen

  1. Probleme mit WAGO RS232 Schnittstelle an S7
    Von namenloser_fremder im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 03.06.2011, 06:07
  2. Converter SSI auf RS232/RS422 Schnittstelle mit µC
    Von claudia im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 15.10.2010, 07:51
  3. CNC-Gantry-Achsen (ISG) von Beckhoff mit unterschiedlichen Abweichungen?
    Von Tigerkroete im Forum Sonstige Steuerungen
    Antworten: 0
    Letzter Beitrag: 07.12.2007, 06:38
  4. PC RS232 Schnittstelle mit WinCC abfragen?
    Von Wondermike_2000 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 22.05.2007, 21:25

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •