TIA Optimierungshilfe

Arlos

Level-2
Beiträge
11
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,
Ich habe eine S7-313C und programmiere in TIA15.1. Ich habe 96 DIs und 64 DOs und möchte mit denen für Anschauungszwecke ein Lichtspiel machen. Einmal möchte ich die Ausgänge nacheinander einschalten und sobald ich beim letzten bin rückwärts ausschalten. Dann möchte ich auch noch alle Ausgänge gleichzeitig über einen Taktmerker ansteuern. Die Auswahl welcher Modus es ist wird über einen Schalter am Schaltschrank gemacht. Die DIs sind mit den DOs verbunden und werden dadrüber gesetzt.
Also ich kann es funktionell erledigen nur wollte ich wissen ob es einfacher geht. Für den ersten Modus habe ich bislang an eine lange Reihe von IFs gedacht. Für dem zweiten Modus einfach eine lange Reihe an Zuweisungen.
Gibt es da einfachere Möglichkeiten? Meine Methoden sind ja auch relativ unübersichtlich wenn jemand anderes später drüberschauen muss.
 
DatenTyp LINT (64 Bit = 8 Byte).

Modus 1:

Eine Lampe hinzu (bis max. 63 bei LINT):
X := 2 * X + 1 ;

Eine Lampe weniger:
X := (X - 1) / 2 ;

Modus 2:

Alle Lampen EIN (64 bei LINT):
X := -1 ;

Alle Lampen AUS:
X := 0 ;

Die DIs sind mit den DOs verbunden und werden dadrüber gesetzt.
Was ist damit gemeint? Wozu? Was soll damit gemacht werden?
 
Zuletzt bearbeitet:
Ich hatte selber noch nichts mit einer 300er steuerung zu aber ich habe das mal testweise so aufgebaut.
So oder so ähnlich könnte mann das auch machen.

1705330186325.png
 
Code:
Das sollte auch eher ein Denkanstoß sein und nicht die Lösung.

    FOR #i := 0 TO 63 DO
    #Bools[#i] := Taktmerker;
    END_FOR;

das funktioniert genausowenig. Wenn der Taktmerker TRUE ist werden alle gesetzt. Wenn der Taktmerker FALSE ist werden alle auf FALSE gesetzt.
 
Das sollte auch eher ein Denkanstoß sein und nicht die Lösung.
Eine FOR-Schleife wird in einem Zyklus immer komplett durchlaufen. Mit deiner Lösung werden entweder alle eingeschaltet, oder alle ausgeschaltet, abhängig davon ob der Taktmerker in dem jeweiligen Zyklus (den Zyklen) TRUE oder FALSE ist.

-chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das funktioniert genausowenig. Wenn der Taktmerker TRUE ist werden alle gesetzt. Wenn der Taktmerker FALSE ist werden alle auf FALSE gesetzt.
Das ist meiner Meinung nach genau eines der dinge, die er erreichen möchte.
Dann möchte ich auch noch alle Ausgänge gleichzeitig über einen Taktmerker ansteuern.

Ich finde es auch sehr hilfreich, dass ihr meinen Lösungsansatz lieber kritisiert, als hier einen hilfreichen Beitrag zu posten.


Code:
TON(IN := NOT TON.Q,
                      PT := t#1s);


IF mode_1 THEN 
    FOR #i := 0 TO 63 DO
        #Bools[#i] := Taktmerker;
    END_FOR; 
ELSIF mode_2 AND TON.Q THEN 
    IF CountDown THEN
        #i := #i - 1;
    ELSE
        #i := #i + 1;
    END_IF;
    IF #i > 63 THEN
        CountDown := TRUE;
        #i := 63;
    ELSIF #i < 0 THEN
        CountDown := FALSE;
        #i := 0;
    END_IF; 
    #Bools[#i] := NOT CountDown; 
END_IF;

#retval := BLKMOV(SRCBLK := #Bools, DSTBLK => #Bytes);

"OutByte_0" := #Bytes[0];
"OutByte_1" := #Bytes[1];
"OutByte_2" := #Bytes[2];
"OutByte_3" := #Bytes[3];
"OutByte_4" := #Bytes[4];
"OutByte_5" := #Bytes[5];
"OutByte_6" := #Bytes[6];
"OutByte_7" := #Bytes[7];
 
Ich hatte selber noch nichts mit einer 300er steuerung zu aber ich habe das mal testweise so aufgebaut.
So oder so ähnlich könnte mann das auch machen.

Anhang anzeigen 74341
Ja das hat mir schon mal einen richtigen Denkanstoß gegeben. Jetzt sollte ich klarkommen.
Für den Taktmerkermodus werde ich es erstmal mit der For-Schleife versuchen, da es ein relativ langsamer Takt ist.

Für den anderen Modus setze ich jetzt ein Bit pro Zyklus und nutze einen BLKMOV um ein Array auf die Ausgänge zu geben.
 

Anhänge

  • Screenshot 2024-01-16 094849.png
    Screenshot 2024-01-16 094849.png
    8,6 KB · Aufrufe: 12
Eine FOR-Schleife wird in einem Zyklus immer komplett durchlaufen. Mit deiner Lösung werden entweder alle eingeschaltet, oder alle ausgeschaltet, abhängig davon ob der Taktmerker in dem jeweiligen Zyklus (den Zyklen) TRUE oder FALSE ist.
Achtung! (klugscheixxmodus) Die CPU-Taktmerker sind asynchron zum Zyklus und können sich innerhalb der FOR-Schleife ändern. Dann sind nach der Schleife nicht alle Werte gleich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achtung! (klugscheixxmodus) Die CPU-Taktmerker sind asynchron zum Zyklus und können sich innerhalb der FOR-Schleife ändern. Dann sind nach der Schleife nicht alle Werte gleich.
Es sind doch immer die Feinheiten auf die es letztendlich ankommt.
 
Find den Satz im 1500er Handbuch so nicht🤔
Müsste auch in der TIA-Hilfe bei den Taktmerkern stehen.

Das ist eigentlich "schon immer" (seit S7-300) so.
Wenn man CPU-Taktmerker braucht, die im gesamten Zyklus gleich bleiben/sich nicht ändern, dann muss man sich ein "Prozessabbild" der Taktmerker erstellen, sprich: am Zyklus-Anfang auf andere Variablen/Merker umkopieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist bei den 300/400ern auch schon so.
Hmm, ist dann an mir irgendwie vorbei gegangen.

Wer hat sich sowas denn ausgedacht? Ursprünglich wurde so nen Taktmerker ja mal oft dafür eingesetzt, dass alle Leuchten am Bedienpult einheitlich blinken. Würde ja heissen, abundzu gehn manche nen Zyklus später an bzw. aus... naja, egal. Wenn ich mal wieder komische Phänomene hab, versuch ich mich dran zu erinnern ;)
 
Zuletzt bearbeitet:
Jetzt hab ich endlich ne Begründung für meine Kollegen, warum meine Philosophie die 100ms-Flanken-Bits global zu bilden schon immer richtig war :LOL:

Danke trotzdem für den Hinweis!
 
Zurück
Oben