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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Auslesen Array aus DB über zwei Funktionen (ANY-Zeiger und Blkmov)

  1. #11
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von RONIN Beitrag anzeigen
    Ich mach's immer so:
    [...]
    Muss man eigentlich L DID [AR1,P#0.0] schreiben?
    Funktionieren tut's zumindest...
    Nein, muß man nicht - ist aber sicherer und deutlicher lesbar. Die Speicherbereichskennung ist ja schon in den ARx enthalten - hoffentlich auch richtig!!!

    Du hast Glück daß Dein Code funktioniert, denn Dein Code hat 2 Probleme:
    - er funktioniert nur mit Instanz-DB max. 4kB, weil bei +AR1 nur ein 16-Bit-Offset addiert wird
    - Dein AR1 zeigt auf "DB" statt "DI"! Die Bereichskennung, die vor dem +AR1 in AR1 ist wird durch +AR1 nicht verändert. Würdest Du "L DID" verwenden, dann wäre das egal. Irgendwie hat Siemens das wohl vorausgesehen und dafür gesorgt, daß beim Eintritt in einen FB das DI- und das DB-Register auf den selben DB zeigen.

    siehe den Link in #3 http://www.sps-forum.de/simatic/6360...tml#post481732
    Da ist das Problem mit +AR1 erklärt und es sind beide Varianten des indirekten Kopierens gezeigt (bereichsinterne und bereichsübergreifende registerindirekte Adressierung)

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  2. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    RONIN (02.12.2014)

  3. #12
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von UsernameS7 Beitrag anzeigen
    Wieso funktioniert auch Ronins Beispiel ohne Bereichskennung ausblenden?
    Weil er zum Addieren des Multiinstanz-Offsets aus AR2 die Operation "+AR1" verwendet - da ist das Ausblenden (genauer: Ignorieren) schon enthalten.

    Zitat Zitat von UsernameS7 Beitrag anzeigen
    Oder habt ihr noch Verbesserungsvorschläge?
    Dein zusammenbasteln des #Ziel-ANY sieht verdächtig falsch aus. Ich kann es nicht nachvollziehen.
    Wo holst Du den gewünschten Zielbereich her? Aus welchen Teil-Werten soll die Adresse zusammengesetzt werden?

    Zitat Zitat von UsernameS7 Beitrag anzeigen
    Code:
    //Ziel
    LAR1  P##Ziel                     //Lade die Anfangsadresse des ANY-Pointers in AR1
    L     B#16#10                     //S7-code immer b#16#10 = 10hex
    T     LB [AR1,P#0.0]
    L     B#16#2                      //Datentyp: 02 = Byte
    T     LB [AR1,P#1.0]
    L     #Laenge                     //Länge der Daten bzw. Anzahl/Wiederholfaktor
    T     LW [AR1,P#2.0]
    L     DINO                        //DINO liest DBNR aus, wenn nicht benötigt: 0
    T     LW [AR1,P#4.0]
    L     B#16#84                     //Auswahl Eingänge (???) bzw Speicherbereich: 84 = DB
    T     LB [AR1,P#6.0]
    L     B#16#0                      //Adressbelegung: 0 = 000
    T     LB [AR1,P#7.0]              //Adressformat:Byte.Bit wobei Byte aufgeteilt in Bit0-2 von 7. Byte
    L     P##OUT                      //Adressanfang (Zeiger), hier im Eingang       
    SLD   16                          //16mal Shift DWORD nach links (in Akku 1) damit Adressformat: .Bit = .000
    SRD   16                          //16mal Shift DWORD nach rechts (in Akku 1) damit Adressformat: .Bit = .000
    L     #Offset_Ziel                //Laden des Offsets
    +D    
    SLD   3                           //dreimal Shift nach links (in Akku 1) damit Adressformat: .Bit = .000
     T     LW [AR1,P#8.0]              //Adressformat: Byte.Bit wobei Byte in Bit0-7 von 8.Byte
    
    Die "hardcodierte" Angabe der Speicherbereichskennung "16#84" löst man übersichtlicher durch "L P#DBX0.0" - da muß man nicht wissen, welche Kennung der Speicherbereich hat.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #13
    UsernameS7 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.11.2014
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Euch und vorallem Harald,
    dass heißt wenn ich eine feste Adresse Angeben anstatt P##Out in Form von L P#DBX0.0 bräuchte ich nicht den Speicherbereich in Byte 6 schreiben oder wie meinst du das?

    Byte 7 musste ich mit "0" beschreiben, da es mit der "hardcodierten" Variante sonst nicht funktioniert hat.
    Byte 8 musste ich so komisch shifften, da mir auch sonst die übergabe nicht funktioniert hat.

  5. #14
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.336
    Danke
    448
    Erhielt 688 Danke für 513 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    - er funktioniert nur mit Instanz-DB max. 4kB, weil bei +AR1 nur ein 16-Bit-Offset addiert wird
    Ne das passt schon. Über das bin ich aber auch schon drüber gestolpert. Es kommt darauf an in welcher Reihe man die ARs addiert. (Siehe hier - letzter Beitrag)
    Im Screenshot unten ist es schön ersichtlich.

    Zitat Zitat von PN/DP Beitrag anzeigen
    - Dein AR1 zeigt auf "DB" statt "DI"! Die Bereichskennung, die vor dem +AR1 in AR1 ist wird durch +AR1 nicht verändert. Würdest Du "L DID" verwenden, dann wäre das egal. Irgendwie hat Siemens das wohl vorausgesehen und dafür gesorgt, daß beim Eintritt in einen FB das DI- und das DB-Register auf den selben DB zeigen.
    Da hast du mich auf was interessantes gebracht. Die Variante die ich verwende arbeitet tatsächlich mit der DB-Bereichskennung. Dann wir der Pointer also direkt aus dem DB ins Temp kopiert...
    Ist zwar nicht unbedingt falsch aber, ob ich beim nächsten mal nicht deine verwenden...

    Hier noch mal beide Varianten mit simulierten Werten....
    CopyAny.jpg

    [EDIT] Hab's grad nochmal mit L DBNO und L DINO verifiziert. Siemens sorgt tatsächlich dafür dass das DB-Register und das DI-Register beim eintreten in den FB gleich sind....
    Mann, da hätte ich, wenn irgendwo das DB-Register nicht passt, aber irgendwann mal ganz schön auf die Schnauze fallen können...
    Danke nochmal PN/DP!
    [/EDIT]
    Geändert von RONIN (02.12.2014 um 13:30 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  6. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von UsernameS7 Beitrag anzeigen
    dass heißt wenn ich eine feste Adresse Angeben anstatt P##Out in Form von L P#DBX0.0 bräuchte ich nicht den Speicherbereich in Byte 6 schreiben oder wie meinst du das?

    Byte 7 musste ich mit "0" beschreiben, da es mit der "hardcodierten" Variante sonst nicht funktioniert hat.
    Byte 8 musste ich so komisch shifften, da mir auch sonst die übergabe nicht funktioniert hat.
    Es kommt immer gut, wenn man die eigentliche Problemursache erkundet und es dann gezielt richtig macht, statt solange irgendwas auszuprobieren bis es anscheinend funktioniert. Man muß auch wissen, warum es funktioniert. Gerade bei der Maschinenprogrammierung ist es sehr wichtig daß man genau weiß was man tut.

    Nochmal meine Frage:
    Wo holst Du den gewünschten Zielbereich her? Aus welchen Teil-Werten soll die Adresse zusammengesetzt werden?
    Was willst Du eigentlich erreichen?
    Wenn Du diese Fragen beantworten kannst, dann können wir Dir zeigen wie es richtig gemacht wird.

    Wenn Du schon die Quelladresse als ANY übergibst, warum übergibst Du dann die Zieladresse nicht auch als ANY?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #16
    UsernameS7 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.11.2014
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Im Grunde geht es darum einen Datensatz (DB z) von einem IN-Parameter in den DB y des FB y zuschreiben.
    Der Datensatz ist ein Array und liegt wie schon beschrieben am IN (Datenholen) an: "DB_z".S[2].A1.Read.DATEN.Datenteile.teilenummer

    In dem DB y habe ich ein Datensatz als Struktur OUT in STAT hinterlegt. In OUT sollen ab einem Byte x die Daten die am IN anliegen übertragen werden.
    Durch den ANY-Zeiger Ziel und Blockmove sollte die Anzahl Bytes übertragen werden.
    Ziel ist wie Quelle als ANY im Temp des FB hinterlegt.

    Reicht euch das als Beschreibung und ist es verständlich?

  8. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Ich schätze ich habe Dich jetzt verstanden.
    Dein FB soll einen an seinem IN:Datenholen angegeben Datensatz in sein eigenes STAT in die Struktur OUT (+ evtl. x Byte Versatz zum Anfang der Struktur) kopieren?

    Das könnte so aussehen:
    Code:
    //AR2 sichern  (Offset dieser Multiinstanz mit Bereichskennung DB!)
          TAR2  #SaveAR2
    
    //Quelle
          L     P##Datenholen               //relative Adresse #Datenholen in dieser Instanz (DI)
          TAR2                              //Lade Adressregister2 mit Offset dieser Multiinstanz (DB) in Akku1
          UD    DW#16#FFFFFF                //Bereichskennung (DB) ausblenden
          +D                                //Addiere
          LAR1                              //Lade AR1 mit Inhalt von Akku1: absolute Adresse #Datenholen im IDB (DI)
    
          LAR2  P##Quelle                   //Lade AR2 mit Adresse des TEMP-ANY #Quelle
          L     DID [AR1,P#0.0]             //S7-ID 16#10 + Datentyp + Wiederholfaktor aus #Datenholen
          T     LD [AR2,P#0.0]              //schreibe in den ANY #Quelle
          L     DIW [AR1,P#4.0]             //Lade DB-Nummer aus #Datenholen
          T     LW [AR2,P#4.0]              //schreibe in den ANY #Quelle
          L     DID [AR1,P#6.0]             //Lade Bereichsadresse aus #Datenholen
          T     LD [AR2,P#6.0]              //schreibe in den ANY #Quelle
    
    
    //Ziel  (hier AR2: Adresse des TEMP-ANY #Quelle)
          LAR1  P##Ziel                     //Lade AR1 mit Adresse des TEMP-ANY #Ziel
          L     LD [AR2,P#0.0]              //S7-ID 16#10 + Datentyp + Wiederholfaktor aus #Quelle
          T     LD [AR1,P#0.0]              //übernehmen in den ANY #Ziel
    
          L     DINO                        //Lade eigene Instanz-DB-Nr
          T     LW [AR1,P#4.0]              //schreibe die in den ANY #Ziel
    
          L     P##OUT                      //relative Adresse der Struktur #OUT in STAT dieser Instanz (DI)       
          L     #SaveAR2                    //Offset dieser Multiinstanz (DB)
          UD    DW#16#FFFFFF                //Bereichskennung (DB) ausblenden
          +D                                //Addiere
    //= Akku1 enthält jetzt die absolute Adresse der Struktur #OUT in STAT dieser Instanz (DI)
    
    //sollte noch ein Versatz zum Anfang der Struktur #OUT addiert werden müssen: 
    //A falls der Versatz in einer Instanz-Variable (IN, INOUT, STAT) gespeichert ist
    //A      LAR2  #SaveAR2                    //AR2 wiederherstellen für Zugriff auf Instanz-Variable
    //A      L     #iExtraOffset               //INT: Anzahl Bytes Versatz (aus einer Instanz-Variable)
    //A      SLD   3                           //in Pointerformat P#<versatz>.0 wandeln 
    //A      +D                                //zur absoluten Adresse #OUT im Akku1 dazuaddieren 
    
    //B oder falls Versatz fest angegeben werden kann:
    //B      L     P#10.0                      //z.B. fest 10 Byte im Pointerformat
    //B      +D                                //zur absoluten Adresse #OUT im Akku1 dazuaddieren 
    
    //= Akku1 enthält jetzt die absolute Adresse des Ziels in STAT dieser Instanz (DI)
          T     LD [AR1,P#6.0]              //schreibe Akku1 in die Bereichsadresse in den ANY #Ziel
    
    
    //AR2 wiederherstellen
          LAR2  #SaveAR2
    
    //Blockmove
          CALL  "BLKMOV"
           SRCBLK :=#Quelle                 //von IN:#Datenholen
           RET_VAL:=#RET_VAL_Block
           DSTBLK :=#Ziel                   //nach STAT:#OUT (+ ExtraOffset)
    
    //...
    //AR2 wiederherstellen
          LAR2  #SaveAR2
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    vollmi (03.12.2014)

  10. #18
    UsernameS7 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.11.2014
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Harald,
    ja genau das habe ich vor. Nur von einem z.B. DB20 in den DB30 des FB30.

    Paar Fragen hätte ich noch:


    Code:
    //Quelle
    L     P##Datenholen               //relative Adresse #Datenholen in dieser Instanz (DI)
    TAR2                              //Lade Adressregister2 mit Offset dieser Multiinstanz (DB) in Akku1
    Stimmt das TAR2 weil du LADE AR2 kommentierst?

    Code:
    //Ziel  (hier AR2: Adresse des TEMP-ANY #Quelle)
    LAR1  P##Ziel                     //Lade AR1 mit Adresse des TEMP-ANY #Ziel
    L     LD [AR2,P#0.0]              //S7-ID 16#10 + Datentyp + Wiederholfaktor aus #Quelle
    T     LD [AR1,P#0.0]              //übernehmen in den ANY #Ziel
    Ist es wirklich besser den Datentyp und Wiederholfaktor direkt zu übernehmen, also der ANY übernimmt dann die Länge über den Datensatz der am IN anliegt?
    Mir gefällt das nämlich nicht so gut, wenn mal durch ein Zufall jemand den Datensatz am Eingang ändern sollte, kopiert der ja automatisch zuviel und würde die Werte auf ein Adressbereich in meinem DB schreiben was nicht vorgesehen ist..
    Deshalb habe ich hier lieber explizit die Länge bzw Wiederholfaktor angegeben, quasi Zur Sicherheit, das nicht mehr Werte wie vorgesehen geschrieben werden.


    Code:
    //Ziel  (hier AR2: Adresse des TEMP-ANY #Quelle
    
          L     P##OUT                      //relative Adresse der Struktur #OUT in STAT dieser Instanz (DI)       
          L     #SaveAR2                    //Offset dieser Multiinstanz (DB)
          UD    DW#16#FFFFFF                //Bereichskennung (DB) ausblenden
          +D                                //Addiere

    Mit Bereichskennung ausblenden und Laden des AR2 ist dann die schönere Form anstelle meinem shiften (SLD 16 / SRD 16)?



    Code:
    //Ziel  (hier AR2: Adresse des TEMP-ANY #Quelle)
    
    //sollte noch ein Versatz zum Anfang der Struktur #OUT addiert werden müssen: 
    //A falls der Versatz in einer Instanz-Variable (IN, INOUT, STAT) gespeichert ist
    //A      LAR2  #SaveAR2                    //AR2 wiederherstellen für Zugriff auf Instanz-Variable
    //A      L     #iExtraOffset               //INT: Anzahl Bytes Versatz (aus einer Instanz-Variable)
    //A      SLD   3                           //in Pointerformat P#<versatz>.0 wandeln 
    //A      +D                                //zur absoluten Adresse #OUT im Akku1 dazuaddieren  
    
    //= Akku1 enthält jetzt die absolute Adresse des Ziels in STAT dieser Instanz (DI)
          T     LD [AR1,P#6.0]              //schreibe Akku1 in die Bereichsadresse in den ANY #Ziel

    Oder ersetzt hier das LAR2 #SaveAR2 mein shiften?
    Am Ende Transferierst du Lokaldoppelwort auf Byte 6 was ist mit Byte 8? Wird das somit mit überschrieben wegen LD statt LW?

    Danke für die Hilfe und hoffe meine Fragen klingen nicht zu stupide.

  11. #19
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von UsernameS7 Beitrag anzeigen
    Stimmt das TAR2 weil du LADE AR2 kommentierst?
    Deutsche Sprake, schwere Sprake...
    gemeint ist: "Lade das Adressregister2 (enthält den Offset dieser Multiinstanz mit Bereichskennung "DB") in den Akku1"

    Eigentlich ist es nicht nötig, Lade/Transfer-Befehle mit "Lade/Transferiere von Register x zu Register y" zu kommentieren - das sagt der Befehl ja selber schon aus. Der Kommentar sollte zeigen, was da kopiert wird.


    Ist es wirklich besser den Datentyp und Wiederholfaktor direkt zu übernehmen, also der ANY übernimmt dann die Länge über den Datensatz der am IN anliegt?
    Mir gefällt das nämlich nicht so gut, wenn mal durch ein Zufall jemand den Datensatz am Eingang ändern sollte, kopiert der ja automatisch zuviel und würde die Werte auf ein Adressbereich in meinem DB schreiben was nicht vorgesehen ist..
    Deshalb habe ich hier lieber explizit die Länge bzw Wiederholfaktor angegeben, quasi Zur Sicherheit, das nicht mehr Werte wie vorgesehen geschrieben werden.

    Wo bleibt denn da Deine "Wiederverwendbarkeit", wenn Du bei jeder Wiederverwendung den FB anpassen mußt?

    Du kannst die Länge sicherheitshalber explizit angeben, entweder aus einer Variable oder direkt als Konstante hardcodiert:
    Code:
    //Wenn die Länge in einer Instanz-Variable (IN, INOUT, STAT) gespeichert ist 
    //Ziel
          LAR1  P##Ziel                     //Lade AR1 mit Adresse des TEMP-ANY #Ziel
          L     W#16#1002                   //S7-ID 16#10 + Datentyp Byte 16#02
          T     LW [AR1,P#0.0]              //schreibe in den ANY #Ziel
    
          LAR2  #SaveAR2                    //AR2 wiederherstellen für Zugriff auf Instanz-Variable
          L     #iLaenge                    //INT: Anzahl Bytes
          T     LW [AR1,P#2.0]              //schreibe als Wiederholfaktor in den ANY #Ziel
    
          L     DINO                        //Lade eigene Instanz-DB-Nr
          ...
    
    //besser: die Länge fest als Konstante, z.B. 10 Bytes
    //Ziel
          LAR1  P##Ziel                     //Lade AR1 mit Adresse des TEMP-ANY #Ziel
          L     DW#16#1002000A              //S7-ID 16#10 + Datentyp Byte 16#02 + Wiederholfaktor 10
          T     LD [AR1,P#0.0]              //schreibe in den ANY #Ziel
    
          L     DINO                        //Lade eigene Instanz-DB-Nr
          ...
    
    //oder besser lesbar/anpassbar
          LAR1  P##Ziel                     //Lade AR1 mit Adresse des TEMP-ANY #Ziel
          L     W#16#1002                   //S7-ID 16#10 + Datentyp Byte 16#02
          T     LW [AR1,P#0.0]              //schreibe in den ANY #Ziel
          L     10                          //Wiederholfaktor 10
          T     LW [AR1,P#2.0]              //schreibe in den ANY #Ziel
    
          L     DINO                        //Lade eigene Instanz-DB-Nr
          ...

    Mit Bereichskennung ausblenden und Laden des AR2 ist dann die schönere Form anstelle meinem shiften (SLD 16 / SRD 16)?
    Ja. Weil meine Form ist die korrekte und kürzere Form.
    Das Ausblenden der Bereichskennung kann man natürlich auch mit Shiften machen, dann aber bitteschön korrekt: SLD 8 + SRD 8
    Das Laden und Addieren des AR2 fehlt bei Dir. Weil #OUT eine Instanz-Variable ist muß aber der Instanzoffset aus AR2 noch addiert werden. (oder soll das Dein #Offset_Ziel sein? das ist aus Deinem Code nicht ersichtlich)
    Dein SLD 3 steht an der falschen Stelle, P##OUT ist schon im Pointerformat und darf nicht nochmal geshiftet werden.


    Oder ersetzt hier das LAR2 #SaveAR2 mein shiften?
    Nein, das hat nichts damit zu tun.
    Es soll auf eine Instanzvariable zugegriffen werden, dazu muß in AR2 der originale Instanzoffset stehen.
    Siehe meinen Kommentar: "LAR2 #SaveAR2 //AR2 wiederherstellen für Zugriff auf Instanz-Variable"


    Am Ende Transferierst du Lokaldoppelwort auf Byte 6 was ist mit Byte 8? Wird das somit mit überschrieben wegen LD statt LW?
    Jetzt enttäuschst Du mich aber... wer mit ANY und AWL 'rummacht sollte solche Basics eigentlich wissen...
    "T LD [AR1,P#6.0]" transferiert den Akku1 in das LokalDoppelwort, dessen Adresse aus dem Inhalt von AR1 + P#6.0 berechnet wird. Im Klartext: der Akku1 wird in die Bytes 6 und 7 und 8 und 9 der ANY-Variable #Ziel geschrieben.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  12. #20
    UsernameS7 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.11.2014
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von PN/DP Beitrag anzeigen
    Deutsche Sprake, schwere Sprake...
    gemeint ist: "Lade das Adressregister2 (enthält den Offset dieser Multiinstanz mit Bereichskennung "DB") in den Akku1"

    Eigentlich ist es nicht nötig, Lade/Transfer-Befehle mit "Lade/Transferiere von Register x zu Register y" zu kommentieren - das sagt der Befehl ja selber schon aus. Der Kommentar sollte zeigen, was da kopiert wird.
    Alles Klar, habe ich mir so gedacht, wollte nur auf Nummer sicher gehen.

    Zitat Zitat von PN/DP Beitrag anzeigen
    Wo bleibt denn da Deine "Wiederverwendbarkeit", wenn Du bei jeder Wiederverwendung den FB anpassen mußt?

    Du kannst die Länge sicherheitshalber explizit angeben, entweder aus einer Variable oder direkt als Konstante hardcodiert:
    Code:
    //Wenn die Länge in einer Instanz-Variable (IN, INOUT, STAT) gespeichert ist 
    //Ziel
          LAR1  P##Ziel                     //Lade AR1 mit Adresse des TEMP-ANY #Ziel
          L     W#16#1002                   //S7-ID 16#10 + Datentyp Byte 16#02
          T     LW [AR1,P#0.0]              //schreibe in den ANY #Ziel
    
          LAR2  #SaveAR2                    //AR2 wiederherstellen für Zugriff auf Instanz-Variable
          L     #iLaenge                    //INT: Anzahl Bytes
          T     LW [AR1,P#2.0]              //schreibe als Wiederholfaktor in den ANY #Ziel
    
          L     DINO                        //Lade eigene Instanz-DB-Nr
          ...
    
    //besser: die Länge fest als Konstante, z.B. 10 Bytes
    //Ziel
          LAR1  P##Ziel                     //Lade AR1 mit Adresse des TEMP-ANY #Ziel
          L     DW#16#1002000A              //S7-ID 16#10 + Datentyp Byte 16#02 + Wiederholfaktor 10
          T     LD [AR1,P#0.0]              //schreibe in den ANY #Ziel
    
          L     DINO                        //Lade eigene Instanz-DB-Nr
          ...
    
    //oder besser lesbar/anpassbar
          LAR1  P##Ziel                     //Lade AR1 mit Adresse des TEMP-ANY #Ziel
          L     W#16#1002                   //S7-ID 16#10 + Datentyp Byte 16#02
          T     LW [AR1,P#0.0]              //schreibe in den ANY #Ziel
          L     10                          //Wiederholfaktor 10
          T     LW [AR1,P#2.0]              //schreibe in den ANY #Ziel
    
          L     DINO                        //Lade eigene Instanz-DB-Nr
          ...
    Der FB wird bei den Längen der Datensätze in diesem Projekt nicht mehr angepasst, da wir eine feste und vorgegebene Länge haben.
    Nur der Adressanfang kann sich ändern. Durch die Verwendung von P##OUT wird da im DB aber immer wieder passend draufzugegriffen. Diese Wiederverwendbarkeit ist hier wichtig.
    Dennoch, weiß ich jetzt wenigstens wie ich auch sonst die "Wiederverwendbarkeit" nutzen kann, also vielen Dank
    Die Besser/Lesbare Variante hatte ich ja zuvor auch so, dann belasse ich diese so an den Stellen.

    Zitat Zitat von PN/DP Beitrag anzeigen
    Ja. Weil meine Form ist die korrekte und kürzere Form.
    Das Ausblenden der Bereichskennung kann man natürlich auch mit Shiften machen, dann aber bitteschön korrekt: SLD 8 + SRD 8
    Das Laden und Addieren des AR2 fehlt bei Dir. Weil #OUT eine Instanz-Variable ist muß aber der Instanzoffset aus AR2 noch addiert werden. (oder soll das Dein #Offset_Ziel sein? das ist aus Deinem Code nicht ersichtlich)
    Dein SLD 3 steht an der falschen Stelle, P##OUT ist schon im Pointerformat und darf nicht nochmal geshiftet werden.
    Wieder was dazu gelernt, ich wusste nicht das SLD/SRD 16 falsch ist, hatte das so im Internet gelesen. Ist das Abhängig von der CPU?
    Mein #Offset_Ziel ist die INT-Variable um den Offset in der Struktur zu markieren bzw den Datensatz dort abzulegen quasi: #OUT+#Offset_Ziel ab da soll der Datensatz im DB abgelegt werden.
    OK, also kann ich mir der Einfachheit halber merken, dass SLD 3 nichts zusuchen hat bei ANY-Zeigern im Pointerformat also wenn die ohne direkte Adressangabe codiert wurden?


    Zitat Zitat von PN/DP Beitrag anzeigen
    Nein, das hat nichts damit zu tun.
    Es soll auf eine Instanzvariable zugegriffen werden, dazu muß in AR2 der originale Instanzoffset stehen.
    Siehe meinen Kommentar: "LAR2 #SaveAR2 //AR2 wiederherstellen für Zugriff auf Instanz-Variable"



    Jetzt enttäuschst Du mich aber... wer mit ANY und AWL 'rummacht sollte solche Basics eigentlich wissen...
    "T LD [AR1,P#6.0]" transferiert den Akku1 in das LokalDoppelwort, dessen Adresse aus dem Inhalt von AR1 + P#6.0 berechnet wird. Im Klartext: der Akku1 wird in die Bytes 6 und 7 und 8 und 9 der ANY-Variable #Ziel geschrieben.

    Harald
    Sorry, ich weiß das LD 4 Bytes entspricht und somit Byte 6 bis Byte 9 beschreiben müsste, wollte aber sicher gehen. Quäl mich momentan mit ner fiesen Erkältung rum, da ist man nicht immer ganz schnell von Begriff!
    Aber Vielen Dank
    Geändert von UsernameS7 (03.12.2014 um 15:59 Uhr)

Ähnliche Themen

  1. Index aus Array auslesen
    Von heri1980 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.09.2010, 14:54
  2. Datenbereich über ANY Zeiger aus DB holen
    Von Temotec im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 21.06.2009, 21:42
  3. Float aus Byte-Array auslesen
    Von Joe im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 07.07.2008, 12:09
  4. Block_DB über zwei funktionen weiterreichen
    Von plant1 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 13.08.2006, 15:17
  5. Wert mit Zeiger aus DB auslesen
    Von mst im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 03.03.2006, 20:20

Lesezeichen

Berechtigungen

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