Frage zu SPB

mega_ohm

Level-2
Beiträge
673
Reaktionspunkte
45
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe folgendes Problem:
Code:
[SIZE=1]U( [/SIZE]
[SIZE=1]U "E0.1"             // Schmierverteiler- Ini[/SIZE]
[SIZE=1]FP "FM120.0"      // als Flanke[/SIZE]
[SIZE=1]U "A2.0"             // und "Pumpe läuft[/SIZE]
[SIZE=1]U "M102.0"         // und Kass.1 aktiv[/SIZE]
[SIZE=1]UN "M104.0"       // und nicht fertig[/SIZE]
[SIZE=1]= "M200.0"[/SIZE]
[SIZE=1]) [/SIZE]
[SIZE=1]L "MB200" [/SIZE]
[SIZE=1]==I                   // Wenn gleich 0[/SIZE]
[SIZE=1]SPB m4_1          // dann mache nix[/SIZE]
 
[SIZE=1]// ... hier steht dann der Rest des NW[/SIZE]
 
[SIZE=1]m4_1: NOP 0[/SIZE]
Das funktioniert so.

Code:
[SIZE=1]U( [/SIZE]
[SIZE=1]U "E0.1"             // Schmierverteiler- Ini[/SIZE]
[SIZE=1]FP "FM120.0"      // als Flanke[/SIZE]
[SIZE=1]U "A2.0"             // und "Pumpe läuft[/SIZE]
[SIZE=1]U "M102.0"         // und Kass.1 aktiv[/SIZE]
[SIZE=1]UN "M104.0"       // und nicht fertig[/SIZE]
[SIZE=1]= "M200.0"[/SIZE]
[SIZE=1]) [/SIZE]
[SIZE=1]UN "M200.0"[/SIZE]
[SIZE=1]SPB m4_1          // dann mache nix[/SIZE]
 
[SIZE=1]// ... hier steht dann der Rest des NW[/SIZE]
 
[SIZE=1]m4_1: NOP 0[/SIZE]
Das funktioniert nicht.

Warum ist das so ?
Ich kann mich mit der 1. Variante überhaupt nicht anfreunden (auch wenn sie funktioniert), weil ich für eine Bitabfrage nicht ein ganzes Byte "verbraten" kann. In diesem Byte mehrere Bits zu hinterlegen, würde die Sprung-Bedingung 'aushebeln'.
 
Die erste Variante ist ja vollkommen abenteuerlich, so sollte man nicht programmieren. :icon_eek:

Und nun zu Deiner zweiten Variante, hast Du mal folgendes probiert (einfach die Klammer weglassen):

Code:
U  "E0.1"        // Schmierverteiler- Ini
FP "FM120.0"     // als Flanke
U  "A2.0"        // und "Pumpe läuft
U  "M102.0"      // und Kass.1 aktiv
UN "M104.0"      // und nicht fertig
=  "M200.0"
 
UN "M200.0"
SPB m4_1         // dann mache nix
 
// ... hier steht dann der Rest des NW
 
m4_1: NOP 0

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst auch folgendes programmieren:

Code:
      U  "E0.1"        // Schmierverteiler- Ini
      FP "FM120.0"     // als Flanke
      U  "A2.0"        // und "Pumpe läuft
      U  "M102.0"      // und Kass.1 aktiv 
      UN "M104.0"      // und nicht fertig
      SPB m4_1
      SPA m4_2         // dann mache nix
m4_1:                  // ... hier steht dann der Rest des NW
 
m4_2: NOP 0

Gruß Kai
 
Hallo,

wie es funktioniert hat dir Kai gezeigt.

Aber du hast ja auch gefragt warum Ver.1 funktioniert und Ver.2 nicht.

Dein erstes Netzwerk funktioniert nur durch Zufall, denn du vergleichst dein MB200 mit dem Wert der vor "L MB200" im Akku 1 stand. (Akt. Akku 2)
Mit den Binäranweisungen beeinflusst du den Akku nicht.
Müsstest noch L 0 vor dem Vergleicher schreiben, damit es sicher funktioniert. Aber so was macht (für mich) erst mal keinen Sinn.

Beim zweiten Netzwerk ists die Klammer, wie Kai sagt, denn der Sprung wird nur ausgeführt, wenn das U(Klammer), und das UN(M200.0) VKE1 liefert.
Dies ist bei deinem Beispiel ausgeschlossen.
Wenn nämlich die Bedingungen in der Klammer da sind kommt =M200.0, was aber gleich darauf auf UN abgefragt wird -> kein SPB

Hoffe das war verständlich.

Gruß Micha
 
Die erste Variante ist ja vollkommen abenteuerlich, so sollte man nicht programmieren. :icon_eek:

Und nun zu Deiner zweiten Variante, hast Du mal folgendes probiert (einfach die Klammer weglassen):

Code:
U  "E0.1"        // Schmierverteiler- Ini
FP "FM120.0"     // als Flanke
U  "A2.0"        // und "Pumpe läuft
U  "M102.0"      // und Kass.1 aktiv
UN "M104.0"      // und nicht fertig
=  "M200.0"
 
UN "M200.0"
SPB m4_1         // dann mache nix
 
// ... hier steht dann der Rest des NW
 
m4_1: NOP 0

Gruß Kai
"Abenteuerlich" und "zufällig" stimmt nicht ganz.
Ich schreibe ja (leider) in dieses MB nix anderes.
Es ist die "Methode mit der Brechstange".
Das man so nicht programmieren sollte, ist mir (sowas von glas-)klar.

Deinen Vorschlag, (ohne Klammer) werde ich mal probieren....

Erst einmal vielen Dank für Deinen Tipp...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wie es funktioniert hat dir Kai gezeigt.

Aber du hast ja auch gefragt warum Ver.1 funktioniert und Ver.2 nicht.

Dein erstes Netzwerk funktioniert nur durch Zufall, denn du vergleichst dein MB200 mit dem Wert der vor "L MB200" im Akku 1 stand. (Akt. Akku 2)
Mit den Binäranweisungen beeinflusst du den Akku nicht.
Müsstest noch L 0 vor dem Vergleicher schreiben, damit es sicher funktioniert. Aber so was macht (für mich) erst mal keinen Sinn.

Beim zweiten Netzwerk ists die Klammer, wie Kai sagt, denn der Sprung wird nur ausgeführt, wenn das U(Klammer), und das UN(M200.0) VKE1 liefert.
Gruß Micha
Eigentlich ist das Progi 'fast' baugleich.
Der Unterschied ist, das es mit einer Abfrage eines kompletten Bytes funktioniert, mit der Abfrage eines Bits aber nicht.

Ich dachte,
Code:
[SIZE=1]UN "M200.0"[/SIZE]
[SIZE=1]SPB m4_1          // dann mache nix[/SIZE]
wäre sinngemäß (über die Unsinnigkeit, ein MB für ein gesetztes Bit zu 'verbraten', möchte ich jetzt nicht diskutieren...
sie ist mir klar, sonst hätte ich die Frage nicht gestellt)
das Gleiche wie
Code:
L 0
[SIZE=1]L "MB200" [/SIZE]
[SIZE=1]==I                   // Wenn gleich 0[/SIZE]
[SIZE=1]SPB m4_1          // dann mache nix[/SIZE]

Das ist die einzigste Änderung (!!!) mit dem Unterschied, daß die 1. Variante nicht, die 2. Variante aber sehr gut funktioniert...

Ich habe gerade festgestellt, daß mir im Quelltext eine Zeile ( L 0) unterschlagen wurde.
Ich hatte das Progi (ausschnittsweise, eben um Tippfehler zu vermeiden mit <Strg+C>, <Strg+V> kopiert.
Also hier nochmal der (hoffentlich) komplette Prg-Text für die funktionierende Variante:
Code:
[SIZE=1]// Kass. 1
U( 
U "E0.1" // Schmierverteiler- Ini
FP "FM120.0" // als Flanke
U "A2.0" // und "Pumpe läuft
U "M102.0" // und Kass.1 aktiv
UN "M104.0" // und nicht fertig
= "M200.0"
) 
[COLOR=red]L "MB200" // Für Vergleich MB200 laden (da ist M200.0 drinn :-)[/COLOR]
L 0 // Auswertung nur von M200.0 funzt nicht. k.A., warum nicht
==I // Wenn gleich 0
SPB m4_1 // dann mache nix
L DB 3.Hub_1 // sonst Zähler 1 laden
L 1 // mit 1 Inc.
+I 
T DB 3.Hub_1 // schreiben
L DB 3.Hub_ges // Gesamt- Zähler laden
L 1 // Inc
+I 
T DB 3.Hub_ges // und zurückschreiben
L DB 3.Hub_1 // Zähler 1 laden
L 4 // mit 4 vergleichen
<I // wenn kleiner dann mache nix, 
SPB m4_1 // sonst
= "M104.0" // Bit "Schmierung fertig setzen"
L DB 3.Hub_1 // Zähler 1 wieder löschen
L 0
T DB 3.Hub_1
R "M104.4" // Fehlermeldung löschen
m4_1: NOP 0
[/SIZE]
 
Zuletzt bearbeitet:
das problem liegt an diesen anweisungen.
U(
)
deine zuweisung befindet sich innerhalb der klammer!

du verknüpfst also die anweisungen in der klammer mit der anweisung vor dem sprung.
d.h. du springst nur dann wenn die klammer vke 1 liefert und m200.0 0-signal hat.
 

Anhänge

  • Zwischenablage05.gif
    Zwischenablage05.gif
    6 KB · Aufrufe: 9
Zurück
Oben