Step 7 Pointer im FB verarbeiten

Waelder

Level-2
Beiträge
964
Reaktionspunkte
117
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 : http://www.sps-forum.de/faq/8663-pointer-als-im-fc-verarbeiten.html
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 :s7:


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...
 
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

//      [COLOR="#FF0000"]AUF   DB [#DB_NR]             //Datenbaustein aufrufen : ist hier eigentlich falsch[/COLOR]
      L     D [AR1,P#2.0]             //Bereichsadresse
      LAR1  

      [COLOR="#0000FF"]AUF   DB [#DB_NR]               //Datenbaustein aufrufen : sollte erst hier erfolgen[/COLOR]
      L     D [AR1,P#0.0]             //aktueller Wert Sensor
      T     #Sensor

Harald
 
Antwort zur Frage

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 ;-)
 
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.

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? :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      TAR2  
      UD    DW#16#FFFFFF //<<<< Den hier
      L     P##HMI
      +D    
      LAR1
Achja richtig - Multiinstanz vergessen :oops:

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
 
@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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@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...
 
Zurück
Oben