vom FB auf temporäre Lokaldaten des OB´s zugreifen

makken

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich versuche von meinem FB aus, der in irgendeinem OB aufgerufen wird, mittels Any-Pointer auf die temporären Lokaldaten zuzugreifen.

In dem Fall interessiere ich mich für die Zykluszeit des OB´s (OBxx_EXC_FREQ). Ich versuche demnach mittels Any-Pointer auf diesen Adressbereich zu zeigen und darauf über den SFC20 den Wert des Adressbereichs in einer temporären Variable im FB abzuspeichern.

Zum besseren Verständnis hier noch einmal der Code:

LAR1 P##Zeiger
L B#16#10 // Syntax-ID
T LB [AR1,P#0.0] // ablegen im Any Pointer
L B#16#5 // Datentyp-ID
T LB [AR1,P#1.0] // ablegen im Any Pointer
L W#16#1 // Wiederholungsfaktor
T LW [AR1,P#2.0] // ablegen in Any-Pointer
L W#16#0 // DB-Nummer laden
T LW [AR1,P#4.0] // ablegen im Any-Pointer
L DW#16#87000000 // Bereichserkennung
L 10 // Anfangsadresse OB
SLD 3 // Platz für die Bitadressen schaffen
OD // ODER-Doppelwort
T LD [AR1,P#6.0] // ablegen in Any-Pointer

CALL "BLKMOV"
SRCBLK :=#Zeiger
RET_VAL:=#fehler
DSTBLK :=#TA

Vielen Dank für eure Hilfe!

Gruß makken
 
Zuletzt bearbeitet:
Übergebe die benötigten Variablen über die Aufrufschnittstelle des FB. Oder über globale Variablen.

Erstens: Das "rummachen" in den Lokaldaten des aufrufenden Bausteins ist ein äußerst schlechter Programmierstil. Zweitens kann Dein FB nicht wissen, von welchem "irgendeinem" Baustein er aufgerufen wird und kennt demzufolge die Lokaldaten des aufrufenden Bausteins nicht (bzw. nicht sicher). Außerdem kann man den SFC20 nicht zum Lesen der Vorgänger-Lokaldaten benutzen, das funktioniert nicht.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Harald!

Das Problem habe ich ja auch zunächst über die Aufrufschnittstelle des FB gelöst. Klar ist mir bewusst, dass das ein schlechter Programmierstil ist. Mein Projekt wird jedoch so aufgebaut das dieser Baustein nicht tiefer verschachtelt wird und somit die Lokaldaten immer die des OB´s sein werden.

Das Problem mit dem SFC20 habe ich nicht so ganz verstanden. Meinst du damit das ich mit dem Zeiger, wenn dieser auf die Lokaldaten zeigt, nicht mittels SFC20 kopieren kann?

makken
 
Was ist schlecht daran die Lokaldaten in dem jeweiligen Baustein (OB) auszulesen und über einen DB oder was auch immer anderen Bausteinen zur Verfügung zu stellen?
 
Hallo makken,


zum SFC20.

Beispiel: Du ruftst im FB 1 den SFC 20 auf und willst die Lokaldaten (Tempvariablen) irgendwohin kopieren, dann mußt Du als Pointerkennung die 27 (glaub ich, mußt Du in der Hilfe noch mal nachlesen). Dann verweißt der SFC20 während der Bearbeitung auf die Lokaldaten des vorherigen Bausteins. Hier FB 1.
Du müßtest aber auf die Lokaldaten des vorvorherigen Bausteins (OB xy) zu greifen. Dafür gibt es keine Kennung!

Mit freundlichen Grüßen

Dominik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
so wie ich das jetzt richtig verstehe, kann ich überhaupt nicht über den SFC20 den Inhalt des Adressbereichs, wo mein Pointer draufzeigt (die Zykluszeit des OB´s), kopieren?

Sitze an dem Problem wirklich schon einige Tage dran. Ich will den Baustein in CFC nutzen, und da wäre es für mich persönlich besser die Zykluszeit des OB´s, wo der FB aufgerufen wird, in dem FB herauszufinden ohne ein zusätzliche Schnittstelle zu nutzen.

Gruß makken
 
Das funktioniert mit einem REAL-Eingang dessen Attribut
S7_sampletime = true

ist.

Nach dem Übersetzen schreibt CFC den Zeitwert des aufrufenden OB's hin.

PS: so funktionieren alle Bausteine die eine Zeitabhängigkeit haben.
 
Zuletzt bearbeitet:
Wenn du dem SFC20 sagst er soll die Vorgänger Lokaldaten kopieren, dann sind das für den SFC20 die Lokaldaten in dem Baustein der Ihn aufruft, also die von deinem FB!
Wenn du auf die Vorgängerlokaldaten zugreifen willst, musst du das über das AR machen, und halt dann in einer Schleife, aber machen würd Ich das auch nicht!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
so wie ich das jetzt richtig verstehe, kann ich überhaupt nicht über den SFC20 den Inhalt des Adressbereichs, wo mein Pointer draufzeigt (die Zykluszeit des OB´s), kopieren?
Exakt, mit dem SFC20 kann man überhaupt nicht von den Lokaldaten des aufrufenden Bausteins kopieren. Weil diese für den SFC20 die Vor-Vorgänger-Lokaldaten wären, wie Dominik schon richtig schrieb.

Lösung: Der OB selber kann seine Lokalvariablen in globale Variablen kopieren, dann kann JEDER darauf zugreifen.
Wenn Du denn unbedingt die OB-Variablen in den Lokaldaten Deines FB brauchst, dann kann Dein FB die ja von den globalen Variablen per SFC20 in seine Lokaldaten kopieren.

Harald
 
@borromeus:

ich habe ja schon so eine ähnliche Lösung. Bei mir ist das Problem nur das ich die Zykluszeit als Eingang meines Bausteins habe, und diese dann in CFC manuell eingeben muss.

Aber so wie sich das anhört ist dein Lösungsvorschlag sogar die Lösung meines Problems. Kannst du mir etwas besser erklären?

Vielen Dank!
 
Im FB einen Eingang anlegen:
SAMPLE_T ........ REAL
Rechte Maustaste->Objekteigenschaften
Attribut:
S7_sampletime Wert=true

Dann hast Du im FB einen REAL-Wert SAMPLE_T der die Aufrufzeit in Sekunden hat.
Die richtige Zeit generiert sich automatisch beim Übersetzen.


Edit:
Der Name "SAMPLE_T" ist ein Beispiel (heisst bei den SiemensBausteinen auch so), du kannst ihn aber nennen wie Du willst.
 
@makken
Bitte nochmal klarstellen: Interessiert Dich nun der Zeitpunkt/die Uhrzeit des OB3x-Aufrufes oder das in HW-Konfig parametrierte Aufruf-Zeitraster des OB3x oder die tatsächlich vergangene Zeit seit dem letzten OB3x-Aufruf? Wie genau brauchst Du die Zeit?

System- und Standardfunktionen für S7-300/400 schrieb:
OB3x_EXC_FREQ INT
• falls OB3x_STRT_INF=B#16#3A: Zeittakt in μs
• in allen anderen Fällen: Zeittakt in ms

btw: Um lediglich einen INT zu kopieren erscheint mir der SFC20 etwas oversized.

Harald
 
@PN/DP:
ich interessiere mich für das in der HW-Konfig parametrierte Aufruf-Zeitraster. Natürlich ist die tatsächlich vergangenge Zeit genauer, aber zunächst reicht mir die Einstellung in der HW-Konfig. Mir kommt der SFC20 auch etwas oversized vor dafür, ich weiß nur nicht wie ich das anders lösen soll.

@borromeus:
hab es gerade ausprobiert, jedoch funktioniert das nicht. wenn ich in CFC übersetze und teste, gibt es keine Veränderung des Eingangs (bleibt auf dem Wert 0)

@borromeus:
ich danke dir, es funktioniert doch! hatte noch nen kleinen fehler drin!
 
Zuletzt bearbeitet:
Ich finde es nicht verwerflich, auf fest definierte Lokaldaten zu zu greifen.

Code:
      L     DW#16#87000000
      LAR1                              // Adresse 0.0 des Lokaldaten-Stack  
      U(    
      L     B [AR1,P#3.0]               // OB-Nr.
      L     30
      >=I                               // OB-Nr. < 30
      )     
      U(    
      TAK                               // OB-Nr.
      L     38
      <=I                               // OB-Nr. > 38
      )     
      NOT   
      BEB                               // z.Bsp. Bausteinende, wenn nicht OB30..OB38

      L     W [AR1,P#10.0]              // OB3x - Frequency of execution (msec)
      T     #TA                         // Abtastzeit [ms]

// im OB1 steht die Ausführungszeit des letzten Zyklus im LW6
// könnte man auch noch auswerten


Gruß, Onkel
 
Wenn wir den OB3x direkt in die Instanz des FB schreiben lassen, dann geht's noch einfacher und noch verwerflicher ;), sogar symbolisch und ohne zusätzlichen Aufrufparameter. Und das erscheint sogar in den Referenzdaten.
Code:
      L     #OB35_EXC_FREQ
      T     "IDB1".iSTAT_TA

      CALL  "FB1" , "IDB1"
       IN_PARAM_1 :=...
       IN_PARAM_2 :=...

Doch am Ende ging es dann ja plötzlich doch mit einem Aufrufparameter.
Da hätte man es auch gleich sauber lösen können:
Code:
      CALL  "FB1" , "IDB1"
       IN_PARAM_1 :=...
       IN_PARAM_2 :=...
       IN_EXC_FREQ:=#OB35_EXC_FREQ

Wie so oft hat sich aber erst im Laufe des Threads herausgestellt, daß das Problem des TE ein ganz anderes ist und nur die Lösung von borromeus den eigentlich vom TE angestrebten Zweck in seiner CFC-Umgebung erfüllt.
Systemattribut S7_sampletime schrieb:
Der eingestellte Wert für die Abtastzeit ergibt sich aus dem Zeitraster des verwendeten Weckalarm-OBs und der eingestellten Untersetzung der Ablaufgruppe, in der sich der betroffene Baustein befindet.
Es reicht nicht, einfach nur (wie auch immer) die OB3x_EXC_FREQ auszulesen. Man braucht auch noch den Untersetzungsfaktor. Und genaugenommen müßte man auch noch schauen, was in OB3x_STRT_INF (LB1) steht, womöglich ist die Zeit in µs ...

Harald
 
Zurück
Oben