Parameter als ANY - Boolwert auslesen

guidokk

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

ich habe einen FB, bei dem ein Eingangsparameter als ANY definiert ist. Beim Aufruf habe ich z.B. E10.0 angegeben.

Wie kann ich jetzt den Statuswert des Eingang im FB ermitteln?

Probiert habe ich folgendes, leider klappt es allerdings nicht:
Code:
LAR1  P##E_Z2
U      [AR1,P#0.0]
=     #Int_E_Z2

#Int_E_Z2 ist eine temporäre Variable vom Typ Bool, mit der ich intern dann weiterarbeiten möchte.

Edit:

Ok, ich bin schon etwas weiter...

Code:
LAR1  P##E_Z2 //ANY-Zeiger laden
L     D [AR1,P#6.0] //Speicherbereich und Adresse
LAR1 //in das Adressregister 1
U      [AR1,P#0.0] 
=     #Int_E_Z2
 
Zuletzt bearbeitet:
Warum ist der Eingangsparameter ein ANY und nicht ein BOOL ?

Weill du ein Art Standard-Struktur hast, wo das Erste bit ein BOOL ist ?

Ich wurde diese Struktur als ein UDT erstellen, mit ein BOOL als erste Parameter usw.
Dann definier der Eingansparameter als der UDT, anstatt als ANY.
Du kannst denn komfortabel die Struktur zugreifen in dein Code.

Es passiert eigentlich dasselbe als mit der ANY, aber ist dann komplett Symbolisch und dadurch 'einfacher'.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum ist der Eingangsparameter ein ANY und nicht ein BOOL ?

Weil ich die zusätzlichen Informationen, die in einem ANY stecken im FB benötige, d.h. ich muss im FB prüfen, ob ein gültiger Operand am Eingang ist usw.

Wobei mir grad auffällt, mit einem POINTER müsste das ja auch gehen. Hm.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ist ein Beispiel.
Ich weiss nicht genau wie deine Daten sind strukturiert, aber Du siehst was ich meine.
In mein Beispiel wird getestet ob ein BOOL=TRUE ist und ob ein INT=2 ist.

(STL Source)
Code:
TYPE "My_UDT"
VERSION : 0.1

  STRUCT  
   bi1 : BOOL ; 
   bi2 : BOOL ; 
   in1 : INT ; 
   in2 : INT ; 
  END_STRUCT ; 
END_TYPE
DATA_BLOCK "Test_data"
TITLE =
VERSION : 0.1

  STRUCT  
   set1 : "My_UDT"; 
   set2 : "My_UDT"; 
  END_STRUCT ; 
BEGIN
   set1.bi1 := FALSE; 
   set1.bi2 := FALSE; 
   set1.in1 := 0; 
   set1.in2 := 0; 
   set2.bi1 := FALSE; 
   set2.bi2 := FALSE; 
   set2.in1 := 0; 
   set2.in2 := 0; 
END_DATA_BLOCK

FUNCTION "FC_test_udt" : VOID
VAR_INPUT
  MyData : "My_UDT"; 
END_VAR
VAR_OUTPUT
  result : BOOL ; 
END_VAR
BEGIN
NETWORK
TITLE =
      A     #MyData.bi1; 
      A(    ; 
      L     #MyData.in1; 
      L     2; 
      ==I   ; 
      )     ; 
      =     #result; 
END_FUNCTION
 
ORGANIZATION_BLOCK OB 1
BEGIN
NETWORK
TITLE =
      CALL "FC_test_udt" (
           MyData                   := "Test_data".set1,
           result                   := M     10.0);
      NOP   0; 
NETWORK
TITLE =
      CALL "FC_test_udt" (
           MyData                   := "Test_data".set2,
           result                   := M     10.1);
      NOP   0; 
END_ORGANIZATION_BLOCK
 
Und wo ein FB ist, bin ich immer ein wenig vorsichtig mit dem einfachen Laden eines Parameter, da ja so ein FB auch als Multiinstanz verwendet werden kann und somit der Offset des Adressregister 2 addiert werden muss, damit man nicht lediglich die relative sondern die absolute Adresse des Parameters im Instanz-DB erwischt

Code:
L  P##E_Z2           //Relative Adresse ANY-Zeiger laden
UD DW#16#FFFFFF      //Bereichscodierung entfernen
TAR2                 //AR2 mit Multiinstanz-Offset laden
UD DW#16#FFFFFF      //Ebenfalls Bereichscodierung entfernen
+D                   //Adresse des ANY-Zeigers auf Multiinstanz-Adresse addieren
LAR1                 //Tatsächliche Adresse ANY-Zeiger in AR1 laden 
L   DID [AR1,P#6.0]  //Bereichscodierung "DID" + bereichsinterner Zeiger in AR1
                     //+ 6 Byte Offset (P#6.0; wg. ANY-Pointer)
                     //= Tatsächliche Adresse in Instanz-DB 
LAR1                 //Und jetzt wie gehabt weiter...
U     [AR1,P#0.0] 
=     #Int_E_Z2
 
Zurück
Oben