1. Dashboard
    1. Dashboard
    2. Suche
  2. Forum
    1. Unresolved Threads
  3. Members
    1. Recent Activities
    2. Users Online
    3. Team
    4. Search Members
  4. Jobs
  5. Articles
  6. Calendar
    1. Upcoming Events
    2. Map
  7. Shop
    1. Orders
    2. Shipping Costs
  • Login or register
  • Search
Roboterprogrammierer finden
This Thread
  • Everywhere
  • This Thread
  • This Forum
  • Articles
  • Pages
  • Forum
  • Blog Articles
  • Events
  • Files
  • Products
  • More Options
  1. Roboterforum.de - die Industrieroboter und Cobot Community
  2. Forum
  3. Industrieroboter Support
  4. KUKA Roboter
Your browser does not support videos autonome mobile Roboter von KUKA
besuche unseren Hauptsponsor
Roboterprogrammierer
Online Roboterschulung
Advertise in Robotics
Der Roboterkanal
Deutscher Robotikverband
Werben in Robotik
Werben für Robotik

2D Arrays

  • maxiTC3
  • November 27, 2024 at 12:03 PM
  • Thread is Resolved
  • maxiTC3
    Points
    210
    Posts
    35
    • November 27, 2024 at 12:03 PM
    • #1

    Hallo zusammen,

    Ich melde mich nach kurzer Zeit wieder.

    Ich habe folgender Struktur in der config.dat deklariert

    STRUC Row REAL fAbsolutPos_Y,fPrePos_Z,fAbsolutPos_X
    DECL Row Shelf[3,10]; 3 Regale, 10 Reihen pro Regal

    Dadurch möchte ich erreichen, das die Struktur aus 2 Bestandteilen besteht.

    Einmal in welchem Regal sich die Reihen befinden, außerdem welche Reihe in dem Regal das Ziel ist.


    So jetzt zur Frage!

    Wie Lese/Schreibe ich dieses Feld jetzt?

    Ich bekomme da irgendwie keine passende Syntax zusammen

    Meine Ansätze zum Schreiben:

    Shelf[nShelf,nLevel] = { fAbsolutPos_Y 0, fPrePos_Z 0, fAbsolutPos_X 0 }

    Das habe ich schonmal hinbekommen, jedoch möchte ich keine Zahlen direkt deklarieren sondern den Wert einer anderen variable z.b in fAbsolutPos_Y übergeben.


    Meine Ansätze zum Schreiben:

    xVariable = Shelf[nShelf, nLevel].fAbsolutPos_Y

    Das nimmt die Syntax aber nicht.


    Wie mache ich das? Vielen dank für die hilfe.

  • Schritt für Schritt zum Roboterprofi!
  • Programmiersklave
    Reactions Received
    104
    Points
    6,464
    Posts
    1,200
    About Me

    neuerdings freigelassen

    Location
    märk. Sauerland
    Occupation
    Roboter- und SPS-Programmierer
    • November 27, 2024 at 12:31 PM
    • #2
    Quote from maxiTC3

    Meine Ansätze zum Schreiben:

    xVariable = Shelf[nShelf, nLevel].fAbsolutPos_Y

    Das nimmt die Syntax aber nicht.

    Im Grunde sollte das aber so gehen.

    Ich hab' gerade mal in ein altes Projekt geguckt, und da hab' ich damals gemacht:

    Code
    GLOBAL STRUC measdata REAL laserval,FRAME position,BOOL valid
    
    
    DECL GLOBAL INT M_activearray=1
    DECL GLOBAL INT M_store=18
    
    
    DECL GLOBAL measdata messung[3,100]
    messung[1,1]={laserval 406.590485,position {X 156.811462,Y 1221.34094,Z 245.797897,A -49.5099945,B -0.510035038,C -178.390},valid TRUE}
    messung[1,2]={laserval 406.590485,position {X 156.811462,Y 1220.74097,Z 245.797897,A -49.5099945,B -0.510035098,C -178.390},valid TRUE}
    messung[1,3]={laserval 406.590485,position {X 156.811462,Y 1220.14087,Z 245.797897,A -49.5099945,B -0.510035157,C -178.390},valid TRUE}
    ....
    
       messung[M_activearray,M_store].laserval=$SOFTPLCREAL[3]
       messung[M_activearray,M_store].position=$POS_ACT
       messung[M_activearray,M_store].valid=TRUE
    Display More

    und so weiter.

    Ging also grundsätzlich.

    Automatisierung mit dem geflügelten Walross aus dem Sauerland

  • maxiTC3
    Points
    210
    Posts
    35
    • November 27, 2024 at 1:30 PM
    • #3

    Okay scheint tatsächlich wirklich so zu funktionieren^^. Jetzt möchte ich diese werte bei Kaltstart noch initialisieren, damit ich die Werte die vor ausschalten der Steuerung wieder zurück bekomme. Würde das so funktionieren?

    SPS.Sub

    DECL BOOl bInit

    ; INIT when coldstart
    IF NOT bInit THEN
    FOR nShelfs = 1 TO 3 STEP 1
    FOR nRows = 1 TO 10 STEP 1
    Shelf[nShelfs,nLevel].fAbsolutPosY = 0
    Shelf[nShelfs,nLevel].fAbsolutPosX = 0
    Shelf[nShelfs,nLevel].fPrePosZ = 0
    ENDFOR
    ENDFOR
    bInit = TRUE
    ENDIF

  • fubini
    Reactions Received
    72
    Points
    5,147
    Trophies
    2
    Posts
    920
    Location
    München
    • November 27, 2024 at 1:56 PM
    • #4

    Nein. Du musst deine Variablen im Dat file deklarieren und dort mit = initialisiern. Dann trackt das System die Werte im Dat file. Beim Anwählen eines Programms werden die Werte dann wieder mit den getrackten aus dem Dat file initialisiert.

  • Programmiersklave
    Reactions Received
    104
    Points
    6,464
    Posts
    1,200
    About Me

    neuerdings freigelassen

    Location
    märk. Sauerland
    Occupation
    Roboter- und SPS-Programmierer
    • November 27, 2024 at 2:48 PM
    • #5

    War jetzt etwas unverständlich gefragt.

    Zum Initialisieren würde ich mir einen "nullshelf" machen, falls man das öfters braucht, ansonsten einfach reinschreiben:

    Code
    DECL row nullshelf={fAbsolutPos_Y 0, fPrePos_Z 0, fAbsolutPos_X 0}

    und dann reicht

    Code
    FOR nShelfs = 1 TO 3 STEP 1
    FOR nRows = 1 TO 10 STEP 1
    Shelf[nShelfs,nRows] = nullshelf
    ENDFOR
    ENDFOR
    blabla


    Mit den Sachen in der SPS.sub ein bisschen vorsichtig, dein Beispiel oben initialisiert Dir das Ding immer, wenn die neu gestartet wird. Das kann aber auch andere Gründe haben als einen Neustart des Systems. Ein Systemstart ist beim Kuka andererseits gar nicht so kritisch, wenn Du keinen Neustart erzwingst. Kann also sein, dass Du Dir die Programmumgebung incl. Variablensituation ohne Not kaputt machst, wo Du eigentlich einfach weiterfahren könntest.

    Anmerkung noch: Deine "Row"-Variable sieht aus, als könne man sie auch durch einen "FRAME" ersetzen. Dann hat man zwar drei Real (die Orientierungen) "über", hat aber ein paar interessante Möglichkeiten mehr, sich die Arbeit zu erleichtern, von ":" bis $NULLFRAME.

    Niemand zwingt Dich, einen "FRAME" nur als "FRAME" zu benutzen... aber letztlich isses egal.

    Automatisierung mit dem geflügelten Walross aus dem Sauerland

  • maxiTC3
    Points
    210
    Posts
    35
    • November 28, 2024 at 6:47 AM
    • #6

    Wie mache ich das wenn ich die werte global nutzen muss. Wie gehe ich sicher, das die werte vor erstem Programmstart initialisiert werden? In welcher Dat File muss ich die schleifen einbauen?

  • maxiTC3
    Points
    210
    Posts
    35
    • November 28, 2024 at 6:52 AM
    • #7

    Außerdem kann ich meines Wissens gar keine Anweisungen wie IF/For/While etc. in einer Dat file nutzen. Das würde nur in einer src. gehen. Ich könnte höchstens das Array manuell in der Dat FIle initialisieren, aber das wäre sehr viel schreibaufwand...

  • fubini
    Reactions Received
    72
    Points
    5,147
    Trophies
    2
    Posts
    920
    Location
    München
    • November 28, 2024 at 9:25 AM
    • #8

    Musst du leider einzeln ohne Verzweigungen und Loops einmal im Dat file machen. Mit dem Blockeditor von Notepad++ geht das ganz schnell und einfach.

  • maxiTC3
    Points
    210
    Posts
    35
    • November 28, 2024 at 10:25 AM
    • #9

    Und in welchem dat file? ist das egal? Config.dat? Ich nutze diese variablen global.

  • Sliwka
    Reactions Received
    32
    Points
    687
    Posts
    130
    • November 28, 2024 at 10:47 AM
    • #10

    In COnfig.dat sind alle Variablen global.

    Wenn du es in anderen .dat Dateien schreibst musst du vor der Deklaration "DECL GLOBAL ...." schreiben.

  • Programmiersklave
    Reactions Received
    104
    Points
    6,464
    Posts
    1,200
    About Me

    neuerdings freigelassen

    Location
    märk. Sauerland
    Occupation
    Roboter- und SPS-Programmierer
    • November 28, 2024 at 10:53 AM
    • #11

    Ich empfehle eine von der $config.dat unabhängige Datei, ich hab' sie immer "globals.dat" genannt. Und dann mit dem Schlüsselwort "GLOBAL", siehe das Beispiel in meiner ersten Antwort. Erspart Ärger bei Systemupgrades und ist dann auch nicht durch andere Prozesse gebunden (Editieren der $CONFIG.DAT führt z. B. zum Stoppen des Submit-Interpreters, weil sich der auf Variablen darinnen bezieht).

    Die Initialisierung baust Du als Routinenaufruf an den Beginn Deines Hauptprogrammes, es startet ja sowieso "von vorne". Je nach Organisation macht man das sogar schon im CELL-Programm.

    Bei solchen Anwendungen (Handlingsaufgaben, wo sich der Roboter Informationen "merken" muss) hab ich auch immer gern als zweite Instanz den Benutzer gefragt. Programm merkt: hey, ich soll hier initialisieren, aber eigentlich war ich vorher noch mittendrin im Job - Benutzer, willst du wirklich, dass ich alles vergesse und von vorne anfange? Hast du alles leer gemacht? Oder soll ich nicht lieber da weitermachen, wo ich unterbrochen wurde?

    Den Array mit den Variablen musst Du trotzdem einmal komplett schreiben (in "globals.dat" oder dergl.). Da sollte Dein Editor Hilfsmittel liefern, das kann man beliebig kompliziert haben ... UltraEdit z. B. kann JavaScript =O damit kann man sich einen automatischen Array-Bastler programmieren....

    Automatisierung mit dem geflügelten Walross aus dem Sauerland

  • maxiTC3
    Points
    210
    Posts
    35
    • November 28, 2024 at 12:30 PM
    • #12

    Also folgende vorgehensweise.

    Modul erstellen mit z.b Namen (GlobalInit), dann in dieser Dat file mit der Anweisung GLobal erstmal meine Structure deklarieren:

    STRUC Row REAL fAbsolutPosY, fPrePosZ, fAbsolutPosX
    DECL GLOBAL Row Shelf[3,10]; 3 Regale, 10 Reihen pro Regal

    Dann jedes einzelne element mit = z.b 0 initalisieren

    Und dann im Hauptprogramm z.b aufrufen?

    macht das nicht sinn nur nach Kaltstart einmal aufzurufen? Warum sollte ich nach jedem Zyklus initialisieren?

    und dadurch wird der Letzt gespeicherte wert der dat file wieder in das Element des Feldes geladen?

    Oder verstehe ich es immer noch falsch.

    Wenn ja seid mal ein bisschen präziser^^

  • Sliwka
    Reactions Received
    32
    Points
    687
    Posts
    130
    • November 28, 2024 at 1:15 PM
    • #13

    Folgender Teil muss in der Dat stehen.

    STRUC Row REAL fAbsolutPosY, fPrePosZ, fAbsolutPosX

    DECL GLOBAL Row Shelf[3,10]

    Shelf[1,1]={fAbsolutPosY 0.0, fPrePosZ 0.0, fAbsolutPosX 0.0}

    Shelf[1,2]={fAbsolutPosY 0.0, fPrePosZ 0.0, fAbsolutPosX 0.0}

    ....

    Shelf[1,10]={fAbsolutPosY 0.0, fPrePosZ 0.0, fAbsolutPosX 0.0}

    Shelf[2,1]={fAbsolutPosY 0.0, fPrePosZ 0.0, fAbsolutPosX 0.0}

    ...

    Shelf[2,10]={fAbsolutPosY 0.0, fPrePosZ 0.0, fAbsolutPosX 0.0}


    Shelf[3,1]={fAbsolutPosY 0.0, fPrePosZ 0.0, fAbsolutPosX 0.0}

    ...

    Shelf[3,10]={fAbsolutPosY 0.0, fPrePosZ 0.0, fAbsolutPosX 0.0}

    Initialisieren brauchst du diese nicht mehr. Werte welche du vorher eingetragen hast, sind nach dem Neustart immer noch in der Variable enthalten.

  • fubini
    Reactions Received
    72
    Points
    5,147
    Trophies
    2
    Posts
    920
    Location
    München
    • November 28, 2024 at 1:34 PM
    • #14
    Quote from maxiTC3

    Wenn ja seid mal ein bisschen präziser^^

    Bist doch Entwickler. Probiere doch einfach mal aus. Da bleibt erfahrungsgemäß auch am meisten hängen. ;)

  • Programmiersklave
    Reactions Received
    104
    Points
    6,464
    Posts
    1,200
    About Me

    neuerdings freigelassen

    Location
    märk. Sauerland
    Occupation
    Roboter- und SPS-Programmierer
    • November 28, 2024 at 6:49 PM
    • #15
    Quote from maxiTC3

    Oder verstehe ich es immer noch falsch.

    Glaub ja.

    In *.DAT stehen die Strukturdefinitionen und die Variablendeklarationen. Und wenn man denen dort einen Wert mitgibt, dann wird der persistent gespeichert. Global, wenn Du willst. (Schlüsselwort "GLOBAL", ich sag's nochmal, oder eben $config.dat) Das ist der Datencontainer.

    Und im Programm - in der *.SRC kannst Du diese Variablen aus der *.DAT überschreiben. Wenn Du unbedingt was mit 0 überschreiben musst, dann dort. "Initialisiert" sind die in der *.dat immer, denn es sind ja globale Persistenten, zumindest wolltest Du das bisher so. Man kann in der SRC auch Variablen deklarieren, aber die existieren dann nur zur Laufzeit der jeweiligen Routine, und müssen tatsächlich initialisiert werden. Wie Du sie mit 0 überschreibst, steht in Deinem eigenen Beitrag #3 oder in meiner Antwort #5.

    Und überschreiben kannst Du sie, wann immer Du willst, zyklisch, nach Bedarf, einmal, oder nie. Ich empfehle nur: ein "Kaltstart" ist erfahrungsgemäß nicht unbedingt ein Grund, sie zu nullen. Musst Du selber wissen. Ein SPS.SUB-Start ist aber nicht dasselbe wie ein Steuerungsstart (ersterer passiert häufiger).

    Weiß ja keiner, was Du vor hast. Wenn das dritte Mal ein Bediener mit 'ner Leiter 40kg schwere Motorenteile aus den Fächern holen muss weil Dein Programm willkürlich die Plätze genullt hat, dann wird er Dir unfreundlich seine Bedürfnisse übermitteln. Wenn er einfach 'nen Setzkasten in 'ne Schäferkiste ausleert ist es ihm vielleicht egal. Wenn dringend genullt werden muss, wirst Du das wissen; wenn die Zahlen einfach stehen bleiben oder überschrieben werden können, dann auch.

    Automatisierung mit dem geflügelten Walross aus dem Sauerland

  • maxiTC3
    Points
    210
    Posts
    35
    • November 29, 2024 at 6:53 AM
    • #16

    Ich glaube, ihr habt mich nicht ganz verstanden, was ich umsetzen möchte. Es geht mir nicht darum, die Variablen mit einem bestimmten Wert wie 0 oder Ähnlichem zu initialisieren. Ich möchte, dass die Daten, die in der Struktur gespeichert werden, nach einem Neustart der Steuerung erhalten bleiben. Der Inhalt der Variablen ist mir jedoch nicht bekannt, da mein Programm die Werte während der Erstinbetriebnahme selbstständig in die Struktur schreibt. (Mithilfe eines Teach ablaufs) .Mein Ziel ist es lediglich, sicherzustellen, dass diese Daten nach einem Neustart persistent bleiben und nicht aufeinmal 0 sind.

  • maxiTC3
    Points
    210
    Posts
    35
    • November 29, 2024 at 6:53 AM
    • #17

    Eventuell hab ich mich auch anfänglich falsch ausgedrückt

  • Sliwka
    Reactions Received
    32
    Points
    687
    Posts
    130
    • November 29, 2024 at 6:55 AM
    • #18

    Wenn du diese so deklarierst wie ich oben beschrieben habe, dann bleiben die auch nach dem Neustart.

  • fubini
    Reactions Received
    72
    Points
    5,147
    Trophies
    2
    Posts
    920
    Location
    München
    • November 29, 2024 at 8:07 AM
    • #19

    Wie schon gesagt: Probier es doch einfach mal mit einem Minimalbeispiel aus dann siehst du was passiert. Du machst die Sache hier komplizierter als sie ist.

    In entweder $config.dat oder ein globales Dat-File:

    DECL REAL myVariable = 0;

    Irgendwo in einem SRC:

    myVariable = 1.0

    Programm ausführen.

    In dat file schauen was drin steht. Kaltstart. Wieder schauen was drin steht. Programm anwählen. Schauen über z.B. Anzeige-> Variable -> Einzeln was drin steht.

    Das gleiche Prinzip funktioniert auch bei komlexeren Variablen. Du musst aber elementweise initialisieren.

    Es wird dir hier niemand das fertige Programm auf dem Silbertablett hinschreiben. Dazu ist ein Forum auch nicht da. Wenn die ersteres willst musst du dir bezahlte Hilfe hohlen. Da kannst du das verlangen. Alternativ kann man bei KUKA auch Schulungen buchen wo einem das beigebracht wird.

  • woodys
    Reactions Received
    35
    Points
    3,255
    Trophies
    8
    Posts
    589
    • November 29, 2024 at 9:45 AM
    • #20
    Quote from maxiTC3

    Ich möchte, dass die Daten, die in der Struktur gespeichert werden, nach einem Neustart der Steuerung erhalten bleiben.

    Hallo ,

    das wurde doch jetzt mehrfach erwähnt. Verstehe nicht wo das problem sein soll

Tags

  • 1
  • 33
  • 2
  • ABB
  • ABB Roboter
  • ABS
  • base
  • constant
  • CP_PARAMS
  • Dialog
  • EX
  • EXT
  • fanuc
  • Fehler
  • FRAMES
  • INIT
  • INITIALIZED
  • INITMOV
  • IRC5
  • joint
  • KRC2
  • KRC4
  • kuka
  • new
  • NONE
  • notify
  • PATH
  • PGNO_GET
  • profinet
  • PTP_DAT
  • PTP_PARAMS
  • P_ACTIVE
  • P_FREE
  • P_RESET
  • P_STOP
  • Quit
  • Roboter
  • RobotStudio
  • Schweißen
  • Sps
  • Sync
  • T1
  • t2
  • tcp
  • Tool
  • VALUE
  • VAR
  • vel_cp
  • vel_ptp
  • Yaskawa
AD
Your browser does not support videos Automatisierung im Handwerk - ich schaffs mit KUKA
Einloggen für weniger Werbung

gesponserte Artikel

  • Gebrauchtroboter kaufen - Was ist zu beachten. Die Checkliste zum kauf von gebrauchten Robotern

    August 11, 2019 at 7:02 PM
  • Was macht ein Roboterprogrammierer genau und was verdient er?

    August 21, 2019 at 8:17 AM
  • Vernetzen, referenzieren, kollaborieren: Das B2B Portal für die Produktionsautomatisierung

    June 2, 2021 at 11:29 AM

Job Offer

  • Sie wollen Ihr Stellenangebot im Roboterforum schalten? Ab 149€

    Werner Hampel June 17, 2021 at 9:52 AM
  • Werde Roboterprogrammierer bei ROBTEC GmbH in Mainburg / Bayern

    Werner Hampel April 5, 2023 at 7:13 PM
Werbung auf Roboterseite
Roboter programmieren lernen
Banner Robotik

Similar Threads

  • KUKA KRC5 vermessene Basepunkte über Programm anfahren

    • FaroBusiness
    • March 4, 2024 at 9:40 AM
    • KUKA Roboter
  • Startpunkt verschieben

    • Holztec-leitner
    • February 15, 2024 at 6:13 PM
    • KUKA Roboter
  • Variable "zusammenbasteln"

    • Andi13130
    • January 11, 2024 at 10:12 AM
    • KUKA Roboter
  • Dynamische Variablen/Array

    • Mishak
    • September 26, 2023 at 1:50 PM
    • ABB Roboter
  • Zerstückeln eines Char Arrays und dessen Zuweisung als REAL Variable

    • Aggasan
    • January 26, 2023 at 3:47 PM
    • KUKA Roboter

Wieviele Mitglieder waren heute eingeloggt?

Logge Dich ein, um hier zu lesen wer in den letzten 24h Online war und um weniger Werbung zu sehen.

  1. Privacy Policy
  2. Legal Notice
Powered by WoltLab Suite™ 6.0.22
Roboterforum.de - die Industrieroboter und Cobot Community in the WSC-Connect App on Google Play
Roboterforum.de - die Industrieroboter und Cobot Community in the WSC-Connect App on the App Store
Download