-> 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
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