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

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

Thema: speicherdirekte Adressierung (Zeiger) auf DB

  1. #1
    Incubant Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich hab folgendes Problem:

    Ich will anhand eines Zählerstandes 1-10 ein Doppelword aus einem DB auslesen, das auslesen soll aber mit einem Zeiger erfolgen, also z.B. bei Zähler = 3 soll das Doppelword mit der Adresse 8.0 ausgelesen werden.

    Was ich bei der ganzen sache nicht ganz versteh ist das AR (Adressregister) und der Zeiger, wie kann ich mit einem Zeiger arbeiten? Also z.b. wie kann ich ihn um 4 erhöhen.

    Zähler: Z 12
    Zeiger: MD 0
    Wert: MD 4 (Ausgelesener Wert)

    vielen Dank für die Hilfe.
    Zitieren Zitieren Gelöst: speicherdirekte Adressierung (Zeiger) auf DB  

  2. "Hallo,

    das Beispiel hier ist super. Habe auch etwas gestutzt als ich die arrays nicht dynamisch indizieren kann.
    Nun brauche ich aber das ganze für ein 2Dimensionales array.
    Also test[0..7,1..24] of type word.
    Wie muss ich das bisherige Programm anpassen um über 2 parameter auf mein array zugreifen zu können?

    mfg Andreas"


  3. #2
    Registriert seit
    18.09.2004
    Ort
    Münsterland/NRW
    Beiträge
    4.718
    Danke
    729
    Erhielt 1.158 Danke für 969 Beiträge

    Standard

    Hallo,

    habe im Moment kein Simatic zur Verfügung (surfe mit Linux), aber suche mal in der AWL-hilfe nach "Beispiele zu registerindirekten Adressierung" oder so ähnlich. Dort ist alles erklärt. Falls dir das nicht weiterhilft, nochmal posten.

    mfg
    marlob

  4. #3
    Registriert seit
    30.09.2005
    Beiträge
    33
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hatte quasi das gleiche Problem, vielleicht hilft dir das: http://www.sps-forum.de/phpBB2/viewtopic.php?t=6348

  5. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    @Incubant

    Schau mal hier rein: http://www.sps-forum.de/phpBB2/viewt...ghlight=#36632.
    Der Baustein liest zwar ein DBW aus, kann aber leicht geändert werden.
    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

  6. #5
    Anonymous Gast

    Standard

    Probier es mal damit,werte für dein Zähler in einem Array fest definieren,
    dann mit einem pointer aufrufen

    FUNCTION FC 2 : VOID
    TITLE =
    VERSION : 0.1


    VAR_TEMP
    TEST_ARRAY : ARRAY [0 .. 9 ] OF WORD ;
    END_VAR
    BEGIN
    NETWORK
    TITLE =Array Beschreiben

    L 100;
    T #TEST_ARRAY[0];

    L 200;
    T #TEST_ARRAY[1];

    L 300;
    T #TEST_ARRAY[2];

    L 400;
    T #TEST_ARRAY[3];

    L 500;
    T #TEST_ARRAY[4];

    L 600;
    T #TEST_ARRAY[5];

    L 700;
    T #TEST_ARRAY[6];

    L 800;
    T #TEST_ARRAY[7];

    L 900;
    T #TEST_ARRAY[8];

    L 1000;
    T #TEST_ARRAY[9];

    NETWORK
    TITLE =MB50 begrenzen

    L MB 50;
    L 0;
    <I ;
    SPB SET0;

    L MB 50;
    L 9;
    >I ;
    SPB SET9;

    SPA NWE2;

    SET0: L 0;
    T MB 50;

    SPA NWE2;

    SET9: L 9;
    T MB 50;

    SPA NWE2;

    NWE2: NOP 0;

    NETWORK
    TITLE =Pointer bilden

    L P#2.0; //Pointer mit 2 Byte laden
    L MB 50; //Index
    *D ; // im Pointer format umwandeln
    LAR1 ; // tranferiere in AR1

    NETWORK
    TITLE =Aus Array mit Index laden

    L LW [AR1,P#0.0];
    T MW 20; //Ergebnis

    END_FUNCTION

    beispiel:ist der MB=8 so ist MW20=900(wert aus array)

  7. #6
    Registriert seit
    20.09.2007
    Beiträge
    4
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    das Beispiel hier ist super. Habe auch etwas gestutzt als ich die arrays nicht dynamisch indizieren kann.
    Nun brauche ich aber das ganze für ein 2Dimensionales array.
    Also test[0..7,1..24] of type word.
    Wie muss ich das bisherige Programm anpassen um über 2 parameter auf mein array zugreifen zu können?

    mfg Andreas
    Zitieren Zitieren das ganze würde ich gern als 2 dimensionales Array erstellen  

  8. #7
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Deine DB-Quelle sieht so aus:

    Code:
    DATA_BLOCK DB 400
    TITLE =
    VERSION : 0.1
    
    
      STRUCT     
       Test : ARRAY  [0 .. 7, 1 .. 24 ] OF //vorläufige Platzhaltervariable
       INT ;    
      END_STRUCT ;    
    BEGIN
       Test[0, 1] := 0; 
       Test[0, 2] := 0; 
       Test[0, 3] := 0; 
       Test[0, 4] := 0; 
       Test[0, 5] := 0; 
       Test[0, 6] := 0; 
       Test[0, 7] := 0; 
       Test[0, 8] := 0; 
       Test[0, 9] := 0; 
       Test[0, 10] := 0; 
       Test[0, 11] := 0; 
       Test[0, 12] := 0; 
       Test[0, 13] := 0; 
       Test[0, 14] := 0; 
       Test[0, 15] := 0; 
       Test[0, 16] := 0; 
       Test[0, 17] := 0; 
       Test[0, 18] := 0; 
       Test[0, 19] := 0; 
       Test[0, 20] := 0; 
       Test[0, 21] := 0; 
       Test[0, 22] := 0; 
       Test[0, 23] := 0; 
       Test[0, 24] := 0; 
       Test[1, 1] := 0; 
       Test[1, 2] := 0; 
       Test[1, 3] := 0; 
       Test[1, 4] := 0; 
       Test[1, 5] := 0; 
       Test[1, 6] := 0; 
       Test[1, 7] := 0; 
       Test[1, 8] := 0; 
       Test[1, 9] := 0; 
       Test[1, 10] := 0; 
       Test[1, 11] := 0; 
       Test[1, 12] := 0; 
       Test[1, 13] := 0; 
       Test[1, 14] := 0; 
       Test[1, 15] := 0; 
       Test[1, 16] := 0; 
       Test[1, 17] := 0; 
       Test[1, 18] := 0; 
       Test[1, 19] := 0; 
       Test[1, 20] := 0; 
       Test[1, 21] := 0; 
       Test[1, 22] := 0; 
       Test[1, 23] := 0; 
       Test[1, 24] := 0; 
       Test[2, 1] := 0; 
       Test[2, 2] := 0; 
       Test[2, 3] := 0; 
       Test[2, 4] := 0; 
       Test[2, 5] := 0; 
       Test[2, 6] := 0; 
       Test[2, 7] := 0; 
       Test[2, 8] := 0; 
       Test[2, 9] := 0; 
       Test[2, 10] := 0; 
       Test[2, 11] := 0; 
       Test[2, 12] := 0; 
       Test[2, 13] := 0; 
       Test[2, 14] := 0; 
       Test[2, 15] := 0; 
       Test[2, 16] := 0; 
       Test[2, 17] := 0; 
       Test[2, 18] := 0; 
       Test[2, 19] := 0; 
       Test[2, 20] := 0; 
       Test[2, 21] := 0; 
       Test[2, 22] := 0; 
       Test[2, 23] := 0; 
       Test[2, 24] := 0; 
       Test[3, 1] := 0; 
       Test[3, 2] := 0; 
       Test[3, 3] := 0; 
    
    ...
    Daran kannst du die "lineare" Struktur deines zweidimensionalen Arrays erkennen und mußt dir damit die Datenwort-Adresse des jeweiligen Elements berechnen, damit dann auf das gewünschte Element über indirekte Adressierung zugreifen.
    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

  9. #8
    Registriert seit
    20.09.2007
    Beiträge
    4
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Daumen hoch

    leider ist da viel Neuland bei. Das Befüllen des Arrays ist nicht das Problem.
    Das ist nur der ungefähre Wert.
    Beschreibung meines Vorhabens:
    Sollwertvorgaben von 0-23uhr und für jeden tag der Woche. Diese Werte stehen in dem array sollwert[0..7,0..23]of word.
    Mit C Programmierung würde ich ja nun einfach sollwert[x,y] schreiben und könnte die entsprechenden Werte abrufen. Welchen Weg muss ich nun gehen um mit "Pointern" auch die 2.Stelle des Arrays anzusprechen? Werde aus den anderen Beispielen noch nicht weiter schlau.

    Danke für die schnelle Unterstützung!!
    Zitieren Zitieren any und co?  

  10. #9
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Ok, das geht so:

    Code:
    FUNCTION FC 400 : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      DB_Nr : INT ;    
      Spalte1 : INT ;    
      Spalte2 : INT ;    
    END_VAR
    VAR_OUTPUT
      Datenwert : INT ;    
    END_VAR
    VAR_TEMP
      ADR_INT : INT ;    
      DB_NR_Temp : WORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
          L     #Spalte1; 
          L     24; 
          *I    ; 
          L     #Spalte2; 
          +I    ; 
          L     2; 
          *I    ; 
          T     #ADR_INT; 
    
          L     #DB_Nr; 
          T     #DB_NR_Temp; 
          AUF   DB [#DB_NR_Temp]; 
    
          L     #ADR_INT; 
          ITD   ; 
          SLD   3; 
          LAR1  ; 
    
          L     DBW [AR1,P#0.0]; 
          T     #Datenwert; 
    END_FUNCTION
    aber Achtung, das Array im DB läuft jetzt von 0..7, 0..23, anders als in deinem 1.Post. Außerdem mußt du dafür sorgen, daß in Spalte1 und Spalte2 nur gültige Werte (0..7 und 0..23) stehen, sonnst kann Mist passieren!

    Definition im DB:

    Test ARRAY[0..7,0..23] INT
    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

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

    automatii (20.09.2007)

  12. #10
    Registriert seit
    20.09.2007
    Beiträge
    4
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Daumen hoch


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Allerbesten Dank für die schnelle Hilfe!!

    Solch eine schnelle Hilfe ist unschlagbar!!!!
    Zitieren Zitieren Besten Dank!!  

Ähnliche Themen

  1. ANY-Zeiger als Rückgabewert
    Von Bensen83 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 04.06.2011, 11:41
  2. Zeiger
    Von snowleopard1702 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 10.05.2011, 17:07
  3. ANY-Zeiger
    Von RAN im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 20.07.2006, 17:42
  4. Zeiger???
    Von Jochen Kühner im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 03.09.2004, 08:33
  5. Any-Zeiger
    Von Anonymous im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 16.10.2003, 20:28

Lesezeichen

Berechtigungen

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