Wertübergabe/Zuweisung

  • Hallo Alle zusammen,


    brauche eure Hilfe. Habe ein (pneumatik)Motor, der mit einen Inkrementalgeber verbunden ist und soll erstmal genau 1 Umdrehung machen!
    ....
    DECL INT STARTWERT
    SIGNAL INK_GEB_VORSCH $IN[425] TO $IN[440]
    ....
    INI
    STARTWERT = INK_GEB_VORSCH


    REPEAT
    OUT 269 '' STATE = TRUE CONT
    &ANOUT[2]=0,3
    OUT 260 '' STATE = TRUE COUNT
    UNTIL STARTWERT == INK_GEB_VORSCH
    $ANOUT[2]=0,5
    OUT 260 '' STATE = FALSE CONT
    OUT 269 '' STATE = FALSE CONT


    Über die "Anzeige" - "Variable" - "Einzeln" bekomme ich den Wert von INK_GEB_VORSCH, dieser Wert wird aber nicht dem "STARTWERT", als Anfangswert zugewiesen, habe ich was falsch gemacht oder von SIGNAL.... kann man keine Wert direkt zuweisen?

  • Schritt für Schritt zum Roboterprofi!
  • Hallo,


    versuch mal:
    UNTIL STARTWERT >= INK_GEB_VORSCH
    ob das Motor dreht sich 1 Mal.
    Frage: wie viel Inkrementen gibt der Inkrementalgeber per Rotation?
    Kann auch sein, dass MSB und LSB getauscht sind (bajt alignment)
    MfG,
    Jacek

    " ... youth is like diamonds in the sun and diamonds are forever ... "

  • Hallo boss,


    die bytes sind nicht vertauscht! es gibt 65536(0-65535) oder 2^16 inkremente(absolut)!
    es zeigt mir die Fehlermeldung "STARTWERT Wert Ungültig", da stimmt was mit der zuweisung/übergabe nicht, obwohl, wie ich schon beschrieben habe, Variable "INK_GEB_VORSCH" ein Wert hat.
    wenn der Motor steht möchte ich diesen Anfangswert merken, und dann Motor genau eine Umdrehung, bis die Werte STARTWERT und INK_GEB_VORSCH gleich sind.......

  • Deklariere mal beide Werte in der $CONFIG.DAT:


    DECL INT STARTWERT=0
    SIGNAL INK_GEB_VORSCH $IN[425] TO $IN[440]

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • IrrerPolterer


    habe ichs probiert, will immer noch nicht!....gibt es eine andere Möglichkeit werte zwischen zuspeichern und dann übergeben.....die Sache ist, das es überhaupt keine Übergabe stattfindet!...habe auch schon mit Funktionen probiert, das gleiche problem!!!.....

  • Das muss so funktionieren!


    In welcher Zeile tritt die Meldung denn auf?


    Postet doch mal das Archiv.

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • IrrerPolterer


    du hattest recht, sollte funktionieren, tut es jetzt auch, habe neue Datei erstellt, Robi neu gestartet, jetzt läufts!....jetzt habe ich aber ein anders problem, bei der Parameterübergabe


    STARTWERT = INK_GEB_VORSCH


    ist der Wert im STARTWERT nur sehr kurze Zeit, d.h. nur bis zur nächster Zeile, ab da ist STARTWERT wieder leer und die Schleife läuft endlos......ist es normal??? der Wert sollte doch im speicher bleiben.....

  • Ich werde den Verdacht nicht los, das Startwert irgendwo überschrieben wird...im Submit oder per Interrupt... :kopfkratz:

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • IrrerPolterer


    danke erstmals für die Hilfe! das mit dem startwert habe ich anders gelöst, habe jetzt aber ne andere Frage
    geht aber immer noch um die gleiche Sache!


    habe jetzt mein Signal von Ink_Geber(16Bit =2 x 8Bitt) zerlegt , da die Bytes irgendwie nicht richtig zusammen hängen und weil in einem 16Bit zähler ein Byte dazwischen liegt, somit belegt der 16Bit-Zähler nicht 16 Bit, sondern 24Bit
    ........
    SIGNAL INK_GEB_ANTR_H $IN[473] TO $IN[480]; HIGH BYTE
    SIGNAL INK_GEB_ANTR_L $IN[489] TO $IN[496]; LOW BYTE


    DECL INT STARTWERT
    DECL INT INK_GEB_ANTR[2]; Feld
    INI


    INK_GEB_ANTR[1] = INK_GEB_ANTR_H
    INK_GEB_ANTR[2] = INK_GEB_ANTR_L


    STARTWERT = INK_GEB_ANTR; ab hier kommt Fehlermeldung


    ........


    Die SIGNALe und INK_GEB_ANTR habe ich auch in der CONFIG.DAT datei deklariert, somit ergeben sich bei der compelierung keine probleme!
    jedoch bei der Ausführung werden die werte von INK_GEB_ANTR_H in INK_GEB_ANTR[1] und [2] ubertragen, nicht aber in INK_GEB_ANTR selbst!!! somit springt eine Fehlermeldung mit "INK_GEB_ANTR Wert ungültig"......wieso passiert es???......Danke im Voraus!

  • DECL INT INK_GEB_ANTR[2]; Feld
    STARTWERT = INK_GEB_ANTR; ab hier kommt Fehlermeldung


    Du hast den gleichen Namen für ein Feld und eine Variable benutzt. Ändere einen der beiden.

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Du musst das Low- und HighByte von Hand zu einem gültigen Integerwert zusammenfügen.


    INK_GEB_ANTR = INK_GEB_ANTR_L + (INK_GEB_ANTR_H * 254)

    Kontrolle ist eine Illusion, denn niemand weiss was als nächstes passiert.

  • nur zur Info _xyz_:


    wenn man ein (Integer)Feld definiert muss bei einer Zuweisung auch ein Feldindex angegeben werden.
    In Deinem Fall ist aber eine Felddefinition überflüssig da die 256er Formel funken soll.
    Von Vorteil wäre auch gewesen die Fehlermeldung zu beschreiben (Fehlernummer, Absender, usw...). Bei einem komplizierteren Fehler kann dann schneller geholfen werden.
    :beerchug:

    Wer nach allen Seiten offen ist kann nicht ganz dicht sein

  • @notime und die Andere!
    vielen Dank für den Tipp


    läuft einigermassen, aber stimmt immer noch nicht ganz, mall funktionier, dann wieder nicht! und zwar in dem Bsp. soll es genau 1Umdrehung machen, macht aber nicht immer!!! hat etwas mit der Logik zutun, vielleicht kann einer von euch die Fehlern sehen.


    DEF TEST_1_UMDR_ANTR()
    SIGNAL INK_GEB_ANTR_H $IN[473] TO $IN[480]; HIGH BYTE
    SIGNAL INK_GEB_ANTR_L $IN[489] TO $IN[496]; LOW BYTE
    DECL INT STARTWERT, ENDWERT, I, X


    INI
    X = 1; Undrehungen gesamt
    I = 13653; 256ink von LowByte * 16ink/Umdr von HighByte = 4096ink/Umdr * 3,333 Getriebeübersetzung =13653
    STARTWERT = INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L,
    ENDWERT = I * X + STARTWERT
    IF ENDWERT > 65535 THEN
    ENDWERT = ENDWERT / X - 65536
    ENDIF
    OUT 267 '' State = TRUE CONT
    wait sec 0,1; verzögerte reaktion von pneumatik
    $ANOUT[1] = 0,8
    OUT 259 ''State = TRUE CONT
    WAIT FOR ENDWERT == INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L
    $ANOUT[1] = 0,5
    OUT 259 '' State = FALSE CONT
    OUT 259 '' State = FALSE CONT
    END


    ich danke euch!

  • Hallo xyz,
    keine Ahnung ob das die Lösung ist aber ändere mal die WAIT FOR Anweisung in


    WAIT FOR ENDWERT <= INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L


    es könnte ja sein das der aktuelle Wert von deinem Geber nicht 100%tig gleich dem Endwert ist.
    Mit dem <= (größer gleich) Vergleich ist auch der Wartebefehl erfüllt wenn der aktuelle Wert größer als der Endwert ist.
    Erholsames Wochenende :beerchug:
    Gruß Paulaner

    Für seine Arbeit muß man Zustimmung suchen, aber niemals Beifall.<br />Zitat: Charles-Louis Baron de Montesquieu

  • @ Paulaner


    Super! DANKE, das wars!!!!....jetzt macht es 1.Umdr, jedoch nur wenn die Werte(start und endwert) zwischen 0-65535 liegen und nicht darüber gehen, d.h. kein Übergang von 65535 auf 0, den dann passiert wieder nichts!....das muss ich noch irgend wie hinbekommen!.....werde vielleicht über HIGH Byte probieren

  • Hi xyz,
    alles wird gut, bloß net aufgeben. :uglyhammer_2:
    wie soll der Ablauf eigentlich sein? Du hast jetzt ein Programm mit dem du eine Umdrehung machen kannst. Danach wird das Programm beendet. Rufst du das Programm dann nochmal auf oder hast du ein übergeordnetes Programm wo du das ganze mit einer Schleife aufrufst?
    Wechselt dein Geber bei einer Umdrehung von 0 --> 65535 -->0 oder zählt der weiter?

    Für seine Arbeit muß man Zustimmung suchen, aber niemals Beifall.<br />Zitat: Charles-Louis Baron de Montesquieu

  • Hi Paulaner!


    das Testprogramm läuft jetzt eigentlich ganz gut, zwar bekomme immer noch werte die, wie du schon selber gemerkt hast nicht genau sind, was auch mit "==" nicht funktionieren wollte, habe aber mit deiner Hilfe und "<=" hinbekommen....der Geber zählt von 0-->65535 und dann wieder von 0, im kreis also!
    eigentlich geht es immer noch um die gleiche Sache was ich schon mal angefangen habe


    http://www.roboterforum.de/rob…ogrammierung-t4012.0.html


    wollte aber zuerst sehen wie das mit den Ink-Gebern funktioniert, jetzt werde ich die Drehzahlen mit den Timern koppeln und daraus die Geschwindigkeit ermitteln! diese Geschwindigkeiten werden ihrerseits von dem Roboter vorgegeben(bzw. kann man auch umgekehrt machen) so das die Abrollgeschwindigkeit von dem Bandvorschub identisch der des Roboters(synchron quasi)......
    der Taktgenerator, was du mir gepostet hast, wird auch seine Anwendung finden, werde aber noch ein bisschen Hilfe von euch allen gebrauchen, hier erstmal mein Teilprogramm, vielleich kann jemand was besseres oder einfaches vorschlagen!?!?....


    DEF TEST_1_UMDR_ANTR()
    SIGNAL INK_GEB_ANTR_H $IN[473] TO $IN[480]; HIGH BYTE
    SIGNAL INK_GEB_ANTR_L $IN[489] TO $IN[496]; LOW BYTE
    DECL INT STARTWERT, ENDWERT, I, X


    INI
    X = 1; Undrehungen gesamt kann max 65535/13653 = 4,8 Umd sein! Reicht für diese Anwendung aus
    I = 13653; 256ink von LowByte * 16ink/Umdr von HighByte = 4096ink/Umdr * 3,333 Getriebeübersetzung =13653
    STARTWERT = INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L; Startwert aus INK_GEB laden
    ENDWERT = I * X + STARTWERT; Endwert initieren und festlegen
    IF ENDWERT > 65535 THEN ; wenn endwert größen als gesamt inkrementen pro Zähler
    ENDWERT = ENDWERT - 65536; dann nach "0" durchgang neuen Wert festlegen
    ENDIF
    OUT 267 '' State = TRUE CONT
    wait sec 0,1; verzögerte reaktion von pneumatik
    $ANOUT[1] = 0,8
    OUT 259 ''State = TRUE CONT
    IF ENDWERT > INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L THEN ; wenn größer als INK_GEB momentanwert, z.B. 44321 > 12345
    WAIT FOR ENDWERT <= INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L; dann warte bis die sich angleichen oder annäheren
    ELSE
    IF ENDWERT < INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L THEN; wenn endwert kleiner als INK_GEB z.B. 13456 < 54678
    WAIT FOR ENDWERT > INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L; dann warte bis z.B. 13456 > INK_GEB-Wert momentan
    WAIT FOR ENDWERT <= INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L; und dann warte bis Endwert kleiner gleich INK_GEB
    ENDIF
    ENDIF
    $ANOUT[1] = 0,5; setze Grundstellung
    OUT 259 '' State = FALSE CONT
    OUT 267 '' State = FALSE CONT
    END



    :merci:

  • Servus xyz,
    um das ganze etwas strukturierter und übersichtlicher zu machen würde ich erst mal:
    1 Ein eigenes src-Programm erstellen mit einer dat-datei
    2 In der dat-datei die Signale und Variablen definieren. Da können auch Werte für Variablen gespeichert werden.
    3 Deine Berechnung mit High und Low-Byte in eine Funktion packen. Als Lokale Funktion in der scr-Datei


    DEF TEST_1_UMDR_ANTR()
    ;hier dein programm
    ;beispiel mit funktion
    IF ENDWERT > GeberAktuell() THEN
    ;
    ENDIF
    END


    DEFFCT INT GeberAktuell()
    RETURN (INK_GEB_ANTR_H * 256 + INK_GEB_ANTR_L THEN)
    ENDFCT


    Das wäre mein Vorschlag! Mußt du aber nicht unbedingt so machen. :denk:
    Kann dein Motor auch in zwei Richtungen drehen? Links/Rechts Vor/Zurück !??!
    Machst du das mit dem Analogausgang? Positiver Wert = Links Negativer Wert = Rechts
    Die Werte die du dem Analogausgang zuweist würde ich auch als Variable deklarieren
    REAL Grundstellung=0.5
    REAL LINKS=0.8
    REAL RECHTS=???


    Was machen die zwei Ausgänge OUT 259 und OUT 267? Denen würde ich auch Namen geben wie beim High und Low-Byte.
    In der iosys.ini kannst du auch diese zwei Bytes so legen das sie bei den Robotereingängen zusammen sind. Dann brauchst du deinen Wert nicht mehr zu berechnen und direkt auswerten. :gutidee:


    Hier mal ein Beispiel. Ich mußte da auch Probieren bis es passte.


    INB14=127,12,x1 ;kappentyp
    INB15=127,13,x1 ;kappenhöhe
    INB16=127,14,x1 ;kappenunterteil
    INB26=127,15,x1 ;reserve!sps datenbaustein!
    INB17=127,17,x1 ;grfhöhe
    INB18=127,16,x1 ;grfhöhe


    Bis dann :ylsuper:

    Für seine Arbeit muß man Zustimmung suchen, aber niemals Beifall.<br />Zitat: Charles-Louis Baron de Montesquieu

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