gibt es brauchbare konstanten?

  • moin moin


    was mich stutzig macht ist, es gibt zwar konstaten, deren wert sich nicht ändern lässt (logisch)(alles im $config.dat)...


    CONST INT blah = 5


    ...aber das klappt nicht (?!?)...


    INT multiblah[blah]


    -> Fehler: Positive ganze Zahl oder ']' oder ',' erwartet


    ...und, naja, wenn ich konstanten nicht als arraysize benutzen kann, find ich das ziemlich begrenzt. wäre toll, wenn es die funktion "StrDeclLen( string )" auch für nicht-strings gäbe, hab aber nichts gefunden. das wäre vor allem auch für unterprogramme ganz praktisch.


    besten dank für die hilfe, gruss, rob

    &quot;When using vi the screen of your terminal acts as a window into the file which you are editing. Changes which you make to the file are reflected in what you see.&quot;<br />Bill Joy 1978

  • Schritt für Schritt zum Roboterprofi!
  • Ja, die Einschränkung, das Konstanten nicht für Array grössen gehen ist mir auch schon aufgefallen. Das gilt übrigens auch für normale variablen...
    Ne Funktion für Array-Grössen hab ich auch schon mal gesucht, hab mir dann mit ner WHILE-Schleife in Kombination mit der Funktion VARSTATE experimentiert und schliesslich das Array erst mit komplett nur Nullen initialisiert und in der WHILE-Schleife auf >0 abgefragt...
    Fänds auch toll, wenn da wer was besseres weiss...

    If you and DEAD people can read Hex, how many people can read Hex?

  • :gutidee:


    so funktioniert das (V5.2) auch mit werten drinnen:


    array_size.src
    ==========


    test.src
    =====


    das "HALT" hab ich nur drinnen, dass man per anzeige/variable... feststellen kann, dass das tatsächlich funktioniert.


    allerdings muss man für jeden array typ (INT, REAL, ...) eine eigene funktion schreiben. oder gibt es sowas wie template klassen, den typ "any" oder so?


    vielleicht auch wichtig: es muss unbedingt call by reference ( :OUT ) sein, da wir auf das original zeigen müssen. find ich nicht ganz logisch, klappt aber nur so...


    dass das mit variablen nicht funktioniert ist schon klar. der speicherbereich wird ja vor dem programmstart alloziiert. wenn wir per "new" oder "malloc" wie in c++/c zur laufzeit speicher beim betriebssystem anfordern könnten, wäre es möglich mit zeigern eine verkettete liste aufzubauen. schön wär's.


    für alle die VARSTATE nicht finden -> zuhinterst im Reference Guide. hab doch 'ne stunde gesucht...


    danke für den tip!

    &quot;When using vi the screen of your terminal acts as a window into the file which you are editing. Changes which you make to the file are reflected in what you see.&quot;<br />Bill Joy 1978

    Einmal editiert, zuletzt von rob ()

  • Sorry, hätte ruhig verraten können wo man die VARSTATE-Doku findet, daran hab ich nicht gedacht. Ich lasse immer diese HTML-Seite suchen, die findet das recht gut.


    Sag mal, mit array[]:OUT greifst Du auf den im aufrufenden Programm initialisierten Speicher zu? Irritierend, das wusste ich nicht, hätt das auch nicht erwartet. Hast Du da was in der Doku gefunden?



    Noch was: Ich fand den Tip sehr gut, ich hab ihn mal in die Roboter-Wiki ( http://www.roboter.com/wiki ) unter array size einsortiert. Ich hoffe, das geht in Ordnung für Dich?

    If you and DEAD people can read Hex, how many people can read Hex?

    Einmal editiert, zuletzt von kai_n ()

  • klar, geht in ordnung. ich kannte die wiki noch gar nicht.


    das OUT ist im kapitel unterprogramme und funktionen in der expertenprogrammierung zu finden. die überschrift ist "call-by-value call-by-reference".


    IN ist call by value. in einer funktion werden dann von allen parametern kopien angelegt. darum ändern sie sich auch nicht im aufrufer und man muss das resultat als RETURN zurückgeben. das ist etwas einschränkend, weil man nicht mehrere werte zurückgeben kann. ausserdem ist es langsamer als call by reference, weil ja die neuen variablen erst auf dem stack angelegt werden müssen, aber ich denke mal, dass das in der roboterprogrammierung eine untergeordnete rolle spielt.


    OUT ist call by reference. da wird für jeden parameter "nur" ein zeiger auf das original angelegt. das hat vorteile:
    - der rückgabewert kann anzeigen, dass die funtion erfolgreich war oder nicht (BOOL)
    - man kann beliebig viele werte im aufrufer ändern, ohne sie als GLOBAL definieren zu müssen.
    - performance (wenn man's denn braucht)
    zu beachten ist, dass man zwar der funktionsdeklaration ansieht, dass es sich um call by reference handelt (das OUT verrät's), nicht aber dem funktionsaufruf selber, also vorsicht, wenn man's nicht gewohnt ist:

    Code
    FCT BOOL foo( zahl :OUT ) ; hier sieht man's...
      ändere die zahl
      return TRUE
    ENDFCT


    Code
    EXTFCT BOOL foo( INT :OUT ) ; ...hier auch noch...
    
    
    BOOL success
    INT ahnungsloseZahl = 3
    
    
    success = foo( ahnungsloseZahl ) ; ...aber hier nicht mehr


    mit arrays ist das so eine sache, weil "niemand" weiss, wie gross sie denn sind. darum wird vermutlich bei arrays immer ein zeiger übergeben, auch by call by value, den es in wirklichkeit bei arrays nicht gibt. arrayfunktionen dürften eigentlich gar nicht laufen mit IN, weil wir ja so eine funktion im gleichen aufrufer mit verschiedenen arraygrössen aufrufen können, und die funktion nicht zur laufzeit generiert wird.


    das wird von KUKA irgendwie untransparent gehandhabt. die haben da irgendwas seltsames gebastelt bei der übergabe von arrays per call by value...


    eine sehr einfache möglichkeit, wenn die array_size fest steht und sich nie ändern wird ist (strings zum beispiel), die grösse global zu definieren und jeder funktion als zusätzlichen parameter zu übergeben, oder sogar direkt darauf zuzugreifen. dann hat man immer sofort zugriff darauf, ohne es erst mühsam berechnen zu müssen. einfach aber etwas unflexibler. und man sollte eigentlich nicht mit hard codierten variablen und globals um sich werfen...

    &quot;When using vi the screen of your terminal acts as a window into the file which you are editing. Changes which you make to the file are reflected in what you see.&quot;<br />Bill Joy 1978

  • Hey Danke, das kam ja schnell und supervollständig!
    Die Wiki gibts erst seit kurz vor Wihnachten, gibt ja auch erst nen paar Artikel. Die wird in naher zukunft auch auf andere Roboter-Systeme ausgedehnt, wir haben beschlossen im Zuge dessen auch ne Art Passwort ein zu führen, damit sich niemand wegen copyright beschwert. Dann ist es schliesslich ein geschlossener Nutzerkreis...
    Also, wenn Du bock hast mit zu machen, das die Wiki sinnvoll benutzbar wird: Hau rein!!!

    If you and DEAD people can read Hex, how many people can read Hex?

  • Ach ja: eins noch...
    Ich hatte VARSTATE mehrfach in nem SPS Programm benutzt. Dabei hab ich festgestellt, das VARSTATE sehr viel mehr Zeit zum abarbeiten benötigt als andere Befehle. Wie viel genau weiss ich nicht, aber die SPS hat es deutlich ausgebremst, das Entfernen von zwei Aufrufen brachte mir ne 50-60ms kürzere Zykluszeit der SPS.
    Nur falls Deine Funktion irgendwas zeitkritisches machen soll.

    If you and DEAD people can read Hex, how many people can read Hex?

  • Hallo rob,


    die bisher einzig sinnvolle Anwendung für die Konstanten, die ich finden konnte, besteht in deren Schreibschutz.



    in $config.dat:


    const int greiferAuf = 20


    im program.src:


    if $in[greiferAuf] == true then ...



    Durch das const ist es auch einem DAU nicht mehr möglich über Variable/Einzeln den Wert der int Variablen zu ändern, vor allen Dingen nicht in Automatik :wallbash: Alles schon gehabt.... :waffen100:

  • Dafür gab es doch


    Code
    SIGNAL greiferAuf=$IN[20]; in der $config.dat


    oder so ähnlich (nur aus dem Kopf grad).
    Dann ist im Programm


    Code
    IF greiferAuf THEN


    möglich.
    (==True ist bei bool-variablen nicht nötig. für greiferAuf==FALSE kann man auch NOT(greiferAuf) schreiben. )






    Ich persönlich nutze Konstanten um Spannungen, die ich von Sensoren irgend ner Art messe, auf deren Messgrösse umzurechnen. Dann liegen die Konstanten alle an einem Ort und sind daher leichter zu finden, als wenn man sich erinnern muss in welcher (oder sogar welchen) Unterroutinen die gebraucht werden.

    If you and DEAD people can read Hex, how many people can read Hex?

    Einmal editiert, zuletzt von kai_n ()


  • Ach ja: eins noch...
    Ich hatte VARSTATE mehrfach in nem SPS Programm benutzt. Dabei hab ich festgestellt, das VARSTATE sehr viel mehr Zeit zum abarbeiten benötigt als andere Befehle. Wie viel genau weiss ich nicht, aber die SPS hat es deutlich ausgebremst, das Entfernen von zwei Aufrufen brachte mir ne 50-60ms kürzere Zykluszeit der SPS.
    Nur falls Deine Funktion irgendwas zeitkritisches machen soll.


    gut zu wissen, danke, und bei der wiki mach ich gerne mit.


    für die I/Os bevorzug ich auch eher die SIGNAL methode. eine sinnvolle anwendung für konstanten könnte auch sein:


    CONST REAL PI = 3.14159


    ...hab ich allerdings noch nie gebraucht :)

    &quot;When using vi the screen of your terminal acts as a window into the file which you are editing. Changes which you make to the file are reflected in what you see.&quot;<br />Bill Joy 1978

  • Hallo alle,


    ich persoehnlich verwende nie Konstanten , muss aber zugeben, dass es fuer Pi schon Sinn macht. Mann muss sich da schon vorher sicher sein, dasss mann da bei laufender Anlage nichts ändern will.


    Der Vorteil eine Feld so zu initialisieren, erschliesst sich mir nicht - weniger Speicher alloziert wird dadurch auch nicht.



    Gruss Stefan

  • Der Vorteil wäre die leichtere durchschaubarket. so gibt es Beispielsweise in der $config.dat die variable max_tool sowie 5 Arrays mit genau dieser Grösse. da wäre es schon praktisch da direkt max_tools reinschreiben zu dürfen...

    If you and DEAD people can read Hex, how many people can read Hex?

  • Hallo Kai_n,


    die Variable max_tool wird in keinem SRC-programm verwendet - vielleicht in irgendwelchen VXWORX - Compilaten oder von der Kuka Bof (zum Tool vermessen??).
    Zugegeben - ich habe ich auch schon versucht Felder von variabler Groesse zu declarieren um Speicher zu sparen. Das die Sache in KRL nicht geht, hat aber einen Vorteil : Die Speicherverwaltung ist eher uebersichtlich gestaltet.


    Gruss Stefan

  • Ja, stimmt alles. mit Max_tool und den entsprechenden arrays kann man nen bisschen schummeln und mehr als 16 tools verwenden.

    If you and DEAD people can read Hex, how many people can read Hex?

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