Serielle Schnittstelle

  • Hallo,
    C
    grad erst neu und schon ein zweites Problem aufgetan. Ich versuche die serielle Schnittstelle an der CS8C zu benutzen. Der Plan sieht soweit auch durchführbar aus. Ich kann alle vom Endgerät geforderten Parameter einstellen. Jedoch scheitert es momentan wohl an meiner Fähigkeit die notwendigen Zeichen über die Schnittstelle zu schicken.


    Plan bisher:
    1) Zeichenketten als String in "Vektor" hinterlegen
    2) Jede Vektorposition ansprechen
    3) Einzelne Zeichen ansprechen und in Binärfolgen übersetzen
    4) Zum Ende jeder "Zeile" CRLF schicken. Laut Gerätehersteller muss es auf jeden Fall gesendet werden, Stäubli sagt, dann muss ich es dahinter fummeln


    Lösungsansatz:
    var[0] = "x"
    var[1] = "y47"
    var [2] = "z3.14"


    toBinary (asc(cr),"1",1,cr)
    toBinary (asc(lf),"1",1,lf)


    for i = 0 to 2 step 1
    laenge = len(var[i])
    for j = 0 to laenge step 1
    toBinary(asc(var[i], j), "1", 1, byteOut)
    sioSet(byteOut)
    endFor
    sioSet(cr)
    sioSet(lf)
    endFor


    Das Gerät sagt allerdings nichts .. jemand von euch eine Idee? Interessanterweise meinte der Stäubli irgendwann im gestrigen Tagesverlauf plötzlich, dass io:portSerial1 ein falscher Name beim Link sei. Das tat er vorher nicht?!

  • ANZEIGE
  • Hi Odyssee,


    nutzt Du VAL3 Version 7 oder 6?
    Bei der Version 7 musst Du erst eine globale Variable vom Typ sio anlegen und die dann mit deiner seriellen Schnittstelle verlinken um sie nutzen zu können.
    Bei der Version 6 existiert eine IO-Bibliothek (wird vom Betriebssystem angelegt und verwaltet) in der die serielle Schnittstelle auftaucht.


    Zu deinem Programm:
    die Befehle "toBinary" sind in deinem Beispiel überflüssig. Ich würde es so programmieren:
    var[0] = "x"
    var[1] = "y47"
    var[2] = "z3.14"


    // step ist überflüssig, wenn sowieso 1, size liefert dir Größe des Arrays, praktisch, wenn das Array var mal größer oder kleiner wird.
    for i = 0 to size(var)-1
    for j = 0 to len(var[i])-1
    // asc liefert den unicode an der Stelle "j"
    nZeichen = asc(var[i], j)
    // das Zeichen senden, io:portSerial nur bei VAL3 Version 6, bei V7 muss anstelle die sio-Variable eingetragen werden
    sioSet(io:portSerial1, nZeichen)
    endFor
    // sende Carriage return
    sioSet(io:portSerial1, 13)
    // sende Line Feed
    sioSet(io:portSerial1, 10)
    endFor


    Oder der andere sehr viel einfachere Vorschlag:


    var[0] = "x"
    var[1] = "y47"
    var[2] = "z3.14"


    for i = 0 to size(var) - 1
    io:portSerial1 = var[i]
    // sende Carriage return
    sioSet(io:portSerial1, 13)
    // sende Line Feed
    sioSet(io:portSerial1, 10)
    endFor


    Viel Erfolg


    Spielkind

  • Hallo Spielkind,


    vielen Dank für die Antwort. Ich hatte mir das Spiel erst zu einfach gemacht und einfach io:portSerial1 = <string> gespielt. Ging halt gar nicht. Macht auch Sinn. Der Stäubli-Service meinte halt, man sollte es erst in ascii und dann in binär übersetzen. Darum die komplexe Struktur. Denn die Übersetzung der Einzelzeichen geht halt nur Zeichen- und nicht stringweise. (CR und LF sind natürlich ein Zeichen)


    Die Ergänzung mit der size vom Array ist gar nicht mal so blöd. Hatt bisher halt händisch hantiert, da die Codekette wohl auch nicht länger wird. Aber um es offen zu halten .. why not.


    Welche VAL-Version ich zur Verfügung habe, kann ich grad leider nicht sagen, da ich erst Montag wieder im Institut bin. Ich hab in jedem Fall eine sio-Variable angelegt. Spricht also für Version 7. Die hab ich dann mit sioLink(Einheit, io:portSerial1) verknüpft. Aber da maulte er auch schon rum ...


    Gruß,
    Odyssee

  • Hallo Odyssee,


    aber deine Variante mit io:portSerial1 = string müsste trotzdem funktionieren (wenn Du VAL3 V6 nutzt).
    Bei VAL3 V7 würdest Du mySioVariable = string schreiben ...


    Schicke doch mal die entsprechenden Fehlermeldungen ...


    Gruss


    Spielkind

  • Hallo zusammen,


    ich bin erst morgen um die Mittagszeit rum wieder im Institut.


    Aktuelle Fehlermeldung ist, dass sie beim


    sioLink(Einheit, io:portSerial1)


    schon meckert, dass "io:portSerial1" kein zulässiger Name sei oder so ähnlich. Ich komm wie gesagt grad nicht an die Fehlermeldung ran.


    Ansonsten erwartet das Endgerät insgesamt 8 Zeilen "Programm". Eine bunte Mischung aus Zahlen, Buchstaben und Sonderzeichen, die aber durch mein Beispiel abgedeckt sind. Erwartet wird am Ende jeder Programmzeile halt noch das CRLF.


    Fehlermeldung ist aktuell noch, dass das Endgerät halt gar nichts sagt.


    Gruß,
    Odyssee

  • So,


    Problem gelöst ! =)


    Der Trick war die Zahlen nicht in Binär umzuwandeln sondern nur in ASCII. Im Code von Spielkind fehlte in der Schleife noch das var[i] ?!


    Ich hab es jetzt so umgesetzt:



    Telefonat mit dem Stäubli-Service ergab, dass die Fehlermeldung, dass io:portSerial1 nicht der richtige Name sei daher rühren könne, dass man zwischenzeitlich den Emulator ausgeführt hat. Ich hab es ignoriert und ignorieren hilft ;)

  • ich hätte auch eine Frage, welche an das vorherige Problem anschließt


    Ich schreibe zur Zeit meine Bachelorarbeit und verwende dazu einen TX60 mit CS8C


    wollte versuchsweise (später soll mal eine Faulhaber Servo gesteuert werden) mit dem Controller einen String per serieller Schnittstelle an den PC schicken


    hab das folgendermaßen gemacht


    begin


    io:portSerial1= "text"


    .
    .
    .
    end


    hab aber weder eine Fehlermeldung, noch irgendwas anderes am PC zurückgekriegt, wobei ich eigentlich im Terminalprogramm alle Parameter auf den Controller abgestimmt hab...


    könnte mir jemand helfen, weiß nämlich nicht mehr weiter!!

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden