Lauflicht

Golden Egg

Level-1
Beiträge
272
Reaktionspunkte
26
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo. Ich hab von meinem Meister eine aufgabe bekommen und blicke da nicht wirklich durch.
Ich hab ein Feld von 8x8 Lichter/Punkten/Elementen.
Jetzt sollen die Punkte erst zeilenweise von oben beginnend angehen und und anbleiben.
Ausgehen soll das ganze dann wieder vom Feld 0.0 aber spaltenweise.

s0s1s2s3s4s5s6s7
z0 . . . . . . . .
z1 . . . . . . . .
z2 . . . . . . . .
z3 . . . . . . . .
z4 . . . . . . . .
z5 . . . . . . . .
z6 . . . . . . . .
z7 . . . . . . . .

In diesem Zusammenhang hat er mir den Siemensdatentyp ARRAY erklärt.

Wenn die Formel:

z*Anzahl(s)
+s

anwende bekomme ich die genaue Adresse von jedem Feld heraus.

Ich hab mir jetzt 2 Zähler (einen für das Bit/Spalte; einen für das Byte/Zeile)......

Hab das Programm auf dem aktuellen Stand angehängt.

Vielleicht könnt ihr mir etwas helfen in welche Richtung ich weiter gehen muss. Aber ich bitte nur um Anhalspunke keine kompletten Lösungen.
Achja ich verwende den SIMATIC Manager V5.4
 

Anhänge

  • FB200.zip
    20,2 KB · Aufrufe: 47
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast du dir das Programm mal angeschaut?

Ich weiß nich wie ich dem Programm sage das wenn die z.B. die Lampe 44 laut Zähler angehen soll, das dann auch in einem DB der das Bit 5.4 von FALSE auf TRUE gesetzt wird......

Wie mache ich aus der 44 im Datentyp INT oder DINT oder WORD oder DWORD eine BOOL 5.4 bzw. wie spreche ich es an?
 
ne, das programm habe ich mir noch nicht angeschaut, mache ich wenn cih zeit habe.

warum ist lampe 44 bei dir dann das bit 5.4 (oder war das nur als beispiel zu verstehen)?

lampe 00 bit0.0
lampe 01 bit0.1
usw.
lampe 10 bit1.0
lampe 11 bit1.1
usw.

wäre doch sinnvoller, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hey,

arbeitet doch mit einem pointer. bei jedem schleifendurchlauf erhöhst du die adresse im db. du kannst dann ja mit dem zähler die adresse des pointers erhöhen. somit mußt du den db natürlich in der richtigen reihenfolge aufbauen.

db1.dbx0.0 lampe00
db1.dbx0.1 lampe01
db1.dbx0.2 lampe02
db1.dbx1.0 lampe10

usw.

habe soetwas auch noch nie gemacht, war jetzt nu7r ne idee. ob dies funkt ist ne andere sache!

bis denne
 
Danke für die Tipps. Lampe 10 ist nicht Bit 1.0 weil ich ja sonst Lampe 8 und 9 nicht mit berücksichtige. Es gibt ja kein bit 0.8 und 0.9 .
 
Hallo,
das mit dem Pointer funktioniert aber so wie von Nordkurve angerissen. Lies dir mal unter FAQ den Beitrag indirekte Adressierung durch. Der müßte schon vieles klären ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ok, damit liegst du richtig, hatte mir den text nicht wieder durchgelesen sondern oben nur auf deine darstellung geguckt! da hast du nur lampen 0-7.

solltest du das nicht hinbekommen, dann melde dich nochmal, dann werde ich mich auch mal dran probieren!

so, schöne pfingsten!
 
Traumhaft! Da fragt einer nach Lösungshilfen, statt nach fertigen Lösungen- dass ich das noch erleben darf :D

So nach dem ersten Gefühl würde ich jetzt 'n Pointer nehmen, dessen Byte-Adresse die Zeile ist und die Bit-Adresse die Spalte. Dann müsste es eigentlich ganz einfach sein.
Aber leider benutze ich die Pointer so selten, dass ich immer nachgucken muss :ROFLMAO: Und hier auf dem Laptop habe ich kein Step7...

Schriftfarbe Weiß, wenn du's nicht wissen willst, sonst markierst du den Text einfach mit der Maus ;) - so könnte der Quelltext für den Pointer aussehen:
L MW... //Zählerstand Zeile
SLD 3 //3 Bits nach links schieben
LAR1 //in Adressregister 1 laden
L MW... //Zählerstand Spalte
+AR // dazu addieren
AUF DB1 // DB öffnen
S DBW [AR1,P#0.0] //Adresse schreiben, oder:
R DBW [AR1,P#0.0] //beim Ausmachen

oder so ähnlich. So ungefähr, von der allgemeinen Idee her.

Man könnte auch die Zahl durch 8 teilen, hat dann die Spaltenadresse und der Rest, der beim Teilen überbleibt, ist deine Zeilenadresse, dann hättest du die Formel angewandt, die dein Meister dir gegeben hat. Für's Ausmachen kannst du ja Zeilen und Spalten tauschen.

Gruß, Tobias
 
Danke:D. Ach ja ich vergas zu sagen das das ganze in FUP oder KOP geschehen soll. AWL darf ich nicht verwenden:(
 
Keine Ahnung....ich soll es halt in kop oder fup machen.

Später soll das Programm auch mit anderen Abmessungen funktionieren z.B. 7x10 Felder/Lampen.
 
Hmm ich sas jetzt ein ganz schönes stück und kam nicht wirklich weiter.:confused: Hab ein paar Sachen ausprobiert die aber alle im leeren endeten.

Need Help:!:

So, hier mal eine komplette Lösung der Aufgabe. :)

Zu meinem Programm:

Als Lösung der Aufgabe bietet sich die indirekte Adressierung an. Der FB100 ist daher in AWL geschrieben, da sich die indirekte Adressierung nur in AWL effektiv programmieren lässt. Das AWL-Programm in ein FUP-Programm umzusetzen, wäre meiner Meinung nach nicht empfehlenswert, da das Programm viel zu unübersichtlich werden würde.

In meinem Programm ist die Anzahl der Zeilen und Spalten variabel. Die Anzahl kann im OB1 am FB100 verändert werden. Der Eintrag ZEILE_MAX=7 bedeutet, dass es die Zeilen 0 bis 7 gibt, und der Eintrag SPALTE_MAX=7 bedeutet, dass es die Spalten 0 bis 7 gibt.

Die Schaltzustände der Lampen werden im DB120 gespeichert. Auch die Nummer des DB ist variabel und kann im OB1 am FB100 verändert werden. Je nach Anzahl der Zeilen und Spalten muss aber die Größe des DB gegebenenfalls angepasst werden.

Vielleicht hilft Dir mein Programm ja bei der Lösung der Aufgabe etwas weiter. :rolleyes:

Gruß Kai
 

Anhänge

  • OB1.pdf
    7,9 KB · Aufrufe: 100
  • OB100.pdf
    3,2 KB · Aufrufe: 61
  • FB100.pdf
    9,1 KB · Aufrufe: 99
  • DB120.pdf
    3,3 KB · Aufrufe: 58
  • Lauflich.zip
    33,8 KB · Aufrufe: 102
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke nochmal für die Mühe.

Mein Meister hat mir aber nochmal einen kleinen aber gewichtigen Tipp in Bezug auf den Datentyp ARRAY gegeben und das ist dabei raus gekommen.

P.S.: Wäre nicht schlecht wenn es einen Bereich im Forum gäbe wo erfahrene Programmierer Übungsaufgaben rein stellen würden.
 

Anhänge

  • OB1.pdf
    15,9 KB · Aufrufe: 39
  • FB200.pdf
    22,6 KB · Aufrufe: 45
  • FC200.pdf
    16,6 KB · Aufrufe: 40
  • DB10.pdf
    13,8 KB · Aufrufe: 28
  • Laufla_1.zip
    332,2 KB · Aufrufe: 39
Zuletzt bearbeitet:
Das Drama geht weiter.

Jetzt soll ein Feld von 12 x 12 Lampen an und aus gehen.

Ich hab das Programm auf 12 x 12 umgestellt in dem ich einfach einen neuen Array im db mit dem Datenbereich [0..11,0..11] erstellt habe und an den ob 1 die neue Anzahl der Zeilen und Spalten ran geschrieben habe.

Der Zähler zählt auch bis 143 hoch aber das Feld 143 wird nie gesetzt.
Ich hab beobachtet das wenn die erste Zeile gesetzt wurde, der Zähler weiter macht ohne das im DB die zweite Zeile gesetzt wird. Nach ca 4 Zählungen wo nix passiert ist wird dann auf einmal das erste Feld der nächsten Zeile gesetzt.
---> Am Ende ist der Zähler auf seiner 143 aber 3 Zeilen wurden noch nicht gesetzt.

Ich hab nachfolgend mal meinen db 10 für die Lampen angehängt.

Mir ist aufgefallen das 144 : 8 = 18 --> genau ab diesem Byte werden dann meine Lampen nicht weiter gesetzt. :rolleyes:

Dummer Zufall?
 

Anhänge

  • DB10.pdf
    27 KB · Aufrufe: 39
Zuletzt bearbeitet:
Du must beachten dass auch ein Bit-Array nach der Wort-Syntax im DB angelegt wird. Das heißt, du erzeugst (in Wirklichkeit) kein 11 x 11 Array sondern ein 16 x 11 Array. Vielleicht siehst du dir hierzu mal die Adresse im DB genauer an ... (Ansicht -> Datensicht).
 
Zurück
Oben