Step 7 Multiinstanz

Reibekuchen

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe die Aufgabe, einen multiinstanzfähigen FB zu erstellen und anschließend fünf Instanzen davon zu erzeugen.

Nun habe ich mich nur flüchtig mit dem Thema Multiinstanzen beschäftigt.

Mein Ergebnis sieht nun so aus, dass die erste Instanz scheinbar problemlos läuft, aber alle weiteren funktionieren nicht.

Gibts da irgendwas grundlegendes, was zu beachten ist?

Danke :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man sollte möglichst überhaupt keine globalen Variablen benutzten, wenn man mehrere Instanzen eines FBs erzeugen will.
Es sei denn es ist (bewußt) gewünscht, das jede Instanz auf die selbe Variable z.B. im DB zugreift.


Übrigens machen mehrere vorhanden Instanzen eines FBs ihn dann noch keineswegs zur Multiinstanz!

Und es ist allgemein eine gute Angewohnheit, nur lokale Variablen im Baustein zu benutzen.
Egal ob einfach oder mehrfach verwendet.
Egal ob Multiinstanz oder nicht.
 
AR1 ist OK. AR2 ist meines Wissens nach problematisch, denn da steht bei 'ner Multiinstanz der Versatz der Daten im IDB drin.
Sichern und Wiederherstellen ist hier wohl das Stichwort.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
AR1 ist OK. AR2 ist meines Wissens nach problematisch, denn da steht bei 'ner Multiinstanz der Versatz der Daten im IDB drin.
Sichern und Wiederherstellen ist hier wohl das Stichwort.
beides unproblematisch, wenn man sich an einfache Grundregeln hält.
sichern am Anfang, am Ende wiederherstellen ist eine.
bei Multiinstanzen den Versatz beachten ... kann man immer mitbetrachten, so ist der Baustein später bibliotheks- und immer multiinstanzfähig
bei AUF DIxy für einen quasi dritten Datenbaustein gilt das selbe, wie für die Adressregister: sichern, wiederherstellen

wenn man sich daran hält, kann man in einem multiinstanzfähigen FB mit den Adressregistern alle denkbaren Sauereien durchführen
 
Ab dem Moment, wo man AR2 oder das DI-Register verändert hat, kann man nicht mehr auf die Instanzdaten (IN, OUT, IN_OUT, STAT) zugreifen! Solange, bis man AR2 und DI wiederhergestellt hat.
Falls das Verändern von AR2 oder DI nötig ist: AR2 und DI und Instanzdaten vorher in TEMP kopieren und ggf. nachher wieder zurück.

Harald
 
Ich verwende nur AR1. Kann ich das so ohne weiteres tun, oder muss ich da auch etwas beachten? (Sichern, Versatz..)

EDIT: Wie sieht das mit Timern aus? Ich verwende einen S_VIMP. Habe gerade schon mal ein bisschen gegoogelt, aber noch keine Lösung dafür gefunden :/
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Siemens-Timern musst Du die Timer-Nr. über die Bausteinschnittstelle übergeben. Bei Siemens-Countern ebenso.

Besser aber die IEC-Timer/-Counter als Multiinstanzaufruf verwenden.
 
Ich verwende nur AR1. Kann ich das so ohne weiteres tun, oder muss ich da auch etwas beachten? (Sichern, Versatz..)
Das AR1 selber muß vor Verwendung nicht gesichert werden.

Wenn das AR1 in die Instanz zeigen soll, dann muß der Multiinstanz-Versatz aus dem AR2 addiert werden.
Zeigt das AR1 in TEMP oder auf globalen Speicher, dann muß nichts addiert werden.
Code:
//*** FB Multiinstanz ***
//Pointer auf IN-Parameter Input_1 erstellen
      L     P##Input_1                  // relative Adresse #Input_1 in dieser Instanz (Kennung DI)
      TAR2                              // Offset dieser Multiinstanz (Kennung DB)
      UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
      +D
      LAR1                              // AR1: absolute Adresse #Input_1 im IDB (Kennung DI)

//funktioniert auch so 'rum
      TAR2                              // Offset dieser Multiinstanz (Kennung DB)
      UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
      L     P##Input_1                  // relative Adresse #Input_1 in dieser Instanz (Kennung DI)
      +D
      LAR1                              // AR1: absolute Adresse #Input_1 im IDB (Kennung DI)

Harald
 
Zurück
Oben