TIA Mehrere String Variablen vergleichen

michi*

Level-2
Beiträge
100
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zsm,

ich versuche gerade mit Hilfe eines Sirus Act ID Schlüsselschalter 80 Schlüssel zuzuordnen und weiter zu verarbeiten.

Mein Ziel ist es einmal die Anlage frei zugeben. Also "einfach" einer von Schlüssel 1 bis 80 ist gesteckt.
Außerdem soll für jeden Schlüssel die Betriebsminuten pro Tag in einem Log gesichert werden.
Hierzu habe ich 80 Betriebsminutenzähler die dann Täglich Nachts in eine neue Zeile von einem Datenlog geschrieben werden und dann genullt werden.
Hier frag ich mich auch noch ob es eine effizientere Möglichkeit gibt, Vor allem wenn es mal mehr Schlüssel geben soll.

Um die Schlüssel zu erkennen habe ich es jetzt so gedacht.
die jeweilige KeyID gebe im Static Bereich ein. In dem Beispiel wären es dann schon 80 Einträge.
Der Baustein gibt dann aus , ob Key1,2 ... aktiv ist.
Könnte auch eine Zahl 1-80 ausgeben anstatt die bool Variablen.

So oder so
kann ich dann im weiteren Programm den Betriebsminutenzähler aktivieren und auch festlegen, Schlüssel ist gültig.

Habt ihr eine Idee wonach ich schauen soll damit ich nicht 80x diesen IF Befehl wiederhole oder auch wie ich evtl. die Betriebsminuten anders zuordnen könnte?
 

Anhänge

  • IDKEY.png
    IDKEY.png
    52,3 KB · Aufrufe: 25
Schleife und Array sind die Stichworte, ansonsten - generell, sollte sowas über einen Dienst in der Netzwerkarchitektur laufen.. d.h. Schlüssel steckt, Nummer wird übergeben, Rückmeldung kommt vom Dienst ob der Schlüssel zugelassen ist oder nicht und welche Stufe er hat.

Betriebsminuten würde ich auch einfach speichern solange der Schlüssel gesteckt ist und wenn er nicht mehr steckt die aufsummierten Minuten wegschicken an eine Datenbank.

So bleibt deine SPS dumm und flexibel, du musst keine Schlüssel-DB verwalten und auch keine nachgelegten Daten verarbeiten.

Zudem können Schlüssel an einer zentralen Stelle so angelegt/entfernt werden ohne dass man dafür die SPS anfassen muss.

Du sparst dir Platz und Zykluszeit, das ganze Thema ist skalierbar auf andere Anlagen/Maschinen ohne dass du um Vordergrund viel anpassen musst und auch im Hintergrund hält sich die Arbeit in Grenzen
 
Naja ... da würde mir dann das Stichwort "Schleife" einfallen.
Deine ID's sollten dann in einem Array stehen und deine Key's auch - hätte dann auch den Vorteil, dass du das schön einfach erweitern kannst.
Für jeden Key würde ich eine Zählvariable (also auch wieder ein Array) anlegen wo du, wenn Key aktiv, einfach deren Inhalt hochzählst - z.B. im Sekundentakt ...
 
Danke für die schnelle Rückmeldung.
Ich probiere das jetzt mal so umzusetzen.

@DCDCDC
Schlüssel werden wohl auf der SPS bleiben müssen.
"Wartungswerte" also die Betriebsminuten ect. sollen Mittelfristig nur zwischengespeichert werden und regelmäßig über die jeweilige EWON Fernwartung weitergeleitet werden und dann aufgearbeitet werden. Hier bin ich leider noch nicht soweit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann würde ich mir auch noch Gedanken über eine HMI Schnittstelle machen über die man neue Schlüssel hinzufügen oder entfernen kann.

Musst natürlich Puffer lassen in deinem Array (evtl bis 100 puffern)

Dann kann man das von einem evtl vorhandenen HMI machen ohne das Projekt anpassen zu müssen.


Oder falls es technisch machbar ist die Schlüssel auf eine csv File auf dem HMI ablegen und im Programm die File öffnen und dort suchen, am HMI dann mit skripten in diese csv reinschreiben/bearbeiten.

So sparst du dir ein Array und bist komplett flexibel
 
Hab es jetzt mit einer For Schleife ersteinmal so gelöst.

@DCDCDC
Ein HMI ist tatsächlich mit angedacht jedoch nur ein Basic KTP
Das mit dem CSV wäre mit die "Beste" Lösung.
Ich weiß garnicht ob die das unterstützen.

Ziel wäre die Maschine jeweils mit X Keys auszuliefern.

Und dann die Möglichkeit schaffen, verlorene Schlüssel rauszuwerfen/ ersetzen evtl. erweitern.
Da die Anlagen nicht immer 100% online erreichbar sein werden zu jeder Zeit wollte ich gerne die Verwaltung auf der
SPS. Auch wenn ein Display mal defekt ist wäre stand jetzt auch ein Betrieb weiter möglich.

Danke für den Input.




IDKEY.png
 
Noch ein-zwei kleine Dinge:

Array immer bei 0 anfangen, auch wenn du erst ab 1 suchst.. so kannst du verhindern dass Zeiger undefiniert steht, bringt nur unnötiges Fehlerpotential rein. Also 0..80 oder wenn du Fach 0 nutzen möchtest 0..79.

Dann kannst du die Größe des Arrays noch durch eine Konstante ersetzen wenn du möchtest, falls der Baustein mal in eine Bibliothek soll.

Also anstatt 0..79 würde sich dass dann [0..KEY_ID_MAX] schreiben und so könntest du dir auch zB #BenuterMax sparen, die beiden Variablen sind ja voneinander abhängig, also Schlüsselspeicher und Benutzerspeicher.

Oder du kannst auch direkt den Eingang verwenden [0..BenutzerMax] ob das geht weiß ich nicht, musst du mal probieren.

Und ich würde dem Eingangsparameter keinen Wer aus den Defaultwert geben, so darf man noch gerne den Paramete am Aufruf auch benutzen und dort zB eine Konstante dranklemmen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@michi* :
dann auch von mir noch 2 kleine Dinge dazu :
- das mit dem Array ab 0 ist Geschmackssache - es gibt keinen Fehler wenn man es vernünftig handelt - oder jedenfalls auch nicht mehr Fehler wie mit dem 0-basierten Array
- eventuell den String in der Länge limitieren wenn du weißt wie lang deine Keys maximal sind.
 
vielen Dank.
Hab die Länge limitiert und die KEY_ID_MAX mit aufgenommen. Als Eingang direkt nutzen ging nicht aber als Constant.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.. und die KEY_ID_MAX mit aufgenommen. Als Eingang direkt nutzen ging nicht aber als Constant.
Das liegt daran, dass du den Eingang ja jederzeit ändern kannst - Array's können aber nicht dynamisch erzeugt werden. Die Konstante wird im Grunde nur beim Compilieren (Übersetzen) verwendet ...
 
würde nicht array[*] funktionieren und dann lower bound und upper bound berechnen über den Wert am Eingang?
weiß ich nicht - habe ich noch nie probiert ...
Das würde dann aber heißen, dass der Speicherbereich dynamisch belegt wird ... (und das könnte sich dann ja auch von Zyklus zu Zyklus ändern)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann würde es mir eigentlich nicht so viel bringen den über die Konstante dann festzulegen oder?
Es sei denn ich will evtl. noch an anderer Stelle abfragen ob der Array Bereich übereinstimmt mit einem Wert.
 
Das ,mit der Konstante würde ich AUF ALLE FÄLLE so machen - wenn du dann irgendwann einmal änderst brauchst du nur die Konstante zu ändern und neu übersetzen (wenn du sie überall eingetragen hast wo sie sich auswirken würde)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
weiß ich nicht - habe ich noch nie probiert ...
Das würde dann aber heißen, dass der Speicherbereich dynamisch belegt wird ... (und das könnte sich dann ja auch von Zyklus zu Zyklus ändern)
Nein, der Speicherbereich wird nicht wirklich "dynamisch" belegt, weil ja alle Arraygrößen bereits beim Kompilieren feststehen.
Es werden dann "nur" beim Kompilieren für jeden Bausteinaufruf die dann wirklich notwendigen Arraygrößen in der Schnittstelle durch TIA berechnet und die Aufrufe entsprechend "angepasst".
 
Für die Speicherung der Tageswerte habe ich jetzt auch versucht mit den Schleifen zu arbeiten.
Die ersten 3 scheinen auch zu laufen.

Jedoch die Letzte , zum Reset auf 0 aller Werte, scheint nicht zu laufen.
Hier setzt er dann jeweils nur den 1. Wert auf 0.

Könnt Ihr hier evtl. einen Fehler sehen?



Code:
IF #"Anlage_EIN" AND #sekundentakt_FP AND #Produkt = 1
THEN
   
    FOR #i := 1 TO #KEY_ID_MAX BY 1 DO
       
        IF #KeyNummer = #i
        THEN
           
            #BTZ_S_Produkt1_Key[#i] := #BTZ_S_Produkt1_Key[#i] + 1;
            EXIT;
           
        END_IF;
       
    END_FOR;
END_IF;// Sekundenzähler Tageswert Stufe 1




IF #"Anlage_EIN" AND #sekundentakt_FP AND #Produkt = 2
THEN
   
    FOR #i := 1 TO #KEY_ID_MAX BY 1 DO
       
        IF #KeyNummer = #i
        THEN
           
            #BTZ_S_Produkt2_Key[#i] := #BTZ_S_Produkt2_Key[#i] + 1;
            EXIT;
           
        END_IF;
       
    END_FOR;
END_IF;// Sekundenzähler Tageswert Stufe 2





IF #"Anlage_EIN" AND #sekundentakt_FP AND #Produkt = 3
THEN
   
    FOR #i := 1 TO #KEY_ID_MAX BY 1 DO
       
        IF #KeyNummer = #i
        THEN
           
            #BTZ_S_Produkt2_Key_1[#i] := #BTZ_S_Produkt2_Key_1[#i] + 1;
            EXIT;
           
        END_IF;
       
    END_FOR;
END_IF;// Sekundenzähler Tageswert Stufe 3





IF  #"Reset_Tageswerte"
THEN
    FOR #i2 := 1 TO #KEY_ID_MAX BY 1 DO

            #BTZ_S_Produkt1_Key[#i2] := 0;
            #BTZ_S_Produkt2_Key[#i2] := 0;
            #BTZ_S_Produkt2_Key_1[#i2] := 0;
           
            EXIT;
     
    END_FOR;
END_IF;
IDKEY.png
 
dein EXIT ist dort der Fehler - der Befehl bewirkt, dass die Schleife beim ersten Element bereits komplett verlassen wird ...
Nimm das da mal komplett raus ...
 
Zurück
Oben