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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Array Indirekt ansprechen

  1. #1
    Registriert seit
    15.10.2008
    Beiträge
    75
    Danke
    15
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo.

    Ich habe ein "kleines" Problem:

    In einem DB habe ich ein Array of UDT erstellt. z.b. [1..10]
    In dem UDT steht eine Artikelnummer und verschiedene Daten die dem Artikel im laufenden Prozess zugeordnet werden.

    Um mir viel programmierarbeit zu sparen, suche ich eine "einfache" lösung um erst mal in dem Array die richtige stelle zu finden.

    Im moment habe ich es so gemacht das ich 10x das gleiche netzwerk habe mit jeweil einem anderen Index (1 bis 10) . Bei 10 ist das ja noch machbar... wird aber einiges mehr werden...

    Ich würde das dann gerne so machen dass ich dies mit einer schleife durchlaufe und dann jeweils meinen index um eins erhöhe.

    in dieser schleife rufe ich einen baustein auf der folgende funktion hat:
    als eingangsparameter ein array und einen wert z.b. Int als Arrayindex. Als ausgang dann meine Artikelnummer als String, und dann die verschiedenen Daten (die meisten sind DINT)

    Danke für eure Hilfe
    ich hoffe das ist einigermaßer verständlich was ich geschrieben habe...

    SCL ist auch möglich. habe ich nur so gut wie keine erfahrungen mit.

    Gruß
    Tobl
    Zitieren Zitieren Array Indirekt ansprechen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    Na ... wenn SCL für dich auch ein Thema ist, dann würde ich diese Aufgabe auch damit lösen.
    Wo genau hängt es denn ?
    In SCL wäre dass dann besonders elegant zu lösen, wenn die Daten, die du durchsuchen / ausgeben möchtest sowieso schon in dem Instanz-DB stehen.
    Wo kommen die Daten ursprünglich her ?

    Gruß
    LL

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

    tobl2002 (13.03.2009)

  4. #3
    Registriert seit
    15.10.2008
    Beiträge
    75
    Danke
    15
    Erhielt 3 Danke für 3 Beiträge

    Standard

    SCL ist schon möglich aber habe keine Ahnung wie ich damit anfangen soll.

    Was ich gestern noch vergessen habe ist, dass ich ja eigentlich erst mal die daten einlesen muss, und dann später wieder zurückschreiben musss. also den gleichen baustein in die andere richtgung. aber ich denke mal wenn ich den einen habe dann ist die andere richtung auch kein problem mehr.

    es hängt schon ganz am anfang.... ich habe keine ahnung wo ich anfangen soll...

    Die Daten werden in der ersten Station erfassst. Also Artikelnummer wird eingelesen (1.Baustein) . dann bekomme ich von einem PC eine Rückmeldung was mit dem Artikel passieren soll. (2. Baustein) Dann wird der Artikel bearbeitet (3. Baustein), kontrolle ob barbeitung ok war (4. Baustein) und zum schluss löschen des Datensatzes (5.Baustein).
    Der Ablauf ist soweit klar nur eben bei 10 möglichen Artikel (oder Datensätzen) wäre das 10x das gleiche netzwerk mit jeweils einem anderen Arrayindex.

    deswegen eben die Idee einen Baustein zu erstellen mit folgenden eigenschaften:
    In: Array (oder was sont benötigt wird, Pointer und größe völlig egal)
    In: Arrayindex
    Out: Artikelnummer (String[10]
    Out: z.b. Höhe artikel DINT
    Out: z.b. Länge artikel DINT
    usw.

    ein Array ist immer 50Byte groß , was aus einem UDT besteht und befindet sich in einem einzelnen DB, da die Artikelzahl die zwischengespeichert werden soll noch nicht feststeht (können auch 1000 oder mehr werden)

    Also die Daten werden von mir alle erstellt.

    Gruß
    Tobl

  5. #4
    Registriert seit
    15.10.2008
    Beiträge
    75
    Danke
    15
    Erhielt 3 Danke für 3 Beiträge

    Standard

    So hier mal ein Ansatz, was mir bis jetzt so eingefallen ist.
    Der generator sagt mir aber "baustein nicht korrekt" in Zeile 18 (letzte Zeile). Wie schon gesagt ich habe mir SCL noch nix gemacht... also bitte nicht gleich steinigen wegen blöden anfängerfehlern^^

    ID = Artikelnummer

    Code:
    FUNCTION_BLOCK FB116
    TITLE   = 'Array_Auswahl'
    NAME    : ARRAY_A
    VERSION : '0.1'
    AUTHOR  : MSE
    VAR_INPUT
        Artikel_Array : ARRAY [1..10] OF UDT10;      
        Arrayindex : INT;
    END_VAR
    VAR_OUTPUT
        ID : STRING;
        Laenge : DINT;
        Pos : DINT;
        vorhanden : BOOL;
    END_VAR
    BEGIN
    ID = Artikel_Array[Arrayindex].ID
    Laenge = Artikel_Array[Arrayindex].Laenge
    Pos = Artikel_Array[Arrayindex].Pos
    IF vorhanden = True THEN 
        Artikel_Array[Arrayindex].vorhanden = true 
        ELSE 
            Artikel_Array[Arrayindex].vorhanden = False
    End_IF 
     
    END_FUNCTION_BLOCK

  6. #5
    Registriert seit
    04.07.2007
    Beiträge
    147
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Standard

    Du musst jede Zeile mit einem ; abschließen.
    Code:
    BEGIN
    ID = Artikel_Array[Arrayindex].ID;
    Laenge = Artikel_Array[Arrayindex].Laenge;
    Pos = Artikel_Array[Arrayindex].Pos;
    IF vorhanden = True THEN 
        Artikel_Array[Arrayindex].vorhanden = true ;
        ELSE 
            Artikel_Array[Arrayindex].vorhanden = False;
    End_IF; 
     
    END_FUNCTION_BLOCK
    Den Rest hab ich jetzt nicht kontrolliert, aber das sollte schon mal ein Fortschritt sein.

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

    tobl2002 (13.03.2009)

  8. #6
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    ICh habe es mit ein FC gemacht:

    Code:
     
    TYPE Artikel_UDT 
        STRUCT
            Artikel_nummer : STRING[10] ;
            Artikel_hoehe : DINT ;
            Artikel_laenge : DINT ;
        END_STRUCT
    END_TYPE
     
    TYPE Artikel_Array_UDT 
        STRUCT
            Artikel : ARRAY[1..10] OF Artikel_UDT ;
        END_STRUCT
    END_TYPE
    
    FUNCTION Array_daten_holen_FC : VOID
    VAR_INPUT
        array_in : Artikel_array_UDT ;
        iArrayindex : INT ;
    END_VAR
    VAR_OUTPUT
        out_Artikel_nummer : STRING[10] ;
        out_Artikel_hoehe : DINT ;
        out_Artikel_laenge : DINT ;
    END_VAR
        out_Artikel_nummer :=  array_in.Artikel[iArrayIndex].Artikel_nummer ;
        out_Artikel_hoehe := array_in.Artikel[iArrayIndex].Artikel_hoehe ;
        out_Artikel_laenge := array_in.Artikel[iArrayIndex].Artikel_laenge ;
    END_FUNCTION
    Jesper M. Pedersen

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

    tobl2002 (13.03.2009)

  10. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    Hallo Tobi,
    ich interpretiere deine Anwendung als Rundschalttisch o.ä.
    Etwas ähnliches mache ich auch.
    Ich würde für alle Vorgänge den gleichen FB nehmen und ihn die Daten entsprechend seiner äußeren Beschaltung wegpacken lassen.
    Also wenn die St.Nummer 1 ist (IN-Parameter) und du das Bit "Daten-Speichern" (IN-Parameter) setzt, dann schreibst du den IN-Parameter Artikelnummer in den richtigen ARRAY-Platz (ggf. 1). Entsprechend verfährst du mit den anderen Stationen.
    Falls es wirklich ein Rundschalttisch ist, so könnte der Eingang "Tisch fährt" alle Datensätze vom Index her um 1 nach oben schieben.
    Wenn du die Datensätze an irgendeiner Stelle entnimmst (und vielleicht nach irgend wohin weiterleitest), dann wäre das dann auch die Aufgabe der entsprechenden Beschaltung.

    Falls dieser Ansatz für dich interessant ist, dann würdest du diesen Baustein in deinem Programm bei jeder Station mit unterschiedlicher Beschaltung (Parametrierung) aufrufen.

    Nach Klärung dieser Sachen steht für mich dann erst die Programm-Umsetzung ...

    Gruß
    LL

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

    tobl2002 (13.03.2009)

  12. #8
    Registriert seit
    15.10.2008
    Beiträge
    75
    Danke
    15
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Nein ist kein Rundschalttisch. eine Artikelverfolgung.
    Artikel wird an einer stelle erfasst und zu einem bestimmten Ziel geleitet.
    Datenerfassung ist an einer festen Stelle, der Rest wird über einen Drehgeber gemacht. beispiel: Drehgeber = 100 dann den Artikel x an Station 1 auschleusen... Drehgeber = 105 dann artikel y an Station 3 ausschleusen.

  13. #9
    Registriert seit
    15.10.2008
    Beiträge
    75
    Danke
    15
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Zitat Zitat von JesperMP Beitrag anzeigen
    ICh habe es mit ein FC gemacht:

    das sieht schon mal gut aus. Wie ich sehe hast du aber 2 UDT´s erstellt. Ich brauche aber einen UDT und diesen rufe ich dann in einem DB auf mit (wie bei dir im 2. UDT)
    Wie kann ich den UDT denn am einfachsten in einen DB ändern?

    Gruß
    Tobl

  14. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.262
    Danke
    537
    Erhielt 2.707 Danke für 1.956 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von tobl2002 Beitrag anzeigen
    das sieht schon mal gut aus. Wie ich sehe hast du aber 2 UDT´s erstellt. Ich brauche aber einen UDT und diesen rufe ich dann in einem DB auf mit (wie bei dir im 2. UDT)
    Wie kann ich den UDT denn am einfachsten in einen DB ändern?

    Gruß
    Tobl
    Einen DB anlegen, in dem DB eine Variable, dieser Variablen als Typ deine UDT, speichern, fertig.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Ähnliche Themen

  1. Ausgangsbit indirekt in scl ansprechen
    Von Bensen83 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 18.07.2011, 13:03
  2. indirekt DBs in SCL ansprechen
    Von Bensen83 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 01.08.2010, 22:29
  3. Array indirekt beschreiben
    Von Airpower im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 22.06.2009, 08:34
  4. Array indirekt füllen
    Von Woto im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.05.2009, 19:40
  5. 2D-Array in Step7 mit Variablen ansprechen
    Von jank-automation im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.08.2008, 08:32

Lesezeichen

Berechtigungen

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