TC3: __VARINFO der übergebenen Variable

Gregtex

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,


ich brauche die Möglichkeit den symbolischen Namen oder den Kommentar einer übergebenen Variablen auslesen zu können.
__VARINFO habe ich leider nur dazu bringen können die Informationen der eigenen Instanz auszulesen.

Code:
VAR_INPUT
    bAlarm                :    BOOL;
    tsEventEntry        :     TcEventEntry := TC_EVENTS.RuntimeErrorClass.NotInitialized;
    sNameOfComponent    :     STRING := '';
END_VAR

bAlarm hat bereits im Kommentar der Übergebenen Variable den Informationsgehalt von sNameOfComponent enthalten, somit redundant.
Ist sowas überhaupt möglich?
 
Hää? Den Kommentar bekommst du angezeigt. Genauso die Instanz auch wenn du sie wohl in sNameOfComponents schon hinterlegt hast
//Declaration
VAR
MyVarInfo: __SYSTEM.VAR_INFO;
MyTestVar: INT;
END_VAR


//Code
MyVarInfo:= __VARINFO(MyTestVar);
// und danach online dir das Ganze anschauen.



Du könntest natürlich auch einen Baustein basteln und als Struktur nutzen. Ich komme wegen VAR_INPUT da drauf.
Dann kannst du mit dem Attribut {attribute 'instance-path'} dir über eine in einem String den Instanzpfad generieren lassen.
Nur für Bausteine!


{attribute 'reflection'}
FUNCTION_BLOCK FB_MY
VAR_OUTPUT
{attribute 'instance-path'}
{attribute 'no_init'}
sPath : STRING;
END_VAR


// Nutzung
sMyPath := fbMy.sPath;
//(fbMy = Instanz von FB_My)
//sMyPath = STRING
Name lautet dann z.B. 'TwinCAT_Device.Unbenannt1.Main.fbMy'


Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
da du bAlarm als Input-Deklariert hast wird der Wert der Variablen umkopiert. Ich gehe nicht davon aus das weitere Informationen mitgegeben werden. Du könntest es Probieren aus bAlarm einen Pointer To Bool zu machen. Wenn das klappen würde, müsste man mit den Pointern aber beim Online-Change aufpassen.
 
War wohl nicht verständlich ausgedrückt von mir :p

Es um folgendes:
Ich habe in einer beliebigen GVL folgende Bool-Variable

Code:
VAR_GLOBAL
B51_1 : BOOL //++B51.1
END_VAR

An einer beliebigen Stelle habe ich einen FB_EventHandler mit folgender Input-Schnittstelle

Code:
VAR_INPUT
    bAlarm                :    BOOL;
    tsEventEntry        :     TcEventEntry := TC_EVENTS.RuntimeErrorClass.NotInitialized;
    sNameOfComponent    :     STRING := '';
END_VAR

Der hat als Eingabeparameter bAlarm - der mit der B51_1-Variable verknüpft ist - und sNameOfComponent - was dem Kommentar eben dieser B51_1 Variablen entsprechen soll.
Stand jetzt muss sNameOfComponent ständig händisch eingetragen werden --> Mehraufwand.

Nun ist es mein Ziel, dass sNameOfComponent aus den Eingabeparametern zu entfernen. Ich möchte von der Input-Variablen bAlarm, die ja von außen mit B51_1 beschaltet ist, den Kommentar der B51_1 erhalten und eben NICHT den Kommentar von bAlarm.
 
Ohne das ich das schon mal gemacht hätte: Ich würde mal als Eingangsvariable den Datentyp Pointer Of Bool probieren und das ganze von außen mit dem ADR()-Operator beschalten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne das ich das schon mal gemacht hätte: Ich würde mal als Eingangsvariable den Datentyp Pointer Of Bool probieren und das ganze von außen mit dem ADR()-Operator beschalten.

Leider nein.
Habe auch schon probiert bAlarm als In_Out zu verwenden... VAR_INFO möchte sich nicht verarschen lassen :(
 
In_Out ist hier kein Pointer, wie bei Siemens.
Definier das mal im Bereich VAR_INPUT als Pointer OF BOOL;. Was geschieht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich weis jetzt leider nicht, was ich machen soll, damit Du mich verstehtst. Denn es könnte tatsächlich sein, das mein Vorschlag funktioniert.

Ein Versuch noch, statt

Code:
VAR_INPUT
    bAlarm                :    BOOL;
    tsEventEntry        :     TcEventEntry := TC_EVENTS.RuntimeErrorClass.NotInitialized;
    sNameOfComponent    :     STRING := '';
END_VAR

schreibst Du

Code:
VAR_INPUT
    [B]pAlarm                :   POINTER OF BOOL;[/B]
    tsEventEntry        :     TcEventEntry := TC_EVENTS.RuntimeErrorClass.NotInitialized;
    sNameOfComponent    :     STRING := '';
END_VAR

Dann verwendest Du in allen Aufrufen in der Schnittstelle:

Beispiel:

Code:
FbAufruf(
    [B]pAlarm := ADR(B51_1),[/B]
    usw... );

Ich hoffe verständlicher gewesen zu sein.
 
Genau das hatte ich ja probiert, und das war das Ergebnis nachdem ich die VARINFO-Funktion ausgeführt hatte:

Code:
Type = 'POINTER OF BOOL'
NAME = pAlarm
Comment = ''

Morgen habe ich einen Beckhoff-Mann an der Strippe, dann werde ich es mal bei ihm direkt Nachfragen, zur Not wird er es dann in die Entwicklungsabteilung weiter geben
 
Genau das hatte ich ja probiert, und das war das Ergebnis nachdem ich die VARINFO-Funktion ausgeführt hatte:

Code:
Type = 'POINTER OF BOOL'
NAME = pAlarm
Comment = ''

Morgen habe ich einen Beckhoff-Mann an der Strippe, dann werde ich es mal bei ihm direkt Nachfragen, zur Not wird er es dann in die Entwicklungsabteilung weiter geben

Kann es sein das du folgendes gemacht hast?
Code:
VAR_INPUT
        pAlarm : POINTER TO BOOL;
END_VAR

__VARINFO(pAlarm);
Das würde erklären warum der Typ Pointer to Bool ist.

Hast du es mit Dereferenzierung versucht?
Code:
__VARINFO(pAlarm^);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das hat mich jetzt auch interessiert. Ich habe gerade die De-Referenzierung ausprobiert - tut aber nicht.
Die einzige Variante die ich sehe ist sich die Informationen per ADS holen. Konkret per Baustein PLC_ReadSymInfoByNameEx aus der Utility Bibliothek.
Hacken dabei: Die Antwort ist nicht "sofort" verfügbar sondern frühestens im nächsten SPS-Zyklus...

Guga
 
Zurück
Oben