Out-Bereich eines FB einlesen

ChristianPaier

Level-1
Beiträge
44
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

folgende Thematik: Ich hab einen FB der neben anderen, 3 Ausgänge hat bei denen ich überwachen muss ob es irgendeine Änderung gibt. Das mit 6 Flanken 3x positiv, 3x Negativ) zu machen = aufwendig und unschön.

Ich hab mir also gedacht, einfach bei jedem zyklus des Wort vom Ausgangsbereich zu sichern und es im nächsten Zyklus zu vergleichen. (Gegebenenfalls noch mit OW ausmaskieren).

Die goldene Frage nun: wie kann ich dieses OUT-Word auslesen?

mfg
 
Du suchst dir die Wortgrenze in deinen Outdaten.

Dort steht z.Bsp. ein Bit.

Dann

L P##Erstes_Bit_an_Wordgrenze
LAR1 (Adresse Ins AR1 laden)

Nun kannst z.Bsp. mit

L W[AR1, P0.0]

dieses komplette Wort laden und hinspeichern wohi du willst. Deine Bits sind dann an der ensprechenden Stelle irgendwo in dem Wort.

Was ich hier schreib gilt für FB, die nicht als Multiinstanzen eingesetzt werden.
 
Zuletzt bearbeitet:
Du meintest bestimmt

L DIW[AR1, #P0.0]

Der Out-Bereich eines FB liegt ja nicht in den Lokaldaten.
Ist es in diesem Fall überhaupt nötig den Speicherbereich "DI" mit anzugeben?

L W[AR1, #P0.0]

sollte doch so funktionieren, das "DI" steht doch durch den Pointer ohnehin schon im AR1.
Oder irre ich mich jetzt? :confused:
 
Ich habs mal so probiert aber leider ohne erfolg. Wenn ich einen Ausgang schalte ändert sich dass ausgelesene Wort leider nicht.

Code:
      L     #Outword              //Wort in dem das OUT-Word gespeichert werden soll
      LAR1  P##Bereit            //Erstes bit im OUT-Bereich
      L     DIW [AR1,P#0.0]
      L     28
      UW                             //Restliche Bits ausmarkieren
      <>I   
      S     #HM_umschalten   //Aktion bei Änderung

      T     #Outword
 
Zuletzt bearbeitet:
@ Larry: Ja auch wenn um Any-Pointer und das verschieben von Daten ging. Hier war meine Frage wie ich auf den OUT-Bereich zugreifen kann.

Ich wusste nicht das man das auch über Pointer lösen muss. Ich dacht das geht ähnlich wie bei den Lokaldaten wo man zb mit L LW0 arbeiten kann.

Bleibt nur noch die Frage was bei obigem Code von mir falsch ist. Ich lese nämlich immer 0 aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst auch direkt darauf zugreifen ...
Aber ... wann beschreibst du denn dein OUTWORD und mit was ?
Zeig doch mal den ganzen FB mit seinem Aufruf / Beschaltung ...
 
Direkt kann ich aber nur auf die jeweiligen Variablen im Outbereich (in diesem Fall 3 Bits) zugreifen oder irre ich.

Das sieht dann so aus...

Ich muss feststellen wann sich die Ausgänge Q_Mot_Y, Q_Mot_D, Q_Mot_YY ändern. Is'n Motorbaustein für ein Drehkolbengebläse mit Dahlanderschaltung.
 

Anhänge

  • sc_1.JPG
    sc_1.JPG
    160 KB · Aufrufe: 28
  • sc_2.JPG
    sc_2.JPG
    138 KB · Aufrufe: 26
Zuletzt bearbeitet:
Und wenn ich richtig geguckt habe, ruft er seinen FB als Multiinstanz auf.
Bei Multiinstanzen und verwenden des AR1 musste man doch einen Adressoffset im AR2 berücksichtigen.
Ich meine mich an sowas erinnern zu können....
 
@OHGN:
Das mit dem Outword stelle ich mir auch in etwa so vor - aber wo ist es abgelegt.

@Christian:
Bedenke bitte, dass die OUT-Bits deines FB's nichts mit den von aussen angeschalteten Merkern zu tun haben. Die zählen eigenständig.
Das Bit "Bereit" steht somit auf Bit-Adresse 0, das nächste darauf folgende auf 1 dann 2 usw.
Vielleicht ist das ja der Knackpunkt ...
 
@Westermann:
:confused::confused::confused:
Ich stehe gerade etwas auf der Strippe ... was soll uns dein Beitrag sagen ?

@OHGN:
Der Einwand mit dem AR2 ist natürlich berechtigt ...
 
@OHGN:
Das mit dem Outword stelle ich mir auch in etwa so vor - aber wo ist es abgelegt.

Das liegt natürlich als INT im Statischen teil des FB's. Ich möchte mir damit den letzen Zustand der drei Ausgangsbits speichern (am einfachsten in dem ich gleich das ganze wort lese) und diese Bits dann im nächsten Zyklus mit dem zuletzt gespeicherten Wert (Das Wort von vorhin) vergleichen: Hat sich wass geändert oder nicht. (Der Vergleich findet natürlich im FB statt)

@OHGN:
@Christian:
Bedenke bitte, dass die OUT-Bits deines FB's nichts mit den von aussen angeschalteten Merkern zu tun haben. Die zählen eigenständig.
Das Bit "Bereit" steht somit auf Bit-Adresse 0, das nächste darauf folgende auf 1 dann 2 usw.
Vielleicht ist das ja der Knackpunkt ...

Deshalb maskiere ich das Wort auch mit 28 (0000000000011100). Damit mir die bieiden anderen Bits (Bereit und Pause) den Vergleich nicht beeinträchtigen. Klar das das mit der äußeren Beschaltung nichts zu tun hat, ich bedinde mich ja schlließlich IM FB.

Das muß latürnich im FB10 programmiert werden:

Code:
lar1    p##m410_1 
l        w[ar1,p#12.0] 
t        watwetick

Du machst also einen Pointer auf die Multiinstanz selbst oder wie??? Und nächstes Problem daran wäre das ich im FB wissen müsste wie die Multiinstanz dafür heißt. Schließlich rufe ich den Fb mehrmals auf, dann heist das mal p#m410_1 mal p#m300_1 usw.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das funktioniert nicht, weil das L #Outword nach dem Befehl "UW" gehört.
Dreimal Laden hintereinander wird nix.

lG
Karl

Edit: und vor T #Outword gehört natürlich wieder

L W [....]
L 28
UW
T #Outword
 
Zuletzt bearbeitet:
Ja, dreimal laden bringt natürlich nichts. Aber das ist auch nicht das Hauptproblem. Ich möchte den Inhalt das OUT-Bereiches in Wortform auslesen können. Wie man im Anhang sieht ist der Wert 0 obwohl 1 Ausgang gesetzt ist

(Hätte ich von Anfang an die drei Bits einzeln ausgewertet wäre ich vermutlich schneller gewesen. Aber jetzt interresiert's mich schon...)
 

Anhänge

  • sc_3.JPG
    sc_3.JPG
    162 KB · Aufrufe: 11
Zuletzt bearbeitet:
Du musst schreiben:

L W [....]
L 28
UW
T #Outword

oder
TAK
T #Outword

Ich wuerde das Ungleichbit nicht setzen sondern mit
"=" bilden.
Um Ausgang des FB Aufrufes kannst Du dann eine Aktion deines Wunsches mit der gebildeten Flanke auslösen.

Edit: aso du verarbeitest den HM_Ungleich ohnehin.... verstehe.
 
Zurück
Oben