FC zu FB + Programmfrage

Kniffo

Level-1
Beiträge
119
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hab ein Programm vor mir, bei dem für spätere Zwecke die FC Bausteine als FB umgeschrieben werden sollen. Im Grunde sollte das keine Probleme machen. Ich übertrage die NW des FC so wie sie sind in einen FB!? Oder gibt es noch eine schnellere Methode? Nur die Zugriffe auf den (dann festen) Datenbaustein sollten wahrscheinlich angepasst werden.

Jetzt ist mir noch etwas unklar. Zu Beginn wird der Datenbereich #p geladen und dann auf eine Art temporären „Merker“ geschoben (#m). Ich möchte hier auf den angehängten Screenshot verweisen, um jetzt keinen Blödsinn zu erzählen. Ich verstehe leider den Vorgang nicht. Da erreichen zwei Monate SPS-Selbststudium bereits ihre Grenzen. Ich hoffe in dem Screenshot sind alle nötigen Informationen enthalten und ihr könnt mir da helfen.

In den folgenden NWs wird nun mit dem m-Bereich gearbeitet (#m.open, #m.close, ...) und am Ende werden die Werte aus #m wieder mittels SFC20 auf #p zurückgeschoben.

Welchen Sinn hat das und hängt das mit der Verwendung des FC zusammen?
Sollte ich jetzt etwas daran ändern oder ist diese Vorgehensweise auch beim FB nötig/möglich?

Danke
Kniffo
 

Anhänge

  • FC-JPG.jpg
    FC-JPG.jpg
    230 KB · Aufrufe: 65
Hallo!

Hier wird ein ANY Pointer gebildet!
Da werden die Daten für den ANY Pointer ab der Adresse von Instance 10Bytes lang in den Bereich von p kopiert. (p wird als Anypointer Deklariert sein)
Befindet sich Instance im INOUT Bereich?

Mit der SFC 20 werden die Daten die mit dem ANY Pointer p Adressiert sind in den Bereich kopiert der mit den ANY Pointer m Adressiert ist.

VORSICHT!
Wenn du mit dem Adressregister 2 und Multiinstanzen arbeitest dann vorher die adresse zwischenspeicher und nach dem Stück Programmcode wieder in das Adressregister 2 zurückschreiben.

godi
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ajo, so langsam verstehe ich.
Befindet sich Instance im INOUT Bereich?

Ja tut es und dieser erscheint als Eingang am FC. Dort ist wiederum der Pointer P#DB1001.DBX0.0 angegeben.
Den Bereicht lädt er dann also, arbeitet mit ihm und schreibt ihn zurück...alles klar.

Liegt das jetzt an dem FC, das man mit dem Pointer arbeitet oder macht man das beim FB genauso?

VORSICHT!
Wenn du mit dem Adressregister 2 und Multiinstanzen arbeitest dann vorher die adresse zwischenspeicher und nach dem Stück Programmcode wieder in das Adressregister 2 zurückschreiben.

Wird gemacht, im NW 1 steht:
Code:
      TAR1  #temp_AR1
      TAR2  #temp_AR2
Gibt es noch eine einfache Erklärung, warum man das machen muss?
 
Ajo, so langsam verstehe ich.


Ja tut es und dieser erscheint als Eingang am FC. Dort ist wiederum der Pointer P#DB1001.DBX0.0 angegeben.
Den Bereicht lädt er dann also, arbeitet mit ihm und schreibt ihn zurück...alles klar.

Wenn der Pointer direkt (also mit am P#DB1001.DBX0.0) an INOUT übergeben wird dann könntest du das ganze auch weglassen und am SFC 20 gleich instance angeben.

Liegt das jetzt an dem FC, das man mit dem Pointer arbeitet oder macht man das beim FB genauso?

Normalerweise bildet man sich einen Pointer selbst wenn er sich während der laufzeit ändern soll.

Wird gemacht, im NW 1 steht:
Code:
      TAR1  #temp_AR1
      TAR2  #temp_AR2
Gibt es noch eine einfache Erklärung, warum man das machen muss?

Bei Multiinstanzen steht im Adressregister 2 das Offset des Bausteines drinnen. Also wenn ein FB in einem Deklarationsbereich von einem anderen FB deklariert wird dann bekommt die Variable eine Adresse. Diese steht dann im AR2 von deiner Multiinstanz. Das ist gut damit der Baustein weiß wo sich seine Variablen im DB befinden. Also die Adresse bildet sich bei ner Multiinstanz aus dem Offset vom AR2 + zusätzlich noch die Adresse der Variable aus der Deklaration.
Kompliziert zu erklären! :(

So jetzt genugt das nicht wenn du nur im ersten Netzwerk das machst.
Du solltest bevor du das AR2 neu beschreibst es sichern und bevor du die erste Variable abfragst wieder zurückschreiben.
 
Wenn der Pointer direkt (also mit am P#DB1001.DBX0.0) an INOUT übergeben wird dann könntest du das ganze auch weglassen und am SFC 20 gleich instance angeben.
Ich meinte damit nur (für mich), dass beim Aufruf des FC Instance (ist ja IN_OUT) mit am Eingang erscheint. Dort ist dann der Pointer angegeben.
Im FC selbst wird dann nur noch P##instance geladen.

Normalerweise bildet man sich einen Pointer selbst wenn er sich während der laufzeit ändern soll.
Ja soweit klar. Ich muss mir nur nochmal generell die Benutzung von Pointern zu Gemüte führen. Man benutzt sie in FBs und FCs gleichermaßen!?


Wegen dem AR2 sichern...ist dies nicht (wie du auch sagst) nur bei Multiinstanzen, also FBs nötig? Ich habe ja hier aber einen FC vorliegen. Warum wurde da das AR gesichert? Ich möchte ihn ja jetzt erst in einen FB umschreiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich meinte damit nur (für mich), dass beim Aufruf des FC Instance (ist ja IN_OUT) mit am Eingang erscheint. Dort ist dann der Pointer angegeben.
Im FC selbst wird dann nur noch P##instance geladen.
Damit meinte ich das du die Zusammensetzung des Pointers weglassen kannst und an der SFC 20 anstatt #p gleich #instance anschreiben kannst

Ja soweit klar. Ich muss mir nur nochmal generell die Benutzung von Pointern zu Gemüte führen. Man benutzt sie in FBs und FCs gleichermaßen!?

Ja benutzt man gleichermaßen

Wegen dem AR2 sichern...ist dies nicht (wie du auch sagst) nur bei Multiinstanzen, also FBs nötig? Ich habe ja hier aber einen FC vorliegen. Warum wurde da das AR gesichert? Ich möchte ihn ja jetzt erst in einen FB umschreiben.

Wenn man Bausteine hat die man öfters Verwendet bzw Bibliotheksfähig sein sollen dann sollte man das so machen damit in dem Baustein wo der Busteinaufruf erfolgt sich nichts in den Adressregistern ändert.

godi
 
Zurück
Oben