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

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

Thema: Indirekte Adressierung von Eingängen

  1. #1
    Registriert seit
    20.11.2012
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo, ich würde gerne wissen ob es möglich ist eingänge indirekt zu adressieren.

    Ich bin in einem FC und habe eine Temp Vari

    VAR_TEMP
    EADR : WORD ;
    END_VAR

    und wie ich es kenne müsste es so aussehen :

    L EW[#EADR]

    Dieß geht aber nicht, kann mir jemand sagen wie es genau geht, bzw ob es geht ?
    Zitieren Zitieren Indirekte Adressierung von Eingängen  

  2. #2
    Bubi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.11.2012
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich brauche die Vari als Doppelwort !
    Danke für die Hilfe

  3. #3
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Verstehe nun nicht.
    Was genau willst Du machen oder was soll es werden?
    Wieso ist die Variable im Temp-Bereich deklariert?

  4. #4
    Bubi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.11.2012
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich will ganz schlicht zum beispiel 20 Eingangswörter in ein Array im db schreiben

    AUF DB 56
    L 0.000000e+000
    T #DBADR
    L 0.000000e+000
    T #EADR
    M001: NOP 0
    L EW [#EADR]
    T DBW [#DBADR]
    L #EADR
    L 2.000000e+001
    >R
    BEA
    L #EADR
    L 2.000000e+000
    +R
    T #EADR
    L #DBADR
    L 2.000000e+000
    +R
    T #DBADR
    SPA M001




    EADR ist ein DWORD (Eingangsadresse)
    DBADR ist ein DWORD (DBadresse)
    Geändert von Bubi (20.11.2012 um 16:58 Uhr)

  5. #5
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    1. mit einer REAL-Zahl geht das nicht.... DINT ist geboten
    2. Du musst vor
    L EW [#EADR]
    die Adresse um 3 Bits nach links schieben, da die Adressierung in Step7 bitgranulat ist.
    3. Dein Vorhaben geht mit dem SFC20, BLOCK_MOVE, einfacher.

  6. #6
    Bubi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.11.2012
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ok bei real muss ich auf die 3 stellen achten, aber mit ganzzahlen und int oder dint sollte es ja keine probs geben oder?

  7. #7
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Das in der Klammer [ ] darf keine Realzahl sein.
    Das ist ja die Adresse, und die hat "intern" das Format ADRESSBYTE.BIT

    L P#3.2
    LAR1
    U E [AR1, P#0.0]

    "lädt" E3.2

    Die Bitadresse steht in den letzten drei Bits des Zeigers. Darum muss man wenn man eine Byteadresse lädt diese um 3 Bits nach links verschieben!
    Klar?

  8. #8
    Bubi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.11.2012
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ah danke Hatte auch noch einen fehler drin, BEA statt BEB

    AUF DB 56
    L 0
    SLW 3
    T #DBADR
    L 0
    SLW 3
    T #EADR
    M001: NOP 0
    L EW [#EADR]
    T DBW [#DBADR]
    L #EADR
    SRW 3
    L 38
    >I
    BEB
    L #EADR
    SRW 3
    L 2
    +I
    SLW 3
    T #EADR
    L #DBADR
    SRW 3
    L 2
    +I
    SLW 3
    T #DBADR
    SPA M001


    So geht es nun
    Wobei ich noch am versuchen bin ob ich es einfacher hinbekomme.

  9. #9
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Nimm doch LOOP, der prüft automatisch ob dein Schleifenzähler <> 0 ist und dekrementiert diesen, und springt danach zurück an den Schleifenanfang.

    Folgender Code überbügelt einen DB mit Nullen
    Code:
          AUF   "MyDB"
    
          L     P#0.0
          T     #MyDB_INDEX_DW
    
          L     20                          //beliebig
    back: T     #MyDB_ANZ_DW
    
          L     0
          T     DBD [#MyDB_INDEX_DW]
    
    //Index erhöhen
          L     #MyDB_INDEX_DW
          L     P#4.0
          +D    
          T     #MyDB_INDEX_DW
    
          L     #MyDB_ANZ_DW
          LOOP  back //Schleifenzähler dekrementieren, <> 0?, dann springe zu back

  10. #10
    Bubi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.11.2012
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Flux ja mit einem LOOP geht es auch.

    Meine derzeitige Version sieht so aus :
    FUNCTION FC 1 : VOID
    TITLE =
    //Baustein zum Einlesen von Eingangswörtern und Speichern in einem Datenbaustein.
    //Die Nummer des DB´s, das erste Eingangswort, die Anzahl der einzelesenden Wörter
    //und das erste Speicherwort werden im INT Format von aussen bestimmt.
    VERSION : 0.1


    VAR_INPUT
    StartWORD_EINGANG : INT ; //Ab (inklusive) diesem Eingangswort werden die Eingänge eingelesen.
    StartWORDinDB : INT ; //Ab (inklusive) diesem Word werden die Eingänge im Datenbaustein gespeichert.
    DB_Nummer : INT ; //In diesen Datenbaustein werden die Eingangswörter geschrieben.
    Anzahl_WORD : INT ; //Die Gesamtanzahl der Einzulesenden Eingangswörter.
    END_VAR
    VAR_TEMP
    DBADR : DWORD ;
    EADR : DWORD ;
    DBNRW : WORD ;
    Anzahl : INT ;
    END_VAR
    BEGIN
    NETWORK
    TITLE =


    L #DB_Nummer;
    T #DBNRW;
    AUF DB [#DBNRW];
    L #StartWORDinDB;
    SLW 3;
    T #DBADR;
    L #StartWORD_EINGANG;
    SLW 3;
    T #EADR;
    M001: NOP 0;
    L EW [#EADR];
    T DBW [#DBADR];
    L #Anzahl_WORD;
    + -1;
    L 2;
    *I ;
    L #StartWORD_EINGANG;
    +I ;
    T #Anzahl;
    L #EADR;
    SRW 3;
    L #Anzahl;
    >=I ;
    BEB ;
    L #EADR;
    SRW 3;
    L 2;
    +I ;
    SLW 3;
    T #EADR;
    L #DBADR;
    SRW 3;
    L 2;
    +I ;
    SLW 3;
    T #DBADR;
    SPA M001;

    Nachteil ist ich kann nur Wörter einlesen, keine Doppelwörter.
    Entweder erstelle ich mir noch einen der nur doppelwörter einließt oder ich lege noch eine in var an über die ich bestimme ob ich word oder doppelwort habe.

Ähnliche Themen

  1. Indirekte Adressierung von einem DB
    Von Sirus im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 14.08.2009, 18:08
  2. Indirekte Adressierung von STRING SCL
    Von sm@rt im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 06.02.2009, 15:12
  3. Indirekte Adressierung von Bit's in SCL
    Von tarzipan7 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 23.01.2009, 12:37
  4. Indirekte Adressierung von DATE_AND_TIME
    Von vennemer im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 13.03.2007, 12:23
  5. Indirekte Adressierung von SFC 20
    Von andre im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 05.09.2005, 09:44

Lesezeichen

Berechtigungen

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