SFC14/SFC15 zugriff auf Stukturen im Stat. Bereich von FBs

Markus

Administrator
Teammitglied
Beiträge
6.299
Reaktionspunkte
2.316
Zuviel Werbung?
-> Hier kostenlos registrieren
Folgeder Code ist aus einem Baustein von Siemens zum ansteuern eines Micromaster über Profibus (FB63)

Code:
       CALL  "DPRD_DAT"                  // PKW einlesen
       LADDR  :=#P_Adresse
       RET_VAL:=#Intern.Fehler_DP_SFC14_15
       RECORD :=#PKW.EMPFANGEN


PKW ist eine Stuktur im Stat Bereich und enthält die Struktur EMPFANGEN welche zwei INT und einen DINT enthält.

Das läuft problemlos.



In meinem Projekt habe ich auch eine dezentralen Antrieb am Profibus mit dem ich 8 Byte austausche. Folgender Code ist im FB64, der den DB64 als IDB hat.

Code:
       CALL  "DPWR_DAT"
       LADDR  :=#SteuerStatus_start_Addr
       RECORD :=#Steuerwort
       RET_VAL:=#retval

"Steuerwort" ist eine Struktur im Stat. Bereich des FB64 mit 8 Bytes.
Wenn ich es so mache, dann geht es nicht - Fehlermeldung "Bereichslängenfehler beim lesen(schreiben)"


Mache ich es aber so:

Code:
       CALL  "DPWR_DAT"
       LADDR  :=#SteuerStatus_start_Addr
       RECORD :="IDB_Servoregler".Steuerwort
       RET_VAL:=#retval

dann geht es! Ich mache nur den DB davor.
Wieso geht das bei mir ohne den DB nicht (den will ich nicht - wegen Instanz FB), aber beim obigen BEispiel vom FB63 von Siemens gehts?
 
Ruft den Siemens da den IDB nicht auch auf?
-> RET_VAL:=#Intern.Fehler_DP_SFC14_15
Wenn ja, dann hätte ich folgende Erklärung
Ich denke dass da der IDB nicht mehr bekannt ist, also AR2 irgend wie verbogen wird.
Abhilfe wäre ein umweg über Lokaldaten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie ist denn dein Steuerwort aufgebaut?
Ich habe gerade mal auf die schnelle das Beispielprojekt genommen und eine Testvariable angelegt (Struktur mit 8 Member vom Typ byte) und ich hatte beim simulieren mit PLCSim keine Probleme mit Bereichslängenfehler
 
1. an dem beispiel von siemens wird auch nur auf lokaldaten verwiesen.

2. meine struktur "steuerwort" ist wie geschrieben 8 byte lang (8x 1byte)
(der nama SteuerWORT ist etwas ungünstig gewählt - wird geändert)

3. Retval ist nicht das Problem

5. der editor meckert auch nicht und es lässt sich alles übertragen, aber irgendwie hat das mit der symbolik von "steuerwort" ohne den db mitanzugeben nicht hin. aber "steuerwort" ist doch schon eine lokalvariable (stat)...
 
Ich hab mir das jetzt mal alles durchgelesen. Und muss gestehen, das ich völlig falsch liege.
Aber den Umweg über Temp's sollte dann gehen. Obs sein muss weiss ich nicht. Aber würde ich probieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
möglicherweise geht es über temps, sicher geht es mit dem db vorne dran oder wenn ich einen any rechne und den übergebe.

ABER: WARUM GEHT ES NICHT - BZW NUR BEI MIR NICHT???

in dem ersten Beispiel geht es eben doch!

wie ich das problem umgehen kann ist mir mehrfach bekannt.
aber warum es dieses problem gibt und wie ich es lösen kann, das übersteigt derzeit mein verständniss.

ich halte nichts von "hauptsache es läuft" lösungen!
das ist was für pfuscher!

es muss doch eine logische erklärung dafür geben?
 
Fb

Hallo Markus,

wie wärs wenn du vor dem Bausteinaufruf mal den IDB öffnest? Dann weisst du obs davon kommt.

L DINO
T #NR_DI
AUF DB [#NR_DI]

Ich denke dass im ANY-Pointer zum SFC nicht die DI-Nr übergeben wird wenn er direkt auf statische Variablen zeigt. Evtl wird im Siemens-Beispiel irgendwo vorher der DI "aktiviert"

André
 
Ich hab gerade mal ein Projekt rausgekramt. Und da funktioniert das mit STAT's einwandfrei.
Mir bleibt nur der Hinweis mit der Adresse, also angabe Hexadezimal. Aber ich denke das hast du schon so.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Markus,

eigentlich sollte die Variante wie im Siemens-Bsp. funktionieren. Was machst du vor dem Aufruf der SFC15? Verwendest du event. eine Adressierung über Adressregister im FB64? Werden vorher andere Bausteine aufgerufen die irgendwas verbiegen können?


Gruß, Onkel
 
hier der ganze code:

Code:
      L     #I_LADDR                    // PZD-Daten beginnen 10 Byte später
      +     10
      T     #SteuerStatus_start_Addr
      LAR1  P##Steuerwort
      UN    #I_Freigabe
      =     DIX [AR1,P#1.0]             // Freigabe
      U     #I_Start
      UN    DIX [AR1,P#1.6]             // Stop
      =     DIX [AR1,P#1.2]             // Start
      U     #I_Home_Pos
      =     DIX [AR1,P#1.4]             // MaschinenNull suchen
      UN    DIX [AR1,P#1.6]             // Stop
      UN    #I_Start
      UN    #I_Home_Pos
      =     DIX [AR1,P#1.6]             // Stop
      
      CALL  "DPWR_DAT"
       LADDR  :=#SteuerStatus_start_Addr
       RECORD :=#Steuerwort         // so gehts nicht!!!!!!
       RET_VAL:=#retval
      
      CALL  "DPRD_DAT"
       LADDR  :=#SteuerStatus_start_Addr
       RET_VAL:=#retval
       RECORD :="IDB_Servoregler".Statuswort    // so gehts ???!!!
 
Und wenn du das AR1 einfach mal rettest,
vor der ersten Zeile und dann vor dem SFC Aufruf.

Ich musste mir letztens von HDD sowas erklären lassen,
und das wäre doch imho bei dir auch eine mögliche Erklärung.

Guten Morgen,
also das stimmt nicht ganz es gibt schon Situationen bei denen man es Retten muss.
Berger schreibt hierzu:
AWL verwendet das AR1 um auf Bausteinparameter zuzugreifen, die als DB-Zeiger übergeben werden. Bei Funktionen sind dies alle Bausteinparameter mit zusammengesetztem Datentyp und bei Funktionsbausteinen Durchgangsparameter mit zusammengesetztem Datentyp.

Wenn Sie also auf einen derartigen Bausteinparameter zugreifen, z.B. um eine Bitkomponente einer Struktur abzufragen oder einen INT-Wert zu einer Feldkomponente zu schreiben, wird der Inhalt des AR1 verändert, und nebenbei bemerkt auch der Inhalt des DB-Registers.
Dies trifft auch zu, wenn Sie Bausteinparameter mit diesem Datentyp an aufgerufene Bausteine „weiterreichen“.

Verwenden Sie das AR1, so darf zwischen dem Laden des AR1 und der indirekten Adressierung kein oben beschriebener Zugriff auf einen Bausteinparameter erfolgen. Andernfalls müssen Sie den Inhalt des AR1 retten.

HDD


Mfg
Manuel
 
böse - und ich dachte mit ar1 kann ich machen was ich will weil das symbol "steuerwort" dem sfc alle notwenigen parameter gibt.

er sollte doch erkennen das es eine lokale stat-var ist und wie groß diese ist...

trotzdem danke!
 
Zurück
Oben