Verwendung eines Any-Pointers im FB

merlin

Level-1
Beiträge
184
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

Ich bin dabei einen FB zu erstellen. Dem FB möchte ich auf der Schnittstelle als IN einen Bereich mitteilen auf dem ich dann arbeite. zB IN1 := P#DB402.DBX0.0 BYTE 10

Wie schaffe ich es jetzt im FB drinnen das Bit 0o.0 anzusprechen?

Meine Versuche schaun derzeit so aus:
L P##IN1
LAR1
U M100.0
= DBX [AR1, P#0.0]

Hat leider nicht den gewünschten Erfolg.
Wo liegt mein Fehler?

Besten Dank
Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich komm mit dem Beispiel nicht ganz klar.
Wenn ich die letzte Zeile aktiviere, geht die CPU auf Stop und meldet einen Bereichsfehler beim Lesen (falsche Bereichskennung).
 
Es ist doch immer wieder das gleiche Problem, wo zeigt welcher Zeiger hin?
Dein
lädt nicht den übergebenen Anypointer, sondern die Adresse, an der sich der Anypointer befindet (also letztlich die Adresse von IN1).

Ich würde es folgendermaßen lösen:
Code:
FUNCTION_BLOCK FB 123
TITLE =
VERSION : 0.1

VAR_INPUT
  IN1 : ANY ;    
END_VAR
VAR_TEMP
  DBNr : WORD ;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     P##IN1; 
      LAR1  ; // Zeiger auf IN1
      L     0; 
      L     LW [AR1,P#4.0]; // Hier steht die DBNr, wenn ein DB gefordert ist
      ==I   ; 
      SPB   NDB; // kein DB
      T     #DBNr; // DB Nummer sichern
      AUF   DB [#DBNr]; // den DB aufschlagen
NDB:  L     LD [AR1,P#6.0]; // Jetzt den Pointerteil laden
      LAR1  ; 

      U     M    100.0; 
      =      [AR1,P#0.0]; 

END_FUNCTION_BLOCK
Ich hab' gerade gesehn, dass ralle auch ein Bsp angegeben hat. Problem ist, dass ralles Verweis auf dem nur intern genutzten 6 Byte langen Pointer Typ basiert.

Was noch dazu kommt:
Die Verwendung von AR2 ist bei Multiinstanz-fähigen Bausteinen immer gefährlich, da AR2 für interne Adressierungszwecke verwendet wird.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also jetzt stürtzt die CPU in der Zeile L LW [AR1,P#4.0]; ab.
Komischerweise steht die DB-Nummer im Bereich 0.0 wie in Ralles Beispiel??? Ich blick bald nicht mehr durch...
 
Sorry, auf die schnelle ein Fehlerchen. Bei den beiden Zeilen
L LW [AR1,P#4.0]; // Hier steht die DBNr, wenn ein DB gefordert ist

NDB: L LD [AR1,P#6.0]; // Jetzt den Pointerteil laden
muss das auf die Lokaldaten verweisende "L" weg, also richtig wäre:
L W [AR1,P#4.0]; // Hier steht die DBNr, wenn ein DB gefordert ist

NDB: L D [AR1,P#6.0]; // Jetzt den Pointerteil laden
 
du hovonlo hast du nicht zufällig eine cpu bei der hand?
so recht funktionieren will das nicht. jetzt steht die cpu bei der = zuweisung. :(
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kommando retour... Fehler entdeckt...

Beim Aufruf des FB liegt mein Problem. Rufe ich den FB402 dirket mit einem Instanz-DB auf ist alles wunderbar wie du beschrieben hast. Beim Aufruf mit einem Multi-Instanz-DB klappts nicht mehr.
 
Hallo merlin,

..Rufe ich den FB402 dirket mit einem Instanz-DB auf ist alles wunderbar wie du beschrieben hast. Beim Aufruf mit einem Multi-Instanz-DB klappts nicht mehr.
In einem FB hat man nicht so viel Narrenfreiheit mit AR1 und AR2 wie in einer FC. Wie es dennoch mit Multiinstanzen funktioniert, zeigt anhängendes Bsp. von Siemens. AR2 wird als Startadresse der Instanz zum Pointer dazu addiert. Achtung, im Bsp. wird auch wieder "nur" ein Pointer verwendet, kein ANY.

Hier der link zum Siemens-Beitrag:
http://support.automation.siemens.com/WW/view/de/19106712


Gruß, Onkel
 

Anhänge

  • Siemens-Bsp. Pointer im FB.jpg
    Siemens-Bsp. Pointer im FB.jpg
    49,7 KB · Aufrufe: 34
Beitrags-ID:19106712 Datum:01.12.2006 schrieb:
..Das beschriebene Beispiel gilt nur für DB-Bereiche, da die CPU sonst in den Zustand "STOP" geht. Eine Nummerierung mit 0 (DB0) ist nicht zulässig...
Hä? Wieso das denn jetzt? Das widerspricht meiner bisherigen bescheidenen Erfahrung. Kann mir das mal jemand erklären? IN_OUT in diesen Zusammenhang verwende ich allerdings auch höchst selten, Pointer in FBs auch.


Gruß, Onkel
 
Zuletzt bearbeitet:
Zurück
Oben