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

Ergebnis 1 bis 10 von 10

Thema: B&R String über RS 232 an Drucker ausgeben

  1. #1
    Registriert seit
    15.02.2007
    Beiträge
    16
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Grüßt Euch,

    ich möchte mehrere Zeilen Text an einen Drucker über die serielle Schnittstelle ausgeben.

    Zur Zeit habe ich eine PC mit Hyperterminal als Endteilnehmer. Die RS232 an der B&R funktioniert.
    Es kommen einige Zeilen am PC an. Dann gibt es im Programm einen Fehler: Und zwar geht der DVWrite auf Störung mit der Fehlernummer 8078 ("Der Auftrag wird abgehlehnt, weil in der Sendewarteschlange bereits die maximal erlaubte Anzahl von Sendepuffern (siehe Funktion FRM_xopen) eingereiht ist").

    Ich rufe nur einmal den FRMgbuf auf, dann werden die Zeilen eine nach der anderen (pro Zyklus eine) übergeben.

    Hat da jemand Erfahrung?

    Danke Euch für die Mühe
    Heppo
    Zitieren Zitieren B&R String über RS 232 an Drucker ausgeben  

  2. #2
    Registriert seit
    28.10.2005
    Ort
    Ottweiler, Saar
    Beiträge
    940
    Danke
    259
    Erhielt 124 Danke für 109 Beiträge

    Standard

    Kenn mich mit B&R nicht aus, aber vielleicht hilft Dir das:

    Ich denke eine Zeile pro Zyklus ist viel zu schnell.

    Angenommen der serielle Zeichenrahmen ist 8N1,
    ein Byte belegt 10 Bits. Bei 9600 Baud kommst Du
    somit auf 960 Zeichen pro Sekunde.
    Bei Zykluszeiten im Millisekundenbereich ist dann
    ruckzuck der Puffer voll...

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

    Heppo (06.04.2007)

  4. #3
    Registriert seit
    22.03.2007
    Ort
    Niederlande
    Beiträge
    45
    Danke
    3
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hallo Heppo,

    ein Tip meinerseits. Du musst den Buffer auf empty ueberwachen,
    sprich status = 0. Die Meldung 8078
    frmERR_TRANSMITOVERRUNSend buffer waiting queue full
    sagt aus, das der Send-Buffer die Daten nicht los wird. Du kannst
    dann mit FRM_robuf_01 den Inhalt des Buffers loeschen und den
    zuletzt gesendeten String nochmal senden. Nachteil ist aber,
    alles was im Buffer stand ist weg.

    Ein andere Punkt ist, das Dein Drcker einfach zu langsam ist um
    die Daten entgegen zu nehmen, weil der Sendbuffer wie wild
    seine Daten los werden will. Frage ist jetzt in welcher Zykluszeit
    du das ganze laufen laesst? Du bist doch wohl nicht dabei in TK#1
    mit 10ms den Buffer zuzuschuetten?

    Tip:
    a. Baue einen wait-step ein = 100ms bis 5000ms (testen)
    b. Benutze die Funktion FRM_ctrl(), damit kannst Du das
    DSR/DTR Signal abfangen. Kommt das signal/event sendest
    Du die naechsten Daten. Serial interface ABC....
    c. Vergroessere Deinen send-buffer in FRM_xopen_01.
    d. Passe Deine config_structure an. Wie sieht Deine config aus?
    Kannst Du die mal hier her kopieren?

    <schinpp vom init>
    config_struct.idle := 4;
    config_struct.delimc := 0;
    strcpy(ADR(config_struct.delim), '00');
    config_struct.tx_cnt := 8;
    config_struct.rx_cnt := 8;
    config_struct.tx_len := 512; (* bytes *)
    config_struct.rx_len := 512; (* bytes *)
    config_struct.argc := 0;
    config_struct.argv := 0;
    </schnipp vom init>

    e. Sieh Dir nochmal die Hilfe zu DVframe an. Besonders die
    open Funktion.

    Hilft alles nichts dann mail nochmal mit Kopie Deine config-struct.

    Gruss,

    Mike
    Geändert von mike_nl (05.04.2007 um 08:46 Uhr)
    Alles ist (un)moeglich, letztendlich bist Du selbst der (un)Faktor
    Zitieren Zitieren re:  

  5. Folgender Benutzer sagt Danke zu mike_nl für den nützlichen Beitrag:

    Heppo (06.04.2007)

  6. #4
    Registriert seit
    26.03.2007
    Beiträge
    67
    Danke
    6
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Du kannst auch mit dem Funktionsbloch _GLOBAL FRM_ctrl_typ frm_control;kontrollieren, ob die Zeile schon gesendet wurde und bei einem StatusOutarg von 0 die nächste Zeile senden. Wenn gerade gesendet wird dann ist der StatusOutarg = 1.
    Eine andere (unschöne) Möglichkeit ist, die Zykluszeit zu vergrößern - dann gehts auch!!

    lg
    Hannes


    frm_control.enable = 1;
    frm_control.ident = frm_xopen.ident;
    frm_control.ioctrl = 0x23;
    FRM_ctrl(&frm_control); /* get handshake info */
    StatusControl = frm_control.status; /* get status */
    StatusOutarg = frm_control.outarg; /* get status */

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

    Heppo (07.04.2007)

  8. #5
    Registriert seit
    22.03.2007
    Ort
    Niederlande
    Beiträge
    45
    Danke
    3
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hallo Hannes,

    so gehts auch. Wie gesagt der FRM_ctrl schafft das
    sehr gut. Habe das heute schnell mal nachgestellt.

    War ein ruhiger Tag und ich konnte mal wieder etwas spielen.
    Habe sogar meinen PacMan auf ein APC600 portiert.

    Gruss,

    Mike
    Alles ist (un)moeglich, letztendlich bist Du selbst der (un)Faktor
    Zitieren Zitieren re:  

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

    Heppo (06.04.2007)

  10. #6
    Registriert seit
    26.03.2007
    Beiträge
    67
    Danke
    6
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Ja, so gehts am besten, Kannst du mir nicht noch schreiben warum ich auf den Speicherbereich von den Tasten nicht schreiben kann bzw. was dahinter steht (was da das Betriebssystem VXWorks macht)
    Ich wäre dir sehr dankbar für jede Information!!

    Vielen Dank!

    lg
    Hannes

  11. Folgender Benutzer sagt Danke zu Hannes für den nützlichen Beitrag:

    Heppo (06.04.2007)

  12. #7
    Heppo ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.02.2007
    Beiträge
    16
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    danke für die ganzen Tips, werde ich mir nach und nach anschauen. Bin auch mit der Länge des Strings schon weiter gekommen.

    Noch eine Frage: Wenn ich in der ersten Zeile "-------------" drucke, dann einen CR LF ausführen möchte, wie bekomme ich das in den String?
    Die Zeichen Kopiere ich ja mit strcpy, strcat.

    Schöne Ostern, Bernd

  13. #8
    Registriert seit
    28.10.2005
    Ort
    Ottweiler, Saar
    Beiträge
    940
    Danke
    259
    Erhielt 124 Danke für 109 Beiträge

    Standard

    Zitat Zitat von Heppo Beitrag anzeigen
    Hallo,
    danke für die ganzen Tips, werde ich mir nach und nach anschauen. Bin auch mit der Länge des Strings schon weiter gekommen.

    Noch eine Frage: Wenn ich in der ersten Zeile "-------------" drucke, dann einen CR LF ausführen möchte, wie bekomme ich das in den String?
    Die Zeichen Kopiere ich ja mit strcpy, strcat.

    Schöne Ostern, Bernd
    strcpy, strcat sind Funktionsaufrufe der Standard-C-Bibliothek.
    Dann probier's mal mit diesem String:
    "-------------\r\n"

  14. Folgender Benutzer sagt Danke zu argv_user für den nützlichen Beitrag:

    Heppo (07.04.2007)

  15. #9
    Heppo ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.02.2007
    Beiträge
    16
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von argv_user Beitrag anzeigen
    strcpy, strcat sind Funktionsaufrufe der Standard-C-Bibliothek.
    Dann probier's mal mit diesem String:
    "-------------\r\n"

    Danke, das hatte ich total vergessen, so einfach kann die Welt funktionieren.

    Noch eine Frage:
    Den String den ich sende, hat 1024 Byte Gesamtlänge. Nun benötige ich nicht immer die gesamte Länge. Damit nicht bei einem kurzen Ausdruck anschließend noch die alten Zeichen gedruckt werden, lösche ich den Inhalt des Strings mit einer Schleife, in der immer 0 auf die einzeln Bytes geschrieben wird. Jetzt werden die Leerzeichen aber auch immer nicht ausgegeben. Das möchte ich nicht, es soll nach dem letzten "-----\L\N" Ende sein. Wie bringe ich das der Zeichenkette bei?

    Frohe Ostern von Heppo

  16. #10
    Registriert seit
    22.03.2007
    Ort
    Niederlande
    Beiträge
    45
    Danke
    3
    Erhielt 6 Danke für 6 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Heppo,

    das haengt davon ab welche Sprache Du verwendest.
    Bei ST z.B. ist das mit strcpy(adr(dein_string), adr(' '));
    damit ist alles weg oder Du machst ein memset:
    memset(adr(dein_string), 0, sizeof(dein_string));

    Zum check der string laenge die Du drucken moechtest
    gibt es in der standard library die Funktion LEN(adr(dein_string));
    Das Ergebnis gibt Dir die Laenge aus. Die Info benutzt Du fuer
    data_send_length. ganz einfach.

    In allen anedern Sprachen (ansi-c......) funktioniert das aehnlich.

    Gruss,

    Mike
    Alles ist (un)moeglich, letztendlich bist Du selbst der (un)Faktor
    Zitieren Zitieren re  

  17. Folgender Benutzer sagt Danke zu mike_nl für den nützlichen Beitrag:

    Heppo (08.04.2007)

Ähnliche Themen

  1. CAB-Drucker über Ethernet
    Von Skrajewski im Forum Feldbusse
    Antworten: 9
    Letzter Beitrag: 04.02.2016, 08:53
  2. Wert über Kurvenanzeige in WinCC ausgeben
    Von Sally88 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 18.11.2010, 14:29
  3. Drucker über SPS ansteuern
    Von blueColt im Forum Simatic
    Antworten: 35
    Letzter Beitrag: 26.09.2010, 12:06
  4. 6 versch. Werte über den Analogausgang ausgeben
    Von MRT im Forum Sonstige Steuerungen
    Antworten: 22
    Letzter Beitrag: 28.01.2008, 12:46
  5. STRING an Drucker senden
    Von .nimrod im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 28.03.2007, 11:23

Lesezeichen

Berechtigungen

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