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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Adresse von Struct in TEMP ermitteln

  1. #11
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    genau kann dir das nur der programmierer sagen.

    eine mögliche theorie:
    im DB_dat.DBW0 steht eine nummer, die den fehler repräsentiert.
    zu dem fehler gehört ein anderes datenbausteinfeld (<= word) in dem irgendwas zu dem fehler steht, eine beschaltung der warnlampen oder eine eindeutige fehler-id oder was weiß ich.
    mit dem laden der fehlernummer und dem schieben um 3 nach links wird die fehlernummer gleich zur byte-adresse des "anderen datenbausteinfelds", so dass in der folgenden bearbeitung nur noch ein LAR1 #ErrorWord notwendig ist um einen pointer auf dieses feld zu adressieren.
    Hallo 4L,

    für diese Antwort ein Danke von mir, da sie jetzt wirklich mal klar und deutlich formuliert ist.
    Hätte ich es nicht gewusst, hätte ich es nun kapiert.

    Deine zweideutigen, nichtssagenden Antworten wie, "lies doch selber" haben mir noch nie gefallen.

    Und mittlerweile ist es ja auch so, wenn wir dem TE nicht ziemlich schnell mit kurzen klaren Sätzen geholfen haben,
    kommt sogleich Harald mit seinem ausführlichen Bericht.
    @Harald, ich hoffe Du liest da jetzt meine Achtung und keine Kritik raus.
    Geändert von Paule (19.05.2011 um 00:26 Uhr)
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  2. Folgende 2 Benutzer sagen Danke zu Paule für den nützlichen Beitrag:

    PN/DP (19.05.2011),SoftMachine (19.05.2011)

  3. #12
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Paule Beitrag anzeigen
    Deine zweideutigen, nichtssagenden Antworten wie, "lies doch selber" haben mir noch nie gefallen.
    lies doch selber hab ich noch nie geschrieben... höchstens einen link zum entsprechenden handbuch mit einem verweis auf die stelle da ... aber auch nur, wenn es da eindeutig beschrieben steht...

    aber hat ja jeder seinen eigenen selektiven filter
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. #13
    Registriert seit
    27.03.2011
    Beiträge
    10
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo vierlagig,
    vielen dank für deine Antwort.
    So wie ich jetzt verstehe mit dem Befehl
    AUF #DB_dat
    LAR1 P#0.0

    erzeuge ich eine Pointerkonstante P#0.0 für DB_dat.
    Mit dem Befehl
    L DBW [AR1,P#0.0]
    erzeuge ich die Grösse des Pointers und die Byteadresse im DB_dat.
    Mit dem "magischen " Befehl
    SLD 3
    erzeuge ich platz für die Bitadresse des Ponters
    Ist es richtig?
    Danke im voraus

  5. #14
    Registriert seit
    03.04.2008
    Beiträge
    6.200
    Danke
    237
    Erhielt 815 Danke für 689 Beiträge

    Standard

    Zitat Zitat von serpantin Beitrag anzeigen
    erzeuge ich eine Pointerkonstante P#0.0 für DB_dat.
    Mit dem Befehl
    L DBW [AR1,P#0.0]
    erzeuge ich die Grösse des Pointers und die Byteadresse im DB_dat.
    Mit dem "magischen " Befehl
    SLD 3
    erzeuge ich platz für die Bitadresse des Ponters
    Ist es richtig?
    Wenn du schon eine Pointer hast, was willst du mit dem Schieben noch erreichen?

    Du könntest dir und uns helfen, wenn du schreibst was du mit dem Programmcodeschnipsel willst.
    Was willst du programmieren und wie willst du dieses Ziel erreichen?

    Sorry, kann nicht mehr helfen, meine Glaskugel ist in Reparatur.


    bike

  6. #15
    Registriert seit
    13.09.2010
    Beiträge
    2.292
    Danke
    178
    Erhielt 375 Danke für 355 Beiträge

    Standard

    Hallo Bike,

    der mit
    L DBW [AR1,P#0.0]
    geladene Wert ist wohl eine DBW-Nr., auf die später zugegriffen werden soll.

    Mit
    SLD 3
    wir ein weiterer Pointer erzeugt, der dann mit
    T #ErrorWord
    für nachfolgende Bearbeitung zur Verfügung stehen soll...

    Gruss

  7. #16
    Registriert seit
    13.09.2010
    Beiträge
    2.292
    Danke
    178
    Erhielt 375 Danke für 355 Beiträge

    Standard

    Na, nochmal etwas ausführlicher:

    AUF #DB_dat //schlägt den DB auf

    LAR1 P#0.0 //lädt einen leeren Pointer auf das Ziel Byte 0 und Bit 0 in das Adressregister 1

    //Lädt ein Datenwort aus dem aufgeschlagenen Datenbaustein, das mit dem leeren Pointer P#0.0 und
    //dem angegebenen Offset (weiterer "Pointer" P#0.0) adressiert ist
    L DBW [AR1,P#0.0]

    //Der geladene Wert befindet sich jetzt nun im Akku und ist wohl eine DBW-Nr., die später benötigt wird

    SLD 3 //der geladene Wert wird zum Pointerformat "umfunktioniert" (Bitadresse freischieben)
    T #ErrorWord //der umfunktionierte Wert wird transferiert und steht hier für weitere Zugriffe bereit

    U DBX [AR1,P#2.0] //weiss ich nicht...
    = #reset

    ....
    und dann vermutlich so:

    AUF DB_WasWeissIch //DB aufmachen
    LAR1 #ErrorWord //umfunktionierten Pointer ins AR1 laden
    L DBW [AR1,P#0.0] //benötigten Wert holen

    Na, hoffentlich richtig zu so später Stunde !
    Das Bett ruft schon...

    Grüsse

  8. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Na, ich hab' nun auch mal meine Glaskugel befragt. Meine spekuliert so:
    Code:
    //Es gibt einen/mehrere DB mit etwa dieser Struktur direkt am Anfang des DB:
    // 0.0  Auftrag : STRUCT
    // +0.0  ErrorNummer : INT
    // +2.0  CMD_Reset : Bool
    // ...
    // =?.0 END_STRUCT
    
    AUF #DB_dat
    LAR1 P#0.0         //Lade die Anfangsadresse der Struktur "Auftrag" in AR1
    
    L DBW [AR1,P#0.0]  //Lese [#DB_dat].Auftrag.ErrorNummer
    SLD 3              //multipliziere mit 8 (oder mache daraus einen Byte-Pointer?)
    T #ErrorWord       //Ergebnis merken in der lokalen Variable #ErrorWord (Word?!)
    
    U DBX [AR1,P#2.0]  //Lese [#DB_dat].Auftrag.CMD_Reset
    = #reset           //und merken in der lokalen Variable #reset
    ErrorNummer könnte ein Index auf eine Tabelle mit 8-Bit-Einträgen oder auf ein Byte-Array sein. Es kann aber auch sein, daß das SLD 3 garnichts mit einem Pointer zu tun hat und der Wert aus anderen Gründen mit 8 multipliziert wird.
    Die Struktur könnte beispielsweise eine Message / ein Kommando aus einer Visu sein, wo die Nummer eines Objektes drinsteht und ein Bit(feld?), was mit diesem Objekt gemacht werden soll. Oder die Antwort auf eine Anfrage, ob eine bestimmte ErrorNummer schon quittiert wurde. Oder ...

    Da die Struktur direkt am Anfang des DB liegt (ab DBB0), kann man den Code auch wie folgend schreiben. (Das AR1 wurde möglicherweise nur deshalb benutzt, um den Anfang der Struktur irgendwie symbolisch zu adressieren oder um bei einer späteren Adressverschiebung der Struktur nur eine Zeile im Programm anpassen zu müssen.)
    Code:
    AUF #DB_dat
    L DBW 0
    SLD 3
    T #ErrorWord
    
    U DBX 2.0
    = #reset
    Eine weitere Theorie zum Sinn dieses Codes hat vierlagig schon in #10 gebracht.
    Ich sage ebenfalls:
    Zitat Zitat von vierlagig Beitrag anzeigen
    genau kann dir das nur der programmierer sagen.
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #18
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von SoftMachine Beitrag anzeigen
    und dann vermutlich so:

    AUF DB_WasWeissIch //DB aufmachen
    LAR1 #ErrorWord //umfunktionierten Pointer ins AR1 laden
    L DBW [AR1,P#0.0] //benötigten Wert holen
    Wenn ErrorWord ein Pointer sein sollte, dann vermutlich eher so:
    Code:
    AUF DB_WasWeissIch //DB aufmachen
    LAR1 #ErrorWord    //umfunktionierten Pointer ins AR1 laden
    L DBB [AR1,P#0.0]  //benötigten Wert holen
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #19
    Registriert seit
    27.03.2011
    Beiträge
    10
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,
    herzlichen dank für die ausführliche und sehr kostbare Antworten!
    Wenn ich den zweite Netzwerk betrachte dann meiner Meinung nach mit dem Befehl SLD 3 wird der Platz für die Bit Adresse des Pointers erzeugt.In einem bestimmten Fall
    Formalparameter #ErrorWord=100(dezimal)
    L #Adr
    ITD
    SLD 3
    T #Adr_temp

    AUF #DB_dat
    LAR1 #Adr_temp

    U #ResetErrors
    = DBX [AR1,P#0.0]

    U #ErrorMustQuit
    = DBX [AR1,P#0.1]

    U #ErrorActive
    = DBX [AR1,P#0.3]

    L #ErrorMask
    T DBW [AR1,P#4.0]

    L MW [#ErrorWord]
    T DBW [AR1,P#2.0]

    UC "ErrorV1"
    L DBW [AR1,P#2.0]
    T MW [#ErrorWord]

    U DBX [AR1,P#0.4]
    = #ErrorBit

    DB_dat ist ein globaler Datenbaustein für einnen bestimmten Fall: DB250
    Er sieht so etwa aus

    0.0 STRUCT
    +0.0 error_header_general "TErrorV1_header"
    +16.0 error STRUCT
    +0.0 Em_Stop "TErrorV1"
    +6.0 Em_Stop_InputLeft "TErrorV1"
    +12.0 Em_Stop_InputRight "TErrorV1"
    +18.0 Em_Stop_OutpLeft "TErrorV1"
    usw......
    END_STRUCT
    DB_WasWeißiCH existiert nicht in dem fall anstatt ihn- MW100.
    Ist das richtig ?
    Danke im Voraus






Ähnliche Themen

  1. in SCL Adresse von String im IDB ermitteln
    Von Ralle im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 03.03.2011, 09:39
  2. DB Adresse ermitteln
    Von Marc_Quark im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 22.10.2009, 08:22
  3. Adresse des geöffneten DBs ermitteln
    Von Woto im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 29.09.2008, 12:09
  4. Adresse im Instanzdatenbaustein ermitteln
    Von hubiwahn im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 25.09.2006, 16:14
  5. pointer über temp struct...
    Von Jochen Kühner im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.09.2006, 10:23

Stichworte

Lesezeichen

Berechtigungen

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