Sicherheitsabfrage in SCL hat nicht funktioniert

DiGo1969

Level-2
Beiträge
138
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
beim Programmieren in Siemens S7 SCL hat meine Sicherheitsabfrage nicht funktioniert. Hat jemand eine Idee, weshalb diese Abfrage nicht gegriffen hat?

Teil meines Programms:
// Analogeingang einlesen
Analogeingang:= (WORD_TO_INT(Peripherieeingangswort));

// Berechnung
Analogausgang:= Analogeingang + Offset;

// Sicherheitsabfrage
IF Analogausgang < 0 THEN Analogausgang:= 0;
END_IF;
IF Analogausgang > 27000 THEN Analogausgang:= 27000;
END_IF;

// Analogausgang ausgeben
DB1.DW0:= INT_TO_WORD(Analogausgang);

Beim Auslesen des Offset habe ich einen Fehler in meinem Programm gehabt. Normalerweise wollte ich meine Offsetwerte aus dem Datenbaustein folgende Datenwörter holen: DW0; DW2, DW4,… Habe allerdings folgende Werte ausgelesen: DW0; DW1; DW2; DW3… Mir ist klar, das ich im DW1 und 3 nur Müll zu stehen habe, aber durch meine Sicherheitsabfrage sollte dies ja abgefangen werden. Passiert aber nicht???
Ich habe mir die Werte die ausgegeben werden angeschaut. Ich lese extrem große Werte (z.B. X hoch 43) aber auch negative Werte. Wie kann das sein?
 
X hoch 43 ist Real-Format, du gibst aber Word aus! Schau dir mal an, was da nun wirklich als Word ausgegeben wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Normalerweise wollte ich meine Offsetwerte aus dem Datenbaustein folgende Datenwörter holen: DW0; DW2, DW4,… Habe allerdings folgende Werte ausgelesen: DW0; DW1; DW2; DW3… Mir ist klar, das ich im DW1 und 3 nur Müll zu stehen habe, aber durch meine Sicherheitsabfrage sollte dies ja abgefangen werden. Passiert aber nicht???

Ob da immer sicher "Müll" drin steht will ich mal dahin gestellt sein lassen ...
Wenn du deinen Fehler aber doch kennst, warum beseitigst du ihn dann nicht ? Wie lädst du dir die Datenworte aus dem DB ? Ich würde hier schon zusehen, dass ich die DBW's korrekt einlese ...

Gruß
LL
 
zu den Datentypen nach: Analogeingang und –ausgang ist Word und der Rest ist INT (Offset und Sicherheitsabfrage).
Das in den Werten „Müll“ steht muss ja sein, denn ich lese aus dem höher- und niederwertigen Byte des jeweilig anderem Datenwort.
Was mich interessiert ist, warum die Sicherheitsabfrage nicht gegriffen hat? Kann es vielleicht sein, das die SPS bei der Berechnung prüft, ob die Werte zur Berechung in bestimmten Bereichen sein müssen? Sollte dies nicht sein, werden alle Werte ohne Berechnung durchgeschoben?????

MfG Dirk
 
Hallo Dirk,
mein Ansatz hier war :
Du weißt, dass deine "wirklichen" Daten in den DBW0 , 2 , 4 ... stehen.
Warum liest du dann auch die DBW 1 , 3 , 5 ... ein, wenn du doch weißt, dass diese sich aus der Überschneidung der Bytes von den Vorgänger / Nachfolger-DBW's bilden - also DBW 1 überschneidet sich mit DBW0 und DBW2.
Beim Einlesen des DBW1 mußt du hier nicht zwangsläufig einen unsinnigen Inhalt einlesen. Es ist immer davon abhängig, was du in DBW0 und DBW2 drin stehen hast. Das mußt du berücksichtigen.

Also wiederhole ich nochmals meine Frage :
Wie lädtst du dir die Datenworte aus dem DB ? Ich würde hier schon zusehen, dass ich die DBW's korrekt einlese ...
Vielleicht solltest du dein SCL-Script hier mal einstellen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gut es geht ihm ja nur darum warum seine Vergleicher nicht funktioniert haben.

Schreib nochmal genau auf welche Datentypen für welche Variable zugeordnet sind, irgendwie passt dein code so nicht.
 
Hallo Leute,
ja, genau – es geht nur darum, warum der Vergleicher nicht funktioniert hat...

Teil meines Programms:
// Analogeingang einlesen
Analogeingang:= (WORD_TO_INT(Peripherieeingangswort));

// Berechnung
Analogausgang:= Analogeingang + Offset;

// Sicherheitsabfrage
IF Analogausgang < 0 THEN Analogausgang:= 0;
END_IF;
IF Analogausgang > 27000 THEN Analogausgang:= 27000;
END_IF;

// Analogausgang ausgeben
DB1.DW0:= INT_TO_WORD(Analogausgang);



Peripherieeingangswort = WORD
Analogeingang = INT
Analogausgang = INT
Offset = INT
Den DB1.DW0 transferiere ich in einem anderem Baustein dann direkt in den Analogausgang (L DB1.DW0; T PAW 512)
 
OK ... und wie beschreibst du nun das DBW1 ?
oder liest du das PEW in Byte-Spüngen aus ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo LL,
ich beschreibe doch das DBW1 nicht. Wo ich mir das angeschaut habe, waren im PEW Werte um die 6500 und iIm DBW0, DBW2, DBW4 usw. stehen INT-Werte (um die 800 herum).
Vielleicht noch einmal zum Verständnis:
- Einlesen des PEW
- Einlesen des Offset (DBW0...)
- Berechnung: DB1.DBW0:= PEW(gewandelt in INT) + Offset
- Sicherheitsabfrage
- Ausgabe des DB1.DBW0
und hier habe ich im DB1.DBW0 Werte kleiner 0 und größer 27000. Welche nur aus dem Einlesen der falschen Werte (DBW1, DBW3, DBW5...) kommen können, denn nach Berichtigung meines Programmfehlers waren die ausgegebenen Werte innerhalb meises Sicherheitsfensters.

Ich habe noch in einer Excel-Tabelle versucht, das Problem zu verdeutlichen.

MfG Dirk
 

Anhänge

  • DBW.zip
    3,3 KB · Aufrufe: 6
Hallo Dirk,
der Aufbau eines Datenbausteins ist mir schon klar. Was du mit deiner Excel-Tabelle sehr schön veranschaulicht hast ist ja auch das, was ich schon eingangs geschrieben habe - der Wert, der im DBW1 steht (welches sich aus dem DBW0 und 2 zusammensetzt) muss nicht zwangsläufig eine nicht-legale Zahl ergeben.

Ich wiederhole also noch einmal meine Frage :
Wieso und wo liest du überhaupt das DBW1 etc. ein, wenn du doch genau weißt, das dessen Inhalt für dich nicht brauchbar ist und du auch weißt, dass das nächste DBW, dass auf DBW0 folgt das DBW2 ist ?

Vielleicht schreibst du ja dazu mal etwas ... (gerne auch vielleicht mit Quell-Code)
Ansonsten weiß ich nicht, wie ich dir weiterhelfen soll ...

Gruß
LL
 
Zurück
Oben