Instanz DB DWort auslesen und als Byte wieder im FB von Instanz DB verwenden

taucherd

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

Habe im FB56 den FB57 aufgerufen und der FB57 gibt mir jetzt ein DWord aus.
Dieses DWord liegt jetzt im Instanz DB vom FB56.
jetzt möchte ich mich nicht auf die Nummer des Instanz DB's bezeihen (wegen Änderung) und brauche aber diese 4 Bytes für vergleiche - habe aber keine Lösung gefunden.
 
Wo willst du dieses Doppelwort denn benutzen?
Im FB56 oder in einem anderen Baustein, dann solltest du ihn auf einen ausgang vom FB56 legen.
Gib erst mal ein paar mehr Infos
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Info:
Habe eine FB56 indem ich den FB57 aufrufe.
der FB57 ist unter statisch eingetragen und somit sind habe ich das DWord vom FB57 im Instanzbaustein vom FB56.
Jetzt benötige ich das DWord vom Instanzbaustein des FB56 im FB56 als 4Bytes, damit ich im FB56 einen Vergleich von den 4Bytes mit anderen 4Bytes erstellen kann.

CRC_GEN (das ist das DWORD vom FB57 im InstanzDB vom FB56)
und ich beötitige jetzt dieses DWORD als 4 Bytes im FB56 für einen Vergleich

mit
L CRC_GEN
T CRC_GEN_inByte (ist ein stat. Array [0..3] Of Byte) im InstanzDB vom FB56

ich hoffe, das meine Angaben jetzt klar sind?
 
Also ich verstehe Dein Problem immer noch nicht so richtig.

Könntest Du vielleicht mal den Programmcode (z. B. als AWL-Quelle) vom FB56 und vom FB57 hier in das Forum stellen?

Gruß Kai
 
... habe ich das so richtig verstanden :
Der FB57 ist eine Instanz des FB56, dass heißt die Instanz-Daten des FB57 sind im I-DB des FB56 hinterlegt ...?

Wenn ja, dann kannst du doch auf diese Daten direkt innerhalb des FB56 zugreifen. Das DBD ist dann dem FB56 doch bekannt in der Unterstruktur des FB57.

Ich stimme aber Kai zu. Du solltest (zumindestens einen Auszug) mal hier einstellen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann auch das Programm reinstellen, glaube aber nicht das das was hilft.
habe mal schnell ein screenshot gemacht.

ich weis, meine angabe ist sehr verwirrent.
 
Zuletzt bearbeitet:
Es müßte ungefähr so gehen :
Code:
L P#CRC_Gen
LAR1
 
L DBB [AR1 , P#0.0]   // 1.Byte
L DBB [AR1 , P#1.0]   // 2.Byte
L DBB [AR1 , P#2.0]   // 3.Byte
L DBB [AR1 , P#3.0]   // 4.Byte

Feinheiten ohne Gewähr ... habe gerade kein PG mehr zum Testen zur Hand ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
CRC_GEN (das ist das DWORD vom FB57 im InstanzDB vom FB56)
und ich beötitige jetzt dieses DWORD als 4 Bytes im FB56 für einen Vergleich

Hier mal ein kurzes Programmbeispiel:

Code:
FUNCTION_BLOCK FB 200
TITLE =
VERSION : 0.1
 
VAR
  CRC_GEN : DWORD ; 
  CRC_GEN_BYTE_1 : BYTE ;   
  CRC_GEN_BYTE_2 : BYTE ;   
  CRC_GEN_BYTE_3 : BYTE ;   
  CRC_GEN_BYTE_4 : BYTE ;   
END_VAR
 
BEGIN
 
NETWORK
TITLE =
 
      L     P##CRC_GEN; // DWORD
      LAR1  ; 
 
      L     B [AR1,P#0.0]; 
      T     #CRC_GEN_BYTE_1; // BYTE 1
 
      L     B [AR1,P#1.0]; 
      T     #CRC_GEN_BYTE_2; // BYTE 2
 
      L     B [AR1,P#2.0]; 
      T     #CRC_GEN_BYTE_3; // BYTE 3
 
      L     B [AR1,P#3.0]; 
      T     #CRC_GEN_BYTE_4; // BYTE 4
 
END_FUNCTION_BLOCK

Gruß Kai
 
Danke für die schnelle Problemlösung, habe mir fast gedacht das es mit Pointer geht. Habe aber keine Erfahrung mit den Pointern - wird sich aber ändern.

Dieses Forum und vor allem die Mitglieder sind spitze!

Ist das jetzt so richtig?
Die Werte im DB stimme halt so!

kann mir jemand erklären was da vor sich geht? oder bekannt geben wo ich nachlesen kann.

L P##CRC_GEN
LAR1
L DBB [AR1,P#0.0] // 1.Byte
T #CRC_GEN_inByte[0]
L DBB [AR1,P#1.0] // 2.Byte
T #CRC_GEN_inByte[1]
L DBB [AR1,P#2.0] // 3.Byte
T #CRC_GEN_inByte[2]
L DBB [AR1,P#3.0] // 4.Byte
T #CRC_GEN_inByte[3]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist das jetzt so richtig?
Die Werte im DB stimme halt so!

L P##CRC_GEN
LAR1
L DBB [AR1,P#0.0] // 1.Byte
T #CRC_GEN_inByte[0]
L DBB [AR1,P#1.0] // 2.Byte
T #CRC_GEN_inByte[1]
L DBB [AR1,P#2.0] // 3.Byte
T #CRC_GEN_inByte[2]
L DBB [AR1,P#3.0] // 4.Byte
T #CRC_GEN_inByte[3]

Der Programmcode geht auch noch kürzer:

Code:
FUNCTION_BLOCK FB 200
TITLE =
VERSION : 0.1
 
VAR
  CRC_GEN : DWORD ; 
  CRC_GEN_inByte : ARRAY  [0 .. 3 ] OF BYTE ;   
END_VAR
 
BEGIN
 
NETWORK
TITLE =
 
      L     P##CRC_GEN_inByte; 
      LAR1  ; 
 
      L     #CRC_GEN; 
      T     D [AR1,P#0.0]; 
 
END_FUNCTION_BLOCK

Gruß Kai
 
das funktioniert, super.

jetzt habe ich ein Arry mit 2 bytes und möchtes es auf ein Ausgangaswort schreiben - so funktioniert es soweit. Ist das auch richtig?

L P##Istwert_Opti_Bytes (ist ein Array 0..1 of byte)
LAR1
L DBW [AR1,P#0.0]
T #Isterwert_Opti (ist das ausgangswort)
 
das funktioniert, super.

jetzt habe ich ein Arry mit 2 bytes und möchtes es auf ein Ausgangaswort schreiben - so funktioniert es soweit. Ist das auch richtig?

L P##Istwert_Opti_Bytes (ist ein Array 0..1 of byte)
LAR1
L DBW [AR1,P#0.0]
T #Isterwert_Opti (ist das ausgangswort)

Code:
      L     P##Istwert_Opti_Bytes       //(ist ein Array 0..1 of byte)
      LAR1  
      L     W [AR1,P#0.0]
      T     #Istwert_opti               //(ist das ausgangswort)
Davon ausgehend, daß Istwert_Opti_Bytes eine Temp-Var ist und IstWert_opti eine Out-Var.
 
Zurück
Oben