TIA F-FUP: Genau 1 Bool TRUE

gilzt

Level-2
Beiträge
15
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag zusammen

Ich habe folgendes Problem, welches ich im TIA Portal V16 im Safetyprogramm mit der Programmiersprache F-FUP lösen muss.

Ich habe mehrere (z.B. 5) sichere Bool-Variablen bei welchen ich prüfen muss, dass genau 1 davon TRUE ist. Sprich ich brauche eine Logische Schaltung, welche mir TRUE ausgibt, wenn genau 1 (und nur 1) dieser Bool-Variablen TRUE ist.
Nun kann ich natürlich die ganze Logik und alle Fälle mit AND und OR ausprogrammieren. Aber das muss doch irgendwie schlanker gehen.

XOR ist leider keine Lösung, da sich dieses bei mehr als 2 Eingängen nicht so verhält wie ich es benötige. Ich habe zwar hier im Forum Lösungen gefunden, welche ein ähnliches Problem behandeln (1 Bit in einem Word oder Array). Hier sind aber die Lösungen dann alle in AWL oder SCL.
z.B. hier https://www.sps-forum.de/threads/genau-ein-bit-true.103321/
Und im F-FUP ist man leider ziemlich beschränkt mit den Funktionen und ich wüsste zumindest nicht, wie ich diese adaptieren könnte.

Kennt jemand eine Lösung wie das vereinfacht in F-FUP umgesetzt werden kann?

Wenn ich das jetzt nur einmal so lösen müsste wäre es mir noch egal. Aber wir werden das dann in jedem Projekt mehrmals und mit variabler Anzahl an Signalen umsetzen müssen.

Vielen Dank schon jetzt für allfällige Ratschläge oder Lösungsansätze.
 
denke nicht dass das schlanker geht. Möglicherweise einwenig objektorientiert...
Allerdings wirst du um eine starre Verschaltung der möglichen Bitmuster nicht herumkommen.
Hinter einem F-Programm steht ja auch der Hintergedanke, dass das Programm von Jemanden kontrolliert werden kann, der nicht unbedingt ein Programmierer sein muss.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bei XOR besteht ja das Problem, dass bei zB 3 true Eingängen das Ergebnis auch true ist.
Das einfachste wäre ein XOR verknüpft mit einer &-Abfrage, dass nicht alle true sind.

Was das was mein Vorredner anspricht angeht würde ich eher behaupten, dass es beim F-Programm nicht darum geht, dass ein Nicht-Programmierer das Ding kontrolliert (was fatal wäre) sondern dass der Programmierer wenig Möglichkeiten hat Fehler zu machen und einfach programmieren sollte. Finde ich eigentlich gut so.
 
Das einfachste wäre ein XOR verknüpft mit einer &-Abfrage, dass nicht alle true sind.
Ganz so einfach ist das aber nicht.

In F-FUP würde ich bei 5 Eingängen die 5 je 5-UND-Verknüpfungen + ODER einfach voll ausprogrammieren und gut und übersichtlich ist's.
Die false-Verknüpfungen kann man sicher noch etwas zusammenfassen, da leidet dann aber die Übersichtlichkeit drunter.

Harald
 
Kann die F-CPU addieren und Vergleichen?

Falls ja würde ich im ersten Netzwerk eine Variable auf 0 setzen. In den folgenden für jedes Bit eine Abfrage, Wenn Bit x gesetzt zu der Variable 1 addieren. Am Ende kannst du die Variable auf gleich 1 abfragen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wort-Verknüpfungen kann das Safety-Programm ja. Dann müsste dieser Ansatz sehr wohl funktionieren:
Die Bits in ein Wort kopieren, dann UND-Verknüpfen mit einer um EINS kleineren Zahl und das Ergebnis auf 0 prüfen.


Ab zwei Bits wird der Merker gesetzt.
 

Anhänge

  • Nur_einer.png
    Nur_einer.png
    27,1 KB · Aufrufe: 83
Ab zwei Bits wird der Merker gesetzt.
Das heißt, der Code ermittelt nicht, ob genau ein Bit gesetzt ist, sondern ob mehr als ein Bit gesetzt ist. Die Negation davon ist nicht "genau ein Bit gesetzt" sondern "höchstens ein Bit gesetzt". Für "genau ein Bit gesetzt" müsste man noch den Spezialfall "kein Bit gesetzt" abfangen.

Der TE wollte :
ich brauche eine Logische Schaltung, welche mir TRUE ausgibt, wenn genau 1 (und nur 1) dieser Bool-Variablen TRUE ist.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In F-FUP würde ich bei 5 Eingängen die 5 je 5-UND-Verknüpfungen + ODER einfach voll ausprogrammieren und gut und übersichtlich ist's.
Das würde so aussehen (und das überblickt jeder Programmierer ziemlich schnell):
1.GIF
Die false-Verknüpfungen kann man sicher noch etwas zusammenfassen, da leidet dann aber die Übersichtlichkeit drunter.
z.B. so (da braucht man schon länger um die Korrektheit zu überprüfen (für Optimierung ist FUP schlecht geeignet)):
2.GIF
Dasselbe in der KOP-Ansicht kann man schneller nachvollziehen:
3.GIF

Harald
 
Wenn ich das öfter benötigen würde, wäre mein Weg einen Baustein mit einer vermutlich Max Anzahl zu Schreiben z.B. 10 Signale.
Den kann ich dann jedes mal aufrufen und beschalte nur die benötigten Signale und die anderen bleiben auf False. Ich denke das dürfte im F-Programm auch möglich sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich würde das genauso wie von PN/DP in NW5 dargestellt, machen. Eventuell auf ein paar mehr Signale erweitern (siehe Spassbass).
So ist es auch für einen Nicht-Programmierer lesbar

Kann die F-CPU addieren und Vergleichen?

Falls ja würde ich im ersten Netzwerk eine Variable auf 0 setzen. In den folgenden für jedes Bit eine Abfrage, Wenn Bit x gesetzt zu der Variable 1 addieren. Am Ende kannst du die Variable auf gleich 1 abfragen.
der EN-Eingang kann bei F nicht verwendet werden
 
Wofür braucht man das im Safety überhaupt? Mir fällt da grad nichts ein und hab sowas jetzt seit 20 Jahren nicht benötigt.
 
Ich programmiere das auch aus, wie PN/DP, man sieht sofort was los ist, bei einer Zählvariante ist das nicht so.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wofür braucht man das im Safety überhaupt? Mir fällt da grad nichts ein und hab sowas jetzt seit 20 Jahren nicht benötigt.
Vielleicht für eine Positions-Überwachung von einen Aggregat.
Ist mehr als ein Sensor geschaltet ist etwas nicht in Ordnung.
Denkbar ist alles …
 
Man könnte es auch noch so machen:
5 Fach XOR Safety.jpg

Ich finde aber Haralds ersten Vorschlag in #9 am besten geeignet fürs Sicherheitsprogramm, denn da ist Übersichtlichkeit und Einfachheit das Wichtigste.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wofür braucht man das im Safety überhaupt? Mir fällt da grad nichts ein und hab sowas jetzt seit 20 Jahren nicht benötigt.
Unser Kunde will z.Bsp. dass nur eine Tür/Gruppe an der Maschine geöffnet werden kann, wenn man mit "Totmanschalter" arbeitet, um Einstellungen vorzunehmen. Wird eine zweite Tür geöffnet --> Alles Aus, bzw. die Zuhaltung gibt andere Gruppen gar nicht erst frei. Genau da habe ich ähnliche Konstrukte in Anwendung.
 
Hallo zusammen

Besten Dank für eure schnellen Lösungsvorschläge.
Die Lösung fände ich auch elegant. Da jedoch das Verschalten von EN in Safety nicht möglich/erlaubt ist. Geht das leider nicht.

Die andern Lösungsvorschläge würden sicherlich auch funktionieren. Jedoch sehen diese dann wie mehrfach schon erwähnt nicht übersichtlicher aus. Daher scheint wohl wirklich der Weg die übersichtlichste Lösung zu sein. Ich hatte gehofft, dass es evtl. mit XOR noch eine schlanke und verständliche Lösung gibt, welche mir nicht eingefallen ist. Aber das scheint wohl wirklich nicht der Fall zu sein.
Ich werde mir noch überlegen einen FB dazu anzulegen oder ob wir es immer frei programmieren. Mir ging es vor allem darum, dass die Logik dann immer genau gleich umgesetzt wird.
Das würde so aussehen (und das überblickt jeder Programmierer ziemlich schnell):
Anhang anzeigen 57074

Die Funktion benötige ich für fast genau ein gleiches Problem mit Zutrittstüren.
Unser Kunde will z.Bsp. dass nur eine Tür/Gruppe an der Maschine geöffnet werden kann, wenn man mit "Totmanschalter" arbeitet, um Einstellungen vorzunehmen. Wird eine zweite Tür geöffnet --> Alles Aus, bzw. die Zuhaltung gibt andere Gruppen gar nicht erst frei. Genau da habe ich ähnliche Konstrukte in Anwendung.

Ich danke euch nochmals bestens für eure Zeit und Lösungsvorschläge
 
Zurück
Oben