Step 5 S5 Bausteinaufruf "Bearbeite"-Befehl

Nico770

Level-1
Beiträge
41
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen
beim übersetzen eines S5 Programms auf ein S7 Programm bin ich auf folgenden Codeteil gestoßen...
Code:
BEZ :    POIN    DKF

    A    -DB 48
    LW    =POIN
    T    MW 230
    B    MW 230
    L    DW 0
    T    DW 0
    SPA    -FB 19
NAME:    EIN-AUSL
POIN:    KF +0
DBAN:    KF +50
ANZA:    KF +150
OFFS:    KF +70
ADR :    KF +61
SEIT:    KC DD
E/A :    -M   1.0
INHA:    MD 202
FEHL:    M 201.7
Nun frage ich mich wie der Eingangsparameter =POIN an den Bausteinaufruf FB19 an den Parameter POIN übergeben wird?
LW =POIN lädt den Wert des Eingangsparameters in AKKU-1 und transferiert diesen dann in MW230.
Nun kommt der Befehl "B MW230" ->"Bearbeite MW230" welcher soweit ich das richtig verstanden habe den Inhalt von MW230 für die nächste Operation nutzt.
Nun wird die Festpunktzahl aus MW230 als "Adresse (Position)" eines Datenwortes aus DB48 genutzt und das entsprechende DW wird in den AKKU-1 geladen.
(Hoffe diese Erklärung macht Sinn.)
Nun Transferiert er den Wert aus AKKU-1 in das DW0 (Der Bearbeite-Befehl gilt ja soweit ich weiß nur für die nächste Operation).
Und letzendlich ruft er den FB19 mit POIN KF+0 auf. Verweist KF +0 auf das erste DW im Datenbaustein? Oder wie übergibt er die Daten(aus MW230/DW0/=POIN) an den FB19?
Er wird aufjedenfall mit dem Inhalt aus =POIN aufgerufen.

Vielen Dank für eure Hilfe. :)

//Edit: Erklärung verbessert
 
Zuletzt bearbeitet:
FB 19 kenn ich jetzt nicht, aber

B MW 230
L DW 0
T DW 0

ist so zu verstehen:

L DW [ MW 230 ]
T DW 0

wichtig ist auch ob die S5 eine 16 oder 8 Bit Maschine ist.
bzw. :
S5: L DW2 ist in
S7: dann L DBW 4 !
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist mir ja bereits bekannt, hatte es nur etwas umständlicher erklärt. Das hast du natürlich schöner aufgezeigt :)
Meine Frage ist aber eher weshalb er FB19 mit KF+0 aufrufen kann, er online aber mit dem Wert aus DW0/MW230 arbeitet.
 
Das hängt doch davon ab was der FB19 intern mit POIN macht. Ohne Beschreibung oder Programm des FB19 kann darüber nix ausgesagt werden.

Grüsse Corrado
 
Nun Transferiert er den Wert aus AKKU-1 wieder in DW0
Nach DW0 ja, aber wahrscheinlich nicht "wieder".
Der Bearbeite-Befehl gilt ja soweit ich weiß nur für die nächste Operation.
Stimmt.
Und letzendlich ruft er den FB19 mit POIN KF+0 auf. Verweist KF +0 auf das erste DW im Datenbaustein?
Es wird 0 an POIN von FB19 übergeben. Was FB19 mit POIN anstellt, zeigst Du uns nicht.
Oder wie übergibt er die Daten an den FB19?
So:
Code:
    SPA    -FB 19
NAME:    EIN-AUSL
POIN:    KF +0
DBAN:    KF +50
ANZA:    KF +150
OFFS:    KF +70
ADR :    KF +61
SEIT:    KC DD
E/A :    -M   1.0
INHA:    MD 202
FEHL:    M 201.7
Er wird aufjedenfall mit dem Inhalt aus =POIN aufgerufen.
Welchen Inhalt POIN in der Zeile
Code:
    LW    =POIN
hat, zeigst Du uns nicht. Das siehst Du dort, wo der FB "unbekannt" (von dem Du uns hier einen Ausschnitt zeigst) aufgerufen wird. Der FB19 kann es jedenfalls nicht sein. Rekursiv geht nicht.
Dass einer der AufrufParameter beim folgenden Aufruf von FB19 auch wieder POIN heisst, sollte Deine Phantasie sie nicht weiter beflügeln!
Nun frage ich mich wie der Eingangsparameter =POIN an den Bausteinaufruf FB19 an den Parameter POIN übergeben wird?
Gar nicht. Wird anscheinend im FB19 nicht benötigt. Ist aber im FB19 in MW230 verfügbar.

Gruss, Heinileini
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist es denn für meine Frage überhaupt wichtig was FB19 macht?

Rein zum Verständnis: der übergebene Wert Pointer beinhaltet eine Festpunktzahl DBNR.Wortadresse.
Von DB50 bis DB150 sind jeweils 3 „Datensätze“ mit einer Länge mit je 80Worten, ab der Adresse DW1 angelegt.

In DB48 sind diese „Pointer“ bestehend aus DBNr.DWAddr gespeichert.
Der FB19 liest im Endeffekt einfach nur Daten aus dieser Datenbank aus/schreibt Daten herein von/in INHA durch Übergabe des Pointers.

FB19 kann aber auf keinen Fall was mit einer KF +0 am POIN-Eingang anfangen, da der Baustein in diesem Fall direkt wieder beendet wird.

Daher wundere ich mich ja, wie der Baustein mit POIN 0 aufgerufen werden kann.

Und btw. Nein der Baustein von dem FB19 aufgerufen wird ist ein anderer Baustein, weiss aber gerade aus dem Kopf nichtmehr welcher, habe das Programm nur auf der Arbeit.
 
Zuletzt bearbeitet:
Ist es denn für meine Frage überhaupt wichtig was FB19 macht?
Selbstverständlich, denn Du wolltest wissen:
Und letzendlich ruft er den FB19 mit POIN KF+0 auf. Verweist KF +0 auf das erste DW im Datenbaustein?
Das, was im FB19 mit POIN=0 gemacht wird, entscheidet darüber, ob im Endeffekt KF +0 auf das erste DW im DB verweist.
Aber Du hast ja jetzt selbst das Rätsel aufgelöst:
FB19 kann aber auf keinen Fall was mit einer KF +0 am POIN-Eingang anfangen, da der Baustein in diesem Fall direkt wieder beendet wird.
 
Das, was im FB19 mit POIN=0 gemacht wird, entscheidet darüber, ob im Endeffekt KF +0 auf das erste DW im DB verweist.

Aber wie könnte der FB19 darüber entscheiden? Ich kann einen Eingangsparameter doch nicht im Baustein verändern - oder doch?
Was vielleicht noch eine nützliche Info gewesen sein könnte, ist dass der FB19 den Eingang =POIN nur liest, aber niemals verändert.
Bloß irgendwie muss der FB19 doch einen anderen Pointer als KF+0 bekommen, da die Anlage ja im jetzigen Zustand funktioniert und da sicherlich kein Pointer "0" übergeben wird...
Oder übersehe ich etwas großes?

Hier zum Verständnis mal die ersten zwei drei Zeilen aus dem FB19, wo man sieht dass der Baustein direkt beendet wird:
Code:
    U    =FEHL
    RB    =FEHL
    MBR    EEC00
    LRW    +48
    SLD    4
    LW    =POIN
    +D    
    LIR    1
    T    MW 230
    L    MW 230
    L    KB 0
    !=F    
    BEB
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber wie könnte der FB19 darüber entscheiden?
1:0 für Dich. Ich meinte damit: Nur das, was im FB19 mit dem aktuellen Inhalt von POIN gemacht wird, kann darüber Auskunft geben, wie sich der Parameter auswirkt.
Ich kann einen Eingangsparameter doch nicht im Baustein verändern - oder doch?
Nein.
Was vielleicht noch eine nützliche Info gewesen sein könnte, ist dass der FB19 den Eingang =POIN nur liest, aber niemals verändert.
Nein.
Bloß irgendwie muss der FB19 doch einen anderen Pointer als KF+0 bekommen, da die Anlage ja im jetzigen Zustand funktioniert und da sicherlich kein Pointer "0" übergeben wird...
Oder übersehe ich etwas großes?
Wenn der Wert, der per LIR 1 in den Akku geladen wird, 0 ist, dann wird der FB19 beim BEB verlassen.
Was aber genau über die EEC30 im BasisAdressRegister adressiert wird, kann ich nicht nachvollziehen (das dürfte auch von der verwendeten CPU abhängig sein).
Ich weiss auch nicht, welche Information dort gelesen, warum sie mit 16 multipliziert und noch der Wert 0 aus POIN draufaddiert wird.
Welche Information dann von dieser so berechneten SpeicherAdresse gelesen wird ... keine Ahnung.
Ich hatte geschrieben, dass der Wert des Parameters POIN des FB "unbekannt" im FB19 noch im MW230 verfügbar ist.
Wie wir sehen können, wird davon kein Gebrauch gemacht: MW230 wird im FB19 überschrieben.
Code:
    U     =FEHL
    RB    =FEHL
    MBR   EEC00   EEC00 (20 Bit!) ins BasisAdressRegister laden
    LRW   +48     48 zum BasisAdressRegister addieren (--> EEC30) und Inhalt von dieser Adresse nach Akku
    SLD   4       AkkuInhalt um 4 BitPositionen nach links schieben (mit 16 multiplizieren)
    LW    =POIN   
    +D            aktuellen Wert von POIN (0) dazu addieren
    LIR  1        niederwertiges Wort von AKKU 1 mit dem Inhalt eines Speicherwortes (durch AKKU 1 adressiert) laden.
    T    MW 230
    L    MW 230   
    L    KB 0
    !=F    
    BEB
 
Zuletzt bearbeitet:
EEC00 kenne ich als Anfangsadresse der DB-Liste bei einer 155U. Wenn das stimmt dann liest der FB19 genau das DW0 aus dem DB48, das vor dem Aufruf beschrieben wurde, und will da etwas ungleich 0 vorfinden, ansonsten BEB.

Grüße von HaDi
 
EEC00 kenne ich als Anfangsadresse der DB-Liste bei einer 155U. Wenn das stimmt dann liest der FB19 genau das DW0 aus dem DB48, das vor dem Aufruf beschrieben wurde, und will da etwas ungleich 0 vorfinden, ansonsten BEB.

Grüße von HaDi

Richtig. EEC00 ist der Speicherbereich des Anfangs der DB-Liste bei unserer SPS (155U) wobei der DB48 eine Liste mit allen aktiven Pointern ist, wobei der zuletzt bearbeitete Pointer immer im DW0 des DB48 abgespeichert wird.

Nur leider bringt auch das mich nicht weiter wie der =POIN in den FB19 gelangt... :/

Ich werde mir den Baustein morgen nocheinmal genau anschauen (FB19), nicht dass ich doch irgendwo etwas überlesen habe dass er etwas aus dem DW0 liest, denn ich sehe hier um ehrlich zu sein weiterhin keinen Lösungsansatz.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
EEC00 kenne ich als Anfangsadresse der DB-Liste bei einer 155U. Wenn das stimmt dann liest der FB19 genau das DW0 aus dem DB48, ...
Das klingt sehr plausibel. Wohin letztendlich der LIR 1 greift, ist mir trotzdem nicht klar - nur, dass mit DW0 quasi ein Listen-/Tabellen-Bereich ausgewählt und dort abhängig von POIN des FB19 (gültiger WerteBereich vermutlich 0 .. 15) ein bestimmtes Element gelesen wird.
 
Nur leider bringt auch das mich nicht weiter wie der =POIN in den FB19 gelangt...
Der Parameter POIN des FBungenannt ist nicht identisch mit dem Parameter POIN des FB19. Der Inhalt des einen migriert auch nicht auf irgendeine mysteriöse Weise in den anderen.
Der POIN des FBungenannt steuert, welche Information im DW0 abgelegt wird und DW0 wird im FB19 ausgewertet.
Welcher Wert wird denn im POIN des FBunbenannt angeliefert? Ich meine nicht den POIN des FB19, der wird mit 0 befruchtet, wie man sehen kann.
 
Zuletzt bearbeitet:
MBR EECOO lädt die Adresse der DB-Liste ins BR-Register.
LRW +48 sorgt dafür dass die Anfangsadresse des DB48 im Akku1 landet, allerdings ist das noch eine Segment- bzw. Paragraphenadresse.
SLD4 macht aus der (16Bit) Paragraphenadresse eine 20Bit-Adresse, jetzt steht im Akku1 die Anfangsadresse vom DB48 und das ist das DW0.
LIR1 liest also den Inhalt von DW0.

Grüße von HaDi
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
MBR EECOO lädt die Adresse der DB-Liste ins BR-Register.
LRW +48 sorgt dafür dass die Anfangsadresse des DB48 im Akku1 landet, allerdings ist das noch eine Segment- bzw. Paragraphenadresse.
SLD4 macht aus der (16Bit) Paragraphenadresse eine 20Bit-Adresse, jetzt steht im Akku1 die Anfangsadresse vom DB48 und das ist das DW0.
LIR1 liest also den Inhalt von DW0.

Grüße von HaDi

Vielen Dank für die Erläuterung des SLD4, das macht Sinn. Somit ergibt der Rest auch einen Sinn, dass er einfach den Wert aus DW0 der den letzten bearbeiteten Wert darstellt, nutzt.

Der Parameter POIN des FBungenannt ist nicht identisch mit dem Parameter POIN des FB19. Der Inhalt des einen migriert auch nicht auf irgendeine mysteriöse Weise in den anderen.
Der POIN des FBungenannt steuert, welche Information im DW0 abgelegt wird und DW0 wird im FB19 ausgewertet.
Welcher Wert wird denn im POIN des FBunbenannt angeliefert? Ich meine nicht den POIN des FB19, der wird mit 0 befruchtet, wie man sehen kann.

Ich weiß nicht genau welchen Wert sie übergeben - aber ich weiß ja dass die Anlage läuft. Der FB19 wird aus mehreren verschiedenen parametrierten FBunbennant aus aufgerufen.
Aber nun mit der Erklärung durch HaDi macht es Sinn dass 0 übergeben wird und er somit den letzten Pointer aus DW0 bearbeitet.
 
Zurück
Oben