SCL: Ungültig strukturierter Datenbausteinzugriff

lindnerlars

Level-1
Beiträge
39
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

In meinem SCL-Code definiere ich FB1, der vom OB1 aufgerufen wird und wiederum FB2 aufruft. In den statischen Variablen von FB1 habe ich (jetzt nur zum Test) zwei Bool-Variablen definiert, die dann ja im DB1 liegen, da der DB1 der Instanz-Datenbaustein von FB1 ist. Im FB2 möchte ich auf die Daten im DB1 zugreifen. Folgender Code:

Code:
FUNCTION_BLOCK FB2

IF (DB1.Test1) THEN
    DB1.Test2 := TRUE;
END_IF;

END_FUNCTION_BLOCK


FUNCTION_BLOCK FB1

VAR
    Test1 : BOOL := 0;
    Test2 : BOOL := 0;
END_VAR

FB2.DB2();

END_FUNCTION_BLOCK


ORGANIZATION_BLOCK OB1

VAR_TEMP
  // reserviert
  info : ARRAY[0..19] OF BYTE;
  // temporäre Variablen

END_VAR

BEGIN

FB1.DB1();

END_ORGANIZATION_BLOCK

Das Problem ist nun, dass, wenn ich vorher NICHT alle Bausteine manuell unter Bausteine im SIMATIC Manager angelegt habe, der Compiler obige Fehlermeldung ausgibt, da er beim ersten Zugriff auf den DB1 diesen noch nicht kennt. Folgende Zwickmühle:

1. Im SCL-Handbuch steht, dass in einer SCL-Quelle alle aufgerufenen Bausteine VOR den aufrufenden Bausteinen stehen müssen!

2. Ebenfalls steht dort drin, dass ein Instanz-DB automatisch erzeugt wird, sobald der FB im Anwenderprogramm aufgerufen wird.

Ergo müsste der Compiler (bei nicht angelegten Bausteinen) im ersten Durchlauf den DB1 anlegen und im zweiten diesen dann kennen und ohne Probleme durchlaufen. MACHT ER ABER NICHT!!!

Selbst wenn ich die Bausteine manuell anlege, muss ich erst zweimal kompilieren, bis der Durchlauf ohne Fehler beendet wird. Was mache ich falsch?

vielen Dank Leute und viele Grüße

Lars
 
Zuviel Werbung?
-> Hier kostenlos registrieren
aua...

nix, so is der scl-compiler nun mal ...

EHRLICH JETZT? Na is ja super...da muss ich jetzt jedesmal mühselig alle FB´s und DB´s vorher anlegen, bevor ich den Compiler starte? Was isn das fürn Scheiss? :confused:

Ja und, was sprichtn dagegen, auf Instanzdaten bausteinübergreifend zuzugreifen? Wenns nicht vorgesehen sein sollte, müsste der Zugriff doch nicht erlaubt sein oder? Ansonsten müsste ich ja jetzt immer alle Daten den FB´s übergeben, die ich dort benötige, da isses doch viel einfacher, ich hol mir die direkt dorther, wo sie stehen?

Ok, du hast schon Recht, Stichpunkt Datenkapselung ist schon wichtig und da finde ich das bei objektorientierten Programmiersprachen schon gut gemacht, dass man die Daten, die nicht nach aussen sichtbar sein sollen, einfach durch "private" kapselt. Da ich meine Daten aber quasi "global" im FB1 und allen seinen Unter-FB´s benötige, lasse ich diese im DB1 stehen und hole sie mir dann immer, ich find dagegen spricht erst mal nix... :rolleyes:
 
EHRLICH JETZT? Na is ja super...da muss ich jetzt jedesmal mühselig alle FB´s und DB´s vorher anlegen, bevor ich den Compiler starte? Was isn das fürn Scheiss? :confused:

Ja und, was sprichtn dagegen, auf Instanzdaten bausteinübergreifend zuzugreifen? Wenns nicht vorgesehen sein sollte, müsste der Zugriff doch nicht erlaubt sein oder? Ansonsten müsste ich ja jetzt immer alle Daten den FB´s übergeben, die ich dort benötige, da isses doch viel einfacher, ich hol mir die direkt dorther, wo sie stehen?

Ok, du hast schon Recht, Stichpunkt Datenkapselung ist schon wichtig und da finde ich das bei objektorientierten Programmiersprachen schon gut gemacht, dass man die Daten, die nicht nach aussen sichtbar sein sollen, einfach durch "private" kapselt. Da ich meine Daten aber quasi "global" im FB1 und allen seinen Unter-FB´s benötige, lasse ich diese im DB1 stehen und hole sie mir dann immer, ich find dagegen spricht erst mal nix... :rolleyes:

Dagegen spricht, daß man sich irgendwann nicht mehr in deinem Programm zurechtfinden wird. Ein Teil der Daten ist als interne Variable aufgerufen, ein Teil als direkter Zugriff auf deinen Instanz-DB. Ich halte das auch für Mist. Dann leg dir doch besser einen DB an, in dem du alle benötigten Variablen definierst (quasi globale Variablen) und übergebe diesen DB dann deinen FB oder beiße in den sauren Apfel und übergebe die Variablen über die Schnittstelle der FB.

PS: Du kannst auch UDT und Struct übergeben, leider nur in der Schachtelungstiefe 1!

Wir hatten die Diskussion schon x Mal im Forum, aber jeder hat seinen eigenen Blickwinkel. Zumindest 4L denkt da schon mal so wie ich.
 
Zuletzt bearbeitet:
Zurück
Oben