TWINCAT3 TcCom Object IOs Global setzen

s_haroth

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
ich habe Matlab-Modelle in TCCOM Objekte kompiliert und in TC3 importiert.
Nun möchte ich die I/Os als Globale Variablen setzen, weil ich diese in einigen SPS-Programmen benötige.
Habe bereits versucht mehrere Variablen über den Weg "Variable verknüpfen" zu verbinden aber eine Mehrfachverknüpfung scheint nicht zu funktionieren.

Habe dann sowas in einigen Varianten im SPS-Programm versucht:
.GlobalVar := TCCOMName.Variable;
aber ohne Erfolg.

Wie bekomme ich das hin, quasi Ausgänge von TCCOM Objekte zu lesen und Eingänge zu schreiben (innerhalb ST)?

Viele Grüße
Hannes
 
Hätte da noch eine Frage, wie kann ich sämtliche Variablen oder das gesamte TcCom-Objekt auf den ursprünglichen Zustand zurücksetzen?
Können Modell-Parameter des TCCom-Objekte aus einem SPS Code heraus verändert werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du über das ITcADI-Interface dir den ImagePointer auf die DataArea geholt hast, könntest du über MEMSET(pInputs, 0, SIZEOF(ST_Inputs)) den gesamten Speicherbereich auf Null setzen.

Bei Parameter ist es die Frage, ob diese im TcCOM-Objekt als Parameter oder DataArea angelegt sind. Die Parameter eines TcCOM-Objektes kannst du über das ITComObject-Interface mit der Methode TcSetPara ändern. Für die DataArea könntest du über das ITcADI-Interface einen Pointer holen und darüber die Parameter ändern.

Für Details müsste man die TMC kennen.
 
Wenn du über das ITcADI-Interface dir den ImagePointer auf die DataArea geholt hast, könntest du über MEMSET(pInputs, 0, SIZEOF(ST_Inputs)) den gesamten Speicherbereich auf Null setzen.

Bei Parameter ist es die Frage, ob diese im TcCOM-Objekt als Parameter oder DataArea angelegt sind. Die Parameter eines TcCOM-Objektes kannst du über das ITComObject-Interface mit der Methode TcSetPara ändern. Für die DataArea könntest du über das ITcADI-Interface einen Pointer holen und darüber die Parameter ändern.

Für Details müsste man die TMC kennen.

Leider habe ich noch nicht mit Data Areas und ImagePointer(=InterfacePointer?) gearbeitet. Kannst du mir den ersten Abschnitt ausführlicher erklären? Dazu habe ich mir das Sample10 angeschaut. Im SPS Programm weis ich nun dass ich die tmc Datei öffnen muss um dort DataAreas usw. anzulegen.
Das ITcADI-Interface liegt im SPS Programm unter ExternalTypes wie kann ich dort die DataArea des TcCOMObjects holen?

Zu den Parametern:
In dem TcCOMObject liegen die ModellParameter sowohl unter Parameter (Init) als auch unter DataArea.
Wie kann ich die Methode TcSetPara vom ITComObject-Interface im SPS Programm verwenden? Finde einfach nichts darüber in der InfoSys!
 
TcCOM Parameter oder DataArea setzen

Hier mal ein bisschen Sample-Code. Ohne Gewähr. ;-)

Code:
FUNCTION_BLOCK FB_MyObjPtr
VAR
    ipObjSrv : ITComObjectServer;
    ipObj : ITComObject;
    ipADI : ITcADI;
    pData : POINTER TO UDINT;
END_VAR

Code:
METHOD FB_init : BOOL
VAR_INPUT
    bInitRetains : BOOL;
    bInCopyCode : BOOL;
    OID : OTCID;
END_VAR
VAR
    hr : DINT;
    nPar : UDINT;
END_VAR
VAR CONSTANT
    cnDataAreaID : UDINT := 0;
END_VAR
Code:
// Pointer auf den "globalen" Object Server holen.
hr := FW_ObjMgr_GetObjectServer(_AppInfo.ObjId, ADR(ipObjSrv));
IF hr <> 0 OR ipObjSrv = 0 THEN FB_Exit(FALSE); RETURN; END_IF

// ITComObject-InterfacePointer auf Objekt mit angegebener OID holen.
hr := ipObjSrv.TcQueryObjectInterface(oid := OID, iid := IID_ITComObject, pipItf := ADR(ipObj));
IF hr <> 0 OR ipObj = 0 THEN FB_Exit(FALSE); RETURN; END_IF

// Parameter vom Object mit der angegebenen ID setzen.
hr := ipObj.TcSetObjPara(16#00000000, SIZEOF(nPar), ADR(nPar), 0);
IF hr <> 0 OR ipObj = 0 THEN FB_Exit(FALSE); RETURN; END_IF

// ITcADI-InterfacePointer vom Objekt anfordern.
hr := ipObj.TcQueryInterface(IID_ITcADI, ADR(ipADI));
IF hr <> 0 OR ipADI = 0 THEN FB_Exit(FALSE); RETURN; END_IF

// DataArea-Pointer anfordern.
hr := ipADI.GetImagePtr(SIZEOF(UDINT), 0, cnDataAreaID, ADR(pData));
IF hr <> 0 OR pData = 0 THEN FB_Exit(FALSE); RETURN; END_IF

// Wert in DataArea schreiben.
pData^ := nPar;

Code:
METHOD FB_exit : BOOL
VAR_INPUT
    bInCopyCode : BOOL;
END_VAR
Code:
IF ipADI <> 0 THEN
    IF pData <> 0 THEN
        ipADI.ReleaseImagePtr(pData);
        pData := 0;
    END_IF
    ipADI.TcRelease();
    ipADI := 0;
END_IF

IF ipObj <> 0 THEN
    ipObj.TcRelease();
    ipObj := 0;
END_IF

IF ipObjSrv <> 0 THEN
    ipObjSrv.TcRelease();
    ipObjSrv := 0;
END_IF
 
Zuletzt bearbeitet:
Zurück
Oben