8x die gleiche Prozedur, geht das auch einfacher ?

mega_ohm

Level-2
Beiträge
675
Reaktionspunkte
45
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an Alle,

wie kann ich mir eine Menge Schreibarbeit ersparen ?

Problembeschreibung:
Für eine "Restmengen- Warnung / Abschaltung" sind pro Kippdorn (KD..) jeweils 2 Lichtschranken (es werden an der Anlage Lichttaster sein, aber für die Erklärung werde ich weiterhin LS schreiben ) vorgesehen.

KD 1 -> LS 1 = ca. 100kg ( Vorwarnung ) {LS1}
KD 1 -> LS 2 = ca. 50kg ( ab jetzt muß eine "Überbrückungstaste"
betätigt werden, sonst hält die Anlage an) {LS2}
KD 2 -> LS 1 = ca. 100kg ( Vorwarnung ) {LS3}
...
KD 4 -> LS 2 = ca. 50kg ( ab jetzt muß eine "Überbrückungstaste"
betätigt werden, sonst hält die Anlage an) {LS8}

Zum Produktionsablauf:
Es wird ein Drahtbund aufgesetzt und nach oben abgezogen. Solange noch genügend Material vorhanden ist, haben beide LS 1-Signal. Irgendwann wird das Material weniger, läuft aber immernoch durch die LS. Es entsteht also irgendwann ein ständig wechselndes Signal.
Dafür habe ich folgende Lösung:
Code:
[SIZE=1]// Zähler Set auf Max. [/SIZE]
[SIZE=1]U "M0.2" // KD1 war unten[/SIZE]
[SIZE=1]SPBN For1 // wenn nicht, dann Sprung zu "Vorwärts zählen"[/SIZE]
[SIZE=1]L DB 1.C_Max // Max_Zähler laden[/SIZE]
[SIZE=1]T DB 1.C_LS1 // akt. Zähler auf max. Wert [/SIZE]
 
[SIZE=1]// Vorwärts zählen [/SIZE]
[SIZE=1]For1: UN "E0.0" // LS1[/SIZE]
[SIZE=1]SPB Rew1 // Sprung zu "Rückwärtszählen LS1"[/SIZE]
[SIZE=1]S "LS1_Sig1" // Merker "LS Signal= 1" setzen [/SIZE]
[SIZE=1]L DB 1.C_LS1 // Vergleich, ob akt. Zähler > Max_Zähler[/SIZE]
[SIZE=1]L DB 1.C_Max[/SIZE]
[SIZE=1]>=I[/SIZE]
[SIZE=1]SPB End1 // Wenn, größer dann ENDE[/SIZE]
[SIZE=1]L DB 1.C_LS1[/SIZE]
[SIZE=1]L 1 // sonst Zähler inkrementieren[/SIZE]
[SIZE=1]+I [/SIZE]
[SIZE=1]T DB 1.C_LS1[/SIZE]
 
[SIZE=1]// Rückwärts zählen [/SIZE]
[SIZE=1]Rew1: U "E0.0"[/SIZE]
[SIZE=1]SPB End1[/SIZE]
[SIZE=1]L DB 1.C_LS1 // Vergleich, ob Zähler < 1[/SIZE]
[SIZE=1]L 1[/SIZE]
[SIZE=1]<I [/SIZE]
[SIZE=1]SPB Res1 // Merker Reset[/SIZE]
[SIZE=1]L DB 1.C_LS1 // akt. Zähler laden[/SIZE]
[SIZE=1]L 1 // dekrementieren[/SIZE]
[SIZE=1]-I [/SIZE]
[SIZE=1]T DB 1.C_LS1[/SIZE]
[SIZE=1]L DB 1.C_LS1 // Vergleich, ob Zähler < 1[/SIZE]
[SIZE=1]L 1[/SIZE]
[SIZE=1]<I [/SIZE]
 
[SIZE=1]Res1: R "LS1_Sig1" // Merker "LS Signal= 1" rücksetzen [/SIZE]
[SIZE=1]End1: NOP 0[/SIZE]
Nun könnte ich diesen Ablauf natürlich 8x tippseln.
Aber mich würde mal interessieren, wie das anders geht.
(Das muß anders gehen. :confused: Alle Programmierer, die ich kenne, sind schreibfaul :D. Niemals würden die das 8x kopieren und anpassen )
Ich habe schon mal nach "array" gesucht, weil ich daß von C++ und BPascal kenne. Dort wäre die Lösung recht einfach. In s7 habe ich mal kurz reingelesen... (LAR... +AR... ) und gar keinen Anfang gefunden.
Ich möchte aber auch nicht 8 IDB's erstellen. (Das wäre ja auch noch eine Möglichkeit. In jedem DB würde aber nur ein Word stehen, das trägt nicht zur Übersichtlichkeit und zum Verständnis des Progis nach Jahren bei.)

Mir schwebt ein FC vor, dem ich eine ID für die jeweilige LS, eventl. noch den Startbereich (MW...) übergebe.
Der max_Zähler ist für alle 8 LS gleich, also könnte man den direkt im FC laden.
Das Ergebnis könnte z.B. so aussehen:
MW20 => Zähler LS 1 (BYTE scheint mir etwas zu knapp, es sollte schon eine Verzögerung von 2-3 sec. erreicht werden )
MW22 => Zähler LS 2
...
MW34 => Zähler LS 8

Ich würde mir das Ganze in etwa so vorstellen:
var Word_Adr: Byte // Word- Adresse, für die Adresse sollte BYTE reichen
ID: Byte // ID, bezieht sich auf die Anzahl der LS (max. 8 Stück = BYTE)

Zugriff auf das jeweilige MW:

MW[Word_Adr+ID] // wenn das so einfach wäre :), das wär' toll

Von mir aus kann das auch ein DB- Bereich sein; daß wäre mir sogar noch lieber. Dann müßte ich mir nämlich in dem bestehenden Programm keine freien Merker suchen.

Kann mir jemand bei der Lösung des Problems helfen oder mir wenigstens einige gute Links zum Nachlesen und Selbststudium geben ?
Es ist garantiert keine Schularbeit !

Mfg
 
Hallo,

ich weis nicht, ob ich dein Vorhaben richtig verstanden habe,
aber...warum schreibst du dir keinen fc und deklarierst die in/outs?

Dann kannst du den Baustein 8x aufrufen und hängst immer verschiedene Variablen dran. Somit hast du dir den Schreibaufwand minimiert.

Gruß Johannes
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich weis nicht, ob ich dein Vorhaben richtig verstanden habe,
aber...warum schreibst du dir keinen fc und deklarierst die in/outs?

Dann kannst du den Baustein 8x aufrufen und hängst immer verschiedene Variablen dran. Somit hast du dir den Schreibaufwand minimiert.

Gruß Johannes
Du hattest es richtig verstanden.

Ich habe natürlich erstmal probiert, wie das mit einem FC funktioniert (Deswegen bedanke ich mich auch erst jetzt)...
Es paßt perfekt.

Mfg
 
Zurück
Oben