Adressregister im FB

moggi

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Habe ein funktionierendes AWL Script in einem FC, wo ich von einem Konst. Datenbereich 6 Word (PEW) Telegramme Empfange!
Dabei setze ich den Pointer auf das erste PEW P##........Adr1 usw.
Lese somit den ganzen Bereich aus und schreib es auf den jeweiligen Datenbereich(Telegramme).
Jetzt habe ich das Script in einen FB koppiert und mein Pointer stimmt nicht mehr, weil es mein Adressregister verbiegt.

Habe mein Problem kurz in einen Beispiel dargestellt:
Testweise 2 Pew's 256/258
Code:
VAR_INPUT
  test : WORD ;    
END_VAR
VAR_OUTPUT    
END_VAR
VAR
  bereich : WORD ;    
  bereich2 : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =

      TAR2  ; // Multi Instance base address --> accu1
      UD    DW#16#FFFFFF; 
      L     P##test; // variable address --> accu 1 
      +D    ; // add to Multi Instance start address
      LAR1  ; // --> into AR1 
// extract Pointer values
      L     W [AR1,P#0.0]; 
      T     #bereich; 
      L     W [AR1,P#2.0]; 
      T     #bereich2; 


//Testvergleich
      NOP   0; 

      L     PEW  256; 
      L     PEW  258;
Danke
 
Vielleicht so....

Code:
L     #iEA_Adresse
SLD   3
T     #wEA_Temp

LAR1  #wEA_Temp                   //Startadrese der Quelle in AR1
     
L     PED [AR1,P#0.0]             //1.PED-Word laden
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe ein funktionierendes AWL Script in einem FC [...]
Jetzt habe ich das Script in einen FB koppiert und mein Pointer stimmt nicht mehr, weil es mein Adressregister verbiegt.
Wie sieht denn Dein funktionierender AWL-Code im FC aus?
Hat der Eingangsparameter "test" da vielleicht einen anderen Datentyp? Z.B. POINTER?
Wie sieht ein Aufruf des FC aus?

Wenn "test" ein WORD (oder INT) ist und Du beim Aufruf z.B. W#16#100 (256) übergibst, dann müßte der Code des FB identisch zum FC-Code sein.

Code:
VAR_INPUT
  test : WORD ;  [COLOR="Teal"]//schöner wäre INT[/COLOR]
END_VAR
VAR_OUTPUT    
END_VAR
VAR
  bereich : WORD ;    
  bereich2 : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =

[COLOR="red"]      L     #test ; //PEW-number: 256 (W#16#100)
      SLD   3 ; //to P#[test].0[/COLOR]
      LAR1  ; // --> into AR1 
// extract Pointer values
      L     [COLOR="red"]PEW[/COLOR] [AR1,P#0.0]; 
      T     #bereich; 
      L     [COLOR="Red"]PEW[/COLOR] [AR1,P#2.0]; 
      T     #bereich2; 


//Testvergleich
      NOP   0; 

      L     PEW  256; 
      L     PEW  258;

Harald
 
Hallo,

Code:
VAR_INPUT
  test : WORD ;    
END_VAR
 
      TAR2  ; // Multi Instance base address --> accu1
      UD    DW#16#FFFFFF; 
      L     P##test; // variable address --> accu 1 
      +D    ; // add to Multi Instance start address
      LAR1  ; // --> into AR1
Danke

Mit o.a. Zeilen ermittelst du die Adresse der Variable im Instanz-DB, nicht den von dir erhofften Pointer.

LG vuli
 
Adressregister

Möchte eigentlich nicht INT "256" schreiben,
sondern WORD "PEW256" als IN Variable..... sonst würde ja das SLD 3 gehen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Möchte eigentlich nicht INT "256" schreiben,
sondern WORD "PEW256" als IN Variable..... sonst würde ja das SLD 3 gehen
Wenn Du "PEW256" an den IN-Parameter schreiben willst, im Baustein aber nicht den Wert des PEW256 sondern die Adresse von PEW256 haben willst, dann müßte Dein IN-Parameter vom Typ POINTER oder ANY sein.

Nochmal: Wie war das denn bei Deinem "funktionierenden" Code für FC?

Harald
 
Adressregister

Genau so!
Und es funktioniert in einem FC!


L P##test; // variable address --> accu 1
LAR1 ; // --> into AR1
// extract Pointer values
L W [AR1,P#0.0];
T #bereich; //out
L W [AR1,P#2.0];
T #bereich2; //out
 
Zuletzt bearbeitet:
:confused: ...war das die Antwort auf die Frage von Harald ? Wenn ja, dann möchte ich mal sehen, wie du bei einem IN-Word die übergebene Adresse übermittelt bekommst - in dem Fall bekommst du nur den Inhalt (also den Wert) der Speicheradresse übergeben ...

Gruß
Larry
 
//In Parameter mit Wert 256 der Variable

Code:
L 256
T "PEW256" // Merkerwort mit Inhalt 256

Die im FB verarbeiten (Anfangsadresse 256)



//In Parameter mit PEW-Wert der Variable

Code:
L PEW 256  //PE-Eingangswort mit Inhalt ??? tatsächlicher Wert
T "PEW256" // Merkerwort mit Inhalt des PEW

Hier spielst du mit dem Wert der Variable, nicht mit der Anfangsadresse
 
Am in Parameter steht Pew256
An den out Parametern kommen die simulierten Werte :
out1: 4 (Pew256)
out2: 8 (Pew258 )
heraus!
Simuliere mal Deine PEW256 und PEW258 auf andere Werte und Du wirst sehen, daß trotzdem immer 4 und 8 rauskommen.

Tip: Beobachte Deinen FB und blende die Spalte AR1 ein. Zeigt Dein AR1 tatsächlich auf P256.0 ?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für einen FB müßte Dein Code etwa so aussehen:
Code:
// IN   : test : POINTER
// OUT  : out1 : WORD    
//        out2 : WORD
// TEMP : tmpW_DBnr : WORD

//Pointer AR1 auf IN-Parameter test erstellen
      LAR1  P##test             //Adresse Parameter test im DI in AR1
[COLOR="Blue"]      TAR2                      //Multiinstanz-Offset von AR2 in Akku1
      +AR1                      //zu AR1 addieren => Pointer auf Parameter test[/COLOR]

//Wert des Pointers test in AR1 laden
[COLOR="Blue"]      L     W [AR1,P#0.0]       //POINTER: DB-Nummer
      T     #tmpW_DBnr[/COLOR]
      L     D [AR1,P#2.0]       //POINTER: Bereichskennung + Adresse
[COLOR="blue"]      SRD   3                   //wg. Wordzugriff sicherheitshalber auf
      SLD   3                   // garantierte Bitadresse .0 bringen[/COLOR]
      LAR1  
[COLOR="blue"]      AUF   DB [#tmpW_DBnr][/COLOR]

//über Pointer-Parameter test adressierten Bereich lesen
      L     W [AR1,P#0.0]
      T     #out1
      L     W [AR1,P#2.0]
      T     #out2

[COLOR="Green"]//## Testvergleich ##
      L     PEW  256
      L     PEW  258[/COLOR]
Die blau markierten Codezeilen kann man unter bestimmten Voraussetzungen weglassen.
Sie machen aber den FB universeller und robuster.

Aufrufen kannst Du den FB so (das PEW256 kann sogar symbolisch angegeben werden):
Code:
      CALL  FB   123 , DB123
       test:=PEW256
       out1:=MW100
       out2:=MW102

Harald
 
Zurück
Oben