Indirekter Zugriff auf DB und DB-Inhalt

KingShango

Level-1
Beiträge
22
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte folgendes ohne Merker oder statische Variablen realisieren:
In: DB-Nummer, Adresse in diesem DB.
Out: Wert aus diesem DB und dieser Adresse.
Der Bausteinaufruf klappt ja noch, mit Auf[DB-Nummer], aber ich weiss nicht, wie ich auf den Parameter an der Adresse zugreifen kann.
Weiss da jemand weiter, Sprache ist egal (AWL,KOP,FUP,SCL) ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

denke, so könnte es klappen

FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
DB_Nr : BLOCK_DB ;
Addr : INT ;
END_VAR
VAR_OUTPUT
Wert : INT ;
END_VAR
BEGIN
NETWORK
TITLE =

AUF #DB_Nr;
L #Addr;
ITD ;
L P#1.0;
*D ;
TAR1 ;

L DBW [AR1,P#0.0];
T #Wert;



// oder etwas kürzer

AUF #DB_Nr;
L #Addr;
SLW 3;
L DBW [AR1,P#0.0];
T #Wert;

END_FUNCTION
 
VORSICHT!!!
Da ist mal wieder dieser böse SLW 3 aufgetaucht. Es muss ein SLD 3 sein:
// oder etwas kürzer

AUF #DB_Nr;
L #Addr;
//SLW 3; // NEIN, es muss
SLD 3; // heißen
L DBW [AR1,P#0.0];
T #Wert;

END_FUNCTION
Mit dem SLW sind nur Zugriffe bis maximal Byte 8191 im DB möglich, danach wird falsch adressiert, nämlich Adresse MODULO 8192
 
Hier noch eine SCL Funktion:
Code:
FUNCTION FC24 : WORD
VAR_INPUT
  DB_No     :WORD;           (* Nummer des Datenbausteins *)
  Byte_Adr  :INT;            (* Byte Adresse *)
END_VAR  
  FC24 := WORD_TO_BLOCK_DB(DB_No).DW[Byte_Adr];
END_FUNCTION
Um welchen Datentyp geht es denn überhaupt?

Also hier noch für Integer:
Code:
FUNCTION FC24 : INT

VAR_INPUT
  DB_No     :WORD;           (* Nummer des Datenbausteins *)
  Byte_Adr  :INT;            (* Byte Adresse *)
END_VAR  
  FC24 := WORD_TO_INT(WORD_TO_BLOCK_DB(DB_No).DW[Byte_Adr]);
END_FUNCTION
 
Zurück
Oben