TIA IF Anweisung mit BOOL Variable aus DB - ERROR

CaptainB

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

erstmal super Forum hier, welches mir bei vielen Problemen schon geholfen hat. Nun aber komme ich leider nicht mehr alleine weiter, daher
mein erster Beitrag in einem Forum überhaupt.

Erst einmal das System:

S7-300 CPU 321
DI16/DO16 x 24V / 0,5A
DI16 x DC24V

Software : TIA V12 SP1 & PLC-SIM V12
Programmiersprache : SCL
Programmierart : symbolisch

Zum Problem: IF-Anweisung mit BOOL Variable aus DB - ERROR

In meinem FB11 (Vorschub) mit dazugehörigem DB2 (DB_Vorschub), der DB wurde aus dem FB erzeugt, habe ich folgenden Code zum Testen geschrieben:

IF "DB_Vorschub".Test_1 THEN
#Test_1 := FALSE;
END_IF;

RETURN;

TIA sagt mir, dass >>"DB-Vorschub"<< eine ungültige Adresse ist. Wenn ich AWL benutze Funktioniert aber die symbolische Adressierung.
Alternativ habe ich auch #Test_1 probiert, in diesem Fall kommt aber beim Aufruf der Funktion ein Bereichslängenfehler. Rufe ich andere Variablen symbolisch auf, welche in anderen DB's liegen, funktioniert es. Die Bausteinschnittstellen sind ich auch alle aktualisiert.
Die TIA Hilfe zum Bereichslängenfehler konnte mir auch nicht weiterhelfen.
Der Bereichslängenfehler kommt sowohl auf der CPU, sowie in der Simulation mit PLC-SIM.

Für alle Tips schon einmal ein "Dankeschöne" im Voraus.

Schöne Grüße
 
Zuletzt bearbeitet:
Hi,

ich würde es mal mit einem Vergleich versuchen, vielleicht so:

Code:
IF "DB_Vorschub".Test_1=1 THEN
 #Test_1 := FALSE;
 END_IF;

 RETURN;

sonst weiß doch die IF-Verzweigung gar nicht was sie tun soll.

Tschö dentech
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo dentech,

habe es gerade probiert. Verhalten ist das gleiche:

"DB_Vorschub".Test_1 : ungültige Adresse
#Test_1 : Bereichslängenfehler beim Aufruf

Schöne Grüße
 
Hmmm...komisch. Vielleicht stimmt etwas mit meinem DB nicht. Auffallend ist, dass die Variable immer TRUE ist, obwohl ich alle
Merker der DB's im Programm mit dem OB100 zurücksetze. Alle anderen sind schließlich Null, also kann es an der Init nicht liegen.

Hab den DB mal gelöscht und neu erstellt, hat auch nichts geholfen.

Noch zu Info:

Der FB wird bedingt mit "CC" mit AWL-Code aufgerufen (also ohne direkte Zuweisung eines DB's)
 
Zuletzt bearbeitet:
Merker der DB's ????

Nutz doch das Intellisense...dingens.

einfach nach der if-Anweisung ein "d" tippen, dann musste ja eine Auswahl des DB's kommen...dann einen Punkt und die nächste Auswahl kommt...usw
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat aber auch nicht funktioniert.

Hab das Projekt mal neu erstellt und nur den FB und den dazugehörigen DB reinprogrammiert, sodass alles sauber ist.
Alles übersetzt und wieder das selbe Problem. Also am DB kann es wohl auch nicht liegen.......
 
Zuletzt bearbeitet:
Code:
IF #Test_1 = true THEN
    #Test_1 := false;
END_IF;

Hatte überlesen, dass du dich in der Instanz bewegst. Dann greifst du ja immer auf die internen Daten zu und deshalb ist der Zugriff immer ohne DB-Namen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, kannst du mir das mit der Instanz genauer erklären, steht gerade auf dem Schlauch.

Dachte, "#" Währe die Kurzform für den Instanz-DB des jeweiligen FB's.


Hab es gerade mit einem unbedingtem Aufruf des FB mit dazugehörigem DB probiert, dann geht es. Also Aufrufcode:

CALL FB, DB

Vorher hatte ich:

A Merker
CC FB
 
der DB von deinem "Call FB, DB" nennt sich Instanz-DB. Dieser DB ist diesem einen Aufruf des FB zugeordnet und beinhaltet alle IN und OUT sowie die STAT Variablen.
wenn du innerhalb deines FBs auf Inhalte des Instanz-DBs zugreifst, macht es ja keinen Sinn hier einen vollen Zugrif mit DB-Namen zu schreiben. Dieser DB ist ja bei einem weiteren Aufruf des FBs ein ganz anderer.
Der "#" bedeutet nichts anderes, als das dies eine Variable aus dem Deklarationsbereich des FB oder FC ist.
 
ich würde es mal mit einem Vergleich versuchen, ...
Bei boolschen Variablen braucht man nicht zwingend einen Vergleich, da die Variable selbst als Ergebnis schon TRUE oder FALSE liefert.

Die kurze Form:
Code:
IF "DB_Vorschub".Test_1 THEN
...
übersetzt:
Code:
Wenn (Wahr/Falsch) dann ...
hat das gleiche Ergebnis wie die lange:
Code:
IF "DB_Vorschub".Test_1 = true THEN
...
.
Übersetzt:
Code:
Wenn Vergleich( (Wahr/Falsch) = Wahr) dann ...

;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also für mich nochmal zum Mitmeißeln:

Wenn ich einen FB mit DB aufrufe, speichert der FB seine Daten im DB. Da dieser instanziert ist, muss ich "#" benutzen, da alle Variablen im Deklarationsbereich
vom DB abgedeckt sind.
Wenn ich nur einen FB ohne DB aufrufe, dann muss ich "DB"."Variable verwenden, es sei denn, ich habe beim Aufruf die Variablen expliziet vergeben, z.B. IN_1 := Merker_1. In diesem Fall kann ich dann wieder "#" benutzen.
Habe ich aber verschiedene FB's aufgerufen, ohne DB, von welchen ich Variablen aus verschiedenen DB's ansprechen will, muss ich z.B. "DB3".Merker_7.

Stimmt das soweit?

Schöne Grüße
 
Zuletzt bearbeitet:
korrekt, wollte das schon gestern schreiben...
Bei boolschen Variablen braucht man nicht zwingend einen Vergleich, da die Variable selbst als Ergebnis schon TRUE oder FALSE liefert.


Jo, das klingt doch schon mal gut... auch wenn du einen Sachverhalt doppelt beschrieben hast.

Eine Sache noch... (ich weiß nicht, ob das schon erwähnt wurde):

Du kannst aus jedem Instanzdatenbaustein (über "DB3".bool_1) die Werte lesen/abfragen aber nicht beschreiben. Das erlaubt TIA nicht für optimierte Bausteine. Beschreiben kannst du die Variablen nur innerhalb des Aufrufs des FBs (mit Instanz).
Ein Aufruf eines FB ohne DB geht am Ziel vorbei, finde ich.
 
Zurück
Oben