Zuweisung auf Pointerbereiche

ETechniker2011

Level-1
Beiträge
26
Reaktionspunkte
0
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 //
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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?
 
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
 
Zurück
Oben