TIA Lauflicht mit 16 Lichter

Zuviel Werbung?
-> Hier kostenlos registrieren
In deinem Codebeispiel sind "Taktmerker" und die Hilfsvariable für die positive Flanke ein und dieselbe Variable:
U "Taktmerker"
FP "Taktmerker"

Das funktioniert nicht. Hinter FP muss eine separate Variable stehen. Diese Variable darf auch sonst nicht verwendet werden.
 
In deinem Codebeispiel sind "Taktmerker" und die Hilfsvariable für die positive Flanke ein und dieselbe Variable:


Das funktioniert nicht. Hinter FP muss eine separate Variable stehen. Diese Variable darf auch sonst nicht verwendet werden.


Danke vielmals jetzt funktioniertes endlich :) auch wenn ich nicht ganz verstehe wieso da eine variable hin muss die sonst nirgends ist.

Behüte dein Nokia :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einfach mal in der Hilfe nachlesen, eine Flanke benötigt einen Hilfsmerker vom Typ Bool um zu speichern, das dein Bit bei dem die Flanke ausgewertet werden
soll da war.

Behüte dein Nokia :smile:
Ich nutze es tatsächlich noch, allerdings muss ich es bald aufgeben da ich SMS von
Smartphones nicht mehr empfangen kann. Sobald dort jemand ein Symbol einfügt
kommt bei mir nur noch eine SMS das jemand eine SMS geschickt hat, aber ein Fehler
aufgetreten ist. Und ich weiß nicht wer was geschickt hat.
 
Hallo – ich verstehs nicht,
nachdem dein Programm funktioniert, du es aber noch nicht richtig verstehst, hier mal meine Erklärung auf der Basis meines Posts #5:

  • Mit einer Flanke des START-Befehls wird ein Bit des Schieberegisters auf 1 gebracht.
Befehlsfolge: U E 0.0 // E0.0 sei der Starttaster
FP M1.0 // M1.0 ist der Flankenmerker, nicht die Flanke selbst
S A 0.7 // A0.7 sei der erste Ausgang der leuchtet. Hier muss der Setzbefehl
// genommen werden, überlege selbst – warum!

  • Der ständig laufende Taktgeber bildet ebenfalls ein Flankensignal
Befehlsfolge: U M 200.5 // MB 200 sei hier das Taktmerkerbyte, Bit 5 taktet mit 1 Hz.
FP M1.1 // M1.1 ist hier wieder der Flankenmerker
= M1.2 // M1.2 ist die Flanke, sie seht für genau einen Zyklus auf 1

  • Mit diesem wird das Schieberegister um 1 Position z.B. nach rechts rotiert (nicht geschoben!)
  • Das Schieberegister wird über L(aden) und T(ransferieren) in jedem SPS-Zyklus auf das Ausgangswort ausgegeben
Befehlsfolge: UN M1.2 // Wenn kein Flankensignal, dann springe
SPB ENDE // an das Programmende. Wenn aber M1.2=1 dann…
L AD0
RRD 1 // um 1 Position nach rechts rotieren
T AD0
ENDE: NOP 0
Noch ein paar Erklärungen:

  • Es gibt keinen Befehl, der nur 16 Bit rotiert, deshalb hier RRD. Dieser Befehl rotiert 32 Bit.
  • Falls es wirklich nur 16 Bit sein sollen, kann man über Merker und ein paar Tricks die Lösung erzwingen, z.B. so:
O M12.0// soll mal dem A0.0 entsprechen
O M 14.0// entspricht dem A2.0
= A 0.0// A0.0 wird also von 2 Bit des DW 12 angesteuert. Diese 3 Befehle müsste man 16 mal für A0.0 bis A1.7 entsprechend anpassen.

  • Wenn der Wechsel schneller passieren soll, dann einfach ein anderes Taktmerkerbit nehmen.
  • Mache dir vor allem klar, wie bei der SPS die einzelnen Byte angeordnet sind, wenn sie als Wort oder Doppelwort verwendet werden.
eNDe
 
Ich dachte für einen Anfänger ist es erst mal leichter und unproblematischer, wenn man die Variable nicht weiter benutzt.
Allerdings, Michael!
Man kann hier im Forum immer wieder beobachten, wie schwer es vielen (nicht nur Anfängern) fällt, die FlankenErkennung mit FP bzw. FN wirklich zu verstehen und richtig anzuwenden. Ich fühle mich jedesmal in meiner Meinung bestätigt, dass man "Einsteigern" zunächst die "zu-Fuss-Programmierung" (ohne FP und ohne FN) der FlankenErkennung "einbläuen" sollte. Wenn sie dann eines Tages entdecken, dass die Verwendung von FP oder FN ein klein wenig SchreibArbeit gegenüber der zu-Fuss-Lösung einspart, dürfen sie gerne bevorzugt FP und FN (also quasi die "Steno-Schreibweise") verwenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
  • Mit diesem wird das Schieberegister um 1 Position z.B. nach rechts rotiert (nicht geschoben!)
  • Befehlsfolge: UN M1.2 // Wenn kein Flankensignal, dann springe
    SPB ENDE // an das Programmende. Wenn aber M1.2=1 dann…
    L AD0
    RRD 1 // um 1 Position nach rechts rotieren
    T AD0
    ENDE: NOP 0

    eNDe


  • Hallo eNDe


Dank deiner Erklärung konnte ich mein Problem lösen das ich immer nach einem Durchgang das erste Bit wider setzen lassen musste
und ich verstehe jetzt den Flankenmerker viel besser.(falls es jemandem hilft, mir ist da der vergleich mit dem FUP aufgefallen)

Aber es passiert immer etwas komisches beim Übergang Zwischen MW10 und MW11(mein verwendetes Zähler Doppelwort), da entsteht manchmal eine lange pause in der alle Bits verschwinden, manchmal verschwindet es ganz und manchmal werden für einen kurzen abschnitt immer 2 Bits gleichzeitig gesetzt.

Weiss jemand woran das liegen könnte?:confused:

Gruss Maik:rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... MW10 und MW11(mein verwendetes Zähler Doppelwort), ...
Moin Maik!
Michael hat es schon gesagt, aber hier noch etwas ausführlicher:
MW10 besteht aus MB10 und MB11,
MW11 besteht aus MB11 und MB12.
Das sind insgesamt nur 3 Byte (wegen der Überschneidung) und die reichen nicht für ein Doppelwort.

Edit:
Code:
MW10 : MB10 MB11
MW11 :      MB11 MB12
MW12 :           MB12 MB13
MD10 : MB10 MB11 MB12 MB13
MD10 :   MW10      MW12
 
Zuletzt bearbeitet:
gute Idee aber kann ich doch erst wenn ich`s wirklich verstanden hab :)



hier auf dem Bild siest du ein Beispiel davon, wenn es in der Mitte ist (wechsel von M10.7 zu M11.0) spinnt es herum und setzt entweder 2 Bits oder oder es ist keines gesetzt für eine zeit lang

Unbenannt.PNG


lg der der noch nicht alles versteht


ps. entschuldige für meine vielen nachfragen (habe sehr lange herumprobiert ohne etwas nachzufragen und bin so einfach auf keinen grünen Zweig gekommen)

und danke für die viele hilfe
 
Dein Programmcode sieht irgendwie nicht komplett aus. Was kommt nach der Zeile mit dem "end: ..."?

Wird Dein MD10 "Laufbits" auch mal irgendwann auf 0 gelöscht? (notfalls mit einer Variablentabelle)
Weil Du zum Schieben RLD verwendest, werden 1-Bits nicht aus dem MD10 verschwinden, sondern sie rotieren von M10.0 bis M10.7 und tauchen danach im M13.0 auf um bis zum M10.7 zu rotieren usw., und bei jedem S "Lampe 1" (M10.0) werden es wohl immer mehr 1-Bits.

Nimm Dir einen Zettel und einen Stift (oder Notepad) und male auf, was bei Deinem Programm bei jedem "RLD 1" passiert, z.B. so:
Code:
MB10     MB11     MB12     MB13
76543210 76543210 76543210 76543210
-----------------------------------
00000001_00000000_00000000_00000000
00000010_00000000_00000000_00000000
00000100_00000000_00000000_00000000
...
10000000_00000000_00000000_00000000
00000000_00000000_00000000_00000001
00000000_00000000_00000000_00000010
...
... und nun setze das Bit M10.0 irgendwann auf 1 und male weiter...

Harald
 
Code:
U "Start Taster"
U "Taktmerker"
TP "Hilfvariabele positive Flankauswertung"
= "Positiver"Flankauswertung Taktmerker"
SPBN end

U(
L "Laufbits"
L 0
==I
)
= "Lampe 1"  // Wenn keine Lampe Ein  Lampe 1 einschalten und spung nach end.
SPB end

// Laufbits 1 nach links rotieren.
L "Laufbits"
[COLOR=#0000ff]RLW 1 [/COLOR]     // Laufbits ist ein WORD und kein DWORD
T "Laufbits"
end: U "Hilfsmerker end"'


Code:
U "Rücksettung"
FP "Flankmerker Rücksettung"
SPBN xxxx
// Alle Lampen Aus

L 0
T "Laufbits"
xxxx: = "Dummy"  // Temp var  "Dummy"  BOOL
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ein Befehl RLW 1 ist mir nicht bekannt.
Damit "ich verstehs nicht" zum Kollegen "jetzt versteh ichs" wird, hier noch einmal mein Programmvorschlag
Code:
Netzwerk 1 
 U    E         0.0              // EIN mit Starttaster 
        FP   M         1.0              // FlaMe des Starttasters 
        =    M         1.1              // Pos. Flanke des Starttasters 
        UN   M         1.1              // Wenn kein Startimpuls, 
        SPB  Ma1   // dann springe
       L    0                          // ansonsten... 
        T    MD       10                // lösche MD10 
        S    M        13.0              // setze danach Bit M13.0 
Ma1:    NOP  0
Netzwerk 2
 U    M       200.5              // ein beliebiges Bit des Taktmerkerbytes 
        FP   M         1.2              // FlaMe des Taktbits 
        =    M         1.3              // pos. Flanke des Taktbits
Netzwerk 3
        UN   M         1.3              // Wenn keine Taktflanke, 
        SPB  ENDE   // dann sprige
        L    MD       10                // ansonsten MD 10 in Akku laden 
        RLD            1                // Akkuinhalt 1 mal nach links rotieren 
        T    MD       10                // Egebnis wieder nach MD 10 transferieren 
ENDE:   NOP  0
Netzwerk 4
        L    MW       10                // MW 10 laden nach Akku1 
        L    MW       12                // MW12 laden nach Akku1, gleichzeitig Akku2 := Akku1  
        OW                              // beide Akkuinhalte verodern 
        T    AW        0                // Ergebnis zum "Lampen-Wort" transferieren.
Netzwerk 5
 // Hinweise: 
 // Im NW 1 wird dafür gesorgt, dass auch bei mehrfachem Startbefehl wirklich nur ein Bit leuchtet 
 // Im NW 4 werden die 32 Bit des MD10 auf die 16 Bit des AW0 komprimiert 
 // Ich bevorzuge Programme, die klar strukturiert sind !!! 
 // Und bitte die Kommentare nicht vergessen !
eNDe
 
Code:
[COLOR="#008000"]//mit Takt Bits aufsteigend schieben[/COLOR]
      U    "Taktmerker"
      FP   "Flankenmerker"
[COLOR="#008000"]//      =    "Taktpuls"[/COLOR]
[COLOR="#008000"]//      U    "Taktpuls"[/COLOR]
      U    "LaufFreigabe"
      SPBN chk
      L    "Laufbits16" [COLOR="#008000"]//z.B. MW10[/COLOR]
      SLW  1            [COLOR="#008000"]//geht auch: SLD 1, RLD 1[/COLOR]
      T    "Laufbits16"

[COLOR="#008000"]//wenn kein 1-Bit dann mit niedrigstem Bit neu anfangen[/COLOR]
chk:  L    "Laufbits16"
      L    0
      ==I
      SPBN aus
      L    1
      T    "Laufbits16"

[COLOR="#008000"]//Ausgabe A0.0 - 0.1 ... 0.7 - 1.0 - 1.1 ... 1.7 - 0.0 ...[/COLOR]
aus:  L    "Laufbits16"
      TAW              [COLOR="#008000"]//Bytes tauschen, damit bei Start mit A0.0 anfängt[/COLOR]
      T    AW0

Harald
 
Zurück
Oben