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

Ergebnis 1 bis 9 von 9

Thema: Pointer im FB verarbeiten

  1. #1
    Registriert seit
    18.04.2005
    Ort
    Fast an der Schweiz
    Beiträge
    856
    Danke
    208
    Erhielt 108 Danke für 76 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich bin gerade am FB schreiben (Anschaltung eines Analogventils an PID) der aus einem DB einige Daten auslesen soll.
    Der FB wird anschliessend als Multiinstanz zig male in einem anderen FB aufgerufen. Meine Frage stellt sich nun wie folgt :

    Ich habe in der FAQ dieses Thema gefunden : Pointer als IN im FC verarbeiten
    Muss ich bei der Beschaltung im FB der als Multiinst. verwendet wird noch ausmaskieren ? Ich meine nicht da ich ja anhand
    AUF DB [#DB_NR] auf die absoluten Adressen des DBs zugreife.

    Umgekehrt müsste ich ja auch auf diese Art in den DB schreiben können oder ?

    Grüsse & Danke für Eure Hilfe,
    Wälder


    Mein Code sieht wie folgt aus :

    Code:
    //Erzeuge Grenzen für Automatikwert
    
          L     P##Sensor_PV
          LAR1  
          L     W [AR1,P#0.0]
          T     #DB_NR
    
          AUF   DB [#DB_NR]               //Datenbaustein aufrufen
          L     D [AR1,P#2.0]
          LAR1  
    
          L     D [AR1,P#0.0]               //aktueller Wert Sensor
          T     #Sensor
    
          L     D [AR1,P#12.0]              //minimum Sensor
          T     #Low
    
          L     D [AR1,P#16.0]              //maximum Sensor
          T     #High
    
    
    //Schreibe in einen DB
     
          L     P##Start
          LAR1  
          L     W [AR1,P#0.0]
          T     #DB_NR
    
          AUF   DB [#DB_NR]               //Datenbaustein aufrufen
          L     D [AR1,P#2.0]
          LAR1  
    
          L    #Wert1
          T     D [AR1,P#16.0]              //Wert 1
    
          L     #Wert2
          T     D [AR1,P#24.0]              //Wert 2
    
          L     #Wert3
          T     D [AR1,P#28.0]              //Wert 3
     
    ... usw...
    Code:
     RTFM ! Read The F..ing Manual
    Arbeitet mit : Step7 V5.5 SPx / WinCC Flex 2008 SPx / Intouch / Winmod /TIA V14 (abgestürzt...Zitat der Hotline : "Sie dürfen nicht so viel rumdrücken....." TIA, so isses halt)

    ║▌║█║║▌║█║ Warnung! Falscher oder fehlender Kaffee - Benutzer angehalten --(◔̯◔)--
    1334566890111
    Zitieren Zitieren Pointer im FB verarbeiten  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von Waelder Beitrag anzeigen
    Muss ich bei der Beschaltung im FB der als Multiinst. verwendet wird noch ausmaskieren ?
    Was meinst Du mit "ausmaskieren"?

    Wie ist bei Dir "Sensor_PV" deklariert? Anscheinend übergibst Du ja eine Struktur. Nur wenn die in IN_OUT oder explizit als POINTER deklariert ist, nur dann kannst Du den Code aus der FAQ verwenden (obwohl er nicht ganz korrekt ist (*) ).
    Wenn die Struktur an IN oder OUT übergeben wird, dann wird eine Kopie im IDB übergeben und Du mußt direkt z.B. auf #Sensor_PV.Low zugreifen. Schau Dir mal den erzeugten IDB in der DB-Ansicht an.


    (*) Der DB aus dem übergebenen Pointer darf eigentlich erst geöffnet werden, wenn auch die Bereichsadresse aus dem Pointer gelesen ist. Zum Glück hat dieser Fehler meistens keine Auswirkung, weil Pointer im FC über den Stack (vorherige Lokaldaten) und im FB über den IDB übergeben werden und daher "L P##InParameter" nicht auf den Bereich "DB" zeigt und deshalb AR1 nicht auf "DB" zeigt, sondern auf "V" bei FC bzw. "DI" bei FB. Trotzdem sollte man sich die falsche Codefolge gar nicht erst angewöhnen. Vielleicht will man ja mal 2 Pointer übergeben und den zweiten Pointer in AR2 laden - da geht die falsche Codefolge in die Hose...
    Code:
          L     P##Sensor_PV
          LAR1  
          L     W [AR1,P#0.0]
          T     #DB_NR
    
    //      AUF   DB [#DB_NR]             //Datenbaustein aufrufen : ist hier eigentlich falsch
          L     D [AR1,P#2.0]             //Bereichsadresse
          LAR1  
    
          AUF   DB [#DB_NR]               //Datenbaustein aufrufen : sollte erst hier erfolgen
          L     D [AR1,P#0.0]             //aktueller Wert Sensor
          T     #Sensor
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Vielleicht will man ja mal 2 Pointer übergeben und den zweiten Pointer in AR2 laden - da geht die falsche Codefolge in die Hose...
    Wobei das noch deutlich weitreichendere Konsequenzen hat - da kann so einiges mehr in die Hose gehen ...
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. #4
    Avatar von Waelder
    Waelder ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.04.2005
    Ort
    Fast an der Schweiz
    Beiträge
    856
    Danke
    208
    Erhielt 108 Danke für 76 Beiträge

    Standard

    Hallo Harald,

    vielen Dank für deine Antwort.
    Vorab : Da ich mit dieser Pointer Geschichte noch nicht Sattelfest bin habe ich diese Frage gestellt
    Ich komme nicht so oft mit den Pointer & Any in Berührung

    So nun zu deiner Frage was ich mit ausmaskieren meine ;

    Ist vermutilch ein verständnisproblem meinerseits, ich meine den Zugriff auf die Variabeln innerhalb eines FBs
    Das habe ich gemeint. Ist aber glaub grad nicht von Bedeutung da ich ja von extern auf einen DB zugreife.
    Code:
          TAR2  
          UD    DW#16#FFFFFF //<<<< Den hier
          L     P##HMI
          +D    
          LAR1
    Aber zu meiner Frage ich habe einen DB der alle Analogsensoren enthält mit Skalierung usw...
    Der FB sieht (teilweise) wie folgt aus :

    Code:
    VAR_INPUT
      CLO : BOOL ;    //
      OPE : BOOL ;    //
      ERR : BOOL ;    //
      Sensor_UNIT : POINTER ;    //Sensor "Unit" << Das ist meine Startadresse
      LNM_Out_PID : REAL ;    //
      ANA_Valve_I : INT ;    //
    END_VAR
    VAR_OUTPUT
      ON : BOOL ;    //Enable output (valve or so)
      PV_IN : REAL ;    //actual value (to PID)
      SP_INT : REAL ;    //setpoint (to PID)
      MAN : REAL ;    //manual value (0-100% to PID)
      MAN_ON : BOOL ;    //1= manual (to PID)
    END_VAR
    ... usw . . usw...


    Teilauszug DB eines Sensors (von ca. 50 Stück) :
    Code:
    DB90.DBW    0    "ANA".DT624.Sensor    DEZ        
    DB90.DBX    2.0    "ANA".DT624.ACK_EXT DEZ        
    DB90.DBD    4    "ANA".DT624.Unit    GLEITPUNKT    << Den übergebe ich am FB als und möchte ihn auslesen    
    DB90.DBD    8    "ANA".DT624.Percent    GLEITPUNKT        
    DB90.DBW   12    "ANA".DT624.SCA.Sensor_Min    DEZ        
    DB90.DBW   14    "ANA".DT624.SCA.Sensor_Max    DEZ        
    DB90.DBD   16    "ANA".DT624.SCA.Unit_Min    GLEITPUNKT << Den möchte ihn auslesen        
    DB90.DBD   20    "ANA".DT624.SCA.Unit_Max    GLEITPUNKT << Den möchte ihn auslesen
    ...usw . . usw...


    Ich möchte nur den Wert "ANA".DT624.Unit (DB90.DBD4) übergeben
    und anhand des Offsets die Werte zur weiterbearbeitung für
    "ANA".DT624.Unit (+0)
    "ANA".DT624.SCA.Unit_Min (+12)
    "ANA".DT624.SCA.Unit_Max (+16)
    weiterverarbeiten.

    Der nächste Sensor beginnt dann halt mit Startadresse 92

    Deshalb habe ich mir diesen Code so angepasst um die Werte anhand einer Startadresse auszulesen.
    Umgekehrt meine ich natürlich auch das Schreiben in einen DB müsste ja nach dem Selben prinzip gehen.

    Grüsse und Danke,

    Auch an 4L
    Code:
     RTFM ! Read The F..ing Manual
    Arbeitet mit : Step7 V5.5 SPx / WinCC Flex 2008 SPx / Intouch / Winmod /TIA V14 (abgestürzt...Zitat der Hotline : "Sie dürfen nicht so viel rumdrücken....." TIA, so isses halt)

    ║▌║█║║▌║█║ Warnung! Falscher oder fehlender Kaffee - Benutzer angehalten --(◔̯◔)--
    1334566890111
    Zitieren Zitieren Antwort zur Frage  

  5. #5
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Waelder Beitrag anzeigen
    Ist vermutilch ein verständnisproblem meinerseits, ich meine den Zugriff auf die Variabeln innerhalb eines FBs
    Das habe ich gemeint. Ist aber glaub grad nicht von Bedeutung da ich ja von extern auf einen DB zugreife.
    Code:
          TAR2  
          UD    DW#16#FFFFFF //<<<< Den hier
          L     P##HMI
          +D    
          LAR1
    mit TAR2 lädst du den Instanzbaustein"pointer" in den Akku1. Durch das Verunden mit 00FF FFFF wird die Information IDB-Nr. gelöscht. ... mir erschließt sich der Sinn nicht ... das Verunden mit FF00 0000 würde mehr Sinn machen, da es die Möglichkeit geben würde, die IDB-Nr. in den später errechneten Pointer im Adressregister 1 zu benutzen. Wobei es dafür auch elegantere Möglichkeiten gibt.

    Zitat Zitat von Waelder Beitrag anzeigen


    Teilauszug DB eines Sensors (von ca. 50 Stück) :
    Code:
    DB90.DBW    0    "ANA".DT624.Sensor    DEZ        
    DB90.DBX    2.0    "ANA".DT624.ACK_EXT DEZ        
    DB90.DBD    4    "ANA".DT624.Unit    GLEITPUNKT    << Den übergebe ich am FB als und möchte ihn auslesen    
    DB90.DBD    8    "ANA".DT624.Percent    GLEITPUNKT        
    DB90.DBW   12    "ANA".DT624.SCA.Sensor_Min    DEZ        
    DB90.DBW   14    "ANA".DT624.SCA.Sensor_Max    DEZ        
    DB90.DBD   16    "ANA".DT624.SCA.Unit_Min    GLEITPUNKT << Den möchte ihn auslesen        
    DB90.DBD   20    "ANA".DT624.SCA.Unit_Max    GLEITPUNKT << Den möchte ihn auslesen
    ...usw . . usw...
    Frage zu Deiner Struktur: sind da noch mehr Bits drin?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von Waelder Beitrag anzeigen
    Code:
          TAR2  
          UD    DW#16#FFFFFF //<<<< Den hier
          L     P##HMI
          +D    
          LAR1
    Achja richtig - Multiinstanz vergessen

    Du mußt AR2 ohne die Bereichskennung zur Adresse des IN-Parameters addieren:
    Code:
    //*** FB Multiinstanz ***
    //Pointer auf IN-Parameter Sensor_PV erstellen
          L     P##Sensor_PV                // relative Adresse #Sensor_PV in dieser Instanz (DI)
          TAR2                              // Offset dieser Multiinstanz (DB)
          UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
          +D
          LAR1                              // AR1: absolute Adresse #Sensor_PV im IDB (DI)
    
    //Pointer auf die übergebene Sensor_UNIT erstellen
          L     W [AR1,P#0.0]
          T     #DB_NR
    
          L     D [AR1,P#2.0]               //Bereichsadresse
          LAR1  
    
    //Werte aus der übergebenen Struktur Sensor_UNIT lesen
          AUF   DB [#DB_NR]                 //Datenbaustein aufrufen
          L     D [AR1,P#0.0]               //aktueller Wert Sensor
          T     #Sensor
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    vierlagig (26.05.2014)

  8. #7
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    so herum macht es Sinn ... und Multiinstanz war das fehlende Stichwort
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  9. #8
    Avatar von Waelder
    Waelder ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.04.2005
    Ort
    Fast an der Schweiz
    Beiträge
    856
    Danke
    208
    Erhielt 108 Danke für 76 Beiträge

    Standard

    @vierlagig
    Hallo Vierlagig,
    danke für deine Denkanregung.
    Ja ich habe noch einige Bits drin in diesen DB90 der DB90 wird übrigens aus einer Multiinstanz generiert.
    Da drin sitzen ca 50 Sensoren.

    Aber zwischen dem Adressbereich
    DB90.DBX 2.0 "ANA".DT624.ACK_EXT
    und
    DB90.DBD 4 "ANA".DT624.Unit
    ist nichts mehr.
    Aber hintendrein gibt es noch viele Bits die im DB auftauchen.
    Mein Beispiel beinhaltet nur 1 Sensor von ca 50 Stück.
    Aufgereiht einer nach dem Anderen.

    Ich hoffe das Mit der Multiinstanz schon vorher richtig dargestellt zu haben

    @Harald
    Die Gerschichte hier unterhalb war aus einem Anderen Baustein als Beispiel gedacht ich war der Meinung das ich die nicht benötige :
    Code:
          TAR2  
          UD    DW#16#FFFFFF //<<<< Den hier
          L     P##HMI
          +D    
          LAR1
    nun werde ich sie trotzdem benutzen

    Schon mal danke für deinen Code ich werde den gleich testen und berichten.
    Code:
     RTFM ! Read The F..ing Manual
    Arbeitet mit : Step7 V5.5 SPx / WinCC Flex 2008 SPx / Intouch / Winmod /TIA V14 (abgestürzt...Zitat der Hotline : "Sie dürfen nicht so viel rumdrücken....." TIA, so isses halt)

    ║▌║█║║▌║█║ Warnung! Falscher oder fehlender Kaffee - Benutzer angehalten --(◔̯◔)--
    1334566890111

  10. #9
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Waelder Beitrag anzeigen
    @vierlagig
    Aber zwischen dem Adressbereich
    DB90.DBX 2.0 "ANA".DT624.ACK_EXT
    und
    DB90.DBD 4 "ANA".DT624.Unit
    ist nichts mehr.
    Aber hintendrein gibt es noch viele Bits die im DB auftauchen.
    ich meinte, ob mehrere Bits zu einem Sensor gehören und ob es dann vielleicht sinnvoll wäre, diese zusammenzufassen? ein Doppelwort für ein Bit ist schon fast Verschwendung...
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

Ähnliche Themen

  1. S7 LAR P##... --- pointer auf pointer
    Von milmu im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 22.11.2010, 17:39
  2. Antworten: 24
    Letzter Beitrag: 31.01.2010, 21:32
  3. 3 Analogwerte verarbeiten
    Von mythus im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 15.09.2008, 20:40
  4. Pointer als IN im FC verarbeiten
    Von Hewlett_de im Forum Simatic
    Antworten: 27
    Letzter Beitrag: 03.07.2006, 22:00
  5. Pointer als IN im FC verarbeiten
    Von plc_tippser im Forum FAQ
    Antworten: 1
    Letzter Beitrag: 29.06.2006, 14:29

Lesezeichen

Berechtigungen

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