SCL: Datentypspezifikation nicht korrekt

lindnerlars

Level-1
Beiträge
39
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute, ich mal wieder :)

jetzt wollte ich auch noch einen Funktionsbaustein in dem Funktionsbaustein aufrufen (gestern wars bloß der SFB4 ;) ) und habe folgenden Code geschrieben:

Code:
FUNCTION_BLOCK FB2

BEGIN

  ;

END_FUNCTION_BLOCK


FUNCTION_BLOCK FB1

VAR
Test : FB2;
END_VAR

BEGIN

Test();

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

Beim Compilieren meckert der Compiler bei dieser Zeile:

Code:
Test : FB2;

mit "Datentyspezifikation nicht korrekt". Was mache ich falsch?

Ich wollte halt gern in dem FB1 (mit zugehörigem DB1) andere FB´s aufrufen, die dann auf den Multiinstanz-DB1 zugreifen können, um somit DB´s zu sparen.
Wenn ich in diesem Code als statische Variable einen SFB definiere, dann klappt die Compilierung! Komisch?

viele Grüße und vielen Dank schon mal, auch für dieses gute Forum :)

Lars
 
jetzt isses korrekt???!!!

das gibts doch nicht, mit folgendem Code funktionierts:

Code:
FUNCTION_BLOCK FB2

VAR    
Timer1 : SFB4;
END_VAR

BEGIN

Timer1(IN := E0.0,PT := DINT_TO_TIME("break0" * 1000));
A0.0 := Timer1.Q;

END_FUNCTION_BLOCK


FUNCTION_BLOCK FB1

VAR
Test : FB2;
END_VAR

BEGIN

Test();

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

Sprich, wenn ich im FB2 was programmiere und dort statische Variablen angebe (bzw. wenn ich ihn nicht leer lasse!), dann scheint der den zu erkennen und als Typ für meine statische Variable "Test" in FB1 zuzulassen.

Oh Mann, wenn das noch so weitergeht, dann falln mir noch meine Haare aus und das mit 27 Jahren... LOL

naja, wie dem auch sei, die besten Lösungen sinn ja die, auf die man selber kommt oder?

Gruß Lars :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn ich im FB2 was programmiere und dort statische Variablen angebe (bzw. wenn ich ihn nicht leer lasse!), dann scheint der den zu erkennen und als Typ für meine statische Variable "Test" in FB1 zuzulassen.

Hallo Lars,
ich denke nicht, dass er dann erst erkannt wird, sondern wahrscheinlich wird er dann erst erzeugt (generiert). Es ist möglich, dass in deinem ersten Posting der FB2 überhaupt nicht erzeugt wurde ...

Gruß
LL
 
SCL: Zugriff auf statische Variablen in einem anderen FB

Ok, jetzt kommt die nächste Sache...
(sorry, aber das Thema Statische Variablen und Multiinstanz-DB is für mich neu und klingt alles nach Bahnhof :confused: )

Ich habe FB2 und FB3, die ich beide als Instanzen in FB1 aufrufe und deshalb beide den Multiinstanz-DB1 benutzen. In FB3 starte ich einen Timer (SFB4), den ich in FB2 abfragen will. Dazu folgender Code:

Code:
FUNCTION_BLOCK FB3

VAR 
Timer1 : SFB4;
END_VAR

BEGIN

Timer1(IN := E0.0,PT := DINT_TO_TIME("break0" * 1000));

END_FUNCTION_BLOCK


FUNCTION_BLOCK FB2

BEGIN

A0.0 := FB3.Timer1.Q;

END_FUNCTION_BLOCK

Das klappt aber nicht bei der Compilierung, da die Instanzdaten von FB3 nicht im FB2 bekannt sind! Muss ich dann den Timer wieder zurück geben an FB1 und diesen an FB2 übergeben?
Oder wie kann ich in FB2 auf den Timer von FB3 zugreifen?

viele Grüße vom Newbie
Lars :)
 
Ok, und wie kann ich nun im FB2 auf den Timer im FB3 zugreifen? Geht das überhaupt?

Nur wenn du ihn über die Schnittstellen der beiden Bausteine laufen läßt.
Aber jetzt mal "Spaß beiseite" ... Was ist der Sinn der Übung ? Du hast geschrieben, dass du dich mit Multi-Instanzen beschäftigen willst - OK. Dein aktuelles Beispiel hat aber mit der Sache nichts zu tun, denn der Trick der Instanzen ist ja, dass sie ihre eigenen Variablen haben ohne dabei die Variablen des Anderen zu beeinflussen.

Gruß
LL
 
Sinn der Übung

grob gesagt gehts um mein Diplom und die dazugehörige Steuerung, die ich entwerfen soll:

1. Ich rufe immer 3 FB´s von einem Über-FB (FB1) auf, diese sollen nicht noch eigene DB´s haben, um nicht "Datenmüll" zu produzieren, da ich auch alles in den Multiinstanz-DB von FB1 schreiben kann. Deshalb erstelle ich einen FB1 mit seinem DB1 und nutze diesen als Multiinstanz-DB zum Aufruf der Unter-FB.

2. Starte ich einen Timer in einem Unter-FB (FB3), dessen Status ich aber in einem anderen Unter-FB (FB2) abfragen will...

Nicht mehr und nicht weniger :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
grob gesagt gehts um mein Diplom und die dazugehörige Steuerung, die ich entwerfen soll

Ohne dich kritisieren zu wollen ...
Dann mach dir den Sinn von Instanzen zunächst klar ... Wie ich schon sagte :
denn der Trick der Instanzen ist ja, dass sie ihre eigenen Variablen haben ohne dabei die Variablen des Anderen zu beeinflussen.
du findest sicherlich einen Weg, das zu realisieren ... entspricht aber sicher NICHT dem Sinn von Instanzen ...
Und ich denke mal ... wenn es deine Diplom-Arbeit werden soll ...
 
denn der Trick der Instanzen ist ja, dass sie ihre eigenen Variablen haben ohne dabei die Variablen des Anderen zu beeinflussen.

Soll das heißen, dass es keinen Sinn macht, einen IEC-Timer (SFB4) in einem FB aufzurufen und den Status in einem anderen FB abzufragen? Bzw. dies nicht die allgemeine Vorgehensweise ist und der Timer immer dort abgefragt werden soll, wo er auch behandelt wird???

PS: Das ganze Zeugs mit den Instanzen ist erst dadurch gekommen, dass ich statt S_ODT nun den SFB4 nehmen wollte und der brauch ja gezwungenermaßen einen DB. Ich aber nicht unnötig viele DB´s erzeugen wollte....
 
... das mit dem SFB4 ist schon OK. Ich binde den auch immer gern in meine Instanz(en) mit ein um den FB autark halten zu können. Was ich sagen wollte ist etwas anderes :
Wenn du den Zustand vom SFB-Timer des FB2 im FB3 brauchst, dann hast du beim Anlegen deiner Struktur einen Denkfehler, denn dann gehört m.E. dieser Teil des FB3 auch noch mit zum FB2 ... Aber wie gesagt ... du kannst das ja in jedem Fall über die Schnittstellen der FB's machen und den Zustand so durchreichen.

Es wäre vielleicht sinnvoll, wenn du etwas mehr über deine Arbeit schreiben würdest - dann könnte man auch gezielter etwas dazu sagen und vielleicht dann auch konstruktiv kritisieren - destruktiv ist eigentlich nicht so meine Masche ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
PS: Das ganze Zeugs mit den Instanzen ist erst dadurch gekommen, dass ich statt S_ODT nun den SFB4 nehmen wollte und der brauch ja gezwungenermaßen einen DB. Ich aber nicht unnötig viele DB´s erzeugen wollte....

Das "Konzept" der Instanz DBs von Siemens ist eben noch aus einer Zeit wo man vieles in wenigen (dafür großen) Bausteinen erledigt hat. Ich bin mal gespannt was der ominöse Sepp7-Nachfolger in diesem Punkt neues bringt.
 
SCL: Zugriff auf statische Variablen in einem anderen FB

He Leute,

ich habe das jetzt folgendermaßen gelöst:

Code:
FUNCTION_BLOCK FB3

VAR 
Timer1 : SFB4;
Timer2 : SFB4;
END_VAR

BEGIN

Timer1(IN := E0.0,PT := DINT_TO_TIME(3000));
Timer2(IN := E0.1,PT := DINT_TO_TIME(3000));

END_FUNCTION_BLOCK


FUNCTION_BLOCK FB2

BEGIN

A0.0 := DB3.Timer1.Q;
A0.1 := DB3.Timer2.Q;

END_FUNCTION_BLOCK


FUNCTION_BLOCK FB1

BEGIN

FB2.DB2();
FB3.DB3();

END_FUNCTION_BLOCK

Im FB1 rufe ich FB2 und FB3 NICHT als lokale Instanzen, sondern ganz normal mit ihren eigenen DB´s auf! Dann starte ich meine Timer im FB3 als lokale Instanzen, die dann den DB3 mit benutzen und greife im FB2 auf diesen DB3 zu :)

Vorher wollte ich im FB2 auf den DB1 zugreifen, da dort implizit auch die Daten von den Timern standen, doch da meinte der Compiler, dass keine rekursiven Aufrufe erlaubt wären???

Guddi, wie dem auch sei, das ist die Lösung, die mich sehr zufrieden stellt, da ich jetzt nur 3 zusätzliche DB´s "verschwende"...

in diesem Sinne viele Grüße von mir

Lars
 
Hallo Lars,
da sage ich jetzt mal nichts dazu ...

Stop ...!

Eine Frage habe ich noch ...
Was hat Absolute Adressierung mit Multi-Instanzen zu tun ? Hattest du eingangs noicht etwas von Diplom-Arbeit geschrieben ...?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was denn???

das is meine Lösung und sie erfüllt meine Anforderungen! Punkt

Ja und die absolute Adressierung is natürlich nicht, ich arbeite natürlich auch immer mit Symbolen bzw. jetzt mit Daten im Datenbaustein...Soll ja nur das Prinzip verdeutlichen!

Mensch, nu machts doch nem Diplomanten net unnötig schwer ;)
 
Mensch, nu machts doch nem Diplomanten net unnötig schwer ;)

Eigentlich hatte ich vor, dir zu helfen ... Leider bin ich von dem Ergebnis "etwas" enttäuscht. Diese Lösung würde ich nicht mal meinen Mitarbeitern durchgehen lassen - geschweige denn als Prof an einer Uni (oder Hochschule etc.) ...

Gruß
LL
 
Zurück
Oben