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

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

Thema: Blockmove in einem FC (UDT als IN Parameter)

  1. #11
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... ich kann dir da jetzt im Augenblick keine passende Antwort liefern ... ich kann meine Behauptung auch gerade nicht testen. Es müßte doch aber für dich (wenn du da dran bist) relativ einfach festzustellen sein. Nach meiner Meinung steht bei "L P##Par1" im Akku_1 die DB-Adresse des Pointers und in Akku_2 das Adresse-Offset und die Kennung ...
    Ich werde das aber später auf jeden Fall noch einmal gegen-checken ...

    Gruß
    LL

  2. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Alles Quatsch ... es liegt an dem LAR1 ... deshalb mußt du den Akku tauschen ...

  3. #13
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Laut Step 7 Hilfe:

    LAR1 lädt das Adreßregister AR1 mit dem Inhalt von AKKU 1 (32 Bit-Pointer). AKKU 1 und AKKU 2 werden nicht verändert. Die Operation wird ausgeführt, ohne die Statusbits zu berücksichtigen oder zu beeinflussen.
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Nee...  

  4. #14
    Registriert seit
    25.09.2008
    Ort
    Wiesenbach, Baden
    Beiträge
    21
    Danke
    3
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Lösungsvorschlag:

    Die FC hat den In-Parameter udtBlock vom Typ UDT xy (irgendein UDT, z.B. mit 40 Byte Länge). Der Parameter ist ein Pointer mit 6 Byte und beinhaltet die Startadresse des Datenblockes vom Typ UDT xy.

    In der FC folgende Lokalvariablen definieren:

    _SaveAR1 : DINT
    _SaveAR2 : DINT // Dienen zum Sichern der Adressregister

    _anySource : ANY // Anypointer für die Quelle, der In-Parameter
    // Das Ziel sei ein Struktur im dbDest, z.B. dbDest.sUDT_Ziel
    TAR1 _SaveAR1
    TAR2 _SaveAR2 // sicherheitshalber Adressregister retten

    ......

    LAR1 _anySource // Quellanypointer aufbereiten
    L P#udtBlock // Zeiger auf den In-Parameter
    LAR2 // LAR2 P#udtBlock geht n icht direkt in einer FC

    L W#16#1002 // Kennung S7 und Datentyp Byte
    T W[AR1,P#0.0]
    L 40 // 40 Byte sei der UDT groß
    T W[AR1,P#2.0]
    L W[AR2,P#0.0] // Das ist der Datenbereich des Parametrierten UDTs!!!
    T W[AR1,P#4.0]
    L D[AR2,P#2.0] // Das ist die Startadresse des UDT-Blockes
    T D[AR1,P#6.0] // Fertig ist der Anypointer

    CALL "BLKMOV"
    SRCBLK := _anySource
    RÉT_VAL := _RetVal // irgendeine INT-Variable
    DSTBLK := dbDest.sUDTZ_Ziel

    ......

    LAR1 _SaveAR1
    LAR2 _SaveAR2

    Gruß Puddl
    Zitieren Zitieren Blockmove in einem FC (UDT als In-Parameter)  

  5. #15
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    @Jochen:
    Das mit dem TAK habe ich mittlerweile gecheckt. Es muß so sein, wie von mir beschrieben ...

    @Puddl:
    Dein Vorschlag, mit dem AR2-Register zu arbeiten ist aber auch nicht schlecht ... Da war ich nicht drauf gekommen ...

  6. #16
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    @Larry....

    Ich habs ja in meinem letzte Bsp. eigendlich genau wie Puddl, und das sollte funktionieren. Brauch auch kein TAK dazu, und sehe auch noch nicht denn sin von den TAK's

    Denke so wie ich es als letztes hatte wirds funktionieren...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Nee...  

  7. #17
    Registriert seit
    29.09.2008
    Ort
    Land der Frühaufsteher
    Beiträge
    104
    Danke
    6
    Erhielt 22 Danke für 21 Beiträge

    Standard

    Um IN-Parameter für einen Aufruf weiterzuverwenden müssen diese in eine TEMP-Variable kopiert werden. Hier könnte das so aussehen:

    L P##PAR1
    T #eingang //TEMP-Variable DWORD

    CALL "BLKMOV"
    SRCBLK :=#eingang
    RET_VAL:=MW abc
    DSTBLK :=P#DBxy.DBX0.0 BYTE z //"z" ist länge des UDTs

    Konnte leider noch nicht checken ob es funktioniert.

    MfG
    FrankW

  8. #18
    Registriert seit
    25.09.2008
    Ort
    Wiesenbach, Baden
    Beiträge
    21
    Danke
    3
    Erhielt 4 Danke für 4 Beiträge

    Ausrufezeichen

    Hallo FrankW

    Das geht so nicht, BlockMove würde so den Inhalt der Variable eingang auf das Ziel kopieren, und der Inhalt von eingang ist die Adresse (Lokalvariable der FC) des Parameters para1.

    Man muss schon einen richtigen Any-Pointer aufbauen, sonst klappt das nicht.

    Gruß Puddl
    Zitieren Zitieren Blockmove...  

  9. #19
    Registriert seit
    29.09.2008
    Ort
    Land der Frühaufsteher
    Beiträge
    104
    Danke
    6
    Erhielt 22 Danke für 21 Beiträge

    Standard

    Hallo Puddl,

    ich weiß nicht so recht, bei mir stand da nur ein Pointer auf "Vorheriger Lokaldatenbereich" und wenn ich diesen ins Adressregister geladen habe, stand da nur der POINTER noch mal als DATEN drin (aber auch nur mit PLCSim getestet).

    Hat es bei Euch funktioniert?

    MfG
    FrankW

  10. #20
    Registriert seit
    25.09.2008
    Ort
    Wiesenbach, Baden
    Beiträge
    21
    Danke
    3
    Erhielt 4 Danke für 4 Beiträge

    Ausrufezeichen


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo FrankW.

    Also, ich habe eine FC programmiert mit einem Input-Parameter udtTest vom Typ UDT 920. Sonst hat der FC keine weiteren Parameter.

    Die UDT 920, mit Trallalla-Daten, hat 32 Byte. Im DB 1 gibt es eine Struktur udtTest vom Typ UDT 920.

    Diese FC habe ich im OB 1 aufgerufen. Als aktualparameter an udtTest habe ich "dbTest".udtTest parametriert, eine Struktur vom Typ UDT 920. Sonst ist im OB1 kein weiterer Aufruf. Der OB1 enthält nur seine Standard-Lokalvariablen (20 Byte).

    Im FC 1 habe ich folgende Befehle eingefügt:

    L P##udtTest
    LAR1
    L W [AR1,P#0.0]
    L W [AR1,P#2.0]
    L W [AR1,P#4.0]

    So. Dann habe ich das Miniprogramm im PLCSIM gestartet und mir die FC 1 online angesehen.

    Der erste Befehl liefert 870000a8 (hex). Das ist ein Pointer! Er bedeutet Lokalvariablen des Vorgängers (die 87) und die BIT-Adresse dieser Variablen. Man mus also a8 durch 8 dividieren und erhält dann 15 (hex) oder 21. Der In-Parameter verweist also auf eine Lokalvariable des Vorgängers (des OB1) die ab Adresse 21 steht. Und das ist korrekt.
    Mit dem 2. Befehl wird dieser Pointer in das Adressregister 1 geladen.
    Die Befehlszeilen 3 - 4 liefern den Inhalt der Lokalvariablen, nämlich den eigentlichen Pointer auf meine Struktur im DB 1.
    Online kann man lesen:
    Befehlszeile 3 -> eine 1. Das ist DB 1
    Befehlszeile 4 -> 8400 (hex). Das bedeutet Speicherbereich DB (die 84) und ein Teil der Adresse, welche hier null ist.
    Befehlszeile 5 -> 01b0 (hex). Das ist die Bitadresse im DB 1 der Struktur udtTest. 1bh umgerechnet ergibt Byte 54, das Startbyte meiner Struktur.

    Ein besonderer Hinweis für alle, die sich mit Pointern und Co etwas schwer tun. In der Simatic-Onlinedokumentation (Titel: STEP 7 - Programmieren mit STEP 7) im Anhang A3 findet ihr alles über Speicherbereiche, Pointer, Anypointer, Datenformate... Das sind die wichtigsten 30 Seiten des Handbuches, die man lesen sollte. Der Rest des Buches, na ja.

    Gruß Puddl
    Angehängte Dateien Angehängte Dateien
    Zitieren Zitieren Blockmove...  

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 19.01.2011, 17:08
  2. Blockmove mit Datenformat Int und String
    Von sailor im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 20.05.2010, 10:49
  3. FC mit einem STRING Parameter aufrufen
    Von xaverlg im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 04.04.2008, 12:20
  4. Blockmove
    Von Anonymous im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 18.01.2005, 08:43
  5. Blockmove Probleme....
    Von Jochen Kühner im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 05.10.2004, 10:21

Lesezeichen

Berechtigungen

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