Step5 AG95u-Problem mit FBs

Aksels

Level-2
Beiträge
257
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Liebe Leut, ich habe hier ein Problem:

ein FB der ungefähr so aussieht:

NAME :SchUhr
BEZ :VON E/A/D/B/T/Z: E BI/BY/W/D: W
BEZ :BIS E/A/D/B/T/Z: E BI/BY/W/D: W
BEZ :ISON E/A/D/B/T/Z: A BI/BY/W/D: BI

000E :A -DB_DZF DB11
000F :L -DW21 DW21
0010 :A -DB_Tmp_FB10 DB20
0011 :T -DW0 DW0
0012 :A -DB_DZF DB11
0013 :L -DW20 DW20
0014 :A -DB_Tmp_FB10 DB20
0015 :T -DW1 DW1
0016 :L = VON
0017 :T -DW2 DW2
0018 :L = BIS
0019 :T -DW3 DW3
001A :L -DW2 DW2
001B :L -DW3 DW3
001C :<=F
001D :SPB = M001
001E :L -DW3 DW3
001F :L KF +2400
0021 :+F
0022 :T -DW3 DW3


Aufruf sieht so aus:

NETZWERK 4 Badpumpe Zeit

0026 :SPA -FBSchUhr FB10
0027 NAME :SCHUHR
0028 VON > -DW12 DW12 (E/W)
0029 BIS > -DW13 DW13 (E/W)
002A ISON < -MBadSchUhrEin M7.3 (A/BI)
002B :***


Damit geht meine SPS in Stop, und zwar wegen DW13. Aber warum?
Wenn ich DW13 zuerst in einen Zwischenmerker speichere geht es. Ich dachte halt, daß ich das so nicht aufrufen darf. Deswegen folgende änderung:

NETZWERK 4 Badpumpe Zeit

0022 :L -DW12 DW12
0023 :T -TmpFB3_1 MW10
0024 :L -DW13 DW13
0025 :T -TmpFB3_2 MW11
0026 :SPA -FBSchUhr FB10
0027 NAME :SCHUHR
0028 VON > -TmpFB3_1 MW10 (E/W)
0029 BIS > -TmpFB3_2 MW11 (E/W)
002A ISON < -MBadSchUhrEin M7.3 (A/BI)
002B :***


Wenn ich diesen Programmteil beobachte sieht alles gut aus. Die gewollten Werte werden übergeben.
Wenn ich aber den FB10 beobachte (und es gibt wirklich nur einen Aufruf davon) dann kriege ich für VON und BIS irgendwelche Werte, von denen ich keine Ahnung habe wo sie herkommen.
Mache ich da was grundsätzliches falsch, oder bin ich schon zu Step7 verdorben um es zu sehen?

Ich Programmiere mit WinSPS-S5.

Gruß,
Aksels
 
Hallo,

der FB10 will DW12 und DW13 aus dem DB20 laden, soll das so sein und wenn ja, ist der auch so lang?

Grüße von HaDi
 
Das sind zwei Themen:
1. Stop bei DW 13 ohne Zwischenspeicherung
2. Ergebnis falsch?? Ist das Ergebnis wirklich falsch oder siehst du nur nichts?

Wenn du im Eingang eine Zahl ablegst, dann ist L =VON richtig!

Fragen:

1. Habe die Tage zufällig gelesen, dass man bei der 95 parametrierte FB nicht beobachten könne?? Kann das der Grund sein?

2. Rechnest du in Hundertstel-Stunden? (L KF +2400)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich diesen Programmteil beobachte sieht alles gut aus. Die gewollten Werte werden übergeben.
Wenn ich aber den FB10 beobachte (und es gibt wirklich nur einen Aufruf davon) dann kriege ich für VON und BIS irgendwelche Werte, von denen ich keine Ahnung habe wo sie herkommen.
Mache ich da was grundsätzliches falsch, oder bin ich schon zu Step7 verdorben um es zu sehen?

Mein Verdacht ist hier folgender :
Es werden an den FB nicht die Inhalte der DW's übergeben, sondern der Zeiger auf die Worte. Da in dem FB ein anderer DB aufgerufen wird ist somit der Bezug zum ursprünglichen DB nicht mehr vorhanden.
Wenn mit Zwischen-MW's gearbeitet wird, dann gilt das nicht mehr, da die ja DB-unabhängig sind ...
Muss nicht so sein, sieht für mich aber danach aus ...

Gruß
LL
 
Also, L =VON und L =BIS scheint richtig zu sein (handbook-not-read-error).
Bei der Variante mit den MW hast du eine Überschneidung drin, daher die komischen Werte (MW10 und MW11 enthalten beide das MB11).
Trotzdem verstehe ich nicht, warum die DW-Variante nicht funktioniert. Ist denn auch wirklich vor dem FB-Aufruf der DB20 aufgeschlagen ?
 
Zuletzt bearbeitet:
@ hadi
Das mit der Merkerüberschneidung ist völlig richtig.

Aber wie kommst du auf db 20??
Im übergeordneten Baustein ist gar kein Aufruf eines DB zu erkennen!?

Nachtrag: Wobei das nichts ändert, wenn der Code mit Zwischenmerkern wirklich funktioniert.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Auf die Zw.MW's habe ich gar nicht geachtet. Solange man im Byte-Bereich mit den Werten bleibt könnte es aber klappen.

Es gibt natürlich die Alternative, dass der DB beim Zuweisen der Werte nicht aufgeschalgen oder ein anderer ist ...
 
Der Kollege Aksels hat ja weiter oben bestätigt, dass er DW12 und DW13 aus dem DB20 benutzen will.
Wenn ich es richtig in Erinnerung habe, wird mit dem Aufruf des FB der Inhalt des DW übergeben, also muss auch der richtige DB aufgeschlagen sein. Im FB wird dann mit dem übergebenen Wert gearbeitet, unabhängig vom aufgeschlagenen DB. Wenn das DW erst im FB geladen werden soll, muss man die DW-Nummer übergeben und dann das DW indirekt (mit B MW/DW und L DW0) laden. Dann sollte man aber konsequenterweise auch die DB-Nummer als Eingangsparameter übergeben.
Wenn das alles Quatsch sein sollte, würde ich mich über eine freundliche Belehrung freuen.
 
Nach dem Programm-Auszug ist der DB zwar aufgeschlagen, es köönte aber trotzdem sein, dass er nicht als Datenquelle verwendet wird ...
Das hatte ich aber schon geschrieben ...

@HaDi: Ich sehe das im Grunde so wie du ...
 
Bei der S95 muss im übergeordneten Baustein ein DB offen sein, bevor der Baustein mit DWs parametriert wird:
Also
A DB 20
Spa Schaltuhr
...

Wenn die Daten in mehreren Bausteinen stehen, müssen sie zwischengemerkt werden. Kann ja nur einen DB gleichzeitig aufmachen.

Im untergeordneten FB kann ich einen eigenen DB öffnen, direkt oder indirekt, auch mehrere hintereinander, aber natürlich immer nur nacheinander.

Ist der FB zu Ende, gilt wieder der DB, der vor dem FB-Aufruf gültig war.
Ich sehe im übergeordneten Baustein keinen DB-Aufruf (was nicht heißt, dass der DB nicht offen ist).

Nachtrag: Nach meiner Erinnerung ist daher die Speicheradresse der Formalparameter =VON und =BIS der zuletzt geöffnete DB aus dem übergeordneten Baustein, dessen Adresse im Auszug leider nicht zu erkennen ist, und nicht automatisch DB 20.
 
Zuletzt bearbeitet:
Gut, dann sind wir ja , was den DB-Aufruf vor dem FB angeht, einig.
Es scheint aber noch keine Einigkeit darüber zu bestehen, ob denn nun ein Zeiger auf das DW oder dessen Inhalt übergeben wird. Ich bleibe vorerst der Überzeugung, dass der Inhalt des DW übergeben wird, lasse mich aber gerne belehren.
Wie auch immer, wenn der DB20 vor dem FB10-Aufruf aufgeschlagen ist, müsste es funktionieren, egal welche Variante tatsächlich stimmt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch da bin ich deiner Meinung! Man kann auch Zeiger übergeben, dann müssten diese allerdings mit z.B.
B =VON
L MW 0
weiterverarbeitet werden. Oder so ähnlich.
 
Zurückruder!!!!

Habe es gerade mit IBH-Simulation versucht. Dort stimmt es überhaupt nicht.
Die Simulations-SPS sucht das als Parameter substituierte Datenwort tatsächlich in dem DB, der innerhalb des FB offen ist.

Dann müsste der DB außen und innen gleich sein, wenn man DW in Parameter schreibt,
oder
man adressiert indirekt mit B =DBxx (Nummer des Datenbausteins für die Datenwörter, die als Parameter draußen stehen.

Oder man weiß, in welchem DB der Kram steht.

Nachtrag: Step 5 ist halt doch irgenwie eine Steinzeitumgebung.
 
Habe das in der Simulation auf die Schnelle noch nicht mal so hinbekommen wie ich es oben beschrieben habe. Der Simulator findet das Datenwort weder bei direkter noch bei indirekter Adressierung. Weiß der Henker warum. Vielleicht heute abend.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
grundsätzlich ist es so, das der zuletzt geöffnete db mit in den aufgerufenen baustein mitgenommen wird.

im fb10 wird aber direkt nach der deklaration der db11 geöffnet.
vor dem laden des parameters =VON ist definitiev der db20 auf.
im parameter von wird der wert stehen, der im db20 dw12 (im beispiel 12)steht
im =BIS der wert des dw13 (im beispiel 13).

wird der fb beendet, so wird im aufrufenden baustein wieder der db geöffnet der vor dem aufruf geöffnet war.

habe das prog mal in ner 100u cpu103 getestet.
läuft ohne probs

Code:
FB 10                                       DB11 <======================
Netzwerk 1     AWL-Status          VKE Status/AKKU1 ---AKKU2-
     :A   DB  11                    1
     :L   DW  21                    1  0000         000D
     :A   DB  20                    1
     :T   DW   0                    1  0000         000D
     :A   DB  11                    1
     :L   DW  20                    1  0000         0000
     :A   DB  20                    1
     :T   DW   1                    1  0000         0000
     :L   =VON                      1  000C         0000
     :T   DW   2                    1  000C         0000
     :L   =BIS                      1  000D         000C
     :T   DW   3                    1  000D         000C
     :L   DW   2                    1  000C         000D
     :L   DW   3                    1  000D         000C
     :<=F                           1  000D         000C
     :SPB =M001                     1
     :L   DW   3
     :L   KF +2400
     :+F
     :T   DW   3
 
FB 10                                       DB20 <=========================
Netzwerk 1     AWL-Status          VKE Status/AKKU1 ---AKKU2--FU
     :A   DB  11
     :L   DW  21
     :A   DB  20
     :T   DW   0
     :A   DB  11
     :L   DW  20
     :A   DB  20
     :T   DW   1
     :L   =VON                      1  000C         0000
     :T   DW   2                    1  000C         0000
     :L   =BIS                      1  000D         000C
     :T   DW   3                    1  000D         000C
     :L   DW   2                    1  000C         000D
     :L   DW   3                    1  000D         000C
 
Zuletzt bearbeitet:
Also, ich ruder jetzt auch mal ganz kleinlaut zurück, Zeiger ist richtig.
Ich habe mich mal an die erstbeste 95U gemacht und das Ganze getestet. Es wird tatsächlich das DW aus dem im FB aufgeschlagenen DB geladen, egal welcher vor dem FB-Aufruf aktiv war und selbst wenn vor dem FB-Aufruf gar kein DB aufgeschlagen ist funktioniert es.
Jetzt würd´ ich mich aber mal für die neuesten Erkenntnisse des Kollegen Aksels interessieren...
 
In der Simualtion funktioniert nur de Anzeige nicht, das Ergebnis im DB stimmt aber. Ergo:

Die CPU liest aus
"L =VON" einfach
"L DW 12" und lädt den Inhalt des DW 12 im aktuellen DB20.

Es bleibt Aksels nicht erspart, ihr zu sagen, in welchem DB das DW 12 im übergeordneten Baustein steht.
Entweder mit
A DBx
oder formal mit
BEZ: DBIN B
und B =DBIN

oder es steht im gerade offenen DB.
 
Zurück
Oben