TIA Bitzuweisung

CDX

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

ich habe eine sehr allgemeine Frage. Wie man mit dem Programm arbeitet und was eine Bitzuweisung ist und was es alles gibt weiss ich. Ich bin Student und ich arbeite gerade an einem Hochschulprojekt. Hierfür haben wir eine kleine Versuchsanlage, die aber schon jemand in Betrieb genommen hat und meine Aufgabe ist es Versuche durchzuführen und zu protokollieren. Ein lauffähiges Programm habe ich auch schon und die Siemens Homepage bietet sehr viele Übungsbeispiele, hab ich genutzt. Als Programm verwende ich das TIA Portal.

Es sieht ungefähr so aus:

Ich habe 3 Schalter und somit 3 Eingangsbits (Ausgangsbits auch). Mit dem Schalter kann ich den Eingang ansprechen, also im TIA portal bei den Bits I0.0 und I1.0 zwischen 0 und 1 wechseln, es sind also Bool Variablen. Angeschlossen an diesen 3 Schaltern sind 20 Glühbirnen, welcher Schalter für welche Glühbirne da ist ist frei wählbar, deswegen auch der komplexe Code der mir zur Verfügung steht. Ich erzähle nur das wichtigste ....

Das Signal 1 wird auf eine Variable eines Datenbausteins geschrieben, hier könnte ich jetzt einen neuen Datentyp erstellen, ich hab da an Word gedacht, hat Platz für 16 Bits (oder 16 Glühbirnen). (Das Ausgangsbit ist jetzt mal nicht so interessant). Eine Zuweisung ist auch recht einfach, das Eingangsbit den Bits des Datenbausteins zuweisen. Meine Frage ist aber eine ganz andere:

Wenn jetzt das Eingangsbit 1 wird, kann man dann irgendwie, mit einer!! Zuweisung gleiche mehrere Bits ansprechen? Ich betätige Schalter 1 und es leuchten dann 10 Glühbirnen. 10 Bits in ein Word schreiben, wenn Eingang 1, dann sind auch die Bits des DB TRUE. Dann kommen noch die restlichen für Schalter 2 und 3 (sind dann vielleicht 6 und 4 Glühbirnen)

Gruß
CDX
 
Zuletzt bearbeitet:
Du hast also 20Ausgänge ?EINZELN? belegt (Q0.0 bis Q2.3)? Und 3Schalter als Eingänge? I0.0 bis I0.2?

Und möchtest mit diesen Schaltern die Birnen allesamt schalten?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will das Programm nur ein bisschen anders schreiben, ja die Ausgänge .. ich hab da schon eine Lösung gefunden. Interessant für mich ist nur der Datenbaustein, bzw wie ich mit einem Schalter mehrere Bits ansprechen kann (kann Typ Word sein oder was anderes). Ich will dem Eingang I1.0 nicht 10 Bool Variablen einzeln zuweisen. ...
 
Zuletzt bearbeitet:
Du kannst einem Word einfach eine Zahl zuweisen, die der Bitfolge entspricht.

SCL:

Code:
If E0.0 Then
   #wMyWord := FFFF;
End_If;

Dabei entspricht

FFFF hex 11111111_11111111 bin
5555 hex 01010101_01010101 bin
0002 hex 00000000_00000010 bin
0003 hex 00000000_00000011 bin

usw.

Wenn du das Word dann auf dein Ausgangsword schreibst, gehen die Ausgänge, die mit 1 belegt sind auf True.

Code:
#wMyOutput := wMyWord;

In FUP/KOP geht das mit dem Baustein Move.
 
Ralles Ansatz würde ich auch so wählen.
jetzt muss er dabei nur darauf achten, wie seine Ausgänge verteilt sind, zB hat die S7-1214 und aufwärts intern nur 10 Ausgänge.
Dann einfach bestimmen welche Lampen leuchten sollen als Binärzahl und mit dem Windowsrechner zB (Einstellung auf Programmierer) einfach in Hex umwandeln.
Jetzt muss ich zugeben,das ich nicht weis ob die Bytereihenfolge dann so stimmt oder ob das Ergebnis noch per SWAP gedreht werden muss.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ganz so einfach ist es nicht. Da er mit 3 Schaltern jeweils unterschiedliche Lampen innerhalb eines AW steuern will, ist es mit Wortoperationen etwas komplizierter. Entweder, er verodert oder er baut 8 IF...THEN, für jede möglich Schalterkombination eines.
Da ist es tasächlich einfacher, das ganze für jeden Schalter Bit für Bit zu schreiben.
 
Mir ist noch nicht klar, wie ich mit 3 Schaltern 20 LEDs (Glühbirnchen sind zu energiefressend) halbwegs sinnvoll ansprechen soll.
Das klingt nach "zeitgemässer" BedienOberfläche. Mühsames Durchtackern durch endlose Menüs und dann sich entscheiden für EIN oder AUS oder WEISSNICHT?
Gruss, Heinileini

PS: 2 Schalter genügen doch! Mit Schalter 1 rotiert man 1 Bit und mit Schalter 2 sagt man, das Bit an der aktuellen Position invertieren.
Wozu Schalter 3? Ist der für die NotAusFunktion?
 
Zuletzt bearbeitet:
...
Ich habe 3 Schalter und somit 3 Eingangsbits (Ausgangsbits auch). Mit dem Schalter kann ich den Eingang ansprechen, also im TIA portal bei den Bits I0.0 und I1.0 zwischen 0 und 1 wechseln, es sind also Bool Variablen. Angeschlossen an diesen 3 Schaltern sind 20 Glühbirnen, welcher Schalter für welche Glühbirne da ist ist frei wählbar...
...
Ich betätige Schalter 1 und es leuchten dann 10 Glühbirnen. ... Dann kommen noch die restlichen für Schalter 2 und 3 (sind dann vielleicht 6 und 4 Glühbirnen)
CDX

@M-Ott
prinzipiell ist das richtig. Aber aus der Aufgabenstellung geht nicht wirklich hervor, dass 1 Lampe durch mehrer Schalter eingeschalten werden kann.
Wenn es also nur um 3 Lampengruppen geht, geht es Wortweise. Ansonsten gebe ich dir Recht muss man schon etwas mehr Hirnschmalz hineinstecken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und wie wäre es mit:
Code:
L    L#1038  // oder sonst eine Zusammenschaltung der gewünschten Ausgänge
U    E0.0
UN   E0.1
UN   E0.2
SPB  OUTx
L    L#914235  // zweites Muster der Ausgänge
UN   E0.0
U    E0.1
UN   E0.2
SPB  OUTx
L    l#51038  // drittes Muster der Ausgänge
UN   E0.0
UN   E0.1
U    E0.2
SPB  OUTx
L    L#0  // alles wieder ausschalten, wenn keine Tastenkombination gedrückt ist
OUTx: T PAD0  // angenommen, die Lampen sind an A0.0 .....A3.3   angeschlossen
Wenn mehr als ein Eingang aktiviert werden kann, kann man auch noch mehr Kombinationen erreichen.
 
Mir ist noch nicht klar, wie ich mit 3 Schaltern 20 LEDs (Glühbirnchen sind zu energiefressend) halbwegs sinnvoll ansprechen soll.
...

Na stell dir vor, du brauchst 3 verschieden Intensitäten des Lichtstroms. Schalter 1 ist praktisch die Hauptlichtquelle mit 10 Lampen. Wenn das nicht reicht, kommen mit Schalter 2 beispielsweise noch 6 Lampen dazu. Respektive Schalter 3, wenn 16 Lampenn auch noch nicht reichen.
Rein theoretisch: stell dir vor du machst highspeed Kameraaufnahmen. Je höher die Bildzahl, desto mehr Ausleuchtung brauchst du. Statt der Lampen kann man sich ja auch gute LED's denken
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Entschuldigung dass ich mich so spät melde. Ich werds mir anschauen, danke.

1 Lampe kann nicht durch mehrere Schalter eingeschaltet werden. Wenn ich dem ersten Schalter 8 Bits zuweise dann sind die belegt. Im moment ist es so: E0.0 -》DB56.11.0 () parallel DB56.11.1 () KOP

Usw. ...

Ich könnte jetzt 8 Bits auslesen und diese der neu erstellten Variable vom Typ Word (oder DWord) zuweisen. Danach schreibe ich eine Zahl darauf um die Bits auf 1 zu setzen sobald der Eingang 1 ist.

Ja es sind LEDs keine Glühbirnen.
 
Zuletzt bearbeitet:
Welche CPU programmierst Du?

Für manche CPU gibt es Anweisungen zum Setzen/Rücksetzen aufeinanderfolgender Bits in Bitfelds (SET_BF/RESET_BF), die sehen zwar zunächst gut aus für schreibfaule ;) Programmierer, sind aber nicht besonders effizient und von Siemens nicht empfohlen. (und wie sieht es mit Querverweisen zu den betroffenen Bits aus??)

3 Verknüpfungen mit 20 einzelnen Zuweisungen an 20 Bits ist die einfachste, verständlichste, flexibelste und effizienteste Lösung.

Andere Versuche das "kürzer" zu lösen führen in Wahrheit zu einer weniger effizienten, aufwändigeren und unverständlichen Lösung. Für Wordverarbeitung braucht man günstigstenfalls 3 Zwischenmerker-Words mit 6 bedingten Zuweisungen und dann noch ein verodern (ggf. mit shiften) der 3 Words auf 2 Ausgangswords. Das wird auf keinen Fall effizienter als die bewährte Standard-Einzelbitzuweisungs-Lösung. Alternative umständliche Lösungen wären noch AWL-Sprungleiste, CASE, IF..THEN, indirekte Adressierung mit Anfangsadresse + Länge, ...

In Zeiten von symbolischer Adressierung und dem Hype nach "optimiertem" Speicher und sollte man sich solche "unsauberen" Programmiertricks aber gar nicht erst angewöhnen. In Industrietechnik sind meistens einfache Lösungen die Besten.

Harald
 
Hallo Harald,

warum braucht man denn 3 mal 20 Zuweisungen? Dann hätte man doch nur eine Auswahl der 3 Schalter, aber nie alle 20 Leuchten zusammen?
Ist es nicht einfacher man schreibt mit dem Schalter nur die Bits die man einschalten möchte, also Schalter 1 10 Zuweisungen usw...?
Nach den 2 Zeilen fällt mir ein, das müsste man dann mit Word-ODER machen? Hätte das dann einen Vorteil gegenüber der sparsamen Variante?
 
warum braucht man denn 3 mal 20 Zuweisungen?
Man braucht nicht 3 mal 20 Zuweisungen (das habe ich nicht geschrieben), sondern insgesamt 20 Zuweisungen, die man in 3 Verknüpfungen (z.B. 3 KOP-Netzwerken) organisieren kann:
- Schalter/Eingang 1 auf 10 Leuchten/Ausgänge
- Schalter/Eingang 2 auf 6 andere Leuchten/Ausgänge
- Schalter/Eingang 3 auf 4 andere Leuchten/Ausgänge

Ist es nicht einfacher man schreibt mit dem Schalter nur die Bits die man einschalten möchte, also Schalter 1 10 Zuweisungen usw...?
Ja genau so:
Code:
U Schalter_1
= LED_1
= LED_2
...
= LED_10

U Schalter_2
= LED_11
...
= LED_16

U Schalter_3
= LED_17
...
= LED_20

Nach den 2 Zeilen fällt mir ein, das müsste man dann mit Word-ODER machen? Hätte das dann einen Vorteil gegenüber der sparsamen Variante?
Bei Wordzuweisungen hat man das Problem, daß man nicht nur die mit LED belegten Bits/Ausgänge beeinflußt sondern alle 16 Bits des Ausgangswords. Und weil ziemlich wahrscheinlich die 3 LED-Gruppen nicht auf 3 unabhängige Ausgangsbaugruppen verteilt sind (wo nichts weiter dran ist als die LEDs), muß man die Words noch verodern (und vielleicht auch noch zusätzlich UND-maskieren). Dadurch wird aus der Einsparung von Zuweisungen (von den Schaltern) ein viel aufwändigeres Programm für die Zuweisungen an die Ausgänge.

Harald
 
Danke PN/DP für die ausführliche Antwort. Ich werde dann nichts weiter ändern. Das was ich machen wollte geht nicht.

Was genau meinst du was nicht geht?
So wie du geschrieben hast sollte es doch gehen. Wenn du das Bitmuster zu einer HexZahl kennst, kannst du es doch in deinem DB Speicher ablegen. Nur musst du dann eventl. alle 8 Kombinationen/Schalterstellungen berücksichtigen. Zum Schluss kannst du dein DB-Word dem Ausgangs-Word zuweisen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke dass es nicht geht, weil:

Wenn ich die Bits in meine neu erstellte Variable vom Typ Word kopiere und danach die Zahl darauf schreibe um mehrere Bits gleichzeitig ansprechen zu können dann würde ich doch etwas übrschreiben ...

Das mit den oder Bedingungen geht nicht weil es zuviele unterschiedliche Kombinationen wären. Das wird unübersichtlich ... es sind einfach zuviele.
 
Ich verstehe nicht warum du im nachhinein noch eine Zahl schreiben willst. Die schreibst du doch quasi zuerst in Abhängigkeit von deiner Schalterstellung:

Schalter 1 aktiv -> schreibe hex17 oder bin00010111-> dbWord (je nachdem mit welchem Zahlenformat du deine Variable füllen möchtest) dez23 würde auc gehen, aber dann musst du das int_to_word am besten machen, denke ich
Kopiere dbWord -> AusgangsWord

8 Kombinationen sind doch nicht viele, da macht man sich ne Tabelle in excel und kann die HexZahlen schön abschreiben. Dann sind es gerade mal ein paar Zeilen SCL code (17 oder so mit if und elsif und end_if)
Und diese tabelle kannst du ja dann immer wieder verwenden wo du bits in word wandeln möchtest. Die Dateiendung einfach wieder nach Excel ändern. Dann nach deinen Bedürfnissen anpassen
 

Anhänge

  • Excel bit word.xlsx.pdf
    38 KB · Aufrufe: 11
... Wenn du das Bitmuster zu einer HexZahl kennst, ...
Wenn man die BitMuster zu allen 16 1-stelligen HexZahlen kennt, kann man sie sich auch merken (das passiert eigentlich automatisch, wenn man häufiger damit zu tun hat und sich nicht allzu sehr dagegen sträubt)!
Und dann kann man auch ohne Excel und ohne den WindowsRechner sehr leicht BitMuster in HexZahlen und sogar HexZahlen in BitMuster umwandeln.
BitMuster einfach von rechts nach links in ViererGruppen aufteilen und dann jedes ViererGrüppchen durch die entsprechende HexZahl ersetzen.
Das ist sooo einfach und genau deshalb sind die HexZahlen bei (schreibfaulen) Programmierern sooo beliebt ;o)
Gruss, Heinileini
 
Zurück
Oben