TIA Bitbearbeitung mit SCL und Case_Of

Raijin Tycho

Level-1
Beiträge
85
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,

folgende Ausgangssituation:

Ich habe eine Int-Variable und basierend auf dem Wert dieser Variable möchte ich bestimmte Ausgänge schalten, solange die Variable den entsprechenden Wert hat. Mich würde interessieren ob dies theoretisch mit einer Case_Of Anweisung möglich ist, ohne das ich andauernd die Ausgänge später zurücksetzen muss. Sprich der Ausgang durch die Case_Of Funktion geschaltet wird, solange Fall auch tatsächlich vorhanden ist.
 
Ja das wäre möglich, das rücksetzen musst du aber natürlich trozdem machen. Aber du kannst das natürlich etwas übersichtlicher gestallten. Denk dran das du auch einen ELSE zweig machst wenn deine Variable nicht im bekannten Bereich ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"Theoretisch" ;) ist das Schalten von Ausgängen in CASE möglich, doch es ist eine ziemlich verpönte Art, Ausgänge an verschiedenen Stellen im Programm zu schalten (Werte zuzuweisen), weil das später bei Problemen niemand beobachten und nur ganz schwer nachvollziehen kann. Auch das Schalten von Ausgängen in IF..THEN..ELSE-Konstrukten ist so eine Un-Art. Einige AG verbieten so eine Programmierung in ihren Lieferbedingungen.

Außerdem: willst Du in jedem Case bei jedem Ausgang immer wieder die kompletten Verriegelungsbedingungen der Ausgänge neu programmieren? Und meinst Du nicht auch, daß sich dabei viele Fehler einschleichen können? Schließlich müssen dann auch noch all die Cases nachgestellt und getestet werden, ob z.B. ein Antrieb wirklich immer notfalls am Endschalter anhält oder nicht nur in 14 von 15 Cases und im 15. Case wurde das vergessen oder ein Tippfehler stoppt den Antrieb bei einem ganz anderen Sensor? Oder ein Ausgang erhält in irgendeinem Case gar keine Zuweisung und dann kommt es darauf an, was vorher war, ob ein Ausgang womöglich "für immer" eingeschaltet oder ausgeschaltet bleibt. Oft endet solches bedingtes Zuweisen von Werten an Ausgänge in Angst-Rücksetz-Orgien des Programmierers, der seinem eigenen Programm nicht traut...

Um wieviele Fälle und wieviele Ausgänge geht es bei Dir? Ist das jetzt nur eine Idee zum Tipparbeit sparen oder gibt es eine absolute Notwendigkeit für das Zuweisen in CASEs?

Harald
 
Wenn es nach mir ginge, bräuchte ich diese Ausgänge noch nichtmal aber leider durfte ich das eigentliche Probelm nicht über Profinet lösen -_- (Kostengründe).

Am Ende des Tages werde ich auch nicht direkt Ausgänge damit schalten sondern würde nur Variablen setzen die ich weiter verarbeite, mit ging es an dieser Stelle eher darum einen möglichst einfachen Ansatz zu schildern.

Was ich am Ende des Tages vor habe, ist ein anderes Gerät eine Aufgabe ausführen zu lassen, basierend auf dem Zuständen der DIs an diesem Gerät. Die Ausgänge die über diese Case_OF Geschichte geschaltet werden würden, dienen dabei lediglich zur Übermittlung welcher Job ausgewählt wurde. Zum starten des Vorganges ist sowieso noch eine weitere Freigabe vorgesehen.

Zb.: Wenn DI_0 (Start) True ist und DI_3 (Job3) True ist, starte Job 3.

Insgesammt habe ich 10 Augänge die ich so schalten müsste.

Und ja, am Ende des Tages geht es mir darum das ganze möglichst kurz und übersichtlich zu halten.
 
Zuletzt bearbeitet:
Das hört sich ganz nett an, wie du es schreibst - trotzdem bin ich der Meinung (Glaskugel !!!), dass du das so nicht machen solltest. Auch wenn deine CASE zuerst Merker schaltet und die dann Ausgänge ändert sich im Grunde gar nichts an Haralds Aussage, die ich hier ausdrücklich unterschreibe !!!
Aber vielleicht beschreibst du deine Aufgabe mal etwas präziser - vielleicht kann man dann ja auch schöne Vorschläge machen ... ;)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In einem Lagersystem habe ich 10 Slots für Werkstücke. Ich habe eine Anlage welche diese Werkstücke nach festgelegtem Muster bearbeiten soll. Die Werkstücke werden über einen Roboter vom Lagersystem in die Anlage transportiert und danach zurück an den selben Platz im Lagersystem gelegt. Da nicht sicher gestellt werden kann, dass alle Slots des Lagersystems belegt sind, werden die Zustaende der Slots überwacht.
Damit der Roboter weiß welchen Slot er anfahren darf und welchen nicht, sind auf der Robotersteuerung 11 Eingänge für die Jobauswahl vorgesehen. Einer zum starten des Verfahrensvorganges und 10 zum festlegen welcher Slot angefahren werden soll. Sprich damit der Roboter ein Werkstück transportiert, braucht er zum einen ein Signal welchen Job er fahren soll und ein seperates Startsignal.

Der Bearbeitungsvorgang wird über ein HMI vom Bediener gestartet und soll dann alle belegten Lager-Slots nacheinander bearbeiten. Den Zustand der Slots schreibe ich in ein Array of Bool. Wenn der Vorgang gestartet wird wird ein Zähler gestartet. Dessen Zählwert nutze ich um den entsprechenden Lager-Slot im array auszulesen. Der Zähler wird hochgezählt wenn entweder ein Slot nicht belegt ist, oder der Bearbeitungsvorgang beendet wurde.

Da ich diesen Wert sowieso verarbeite, wollte ich ihn auch nutzen um dem Roboter zu sagen, welchen Job er verfahren soll. Bei der Frage wie ich das ganze kurz und knackig umsetzen könnte, kam mir die Idee das ganze über die Case_of Funktion zu regeln. Aber da sich die Zustände nicht ändern wenn ein anderer Case eintritt, habe ich mich gefragt ob es nicht einen Weg gibt die Bits nur solange zu schalten, wie der Case auch tatsächlich vorhanden ist, ohne das es zu großen Rücksetz-Arie ausartet. Desshalb meine Frage.
 
Zuletzt bearbeitet:
Wenn es darum geht, zu einer Zahl von 0..n genau 1 von Bit 0..n auf TRUE zu liefern und dieses n "überschaubar" ist, z.B. nicht grösser als 15 oder 31, dann würde ich ein SchiebeRegister bemühen - ganz ohne CASE:
SHL(IN:=1, N:=n)
 
Ich würde es dann ggf. in etwa so machen :
Code:
myOut_01 := (Zaehler = 1) and Slot_belegt[Zaehler] ;
myOut_02 := (Zaehler = 2) and Slot_belegt[Zaehler] ;

usw.
eventuell auch in einer Schleife falls du die OUT's ggf. auch so (also indexiert) ansprechen kannst / willst ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"Theoretisch" ;) ist das Schalten von Ausgängen in CASE möglich, doch es ist eine ziemlich verpönte Art, Ausgänge an verschiedenen Stellen im Programm zu schalten (Werte zuzuweisen), weil das später bei Problemen niemand beobachten und nur ganz schwer nachvollziehen kann. Auch das Schalten von Ausgängen in IF..THEN..ELSE-Konstrukten ist so eine Un-Art. Einige AG verbieten so eine Programmierung in ihren Lieferbedingungen.

An dieser Stelle würde mich einfach mal interessieren wie weit das ganze geht. Villeicht verstehe ich auch nicht zu 100% was du versuchst mir damit zu sagen, also frage ich lieber nochmal nach.

Meinst du damit, ich solle alle Ausgänge an einer zentralen Stelle schalten (ein zentraler Baustein) und mich auf einfache Zuweisungen beschränken wie z.b.:

Code:
E0.0:= Bediung_1 AND Bedingung_2 AND NOT Bedingung_3;

E0.1:=NOT Bedingung_1 AND NOT Bedingung_2;

E0.2:= Bedingung_3;

Diese Bedingungen würden ja auch durch Funktionen wie z.b: Case_of oder IF_Then_Else Funktionen erzeugt werden. Der rein funktionelle Unterschied ist mir da nicht ganz klar.
 
Also erstmal solltest du nicht, wie in deinem Code-Beispiel, Eingänge zuweisen ...

Dann :
Was Harald meinte ist, dass die Ausgänge (also jeder für sich) nur einmal im Programm zugewiesen werden sollten. Das muss nicht alles in einem Baustein stattfinden sondern kann schon Gruppen- odfer Aggregat-mäßig stattfinden.
Was nicht passieren sollte (das hatte ich mal von Siemens so bekommen) ist das ein Ausgang in zig verschiedenen Bausteinen und Netzwerken gesetzt bzw. rückgesetzt wird. Hier hat man bei der Fehlersuche überhaupt keine Chance irgendwas herauszufinden.
Nehmen wir mal an du hast eine Schrittkette in der der Schritt 10 und der Schritt 20 den Ausgang aktivieren sollen. Nun könntest du das an dem jeweiligen Schritt machen und an dem Folgeschritt wieder rücksetzen. Dann hättest du genau das Negativ-Beispiel, dass ich gerade skizziert habe.
Besser wäre, du würdest am Ende des Bausteins eine ODER-Verknüpfung auf die Schrittmerker machen und damit den Ausgang zuweisen - also :
Code:
myOut := (Schritt = 10) or (Schritt = 20) ;

Gruß
Larry
 
Zurück
Oben