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

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

Thema: RS232 Datenkommunikation

  1. #1
    Registriert seit
    18.02.2011
    Beiträge
    26
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    bin am verzweifeln.
    Habe ich Baustein mit der Zusammenfassung zur RS232 Kommunikation erstellt.

    FB_COMMUNICATION
    VAR_INPUT
    Data_In : POINTER TO BYTE;
    Length : UDINT;
    bExecute : BOOL;
    END_VAR

    trig(CLK:=bExecute);
    IF trig.Q THEN
    SendD( pSendData:=Data_In,
    Length:=Length,
    TXBuffer:=TxBuffer1,
    Busy=>SendBusy,
    Error=>SendErrorId
    );
    END_IF
    und wenn ich ihn in MAIN so aufrufe muss ich 3-4 mal auf bExecute drücken bis er was sendet.
    MAIN
    VAR
    SND_NKE : ARRAY [0..4] OF BYTE := 16#10, 16#40, 16#00, 16#00, 16#16;
    bExecute : BOOL;
    END_VAR

    r_trig(CLK:=bExecute);
    IF r_trig.Q THEN
    fbSendNKE( Data_In:=ADR(SND_NKE),
    Length := SIZEOF(SND_NKE),
    bExecute := TRUE);
    END_IF
    was kann ich dagegen machen?
    Zitieren Zitieren RS232 Datenkommunikation  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard

    ... bei Siemens wäre es so, dass der Baustein immer bearbeitet werden wollte und du den Trigger auf den IN-Parameter legen müßtest. Vielleicht versuchst du es hier auch mal so ...
    Code:
     
    fbSendNKE( Data_In:=ADR(SND_NKE),
         Length := SIZEOF(SND_NKE),
         bExecute := myTrigger);
    Gruß
    Larry

  3. #3
    demon2000 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.02.2011
    Beiträge
    26
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich rufe ja den Baustein mit dem Trigger auf. Der Baustein wird also nur ein mal aufgerufen. Ich muss in 3-4 mal aufrufen bis er das richtige sendet.

  4. #4
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    752
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    Ich nehme an, dass "SendD" ein "SendData"-FB aus der TwinCat-RS232-Bibliothek ist. Wenn der beim ersten Aufruf nicht alle Sendebytes in TxBuffer eintragen kann, gibt er Busy=True zurück, und Du musst ihn in den nächsten Zyklen mit unveränderten Sendedaten erneut aufrufen, bis er Busy=False zurückgibt.

    Ich bin mir aber nicht sicher, ob das Dein Problem wirklich löst. Ich habe mit etwas Ähnlichem zu kämpfen. Eigentlich muss ich 300 Bytes senden, dabei fehlen mir aber am Ende einige Bytes. Wenn ich dagegen 320 Bytes sende, werden diese vollständig übertragen. Ich vermute, dass der UART-Chip der Schnittstelle so eingestellt ist, dass er erst bei einem bestimmten Füllstand seines internen FIFO's die Daten sendet. Habe allerdings noch keine Zeit gefunden, mich darum zu kümmern.

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard

    Zitat Zitat von demon2000 Beitrag anzeigen
    Ich rufe ja den Baustein mit dem Trigger auf. Der Baustein wird also nur ein mal aufgerufen. Ich muss in 3-4 mal aufrufen bis er das richtige sendet.
    Ja ... vielleicht ist das ja dein Problem.
    Der Baustein wird ja nur bearbeitet solange der Trigger ansteht - danach nicht mehr. Vielleicht probierst du meinen Vorschlag einfach mal aus. Bedingte Bearbeitung ist immer so eine Sache ...

    Gruß
    Larry

  6. #6
    demon2000 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.02.2011
    Beiträge
    26
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich wollte die Sende und Empfangsfunktion in einer Schleife aufrufen um sicher zu stellen, dass alle Daten Empfangen bzw. gesendet wurden.
    Dabei stürzt der System Manager ab.
    WHILE NOT ReceiveD.DataReceived DO
    Timer(IN:=TRUE, PT:=T#0.1s);
    IF Timer.Q OR SendD.Busy THEN
    SendD( pSendData:=ADR(SND_NKE),
    Length:=SIZEOF(SND_NKE),
    TXBuffer:=TxBuffer1,
    Busy=>SendBusy,
    Error=>SendErrorId
    );
    Timer(IN:=FALSE);
    END_IF
    (*==================================================================
    Receive data
    *)
    ReceiveD( pReceiveData:=ADR(RSP_UD_DATA),
    SizeReceiveData:=SIZEOF(RSP_UD_DATA),
    Timeout:=t#5s,
    RXbuffer:=RxBuffer1,
    Error=> ReceiveErrorID);
    DataReady:= NOT ReceiveD.DataReceived;
    END_WHILE

  7. #7
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    Kann es sein, dass dein ReceiveD-Baustein nicht aktualisiert wird?

    Füg mal folgende Zeile for deine while-Schleife:
    Code:
    ReceiveD();
    A programmer is just a tool which converts caffeine into code.

  8. #8
    demon2000 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.02.2011
    Beiträge
    26
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich bekomme die Fehlermeldung "Kommunikationsfehler (#2), Es wird Ausgeloggt" und im System Manager"Type Server (Port) Timestamp Meldung
    Warning TCIO (300) 31.03.2011 12:39:01 901 ms Watchdog des asynchronen Mapping 1 zwischen Prozeßabbild 1 und 2 hat zugeschlagen, da Prozeßabbild 1 keine neuen Daten lieferte.

  9. #9
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    Du hast dir, wie ich schon vermutet hatte, eine Endlosschleife gebaut. Deshalb schlägt auch der Watch-Dog zu.

    Muss es bei dir denn unbedingt eine while-Schleife sein? Kannst du das Ganze nicht auch mit IFs aufbauen?
    A programmer is just a tool which converts caffeine into code.

  10. #10
    Registriert seit
    09.03.2011
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Die Prozessdaten (Eingänge, Ausgänge, Serielle Dtaen etc.) werden immer vor bzw. nach einem SPS Zyklus aktualisiert. Wenn am Anfang eines Zykluses keine neuen Daten anstehen, dann läuft die While Schleife ewig. Da Daten, die während des Zykluses ankommen erst im nächsten Durchlauf dem Programm zur Verfügung gestellt werden.
    Besser noch:
    Wenn möglich die Serielle Kommunikation über eine zweite "schnelle" Task abwickeln, die nichts anders als die Serielle Kommunikation behandelt.

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 09.01.2011, 17:54
  2. usb - rs232 - internet - rs232 - sps
    Von tojamata im Forum Sonstige Steuerungen
    Antworten: 9
    Letzter Beitrag: 19.02.2010, 10:56
  3. Ilc 150 -> rs232
    Von bernddasbrot87 im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 08.08.2009, 17:22
  4. Datenkommunikation zwischen S5 und S7
    Von delacasa im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 12.11.2007, 19:34
  5. S7 200 Rs232
    Von Much2k im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 06.07.2006, 15:44

Lesezeichen

Berechtigungen

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