TIA Reihenschaltung auswerten

c_s

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich stehe vor folgendem Problem bei TIA.

Ich möchte in einem System, in dem 30 Spannungsquellen (bzw. Eingänge) in Reihe verschalten werden können, die aktuell maximale Spannung und die Anzahl der maximal in Reihe verschalteten Eingänge anzeigen lassen.
Also z.B. wenn an einer Stelle 3, an einer anderen Stelle 7, an wieder einer anderen Stelle 10 Eingänge in Reihe verbunden sind, sollte die 10 angezeigt werden.

Wie löse ich das Problem?

Vielen Dank für eure Hilfe schon mal!
 
Moin c_s,

sind Deine "Stellen" Gruppierungen von Eingängen?
Ich würde wahrscheinlich für jede Gruppe ein entsprechend großes Array erstellen und die Eingänge auf das Array mappen.
Wenn sichergestellt ist, das Jede Eingangsgruppe ein Eingangsbyte oder Eingangword oder ein Wordvielfaches verwendet und keine anderen Eingänge auf diesem Bereich liegen, kannst Du auch ein Datentyp (Array[0..7] of bool, Array[0..15] of bool, Array[0..31] of bool, etc.) erstellen und die Basisadresse (x.0) mit diesem Datentyp versehen.

Wenn Du jetzt ein Array hast, kannst Du einfach mit einer FOR-Schleife die Anzahl der gesetzten Bits in der Gruppe zählen und den Wert ausgeben.

Was ich allerdings noch nicht ganz verstehe ist, wie Du die Reihenschaltung auf Eingänge legst? Dann musst Du ja von jeder Spannungsquelle einen separaten Abgriff haben und auf einen Eingang legen. Oder verstehe ich da was falsch?

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo MFreiberger,

ja die Stellen sind Gruppierungen von Eingängen.

Ich habe 30 Module mit gleicher Spannung die hintereinander liegen.

Diese Module kann ich mit Verbindern in Reihe schalten. Ob ein Verbinder zwischen zwei Modulen verbaut ist wird über einen Ini abgefragt (Eingang).
Die Verbinder können an verschiedenen Stellen verbaut werden, auch die Anzahl ist nicht immer gleich.

Was ich nun wissen müsste:
Die maximale Anzahl der Verbinder, die in dem System in Reihe verbaut sind. (Maximale Spannung im System)
 
Ich habe das noch nicht verstanden ...
Du hast also 30 Module (1..30).
Zwichen den Module 1-6 und 7-17 und 18-25 und 26-30 sind beispielsweise die Verbinder eingelegt.
Du willst jetzt also ausgeben : ich habe 4 Gruppen und in der Gruppe 1 die Spannung x und in der Gruppe 2 die Spannung y usw.

Passt das so ?

Gruß
Larry
 
Moin c_s,

so ganz kann ich mir den Aufbau nicht vorstellen, aber programmiertechnisch kommt ja auch nur darauf an, herauszufinden, wie viele Eingänge in einer Gruppe true liefern, oder?

also:

Gruppe1: Array[0..9] of bool

Gruppe1[0] := I100.0;
Gruppe1[1] := I100.1;
Gruppe1[2] := I100.2;
Gruppe1[3] := I100.3;
.
.
.
Gruppe1[9] := I101.1;

Dann

Code:
cntGruppe1 := 0;
FOR #i := 0 TO 9 DO
    IF Gruppe1[#i] THEN
        cntGruppe1 := cntGruppe1 + 1;
    END_IF;
END_FOR;

Dann hast Du einen Wert, der angibt wie viele Eingänge dieser Gruppe true sind.


Nach Larrys Bemerkung: also willst Du erkennen, wo die Verbinder sitzen? Also ununterbrochene Verbindung von 1..n, dann von n an bis n+x usw.?


VG

MFreiberger
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Beispiel: Alle Module haben eine Spannung von 10 V.

- zwischen den Modulen 3 - 7 sind Verbinder (--> 4 Stück) gesetzt --> 5 Module in Reihe --> 50 V
- zwischen den Modulen 9 - 11 sind Verbinder (--> 2 Stück) gesetzt --> 30 V
- zwischen den Modulen 15 - 25 sind Verbinder (--> 10 Stück) gesetzt --> 110 V
- zwischen den Modulen 27 - 28 ist ein Verbinder (--> 1 Stück) gesetzt --> 20 V

Ausgegeben werden soll:
- Max. Anzahl der in Reihe geschaltenen Module: 11 Stück
- Max. Spannung im System: 110 V
 
Moin c_s,

dann einfach alle Eingänge in ein Array mappen. Als nächstes auswerten:

Code:
cnt := 0;
cntmem := 0;
FOR #i := 1 TO 30 DO
    IF Eingang[#i] THEN
        cnt := cnt + 1;
    ELSE
        IF cntmen < cnt THEN
            cntmem := cnt;
            cnt := 0;    // hier ergänzt ;)
        END_IF;
    END_IF;
END_FOR;

Dann steht in cntmem der höchste Wert an zusammenhängenden Verbindern.

Dann kannst Du einfach mit einem Wert (Einzelspannung) multiplizieren.

VG

MFreiberger
 
Zuletzt bearbeitet:
Code:
// arr[0] .. arr[28] enthalten das "BitMuster" der 29 Eingänge
arr[29] := FALSE;
max := 0;
tmp := 0;
FOR xi := 0 TO 29 DO
    IF arr[xi] THEN
        tmp := tmp + 1;
    ELSIF max < tmp THEN
        max := tmp;
        tmp := 0;
    ELSE
        tmp := 0;
    END_IF;
END_FOR;
// max enthält die maximale Anzahl der aufeinander folgenden Verbinder
volt := 10 * (max + 1);

@Mario
Sorry, Du hast den LöschBefehl an der falschen Stelle eingefügt - der cnt muss auch dann gelöscht werden, wenn cnt >= cntmem ist.
Das 30. abgefragte Element muss unbedingt FALSE bzw. 0 sein, sonst wird der abschliessende Vergleich von cnt mit cntmem geschlabbert.
Das 30. Element entspricht aber nicht einem der 29 VerbinderAnwesenheitsMeldeEingänge, sondern ist konstant FALSE bzw. 0.
cntmem + 1 muss mit derEinzelSpannung multipliziert werden (1 Verbinder --> 2 Spannungen)!
 
Zuletzt bearbeitet:
Zurück
Oben