Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Probleme mit symbolischer Adressierung

  1. #1
    Registriert seit
    06.03.2014
    Beiträge
    17
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo alle zusammen,

    folgendes Anliegen lässt mich unruhig schlafen:

    Mit folgendem Code möchte ich einen FB aufrufen.

    A "DB_Flanken".FP_T_Hand
    S #M_Start_Hand

    A #M_Start_Hand
    CC "Hand"

    Dieser Code befindet sich in einem FB Betriebsarten, welcher folgendermaßen aufgerufen wurde.

    CALL "Betriebsarten", "DB_Betriebsarten" //"DB_Betriebsarten" = DB3

    Mein Merker #M_Start_Hand wird allerdings nicht gesetzt. In allen anderen Stellen im Programm funktioniert diese Herangehensweise, nur hier nicht.

    Folgendes habe ich mit unterschiedlichen Resultaten ausprobiert:

    Benutze ich einen anderen Merker, welcher ebenfalls symbolisch adressiert ist, funktioniert es.
    Adressiere ich den Merker M_Start_Hand absolut mit DBX2.0 (Adresse für M_Start_Hand im DB3), funktioniert es.
    Versuche ich M_Start_Hand anderweitig zu setzen, funktioniert es nicht.

    Eine Flanke am Merker FP_T_Hand kommt definitiv an.
    Der Merker M_Start_Hand wird nicht anderweitig zurückgesetzt, auch wenn alles dafür spricht.

    Das System:

    TIA V12 SP1
    CPU 312

    ebenfalls habe ich das ganze mit S7-PLCSIM V12 simuliert, gleiches Verhalten.


    Für alle Tips und Trick schon mal ein "Dankeschön" im Voraus.

    Schöne Grüße
    Geändert von CaptainB (14.03.2014 um 15:01 Uhr)
    Zitieren Zitieren Probleme mit symbolischer Adressierung  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Ist #M_Start_Hand in Static deklariert oder in Temp?
    Ist der Instanz-DB DB3 konsistent und in die CPU geladen? - ggf. mal neu erzeugen und laden.

    Wird #M_Start_Hand wirklich nirgendwo zurückgesetzt? Vielleicht außerhalb per absolutem Zugriff auf das DB3.DBX2.0 oder indirekt? Hast du indirekt adressierende Programmteile? Kommunizieren andere SPS oder HMI mit Deiner SPS?
    Kannst Du DB3.DBX2.0 steuern (mit einer Variablentabelle?)?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    CaptainB (17.03.2014)

  4. #3
    CaptainB ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.03.2014
    Beiträge
    17
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo PN/DP,

    1.) #M_Start_Hand ist in Static deklariert
    2.) DB ist konsistent und geladen, wurde auch schon gelöscht und neu erzeugt, sowie wieder übertragen = keine Änderung
    3.) Mit dem OB100 rufe ich eine Initialisierung auf, wo ich sämtliche Merker zurücksetze. Wenn es an der Initialisierung liegt, sollte eigentlich gar kein Merker funktionieren.
    4.) Keine indirekte adressierten Programmteile
    5.) Variable lässt sich nicht Steuern oder Forcen

    Eigenartiger Weise, werden bei der Querverweisliste nicht alle Positionen angezeit, in welchen ich die Variable benutze.
    Je nachdem, in welchem FB ich die Variable markiere und auf "Querverweis-Informationen" klicke, bekomme ich unterschiedliche Teilergebnisse.

    Schöne Grüße
    Geändert von CaptainB (17.03.2014 um 07:31 Uhr)

  5. #4
    CaptainB ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.03.2014
    Beiträge
    17
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hab es hinbekommen, weiß allerdings nicht was verkehrt war:

    In meinem FB "Hand" welchen ich aufrufen wollte, war folgender Programmteil:

    A "T_Spanner_einf"
    FP #F_VAR_6 (*Static DB12.DBX2.5*)
    AN "T_Spanner_ausf"
    A "B_Spanner_ausgef"
    AN "B_Spanner_eingef"
    R "DB_Hand".H_V_Spanner_ausf (*Output DB12.DBX0.2*)
    S "DB_Hand".H_V_Spanner_einf (*Output DB12.DBX0.3*)

    Wenn ich diesen Code auskommentiert habe, hat es funktioniert. Also habe ich die Flankenfunktion in einen extra FB ausgelagert und nun funktioniert es.
    Vielleicht habt ihr ja eine Idee warum es vorher nicht funktioniert hat. Wirklich befriedigend ist die Lösung nicht, da ich nicht weiß was ich falsch gemacht habe.

    Schöne Grüße

  6. #5
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard

    Hi

    wie oft wird der FB "Hand" im Zyklus aufgerufen?

    Wenn du diesen mit der gleichen Instanz mehrfach aufrufst, dann macht dir der zweite Aufruf die gespeicherte Flanke aus dem ersten kaputt.

    Und warum schreibst du nicht
    R #H_V_Spanner_ausf (*Output DB12.DBX0.2*)
    S #H_V_Spanner_einf (*Output DB12.DBX0.3*)

    auf deine eigene Instanz solltest du immer lokal Zugreifen. Wenn jemand anders in ein paar Wochen in deinen Code schaut, wird er dir danken.

    'n schön' Tach auch
    HB



  7. #6
    CaptainB ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.03.2014
    Beiträge
    17
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi HellaBarde,

    FB "Hand" rufe ich nur einmal auf. Der Flankenmerker wurde auch nur einmal benutzt.
    Ich hab deshalb nicht lokal adressiert, weil ich den FB "Hand" bedingt in AWL aufrufe, also
    mit CC "Hand".
    Dadurch ist für diesen FB kein DB instanziert, sodass ich bei den Variablen den DB mit angeben muss.

    Schöne Grüße

  8. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von CaptainB Beitrag anzeigen
    Ich hab deshalb nicht lokal adressiert, weil ich den FB "Hand" bedingt in AWL aufrufe, also
    mit CC "Hand".
    Dadurch ist für diesen FB kein DB instanziert, sodass ich bei den Variablen den DB mit angeben muss.
    Auf was sollte dieses im FB denn zugreifen: FP #F_VAR_6 (*Static DB12.DBX2.5*)
    Auf TEMP?
    Wenn #F_VAR_6 in STAT deklariert ist, dann hat dies wohl eher auf DB3.DBX2.5 zugegriffen - weil ja DB3 als IDB des aufrufenden Bausteins FB "Betriebsarten" geöffnet ist.

    Wenn Du einen FB aufrufst, dann MUSST Du dafür sorgen, daß er eine korrekte Ablaufumgebung erhält. Der Code im FB kann nicht wissen, durch welche möglicherweise unsauberen Schweinereien außerhalb er aufgerufen wurde.
    Das ist nicht allein nur eine passende DB-Nummer im DB2-Register (DI), sondern, wenn der FB als "multiinstanzfähig" eingestellt ist, dann muß auch AR2 mit P#DBX0.0 initialisiert werden.

    Warum schreibst Du den Baustein "Hand" überhaupt als FB? Als FC hättest Du nicht diese Versorgungs-Probleme.

    Wenn Du nicht weißt, wie man einen FB fachgerecht in AWL bedingt aufruft, dann programmiere den Aufruf in FUP oder KOP und schaue Dir dann den erzeugten Aufruf in AWL an. Dann wirst Du sehen, daß ein bedingter FB-Aufruf NICHT mit CC realisiert wird, sondern ein "normaler" voll ausprogrammierter CALL bedingt übersprungen wird.


    Wenn ich sehe, daß Du Deinen FB "Hand" nur bedingt aufrufst, dann ahne ich schon Deine nächsten Probleme, die aus dem nur bedingten Aufruf resultieren, z.B.:
    In dem FB willst Du eine steigende Flanke des "T_Spanner_einf" erkennen - ist garantiert, daß "T_Spanner_einf" sich nicht ändert während der FB "Hand" gar nicht aufgerufen wird?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    CaptainB (01.04.2014)

  10. #8
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard

    Zitat Zitat von CaptainB Beitrag anzeigen
    Hi HellaBarde,

    FB "Hand" rufe ich nur einmal auf. Der Flankenmerker wurde auch nur einmal benutzt.
    Ich hab deshalb nicht lokal adressiert, weil ich den FB "Hand" bedingt in AWL aufrufe, also
    mit CC "Hand".
    Dadurch ist für diesen FB kein DB instanziert, sodass ich bei den Variablen den DB mit angeben muss.

    Schöne Grüße
    Au weh
    dann kann FP #F_VAR_6 nicht funktionieren

  11. #9
    CaptainB ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.03.2014
    Beiträge
    17
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    das fällt dann wohl unter die Kategorie "dummer Programmierfehler".

    Ich hab deshalb einen FB verwendet, weil ich meine ganzen Variablen im DB abspeichern kann, was wohl
    bei einem FC nicht geht, laut Informationssystem von TIA. Dann können meine anderen FB's wann sie wollen auf
    die Variablen zugreifen.

    Bedingt habe ich immer deshalb verwendet, weil ich mir die Deklaration der Outputvariablen beim Aufruf spare.
    Dann wird der Code übersichtlicher, finde ich jedenfalls.


    Schöne Grüße

  12. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von CaptainB Beitrag anzeigen
    das fällt dann wohl unter die Kategorie "dummer Programmierfehler".
    Nein, das fällt unter "völlig ahnungslos"


    Ich hab deshalb einen FB verwendet, weil ich meine ganzen Variablen im DB abspeichern kann, was wohl
    bei einem FC nicht geht, laut Informationssystem von TIA. Dann können meine anderen FB's wann sie wollen auf
    die Variablen zugreifen.
    Wie Du gesehen hast: Durch Deine ganze Scheixxe ohne Instanz-DB kann Dein FB keine eigenen Variablen speichern, sondern muß genau wie ein FC voll qualifiziert auf globale DB zugreifen.
    Außerdem haben andere FB sowieso NICHT auf Variablen zuzugreifen, die ein FB lokal deklariert.


    Bedingt habe ich immer deshalb verwendet, weil ich mir die Deklaration der Outputvariablen beim Aufruf spare.
    Stell Dir mal vor wieviele Aufrufvariablen Du sparst, wenn Du gar keine erst deklarierst...


    Dann wird der Code übersichtlicher, finde ich jedenfalls.
    Also ich kann leider nur sagen, Deine Ideen sind nicht übersichtlich sondern einfach nur Scheixxe.
    Ich empfehle Dir, mal einen SPS-Programmierlehrgang zu besuchen. BEVOR Du an richtigen Maschinen 'rumprogrammierst.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren Hart aber herzlich  

  13. Folgende 2 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    Aventinus (01.04.2014),vollmi (01.04.2014)

Ähnliche Themen

  1. Symbolischer Name
    Von outbreak7 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 26.02.2010, 11:24
  2. Antworten: 3
    Letzter Beitrag: 26.01.2008, 08:42
  3. SCL : symbolischer Name
    Von Larry Laffer im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 14.06.2007, 06:56
  4. Probleme mit AR1 und Adressierung
    Von dpd80 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 05.07.2006, 16:58
  5. Antworten: 0
    Letzter Beitrag: 31.12.2004, 04:01

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •