Step 7 Fehlermeldung in SCL

Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du Absolutadressierung verwendest, wird überhaupt nicht geprüft wie der Datentyp in dem Datenbaustein ist.
Es wird nichtmal geprüft ob der Datenbaustein überhaupt im Bausteinordner vorhanden ist.

Wenn du eine Überprüfung haben möchtest, musst du symbolisch programmieren.
 
Wenn du Absolutadressierung verwendest, wird überhaupt nicht geprüft wie der Datentyp in dem Datenbaustein ist.
Es wird nichtmal geprüft ob der Datenbaustein überhaupt im Bausteinordner vorhanden ist.

Wenn du eine Überprüfung haben möchtest, musst du symbolisch programmieren.

Ok, das wusste ich auch nicht.

Aber dennoch funktioniert die Positionierung des Linearmotors, wenn ich das so schreibe... ist dann ja auch seltsam, weil ja dann der DB überhaupt keinen DINT-Wert sondern einen DWORD-Wert erhält, oder?


Noch etwas:

Nach all dem Gesagten versuche ich das mal symbolisch zu machen...

Was mir jedoch auch noch nicht klar ist, wenn ich in der Symboltabelle z.B. eine Variable (Wert) anlege und in diese dann eine Zahl lade, dann sieht das in SCL zunächst so aus:

Wert := 10;

Nun kann ich die Variable Wert auch in Anführungszeichen setzen und dann sieht es so aus:

"Wert" := 10;

Ist da jetzt ein Unterschied?

PS: Was tät ich nur ohne euch...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du eine Überprüfung haben möchtest, musst du symbolisch programmieren.

Wenn den Projekt auf der Einstellung "Symbolisch - bei allen Zugriffen" steht, kann sogar der IDB neu erstellt werden ohne
das du die Verbindung zur Variable verlierst. Ob man es dann gutheißen sollte von aussen in einen IDB zu fassen ist, dann
eine andere Frage, die hier schon oft diskutiert wurde.

Ich würde das Thema Absolutzugriff, d.h. ohne Symbolik, an deiner Stelle beerdigen.
 
Ich würde das Thema Absolutzugriff, d.h. ohne Symbolik, an deiner Stelle beerdigen.

Ok, dann mache ich das mal...

Nun, wie fange ich so eine symbolische Programmierung an?

Ich habe ja im Bausteinordner einen DB17; dieser heißt in der Symboltabelle z.B. Controller_DB.


Da ich ja in diesen Datenbaustein Daten ein- und auslesen möchte, muss er wohl als IN-OUT-Parameter deklariert werden.

Also sagen wir mal:


VAR_IN_OUT

LinearDB.Position : DINT;

END_VAR


Im SCL-Baustein lade ich dann wie folgt:

LinearDB.Position := ( DINT# 198 );


Im OB1 lautet beim Aufruf die Übergabe:

LinearDB.Position := "Controller_DB".DBD22

1)
Kann das so funktionieren?

2)
Was mir jedoch auch noch nicht klar ist, wenn ich in der Symboltabelle z.B. eine Variable (Wert) anlege und in diese dann eine Zahl lade, dann sieht das in SCL zunächst so aus:

Wert := 10;

Nun kann ich die Variable Wert auch in Anführungszeichen setzen und dann sieht es so aus:

"Wert" := 10;

Ist da jetzt ein Unterschied?
 
Aber dennoch funktioniert die Positionierung des Linearmotors, wenn ich das so schreibe... ist dann ja auch seltsam, weil ja dann der DB überhaupt keinen DINT-Wert sondern einen DWORD-Wert erhält, oder?

Wie schon geschrieben: Mit DINT_TO_DWORD wird das Bitmuster 1:1 übernommen.

Der Wert DINT#198 hat das Bitmuster: 2#0000_0000_0000_0000_0000_0000_1100_0110
Nach DINT_TO_DWORD steht genau dieses Bitmuster auch das Ergebnis der Funktion, und bei dir in der Zielvariable.
Wenn du dieses Bitmuster später als DINT interpretierst, erhältst du darum wieder deine 198.

Anders verhalten sich andere Konvertierungsfunktionen wie INT_TO_DINT, oder DINT_TO_REAL, wo das Bitmuster entsprechend angepasst wird.

Was mir jedoch auch noch nicht klar ist, wenn ich in der Symboltabelle z.B. eine Variable (Wert) anlege und in diese dann eine Zahl lade, dann sieht das in SCL zunächst so aus:

Wert := 10;

Nun kann ich die Variable Wert auch in Anführungszeichen setzen und dann sieht es so aus:

"Wert" := 10;

Ist da jetzt ein Unterschied?

Wenn du die Variable ohne Anführungszeichen verwendest, wird dafür entweder eine lokale oder die globale Variable verwendet.
Ist die Variable Wert lokal und auch global in der Symboltabelle vorhanden, wird mit

Wert := 10;

immer auf die lokale Variable geschrieben. D.h. dann hat das lokale Symbol Vorrang.

Mit der Variable in Anführungszeichen:
"Wert" := 10;
wird immer auf das globale Symbol aus der Symboltabelle bezug genommen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So, habe das jetzt mal versucht symbolisch zu machen...


In meinem Bausteinordner gibt es besagten DB17; dieser heißt in der Symboltabelle Controller_DB.

In SCL habe ich deklariert:

VAR_IN_OUT
LinearDB_Position : DINT;
END_VAR

Das Laden (in SCL) sieht nun wie folgt aus:

LinearDB_Position := DINT#198 ;


Im OB1 lautet beim Aufruf die Übergabe:

LinearDB_Position := "Controller_DB".DBD22


Kann es jetzt leider nicht mehr testen; aber beim kurzen Drübersehen - kann das so klappen?


Vielen Dank!
 
Nein, an Adresse DBD22 sollte in dem DB dann ein entsprechendes Symbol stehen was du dann verwenden musst.
Code:
DATA_BLOCK Controller_DB
    STRUCT
        was_auch_immer : ARRAY[0..21] OF BYTE;
        Position : DINT;
    END_STRUCT
BEGIN
END_DATA_BLOCK

Dann machst du bei der Parameterübergabe:
Code:
LinearDB_Position := "Controller_DB".Position
 
... wobei ich dir empfehlen würde, diese Art der Programmierung zu vermeiden. Es ist machbar und funktioniert - gar keine Frage. Ich persönlich finde es aber Sch....e - sorry.
Wenn du "von außen" Werte in deine FB (oder FC's) hinein brauchst dann ist m.E. die Baustein-Schnittstelle (IN, OUT, INOUT) der richtigere Weg.
Aber du bist selbst der Herr (die Herrin) deiner Werke ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, an Adresse DBD22 sollte in dem DB dann ein entsprechendes Symbol stehen was du dann verwenden musst.

Dann machst du bei der Parameterübergabe:
Code:
LinearDB_Position := "Controller_DB".Position

Ja Thomas, danke. Das hatte ich jetzt falsch wiedergegeben. Sobald ich im OB1 (Parameterübergabe) DB17.DBD22 eingebe und ENTER drücke erscheint automatisch:

"Controller_DB".Position

Dann sollte das ja so stimmen, oder?

Und wenn ich es richtig verstanden haben, dann ist ein Vorteil dieser symb. Programmierung z.B. der, dass ich beim Laden von Zahlen keine Wandlung mehr vornehmen muss, da ich ja deklariert habe, dass es sich bei der Variablen "LinearDB_Position" um den Datentyp "DINT" handeln soll.

... wobei ich dir empfehlen würde, diese Art der Programmierung zu vermeiden. Es ist machbar und funktioniert - gar keine Frage. Ich persönlich finde es aber Sch....e - sorry.
Wenn du "von außen" Werte in deine FB (oder FC's) hinein brauchst dann ist m.E. die Baustein-Schnittstelle (IN, OUT, INOUT) der richtigere Weg.
Aber du bist selbst der Herr (die Herrin) deiner Werke ...

Gruß
Larry

Hi Larry,

hm - ich nehme jetzt mal an, dass du dich auf meine ersten Beiträge in diesem Post beziehst? Denn die letzteren handeln ja bereits davon, dass ich zu einer symbolischen Programmierung übergehen will - also auch mit den Baustein-Schnittstellen arbeiten möchte...

Natürlich ist jeder Herr/Herrin seiner Werke - aber ich bin sehr dankbar für eure super Unterstützung hier im Forum. Und sehr gerne nehme ich eure Ratschläge an und versuche sie (mehr oder weniger gut) in die Praxis umzusetzen. Denn genau das fehlt mir ja ganz massiv; Erfahrung und Praxis!

Lieben Dank euch!
 
Ja Thomas, danke. Das hatte ich jetzt falsch wiedergegeben. Sobald ich im OB1 (Parameterübergabe) DB17.DBD22 eingebe und ENTER drücke erscheint automatisch:

"Controller_DB".Position

Dann sollte das ja so stimmen, oder?
Tja, schön wärs.
Der SCL Editor in Step 7 ist nicht viel mehr als notepad.exe. Da passiert nichts automatisch, du musst immer alles so eingeben wie es sein muss. Und erst beim Übersetzen bekommst du eventuelle Fehler gemeldet.

Und wenn ich es richtig verstanden haben, dann ist ein Vorteil dieser symb. Programmierung z.B. der, dass ich beim Laden von Zahlen keine Wandlung mehr vornehmen muss, da ich ja deklariert habe, dass es sich bei der Variablen "LinearDB_Position" um den Datentyp "DINT" handeln soll.
Kann man so sehen, der Compiler überprüft für dich ob du bei den Datentypen keinen Fehler gemacht hast.
Des Weiteren kannst du so die Variable im Datenbaustein nach belieben verschieben, und musst danach nur den SCL Quellcode neu übersetzen damit auf die neue Adresse zugegriffen wird. Du musst keine Absolutadressen (Zahlen) anpassen.
 
Tja, schön wärs.
Der SCL Editor in Step 7 ist nicht viel mehr als notepad.exe. Da passiert nichts automatisch, du musst immer alles so eingeben wie es sein muss. Und erst beim Übersetzen bekommst du eventuelle Fehler gemeldet.

Ähm Thomas, verstehe ich da schon wieder was falsch?

Also

"Controller_DB".Position

ist der Instanz-DB im Bausteinordner. Und den setze ich doch im OB1 beim Aufruf des zugehörigen FB's hinter

LinearDB_Position

Und das hätte doch im OB1 nichts mit SCL zu tun...


LinearDB_Position ist die IN_OUT_Variable in SCL!
 
Probiers am besten erstmal live im Step7 aus.

Yep, mache ich...

Lieben Dank nochmals für deine super Hilfe! :s12:


Ach ist mir grad' noch eingefallen;

bei unten stehendem Ladebefehl handelt es sich ja auch um eine Absolutadresse:

L L#198
T DB17.DBD22

Bedeutet das (egal ob AWL oder SCL) dass ich auch hier das Doppelwort "nur" als DWord beschreibe?
 
Zuletzt bearbeitet:
Zurück
Oben