TIA S7 Graph: Zuweisungen und Rechnungen

Seb1270

New member
Beiträge
2
Punkte Reaktionen
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,
ich mache zurzeit eine Ausbildung und habe einen Frage zum Programmieren mit S8 Graph, die mir im Betrieb leider keiner beantworten kann, also hoffe ich hier auf Hilfe.
Dabei verwende ich:
Tia Portal V15.1
SPS: S7-1500

Mein Problem ist dabei folgendes: Ich habe eine Bedinung Q5 ist nicht B11. Das würde ich gerne in S7 Graph in einem Schritt umsetzen. Die Wege über Interlock und co sind mir bekannt, aber mir geht es hier um's Prinzip dieses Ansatz und warum der geht, bzw nicht geht:
ich weiß, dass ich in dem Schritt ja der boolschen Variabel Q5 z.B. B11 zuweisen kann mit "Q5" := "B11" mit dem verneinten B11 müsste das doch dann etwas in die RIchtung "Q5" := 1- "B11" sein. Das frisst Tia Portal aber nicht, so weit so gut. Da Stellt sich mir dann die Frage, ob es da eine ähnliche Lösung für gibt? Ich konnte da leider nichts finden.
Ich habe auch versucht zwei Bool Variabeln mit verschiedenen Operatoren miteinander zu verknüpfen, akzeptiert Tia aber alles nicht. Leider auch ohne konkrete Fehlermeldung. Ich habe auch versucht eine Boolkonstante zu setzen und davon dann B11 abzuziehen, geht auch nicht.
Danach habe ich die Verknüpfungen mit Integern probiert. Das geht.
Also bleibt bei mir die Frage, gibt es eine Lösung Q5 ist gleich nicht B11 einfach so in eine Aktion/Schritt zu schreiben?
Über Hilfe wäre ich dankbar!



Hier ein Screenshot von TIA

Gruß
Seb
 
Mein Problem ist dabei folgendes: Ich habe eine Bedingung Q5 ist nicht B11.
Bedingung heisst, dass Du einen Vergleich vornimmst, z.B. zwischen zwei ZahlenWerten.
Ist die Bedingung erfüllt, Z.B. 2 = 2 oder 2 <> 3 oder 2 < 3 oder 2 <= 2 oder 4 > 3 oder 4 >= 3, so ist das Ergebnis des Vergleichs vom DatenTyp BOOL und hat den Wert TRUE.
Ist die Bedingung nicht erfüllt, Z.B. ist nicht 2 = 3 oder ist nicht 2 <> 2 oder ist nicht 3 < 2 oder ist nicht 3 <= 2 oder ist nicht 3 > 4 oder ist nicht 3 >= 4, so ist das Ergebnis des Vergleichs vom DatenTyp BOOL und hat den Wert FALSE.
Die 6 aus den Zeichen '=', '<' und '>' bestehenden bzw. zusammengesetzten Operatoren nennt man VergleichsOperatoren und die Ergebnisse von VergleichsOperationen haben immer den DatenTyp BOOL.
Man kann sie ...
- miteinander weiter verknüpfen mit den logischen Operatoren NOT (NICHT, alias Negation alias Inversion), AND (UND), OR (ODER) oder XOR (exklusives ODER),
- einer Variablen vom DatenTyp BOOL zuweisen, wobei zuweisen heisst, man kann sie in eine Variable vom DatenTyp BOOL kopieren alias abspeichern. Der Zuweisungs-Operator sieht so aus ':='. Z.B. in
Alarm := MomentanWert > groessterZulaessigerWert ;
- abfragen mit IF, ELSIF, WHILE, REPEAT und u.U. mit CASE.

Vergleiche wie 'boolWert = TRUE' oder 'boolWert = FALSE' sind absolut überflüssig, da sie auf Umwegen(!) nichts anderes bedeuten, als
'boolWert' (statt 'boolWert = TRUE') bzw. 'NOT boolWert' (statt 'boolWert = FALSE').

ich weiß, dass ich in dem Schritt ja der boolschen Variabel Q5 z.B. B11 zuweisen kann mit "Q5" := "B11" mit dem verneinten B11 müsste das doch dann etwas in die RIchtung "Q5" := 1- "B11" sein.
Q5 := NOT B11 ;
Zuweisen kann man. Arithmetische Operatoren wie '-' kann bzw. sollte man nicht.
Das frisst Tia Portal aber nicht, ...
Wenn die DatenTypen nicht zu den Operatoren passen, kann es sein ...
- dass TIA meckert oder
- dass TIA automatisch eine DatenTypKonvertierung einfügt und nicht meckert.
Das automatische Einfügen von DatenTypKonvertierungen ist zwar manchmal "angenehm", aber immer gefährlich, weil TIA dann Deinen Code vielleicht anders "repariert", als Du es vielleicht beabsichtigt, auf jeden Fall aber versäumt hast, zu programmieren. Diese "Fähigkeit" von TIA also tunlichst abwählen!
Sich merken zu müssen, in welchen Fällen TIA was wie reparieren würde (kann man nachlesen), ist viel komplizierter und "unangenehmer", als sich anzugewöhnen, beabsichtigte DatenTypKonvertierungen "explizit" ins Programm zu schreiben.

Ich habe auch versucht zwei Bool Variabeln mit verschiedenen Operatoren miteinander zu verknüpfen, akzeptiert Tia aber alles nicht.
Welche Operatoren waren das? Zur Verknüpfung von BOOLeschen Variablen bzw. Konstanten (und auch der DatenTypen BYTTE, WORD, DWORD, LWORD) kommen folgende "logischen Verknüpfungen" in Frage:
- NOT (NICHT, invertieren, negieren),
- AND (UND-Verknüpfung),
- OR (ODER-Verknüpfung),
- XOR (Exklusiv-ODER-Verknüpfung) und ferner,
- (gilt allerdings nicht für BOOL) Schiebe- und Rotier-Befehle.
Vergleiche, also =, <>, <, <=, > und >=, liefern ein Ergebnis des DatenTyps BOOL.

Man kann zwei BOOLesche Werte miteinander vergleichen (habe die Ergebnisse direkt an Variablen mit entsprechenden Namen zugewiesen, damit ich mir die Erklärungen bzw. Kommentare sparen kann):
sindUngleich := ErsterBool XOR zweiterBool ;
bzw.
sindGleich := NOT ersterBool XOR zweiterBool ;
bzw.
sindGleich := ersterBool XOR NOT zweiterBool ;
bzw.
sindGleich := NOT(ersterBool XOR zweiterBool) ;

Anmerkung zu XOR:
Die XOR-Verknüpfung ist ausschliesslich für die Verknüpfung von genau zwei BOOLeschen Werten definiert.
Bei AND und OR dürfen gerne mehr als zwei BOOLesche Werte miteinander verknüpft werden, da das Ergebnis ...
- bei AND nur dann TRUE ist, wenn alle verknüpften BOOLeschen Werte TRUE sind und
- bei OR nur dann FALSE ist, wenn alle verknüpften BOOLeschen Werte FALSE sind.
Aber ...
- bei XOR ist das Ergebnis nur dann TRUE, wenn beide verknüpften BOOLeschen Werte unterschiedlich sind bzw.
- bei XOR ist das Ergebnis nur dann FALSE, wenn beide verknüpften BOOLeschen Werte gleich sind.
Die Formulierung "wenn ALLE verknüpften BOOLeschen Werte unterschiedlich sind" funktioniert bei XOR nämlich nur dann, wenn genau zwei BOOLesche Werte verknüpft werden. Warum? Ganz einfach: bei BOOL gibt's nur die zwei Werte TRUE und FALSE und es können nicht drei (oder mehr) verschiedene Werte auftreten, so dass alle drei (oder alle vier u.s.w.) unterschiedlich sein könnten.
Während man sich (AND- bzw.) OR-Verknüpfungen von mehr als zwei Werten vorstellen kann als zusammengesetzt aus mehreren (AND- bzw.) OR-Verknüpfungen von jeweils nur zwei Werten (weil es keinen Einfluss auf das Ergebnis hat),
MUSS man sich XOR-Verknüpfungen von mehr als zwei Werten vorstellen als zusammengesetzt aus mehreren XOR-Verknüpfungen von jeweils nur zwei Werten.
Wenn man dies bedenkt bzw. beachtet, kann man selbstverständlich mehrere XOR-Verknüpfungen aneinanderhängen (z.B. um die "Parität" zu ermitteln).
Verglichen mit AND oder OR hat XOR aber auch einen Vorteil: bei XOR es ist egal, ob man einen der beiden verknüpften Werte oder das Ergebnis der Verküpfung negiert (mit NOT).

Ich habe auch versucht eine Boolkonstante zu setzen und davon dann B11 abzuziehen, geht auch nicht.
Einer BOOL-Konstanten kann man nicht beliebig Werte zuweisen. Man kann sie auch nicht Setzen und nicht Rücksetzen.
Man kann sie definieren als TRUE oder FALSE und so, wie sie definiert wurden, bleiben sie dann auch. Denn sie sind - wie der Name schon sagt - konstant.
Man kann aber einer BOOLeschen Variablen einen Wert zuweisen (oder sie setzen oder sie rücksetzen in KOP, FUP oder AWL).

Anstelle von TRUE und FALSE kann man auch 1 und 0 schreiben, sollte man sich aber gar nicht erst angewöhnen (u.a. weil es hier Unterschiede zwischen verschiedenen ProgrammierSprachen gibt. Z.B. verstehen die Sprachen VB, VBA, VBS, ... alles als TRUE, was ungleich Null ist und man sollte wissen, dass TRUE intern die Darstellung -1 und nicht 1 hat).

"... davon dann B11 abzuziehen, geht nicht": abziehen alias subtrahihieren ist keine logische Verknüpfung, sondern eine arithmetische.

Danach habe ich die Verknüpfungen mit Integern probiert. Das geht.
Das beantwortet vermutlich meine Frage nach den Operatoren.
Du hast wahrschienlich nur arithmetische Operatoren durchprobiert (+, -, *, /, **, DIV, MOD, ...).
Diese sind nur für die "Verknüpfung" von numerischen Variablen und Konstanten miteinander zulässig, aber nicht für die Verknüpfung von logischen Variablen oder Konstanten miteinander.

Also bleibt bei mir die Frage, gibt es eine Lösung Q5 ist gleich nicht B11 einfach so in eine Aktion/Schritt zu schreiben?
Weiss ich nicht, so weit dies ein "Problem" von S7 Graph sein sollte. Sofern aber das Problem durch die Verwechslung von Bedingung, Vergleich, Zuweisung, logischer Verknüpfung, arithmetischer Verknüpfung oder von DatenTypen kommen sollte, konnte ich Dir hoffentlich ein wenig weiterhelfen.
 
Zurück
Oben