TIA Steckercodierung einlesen und auswerten

SPS-Dominik

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

ich bräuchte mal eure Unterstützung.
Was soll realisiert werden.

Wir haben 80 Stecker die über 10 Pins codiert sind. Die 10 Pins bekomme ich auf 10 SPS-Eingänge (bool).
Nun sollen die Eingänge zyklisch eingelesen werden, um zu ermitteln welcher Stecker gesteckt wurde. Nachdem einlesen soll ein Zyklus Pause sein, bevor die Eingänge wieder eingelesen werden. Dies soll permanent geschehen, da die Stecker an unterschiedlichen Positionen in der Anlage gesteckt werden können.

Habt ihr eine Idee wie ich das realisieren kann?

Vielen Dank bereits für eure Unterstützung.
 
Nachdem einlesen soll ein Zyklus Pause sein, bevor die Eingänge wieder eingelesen werden.
Aus welchem Grund?

Wir haben 80 Stecker die über 10 Pins codiert sind. Die 10 Pins bekomme ich auf 10 SPS-Eingänge (bool).
Warum so viele Eingänge für nur 80 Stecker ( mit 10 Eingängen komme ich auf 1023 verschiedene Möglichkeiten )?

Habt ihr eine Idee wie ich das realisieren kann?
Steuerung? Programmiersprache?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aus welchem Grund?
war so gewünscht. Wenn es nicht realisiert wird, wäre es auch kein Beinbruch
Warum so viele Eingänge für nur 80 Stecker ( mit 10 Eingängen komme ich auf 1023 verschiedene Möglichkeiten )?
Erweiterbarkeit. Aktuell sind es 80 Stecker aber es können auch 150 oder 500 sein. Die 80 sind erst einmal ein Anfang
Steuerung? Programmiersprache?
S7-1516F 3PNDP kommt zum Einsatz. Programmiersprache kann SCL oder AWL sein
 
Na dann lies die Eingänge ein, merke dir das du sie gerade gelesen hast und beim nächsten Zyklus überspringst du die Abfrage wenn du es dir gemerkt hast und setzt dann den "Merker" zurück.

Mit Merker meine ich ein DB-BOOL oder einen Merker ( vorzugsweise aber DB ).
 
Hallo SPS-Dominik,

ich fasse mal zusammen:
  • Du hast mehrere Buchsen an der Anlage, wo verschieden codierte Stecker gesteckt werden können.
  • Hat jede Buchse die selben Eingänge? ==> dann benötigts du eine (1) (Integer-) Variable für den Codierungswert
  • Oder hat jede Buchse andere Eingänge? ==> dann benötigts du je Buchse (1) (Integer-) Variable für den Codierungswert
Idealerweise ordnest du die Eingänge von der/den Buchse/n so an, dass sie der Wertigkeit der jeweiligen Bits in deinem EW liegen.
Dieses Bild beschreibt diese Reihenfolge:

1732093358161.jpeg

Dann brauchst du nämlich nur noch dein EW auszumaskieren, z.B. U 2#0000001111111111, (evtl. noch was schieben) und dann in deine Variable für den Codierungswert kopieren.
Falls du die Codierungs-Eingänge anders angeordnet hat, ist es wahrscheinlich am einfachsten die Bits der Codierwertvariable mitttels Slice von den Bucheseneingängen zuzuweisen.
 
Wozu braucht man da Arrays?? :unsure:

Ich würde es wie von Peter Wahlen vorgeschlagen machen:
- pro Steckstelle ein WORD
- dann die Eingänge Ex.y einzeln in die Bits der Words kopieren, das geht in FUP/KOP/SCL/...
- die "unbenutzten" Bits in den Words auf 0 setzen

Die Bits in den Words kann man je nach verwendeter CPU per Slice, AT oder über "Schmiermerker" (Merker oder TEMP) adressieren oder auch mit fertigen Bausteinen arbeiten, z.B. LGF_MergeBitsToWord (oder wenn man es ganz umständlich will mit LGF_BitSetTo).
Verschiedene Lösungen und Irrwege mit old classic Step7 findest Du z.B. hier im Forum hier und hier

Nachdem einlesen soll ein Zyklus Pause sein, bevor die Eingänge wieder eingelesen werden.
Wozu soll das gut sein? Das verkompliziert die ganze Aufgabe nur unnötig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Low und Highbyte sind verdreht.Siemens Spezial.
Hätte integer genommen.
Bei Integer wären genauso "Siemens spezial" Low- und High-Byte für dich "verdreht" (was bei z.B. Slice allerdings gar keine Rolle spielt).
In einem Integer darf man (seriöserweise) aber nicht die einzelnen Bits manipulieren. Da kannst du auch gleich die Schmiermerker-Lösung nehmen. Oder wolltest du die Bitwertigkeiten 1, 2, 4, 8, 16, ... bedingt numerisch addieren?
 
Später muss man diese Bits(Schaltern) ja noch in einer Textliste einen Namen geben.
Im HMI als Bsp.Dann war mein Gedanke wenn man eine Nummer hat und durchnummeriert von 1 bis 80 mit integer einfacher.
 
Wieso manipulieren?Ich lese die Bitkombination ein und schreibe dann ein Zahl raus.
Nirgendwo.Ich sage nur ich würde es so machen.
Und wenn ich es nur innerhalb der SPS so händeln würde.
 
Wieso manipulieren?Ich lese die Bitkombination ein und schreibe dann ein Zahl raus.
Wie willst du denn die Bits oder Bitkombination in eine Zahl wandeln?
Meinst du sowas in der Art Zahl.Bit0 := E12.3; ? Das nenne ich Bit-Manipulation, weil es eigentlich nicht zulässig ist. Nur weil TIA sowas vielleicht zulässt, heißt das nicht, dass das "international" normal üblich oder gar guter Programmierstil ist. Nach IEC ist solcherart direkte Bitmanipulation in numerischen Datentypen wie INT nicht zulässig.

Um aus Bits von mehreren Digitaleingängen einen Zahlenwert zu machen, kann man zunächst die Bits von den (möglicherweise verstreut liegenden) Eingängen in einen Bitstring (WORD) einsammeln. Dann kann das Bitmuster in dem WORD in einen numerischen Wert (eine Zahl) konvertiert (z.B. WORD_TO_INT) und in eine numerische Variable kopiert werden, und dann als Zahl (z.B. Steckernummer oder Index in eine Textliste) verwendet werden.

Oder wolltest du die Bitwertigkeiten 1, 2, 4, 8, 16, ... bedingt numerisch addieren?
Das könnte etwa so aussehen:
Code:
tempWert := 0;
IF E0.4 THEN tempWert += 1; END_IF;
IF E0.5 THEN tempWert += 2; END_IF;
...
IF E12.3 THEN tempWert += 128; END_IF;
MeineZahl := tempWert;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja so wie du oben schreibst.Ich will nur die Zahl von 0-80 am Ausgang.Ich kann das ja mal morgen machen.
Null wäre dann nichts gesteckt.
Ich kann mir gut vorstellen, dass sie die Steckernummer noch visualisieren müssen.
Ich würde wahrscheinlich bei dem Baustein sogar die Eingänge direkt abfragen, da es so viele Variablen sind.
Ist nicht schön, aber man wird wohl bei solchen Aufgaben immer die gleichen Adressen verwenden.
 
Zuweisung der Einzelbits auf ein Datenwort.Ist recht einfach.
Als Integerwort DB1.DBW0
Als Bsp.
U E0.0
=DB1.dbx1.0
U E0.1
=DB1.dbx1.1
u.s.w.

oder mit SCL ist das gleiche.
Als Absolutwertadressierung in einem Baustein.Die oberen Bits habe ich ausgeblendet.
Am Ausgang zeige ich dann die Kombination dezimal an.
 
Slice kenne ich nicht.Gibts das bei Klassik?
Die Variante hat Alles was man braucht.Man kann primitiv die Eingänge anpassen wenn sich was ändern muss.
Die oberen Bits blende ich mit dem Nullmerker aus.Und die Integerdarstellung kann für ein Textfeld verwendet werden.
Zudem gehe ich mal davon aus das sie die Stecker beschriften müssen.Da bietet sich ja diese Nummer an.
 
Wenn das genauso einfach geht, kann man das auch mit Slice machen.
Kann mir ja mal jemand zeigen.Den programmcode hier schriebt man in 5 Minuten.
 
Zurück
Oben