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

Ergebnis 1 bis 5 von 5

Thema: Zuweisung auf Pointerbereiche

  1. #1
    Registriert seit
    16.09.2010
    Beiträge
    23
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,
    ich hätte eine Frage zur Pointeradressierung bzw. Erstellung und freue mich
    über Jeden hilfreichen Beitrag.
    Es geht um folgendes:
    Bei einem bestehenden SPS Projekt gibt es mehrere Ventile, Stopper, Motoren,
    die immer das Gleiche machen, deshalb gibt es für diese Aktionen jeweils
    einen FC. In diesem FC werden die Ansteuerungen bzw. die Fehlermeldungen
    und die HMI Auswertungen vollzogen. Kommt jetzt z.B. ein neuer Motor hinzu,
    nehme ich den FC, leg einen neuen DB Bereich an und fertig. Mit diesem DB Bereich
    hab ich dann die erstellten Fehlermeldungen usw...
    Im unten stehenden Programmablauf seht ihr die Struktur. Am Anfang des FC´s
    wird der Pointer für den DB Zugriff erstellt, dann folgt die Programmierung
    (Ansteuerung, Fehlermeldungen, HMI, ..,..) dann am Ende werden diese Daten wieder
    auf den DB geschrieben, allerdings versteh ich das nicht ganz...
    Hier der Code: --> // Meine Kommentare



    Variablendekleration
    temp: temp_ar1 DWORD
    temp_ar2 DWORD
    temp_any ANY (10 Byte)
    Hilsm UDT (10 Byte)

    TAR1 #temp_ar1 // Adressregister 1 in AKKU 1
    TAR2 #temp_ar2 // Adressregister 2 in AKKU 2

    L P##eAnyHilfsm // DB1.DBX0.0 BYTE 10
    LAR1 // Diese 10 Byte im Adressregister 1
    LAR2 P##temp_any // #temp_any in Adressregister 2

    L W [AR1,P#0.0] // Lade erste 2 Byte von DB1
    T W [AR2,P#0.0] // Transfierier in Adressregister 2
    L D [AR1,P#2.0] // Lade nächste 4 Bytes von DB1
    T D [AR2,P#2.0] // Transfierier in Adressregister 2
    L D [AR1,P#6.0] // Lade letzte 4 Bytes von DB1
    T D [AR2,P#6.0] // Transfierier in Adressregister 2

    CALL "BLKMOV"
    SRCBLK :=#temp_any // Schreibe temp_any auf Hilfsm
    RET_VAL:=#temp_int
    DSTBLK :=#Hilfsm

    LAR2 #temp_ar2 // Lade Adressregister 2

    ****** Bearbeitung *******

    CALL "BLKMOV"
    SRCBLK :=#Hilfsm
    RET_VAL:=#temp_int // Schreibe Hilsm auf temp_any
    DSTBLK :=#temp_any

    LAR1 #temp_ar1 //
    LAR2 #temp_ar2 //
    Zitieren Zitieren Zuweisung auf Pointerbereiche  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.261
    Danke
    537
    Erhielt 2.707 Danke für 1.956 Beiträge

    Standard

    Na ja, was genau verstehst du nicht, du hast doch schon geschrieben wie es geht.
    Über die Any wird der betreffende Bereich des DB in eine interne Struktur umkopiert, dann wird damit gearbeitet und am Ende wird das wieder zurückkopiert.
    Wenn ihr allerdings eh eine Struktur im DB anlegt, dann hätte man auch gleich diese Strucktur als INOUT im FC definieren und dann außen am FC als Variable anlegen können. Im FC hätte man dann direkt mit der angelegten Struktur und den darin definierten Variablen arbeiten können, ohne den Umweg des Umkopierens.
    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

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.302
    Danke
    932
    Erhielt 3.321 Danke für 2.683 Beiträge

    Standard

    Irgendwo in der Step7-Hilfe empfiehlt Siemens, bei mehr als einem Zugriff auf Strukturen diese nicht als IN_OUT zu übergeben, sondern eben diesen Umweg mit dem Kopieren in die Lokaldaten zu gehen. Grund: jeder Zugriff auf ein Element der Struktur am IN_OUT erfordert wegen der Adressberechnung zur Laufzeit ca. 40 Byte mehr Programmcode als ein direkter Zugriff auf L-Adressen (welche schon zur Compilierzeit bekannt sind).

    Übrigens ist es bei einem FC egal, ob man die Struktur als IN_OUT oder IN übergibt, weil nicht die Struktur sondern die Adresse der Struktur übergeben wird.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #4
    ETechniker2011 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    16.09.2010
    Beiträge
    23
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen Dank für die Antworten,

    ja wie es grob funktioniert verstehe ich schon, aber wenn ich mir den Quellcode anschaue, verstehe ich nicht warum es so funktioniert..

    Ich lade den DB Bereich Any, kopiere es dann ins Adressregister 2, was dem Hilsm. hinterlegt ist.

    Warum wird aber nach dem ersten BLKMOV nochmals LAR2 #temp_ar2 geschrieben und warum wird am Ende nach dem 2. BLKMOV nochmals
    LAR1.. LAR2 geschrieben??
    Ist es einfach ein initialisieren der Adressregister bzw. Akkus??
    Das TAR1 und TAR2 wird dann ebals wieder geschrieben, um sicher zu gehen, dass in diesen Bereichen nichts drin steht?

  5. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.302
    Danke
    932
    Erhielt 3.321 Danke für 2.683 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Weil das Programm die Adressregister AR1 und AR2 verändert, ist es so freundlich, die Werte darin vorher zu sichern und danach wieder herzustellen.
    Richtig ausführlich bekommst Du das erklärt, wenn Du den Cursor vor TAR1 bzw. LAR1 setzt und dann F1 drückst und dann in der AWL-Hilfe mit [ >> ] weiterblätterst zum Thema TAR1 <D> bzw. LAR1 <D>
    Code:
    TAR1 #temp_ar1 // AR1 in Lokaldaten sichern
    TAR2 #temp_ar2 // AR2 in Lokaldaten sichern
    ...
    
    LAR2 #temp_ar2 // AR2 wiederherstellen für FB (*)
    
    ...
    
    LAR1 #temp_ar1 // AR1 wiederherstellen
    LAR2 #temp_ar2 // AR2 wiederherstellen
    (*) Wenn das Code für einen mutiinstanzfähigen FB wäre, dann muß AR2 vor dem Zugriff auf Instanzdaten wiederhergestellt werden. In FC ist der Code nicht nötig, stört aber auch nicht.

    Harald

    PS: einen schicken CODE-Block fügt man im Beitragseditor mit dem #-Button ein
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    ETechniker2011 (01.08.2012)

Ähnliche Themen

  1. Zuweisung an Variable
    Von Softi11 im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 11.05.2012, 16:06
  2. Zuweisung in SCL?
    Von petzi im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 12.04.2012, 22:50
  3. Antworten: 27
    Letzter Beitrag: 08.12.2010, 23:32
  4. Zuweisung
    Von snowbda im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 03.12.2008, 15:11
  5. Zuweisung von werten auf Out-Variablen
    Von blasterbock im Forum Simatic
    Antworten: 38
    Letzter Beitrag: 03.12.2008, 10:04

Lesezeichen

Berechtigungen

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