Externer WINPLC Zugriff per DEV-CPP bzw. GAMESTUDIO A7 oder A8

df5zx

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

ich bin zu Lehr/Lernzwecken am Basteln an einer Trainingsumgebung, die virtuelle Geräte oder Maschinen mit einer virtuellen SPS steuern kann.
Die virtuellen Geräte/Maschinen existieren in einer 3D-Umgebung in GAMESTUDIO, dass bereits einige DLLs, die ich in DEV-CPP gebaut habe verwendet. Ich möchte das Ganze nun mit WINPLC verbinden, da dieses Schnittstellen zu SPS-Status und E/As anbietet.
Ich habe sowohl in GAMESTUDIO direkt und in DEV-CPP versucht, die im Handbuch beschriebenen Schnittstellen anzusprechen, leider ohne Erfolg.

Die DLL-Einbindung in GAMESTUDIO direkt geht gar nicht, d.h. beim Laufen lassen der 3D-Welt stürzt die Applikation schlicht ab und hängt sich auf, trotz allerlei Versuche.
Also dachte ich einen Wrapper in DEV-CPP zu schreiben und die WINPLC-Schnittstellen von dort anzusprechen. Nur leider geht das auch nicht, da beim dynamischen Binden die Funktionen nicht gefunden werden:

Ein Codeschnipsel hierzu:


DLLIMPORT int sps_test ()
{
void_func S7AG_GetPeriEPtr ;
void_func S7AG_GetPeriAPtr ;
void_func S7AG_GetCPUZustand ;

BYTE *pOutputs ;
BYTE *pInputs ;
WORD wS7_status = 0 ;

BYTE AB0 = 0;

BOOL fFreeResult ;

char sErr_string[40];

// DLL Datei laden
HINSTANCE hinstLib = LoadLibrary ("WS7_S7AG.dll") ;

if (hinstLib != NULL)
{

// DEBUG-Hilfe
if (test4==0)
{
sprintf (sErr_string, "OK: hinstLib ! %i\n", hinstLib );
MessageBox (0, (char *)sErr_string, "ERROR", MB_ICONINFORMATION);
test4 = -1;
}

// Die Einsprungadresse abfragen
S7AG_GetPeriAPtr = (void_func) GetProcAddress (hinstLib, "S7AG_GetPeriAPtr") ;
S7AG_GetPeriEPtr = (void_func) GetProcAddress (hinstLib, "S7AG_GetPeriEPtr") ;
S7AG_GetCPUZustand = (void_func) GetProcAddress (hinstLib, "S7AG_GetCPUZustand") ;

// Die Funktion aufrufen
if ( S7AG_GetPeriAPtr != NULL )
{
*pOutputs = (*S7AG_GetPeriAPtr) () ;
AB0=pOutputs[124];
} else
{
// DEBUG-Hilfe
if (test1==0)
{
sprintf (sErr_string, "Fehler: S7AG_GetPeriEPtr ! %i\n", S7AG_GetPeriEPtr );
MessageBox (0, (char *)sErr_string, "ERROR", MB_ICONINFORMATION);
test1 = -1;
}
}


if ( S7AG_GetPeriEPtr != NULL )
{
*pInputs = (*S7AG_GetPeriEPtr) () ;

// pInputs[124]=85;

// pInputs[125]=AB0;

// pInputs[0]=(BYTE) wS7_status/256;
// pInputs[1]=(BYTE) (wS7_status - pInputs[0] * 256);
} else
{
// DEBUG-Hilfe
if (test2==0)
{
sprintf (sErr_string, "Fehler: S7AG_GetPeriAPtr ! %i\n", S7AG_GetPeriAPtr );
MessageBox (0, (char *)sErr_string, "ERROR", MB_ICONINFORMATION);
test2 = -1;
}
}


if ( S7AG_GetCPUZustand != NULL )
{
// DEBUG-Hilfe
if (test==0)
{
sprintf (sErr_string, "Aufruf von S7AG_GetCPUZustand OK ! %i\n", S7AG_GetCPUZustand );
MessageBox (0, (char *)sErr_string, "ERROR", MB_ICONINFORMATION);
test = -1;
}

wS7_status = (*S7AG_GetCPUZustand) () ;
} else
{
// DEBUG-Hilfe
if (test==0)
{
sprintf (sErr_string, "Fehler: S7AG_GetCPUZustand ! %i\n", S7AG_GetCPUZustand );
MessageBox (0, (char *)sErr_string, "ERROR", MB_ICONINFORMATION);
test = -1;
}
}


// Die DLL-Datei wieder entladen
fFreeResult = FreeLibrary (hinstLib) ;

return (wS7_status);
}
else
{

sprintf (sErr_string, "Fehler beim Aufruf von WS7_S7AG.dll\n");
MessageBox (0, (char *)sErr_string, "ERROR", MB_ICONINFORMATION);

}



return 0;

}


hinstLib ist nach LoadLibrary initialisiert, nur findet GetProcAddress die Funktionseinsprünge für S7AG_GetPeriAPtr, S7AG_GetPeriEPtr und S7AG_GetCPUZustand nicht, d.h. die sind immer NULL ...
Mit anderen DLLs hat das so in dieser Form bisher immer geklappt.

Gibt es vielleicht einen Hinweis von jemandem, der die WINPLC-Schnittstelle vorzugsweise unter C oder C++ und GCC/MINGW-Compilern zum Laufen gebraucht hat? Oder bin ich einfach nur blind den Fehler zu sehen?

Danke für jeden Hinweis, auch den, dass es ggf nicht geht ...

Jürgen
 
Zurück
Oben