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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 26

Thema: FB mit lokalen Variablen schreiben

  1. #11
    Registriert seit
    15.04.2011
    Beiträge
    1.122
    Danke
    229
    Erhielt 208 Danke für 176 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich wiederhole mich nur ungern...

    Stell doch Deinen Baustein ins Forum...
    Gruß
    190B

  2. #12
    Miffi ist offline Benutzer
    Themenstarter
    Registriert seit
    24.09.2012
    Beiträge
    71
    Danke
    70
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von godi Beitrag anzeigen
    Meinst du mit Lokalen Variablen den Stat - Bereich?
    Dein Adressenoperand (die Variable wo dein Pointer drinn ist) kann nicht im Stat Bereich abgelegt werden wenn dein Baustein Multiinstanzfähig ist, da es sonst Probleme mit den Adressregistern gibt.
    Du kannst entweder deinen Bausten nicht Multiinstanzfähig machen oder den Adressoperanden im temp Bereich ablegen.

    godi

    Ja, das ist es. Danke!

  3. #13
    Registriert seit
    14.10.2010
    Ort
    Telgte
    Beiträge
    653
    Danke
    97
    Erhielt 129 Danke für 99 Beiträge

    Standard

    Ja, das ist es. Danke!
    Was denn jetzt genau? Hast du den Aderssoperanden im Temp abgelegt?
    Dein Problem ist gelöst, aber keiner weiß genau wo das Problem lag...

    190B hat dich 2mal gebeten den Baustein zu zeigen oder genauer zu werden.
    Sinn und Zweck eines solchen Threads ist es unter anderem, das andere Nutzer oder Besucher
    des Forums mit Schlagworten diese Posts finden und ihr Problem anhand der dort zu findenen Informationen
    eigenständig lösen können. Außerdem möchten auch diejenigen die dir geholfen haben ein ordentliches Feedback.
    Sei bitte allen gegenüber so fair.

    Danke, Toki
    Programmierumgebung: Step7 V5.5, WinCCflex2008-SP3, TIA-PortalV13, MicroWinV4.0

  4. #14
    Miffi ist offline Benutzer
    Themenstarter
    Registriert seit
    24.09.2012
    Beiträge
    71
    Danke
    70
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    es tut mir leid, ich war so in Eile, 190B hat geschrieben, dass ich den Baustein hier reinstellen soll ... aber ich wusste nicht wie.

    Wie ich schon bereits geschrieben habe: ich möchte einen FB mit lokalen Variablen schreiben, der Daten in einen Datenbaustein (DBxy.DBWxy) schreibt.


    // Daten in Baustein schreiben geht so nicht:

    AUF #DATENBAUSTEIN
    L #DATEN
    T DBW[#MD1]
    L #MD1
    L p#2.0
    +D
    T #MD1
    L #MD1
    L #ENDE
    ==D
    SPB ENDE

    // weil MD1 als STAT eingestellt war.

    Dann habe ich - wie von Godi gesagt - MD1 als TEMP eingestellt und das hat funktioniert.

    Aber warum??? Das habe ich noch nicht verstanden. Ich dachte, MD1 ist nur 1 Zyklus gültig, wenn ich es als TEMP einstelle? Wie konnte der Wert von MD1 bis zum Schluss erhalten bleiben ... ein Phänomen

  5. #15
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo,
    das was Godi schreibt erscheint mir in diesem Zusammenhang nicht logisch. Du greifst ja nicht indirekt auf deine Variable "#MD1" zu (das ist übrigens ein blöder Name, da er die Verwendung eines Merker-Doppelwortes vorgaukelt).
    Ist diese Variable den in beiden Fällen (TEMP-Bereich und STAT-Bereich) als DINT deklariert ? Ich kenne es so, dass diese Variable als DWORD deklariert sein muß - ich bin allerdings gerade nicht in der Lage, dass in der Software gegenzuchecken ...

    Was passiert wenn #MD1 <> #Ende ist ?
    Bei der Abfrage ist es übrigens sinnig nicht ==D sondern besser >=D hinzuschreiben ...

    Gruß
    Larry

  6. #16
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 182 Danke für 167 Beiträge

    Standard

    Zitat Zitat von Miffi Beitrag anzeigen
    Dann habe ich - wie von Godi gesagt - MD1 als TEMP eingestellt und das hat funktioniert.

    Aber warum??? Das habe ich noch nicht verstanden. Ich dachte, MD1 ist nur 1 Zyklus gültig, wenn ich es als TEMP einstelle? Wie konnte der Wert von MD1 bis zum Schluss erhalten bleiben ... ein Phänomen
    Natürlich ist dein #MD1 nur ein Zyklus gültig! Du musst bevor du lesend auf #MD1 zugreifst unbedingt schreibend auf #MD1 zugreifen!
    Warum es funktioniert hat: Du verwendest in keinem anderem Baustein mit der selben Interrup Priorität Lokale Daten.

    @Larry
    Ich habe gerade mein altes Buch hervorgekramt (Automatisieren mit Step7 in AWL und SCL, 4 Auflage) und da steht auf Seite 417:
    In Funktionsbausteinen können Sie Instanzdaten als Adressenoperanden nur dann einsetzen, wenn Sie den Baustein als CODE_VERSION1-Baustein übersetzen.(nicht "multiinstanzfähig")
    Der Grund warum steht leider nicht dabei.
    Ich denke mal das die speicherindirekte Adressierung intern auch gleich wie die registerindirekte Adressierung funktioniert und somit würde es bei einer Multiinstanz Probleme mit den Adressregistern geben.

    godi

  7. Folgende 2 Benutzer sagen Danke zu godi für den nützlichen Beitrag:

    borromeus (31.10.2012),Larry Laffer (01.11.2012)

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

    Standard

    Zitat Zitat von Miffi Beitrag anzeigen
    // Daten in Baustein schreiben geht so nicht:
    [...]
    // weil MD1 als STAT eingestellt war.

    Dann habe ich - wie von Godi gesagt - MD1 als TEMP eingestellt und das hat funktioniert.
    Warum STAT nicht geht? Weil der AWL-Compiler es nicht kann. Und Siemens extra dokumentiert, daß es nicht zulässig ist:
    Zitat Zitat von Hilfe zu AWL
    Speicherindirekte Adressierung
    [...]
    Der Pointer muß für die speicherindirekte Adressierung in einem der folgenden Bereiche gespeichert werden:
    · M - Merker
    · L - Lokaldaten
    · D - Datenbaustein (DB oder DI)
    · STAT - Statische Daten (nicht bei multiinstanzfähigen Bausteinen)
    Wenn der Pointer #MD1 unbedingt STAT sein muß, dann kann er auch extra nur für die speicherindirekte Operation auf ein TEMP-DWORD umkopiert werden:
    Code:
    L #MD1
    T #TEMP_PTR
    
    L #DATEN
    AUF #DATENBAUSTEIN
    T DBW[#TEMP_PTR]
    Zitat Zitat von Miffi Beitrag anzeigen
    Ich dachte, MD1 ist nur 1 Zyklus gültig, wenn ich es als TEMP einstelle? Wie konnte der Wert von MD1 bis zum Schluss erhalten bleiben ... ein Phänomen
    Eine TEMP-Variable ist gültig von der ersten Zuweisung bis zum Ende des Bausteins. Danach verliert sie ihren Inhalt und muß im nächsten Durchlauf erneut einen Wert zugewiesen bekommen, bevor ihr Inhalt benutzt werden kann.

    In Deinem Programm-Fragment benutzt Du #MD1 in der 3. Zeile bevor Du #MD1 in der 7. Zeile etwas zuweist - das dürfte mit #MD1 als TEMP nicht funktionieren. Es sei denn, Du hast noch Code mit der Zuweisung vor dem hier gezeigten Code.


    Zitat Zitat von Miffi Beitrag anzeigen
    190B hat geschrieben, dass ich den Baustein hier reinstellen soll ... aber ich wusste nicht wie.
    Programmcode in einen Beitrag einfügen: den Code-Text zwischen [CODE]-Tags einfügen. Dazu im Beitragseditor den #-Button benutzen. Oder als Textdatei an den Beitrag anhängen (hochladen).

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Larry Laffer (01.11.2012),Miffi (01.11.2012)

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

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Ich kenne es so, dass diese Variable als DWORD deklariert sein muß - ich bin allerdings gerade nicht in der Lage, dass in der Software gegenzuchecken ...
    STEP7-AWL läßt für Pointer im Doppelwortformat DWORD und DINT zu, und außerdem auch !!! REAL, Time, Time_Of_Day - anscheinend alles, was 32 Bit groß ist. Eigentlich ist keiner der Datentypen 100% korrekt, doch DWORD kommt dem Zweck noch am nächsten. Ich verwende immer nur DWORD.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  11. #19
    Miffi ist offline Benutzer
    Themenstarter
    Registriert seit
    24.09.2012
    Beiträge
    71
    Danke
    70
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von godi Beitrag anzeigen
    Natürlich ist dein #MD1 nur ein Zyklus gültig! Du musst bevor du lesend auf #MD1 zugreifst unbedingt schreibend auf #MD1 zugreifen!
    Warum es funktioniert hat: Du verwendest in keinem anderem Baustein mit der selben Interrup Priorität Lokale Daten. godi
    Das ist der Grund, warum die temporäre Index-Variable weiter ihre Gültigkeit beibehält? Soll aber lt. Definition nicht sein dürfen oder?

  12. #20
    Miffi ist offline Benutzer
    Themenstarter
    Registriert seit
    24.09.2012
    Beiträge
    71
    Danke
    70
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von PN/DP Beitrag anzeigen
    In Deinem Programm-Fragment benutzt Du #MD1 in der 3. Zeile bevor Du #MD1 in der 7. Zeile etwas zuweist - das dürfte mit #MD1 als TEMP nicht funktionieren. Es sei denn, Du hast noch Code mit der Zuweisung vor dem hier gezeigten Code.
    Programmcode in einen Beitrag einfügen: den Code-Text zwischen [CODE]-Tags einfügen. Dazu im Beitragseditor den #-Button benutzen. Oder als Textdatei an den Beitrag anhängen (hochladen).

    Harald
    Ja, die Index-Variable ist vollkommen TEMP. Ich poste mal den kompletten Code hier mit OB1 und ausformulierten Variablen zum besseren Verständnis:

    Code:
    // OB1: 
    
    
    
    U     E      0.0
          =     L     20.0
          BLD   103
          U     M    255.1
          =     L     20.1
          BLD   103
          CALL  FB     1 , DB1
           start_reset  :=L20.0
           takt         :=L20.1
           datenbaustein:=DB100
           daten        :=850
           db_max       :=6400
           led_ende     :=A0.0
    
    
    
    
    // FB1: 
    
    //Es soll der Taktmerker z. B. ein M255.1 verwendet werden, um zur eingestellten 
    //Zeit die abgeholten Daten (INT-Zahl) um 1 zu erhöhen und in einen 
    //lobal-Datenbaustein einzutragen, also x+1 bis x+max. Die originalen Daten 
    //(INT-Zahl) sollen nicht verändert werden.
    
    // #datenbaustein: einen schon erstellen Datenbaustein angeben
    // #db_max:  max. Anzahl der Datensätze in INT (Bitweise)
    // #led_ende: LED leuchtet, sobald zum ersten Mal DB-Ende erreicht wird
    // #daten: irgendeine INT-Zahl als Anfangswert, hier einfach 850 
    
    IN:
    start_reset, BOOL
    takt, BOOL
    datenbaustein, BLOCK_DB
    daten, INT
    db_max, INT
    
    OUT:
    led_ende, BOOL
    
    STAT:
    mw_dateninhalt, INT
    m_index_anfang, BOOL
    m_daten_geholt, BOOL
    
    
    TEMP:
    m_flanke_takt, BOOL
    md_db_index, DINT
    
    // Programm starten:
    
          UN    #start_reset                
          SPB   NULL
    
    
          L     #md_db_index
          L     0
          ==D   
          S     #m_index_anfang
    
    
          U     #start_reset
          U     #takt
          FP    #m_flanke_takt
          U     #m_index_anfang
          SPBN  ENDE
    
    
          UN    #m_daten_geholt
          SPB   HOLE                       
    
    
          L     #mw_dateninhalt             
          L     1                         
          +I    
          T     #mw_dateninhalt
          AUF   #datenbaustein
          L     #mw_dateninhalt             
          T     DBW [#md_db_index]    
          L     #md_db_index
          L     16                         
          +D    
          T     #md_db_index
    
    
          L     #md_db_index
          L     #db_max                
          ==D   
          R     #m_index_anfang
          S     #led_ende
          SPB   NULL                      
          BE    
    
    
    HOLE: L     #daten
          T     #mw_dateninhalt
          S     #m_daten_geholt
          R     #led_ende
          BE    
    
    
    NULL: L     0
          T     #md_db_index
          L     #daten
          T     #mw_dateninhalt
    
    
    ENDE: BE

Ähnliche Themen

  1. Variablen Namen in Variable schreiben
    Von Vogei im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 22.05.2012, 21:30
  2. Antworten: 1
    Letzter Beitrag: 06.04.2011, 15:39
  3. Rohdaten in Variablen schreiben!?
    Von Deyn im Forum HMI
    Antworten: 12
    Letzter Beitrag: 22.06.2010, 16:48
  4. Antworten: 5
    Letzter Beitrag: 30.11.2009, 10:27
  5. Intouch Variablen in DB schreiben
    Von alonely01 im Forum HMI
    Antworten: 6
    Letzter Beitrag: 08.02.2007, 14:30

Lesezeichen

Berechtigungen

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