# Lauflicht



## Golden Egg (24 Mai 2007)

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


----------



## Nordkurve (24 Mai 2007)

was ist denn nun deine genaue frage dazu.


----------



## Golden Egg (24 Mai 2007)

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?


----------



## Nordkurve (24 Mai 2007)

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?


----------



## Rumo (24 Mai 2007)

Schaum mal hier rein
http://www.sps-forum.de/showthread.php?t=13264

Möglicherweise hilft dir der Eintrag von mir mit dem Titel "neue Möglichkeit" weiter. Dort bescheibe ich den Zusammenhang von DWORD und Bit-Adressierung.


----------



## Nordkurve (24 Mai 2007)

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


----------



## Golden Egg (24 Mai 2007)

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 .


----------



## Larry Laffer (24 Mai 2007)

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 ...


----------



## Nordkurve (24 Mai 2007)

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!


----------



## TobiasA (25 Mai 2007)

Traumhaft! Da fragt einer nach Lösungshilfen, statt nach fertigen Lösungen- dass ich das noch erleben darf  

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  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


----------



## Golden Egg (25 Mai 2007)

Danke. Ach ja ich vergas zu sagen das das ganze in FUP oder KOP geschehen soll. AWL darf ich nicht verwenden


----------



## Nordkurve (25 Mai 2007)

will jetzt aber kein besserwisser sein, nur ein hinweis, es müßte im awl code +ar1 (+ar) heißen.

hey golden egg, in fup oder kop bekommst das hin?

bis denne


----------



## Golden Egg (25 Mai 2007)

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.


----------



## Nordkurve (25 Mai 2007)

probier dich halt erstmal, ansonsten weißt du ja, wo du hilfe bekommst!*G

bis denne


----------



## Golden Egg (25 Mai 2007)

Hmm ich sas jetzt ein ganz schönes stück und kam nicht wirklich weiter. Hab ein paar Sachen ausprobiert die aber alle im leeren endeten. 

Need Help:!:


----------



## TobiasA (25 Mai 2007)

Nordkurve schrieb:


> will jetzt aber kein besserwisser sein, nur ein hinweis, es müßte im awl code +ar1 (+ar) heißen.
> 
> hey golden egg, in fup oder kop bekommst das hin?
> 
> bis denne


 
Ups. Stimmt. So funzt des nicht.

Aber davon ab: Sowas geht auch in KOP?

Gruß, Tobias


----------



## Kai (26 Mai 2007)

Golden Egg schrieb:


> Hmm ich sas jetzt ein ganz schönes stück und kam nicht wirklich weiter. 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.  

Gruß Kai


----------



## Golden Egg (1 Juni 2007)

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.


----------



## Golden Egg (11 Juni 2007)

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. 

Dummer Zufall?


----------



## Larry Laffer (11 Juni 2007)

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).


----------



## Golden Egg (11 Juni 2007)

Ich erzeuge doch aber mit meinem Zähler eine indirekte Adresse. Bzw. ich weise sie indirekt zu.

12 --> Lampe 0,11 ---> bit 1.3 wird gesetzt

oder 

13 --> Lampe 1,0 ---> bit 2.0 wird gesetzt.....

oder nicht?


----------



## Larry Laffer (11 Juni 2007)

Aber in dem ursprünglichen FC200 von Kai wird einfach nur Zeile mit Spalte multipliziert. Das wäre für deine aktuelle Anwendung falsch und hatte eigentlich auch nur für den damaligen Fall (8 x 8) funktioniert, weill du dadurch in der Matrix Bit-Byte-Word bleibst.
In aktuellen Fall musst du bei der Pointer-Berechnung mit 16 multiplizieren, damit es wie in deinem DB wird. Oder du baust eine Routine, die dir den Spaltenwert auf vielfache von 8 hochrundet ...


----------



## Golden Egg (11 Juni 2007)

Larry Laffer schrieb:


> In aktuellen Fall musst du bei der Pointer-Berechnung mit 16 multiplizieren, damit es wie in deinem DB wird. Oder du baust eine Routine, die dir den Spaltenwert auf vielfache von 8 hochrundet ...



Wenn ich das mache gehen meine Lampen spaltenweise an.........und das ist nicht jenes Problem welches ich habe.


----------



## Larry Laffer (11 Juni 2007)

Ich beziehe mich auf den folgenden Satz :



Golden Egg schrieb:


> 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. N*ach ca 4  Zählungen wo nix passiert* ist  wird dann auf einmal das erste  Feld der nächsten Zeile gesetzt.



Schau doch mal in deinen DB, welche Bits in den 4 Takten, wo nichts passiert, gesetzt werden. Du wirst dann sehen, dass es die in jeder Zeile (Spalte ?) noch fehlenden 4 Bits innerhalb des zuständigen Bytes sind ...


----------



## Golden Egg (11 Juni 2007)

Danke .... wenn man darüber nachdenkt ist es doch logisch!:sc4:


----------

