Seite 1 von 1

Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 8:51
von mkersch
Hallo Forenmitglieder,

bei einigen Projekten habe ich bereits DLL Dateien mit Erfolg vewendet.

Jedoch hänge ich im Moment an einer einfachen Stelle. Und zwar will ich eine DLL-Datei mit DllLoad("ADSDLL.DLL") laden.
DllLoad gibt 0 zurück und die DOSERROR ==> Das angegebene Modul wurde nicht gefunden.

Diese Dll-Datei ist im Verzeichnis c:\windows\system32 vorhanden. Außerdem habe ich diese DLL bereits zusätzlich in mein Programmverzeichnis kopiert.

Was kann die Fehlerursache sein ?
Muss die DLL Datei unter Windows XP registriert sein ?

mfg

mkersch

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 9:22
von Rolf Ramacher
Meines Wissens muß sich die DLL-Datei im gleichen Verzeichnis befinden, wie die entsprechende EXE-Datei. Mach doch vorher eine If File() - Abfrage.

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 9:34
von brandelh
Hi,
laut Handbuch und Erfahrungen ...
Win32 - Unter Windows erfolgt die Suche in der Reihenfolge aktuelles Verzeichnis,
Windows System Verzeichnis, Windows Verzeichnis und am Schluß alle Verzeichnisse,
die in der Umgebungsvariable PATH definiert sind.
ist c:\windows\system32 im Prinzip OK.
Tippfehler ?
Zugriffsrechte ?

Kopiere die DLL mal ins Programmverzeichnis, wenn es dann geht, fehlen dir Zugriffsrechte.

... das hast du ja schon gemacht ... :(

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 9:54
von mkersch
if file("adsdll.dll") bringt true (da ja im aktuellen Verzeichnis)
DllLoad("adsdll.dll") ==> Rückgabe = 0 ==> DOSERROR 126 ==> Das angegebene Modul wurde nicht gefunden

mfg

mkersch

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 9:57
von brandelh
Hallo,

schreibe doch mal den Namen absichtlich falsch (also dass die DLL nicht vorhanden ist)
und prüfe welche Fehlermeldung dann erscheint. Ich hätte nämlich eine kleinere Nummer (Datei nicht gefunden) erwartet.

Kann es sein, dass die DLL selbst z.B. einen Dongle benötigt um geladen zu werden ?
Kannst du es mit einer anderen Sprache probieren ob die DLL geladen wird ?

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 10:04
von mkersch
DllLoad("falscherName") bringt auch die Fehler Nr 126


Kann dies evtl mit dem DEBUGER xppdbg zusammenhängen ?

mfg.

mkersch

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 10:17
von Martin Altmann
Moin,
ich nutze kein ADS.
Aber: Wenn man eine DLL laden will, die eine andere DLL braucht und diese fehlt, dann kann auch die zu ladende DLL nicht geladen werden...

Viele Grüße,
Martin

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 10:28
von Tom
Was soll "ADSDLL.DLL" sein? :?: Die ADSDBE lädt man durch "DBELoad("ADSDBE")".

Es gibt viele Möglichkeiten. Zuweilen laden DLLs selbst weitere - abhängige - DLLs oder sonstige Dateien nach, und wenn die nicht gefunden werden, lässt sich auch das Original nicht laden. So kann es einem z.B. mit List&Label ergehen, wenn man zwar die "CMLL15.DLL" im Blick (Programmverzeichnis, Systemverzeichnis, kompletter Suchpfad) hat, aber nicht die diversen Module, die von dieser DLL wiederum geladen werden sollen.

Ergänzung: Die "ADSDBE.DLL" benötigt die beiden DLLs ACE32.DLL und AXCWS32.DLL (Client-DLLs für die jeweilige ADS-Version). Diese sollten sich also auch im Suchpfad befinden, falls es darum geht.

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 10:41
von brandelh
Tom hat geschrieben:Was soll "ADSDLL.DLL" sein? :?: Die ADSDBE lädt man durch "DBELoad("ADSDBE")".
das habe ich mich vorhin auch gefragt :D
mit dem ADS hat es nichts zu tun, es ist eine Schnittstelle für Hardwareansteuerung - soweit ich das verstanden habe:
Beckhoff ADS-Welt. ADS steht für "Automation Device Specification" und beschreibt eine Geräte- und Feldbusunabhängige Schnittstelle.
:arrow: http://infosys.beckhoff.com/index.php?c ... ro.htm&id=

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 10:45
von Martin Altmann
:lol: Auf der Seite war ich auch gelandet - und dort steht, dass noch eine zweite DLL unbedingt dazu gehört:
Die ADSDLL.DLL und die TcADSDLL.DLL sind als Bundle zu behandeln und somit immer als Paket zu kopieren.
Darum auch mein Hinweis oben.

Viele Grüße,
Martin

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 11:16
von mkersch
Vielen Dank für Eure Unterstützung !


Nach Euren Hinweisen, das evtl eine zweite Dll benötigt wird, haben wir folgenden Versuch gemacht.

ADSDLL.DLL ==> In aktuelles Verzeichnis kopiert
TCADSDLL.DL ==> in aktuelles Verzeichnis kopiert

Im Xbaseprogramm ==>

DLLLOAD("TCADSDLL.DLL") ==> Diese DLL wurde fehlerfrei geladen
DLLLOAD(ADSFLL.DLL") ==> Fehler Nr. 126


mfg.
mkersch

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 11:26
von mkersch
Diese Programm läuft auf einem PC mit Windows XP und dem bereits installierten Entwicklungssystem von Beckhoff.

Die zuvor beschriebenen Probleme tretten nur auf einem PC auf, auf den nur die Twin Cat Communications API installiert wurde.
Da ja evtl. auf dem Rechner, auf dem das Entwicklungssystem installiert ist, bereits die DLL geladen sind haben wir auf dem Rechner (ohne Entw. System)
die DLLLOAD Befehle für TCADSDLL und ADSDLL hinzugefügt.

Code: Alles auswählen

#include "ot4xb.ch"
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
DLL	AdsDLL	IMPORT AdsPortOpen AS INT32

// ---------------------------------------------------------------------------
DLL	AdsDLL	IMPORT AdsGetLocalAddress AS INT32;
				PARAM pAddr AS LPSTR

// ---------------------------------------------------------------------------

DLL	AdsDLL	IMPORT AdsSyncReadWriteReq AS INT32;
  				PARAM pAddr		AS LPSTR,;
				PARAM nIndexGroup	AS INT32,;
				PARAM nIndexOffset	AS INT32,;
				PARAM nReadLength	AS INT32,;
				PARAM pReadData		AS LPSTR,;
				PARAM nWriteLength	AS INT32,;
				PARAM pWriteData        AS LPSTR
// ---------------------------------------------------------------------------

DLL	AdsDLL	IMPORT AdsSyncReadReq AS INT32;
  				PARAM pAddr		AS LPSTR,;
				PARAM nIndexGroup	AS INT32,;
				PARAM nIndexOffset	AS INT32,;
				PARAM nReadLength	AS INT32,;
				PARAM pReadData		AS LPSTR
// ---------------------------------------------------------------------------
DLL	AdsDLL	IMPORT AdsSyncWriteReq AS INT32;
  				PARAM pAddr		AS LPSTR,;
				PARAM nIndexGroup	AS INT32,;
				PARAM nIndexOffset	AS INT32,;
				PARAM nWriteLength	AS INT32,;
				PARAM pWriteData	AS LPSTR
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
DLL	AdsDLL	IMPORT AdsPortClose AS INT32



procedure main

local   nErr,nPort
local	Addr := space(10)
local	ZielVar:= space(200)
local	sVar
local   AnzLesen
local	i,y
local   nHandl:= space(4)



local aWerte[100],bWerte[100]

for i:=1 to 100
   aWerte[i] := 0
   bWerte[i] := 0
next i

nPort = AdsPortOpen()
//nErr = AdsGetLocalAddress(@Addr)
/*     Hintergrundinformation zur Kommunikation mit ADS Funktionen:

	In unserem Fall wird von einem CP7701 (Touch-Panel) aus einer CX9000 Variableninhalte gelesen.

	Um eine Kommunikation zu ermöglichen mussten beide in den gleichen IP-Rahmen gelegt werden
		- CP7701 (mit zwei Schnittstellen) ==> 192.168.5.204 (1. Schnittstelle) und 192.168.5.205 (2.Schnittstelle)
			  ==> mittels Netzwerkeinstellungen
			- Route hinzugefügt.  Im CP 7701 wurde der Name vom CX9000 + AMS + IP hinzugefügt.
			  ==> EXPLORER ==> Harddisk ==> System ==> TcAmsRemoteMgr
				Name: CX_053553		AMS 5.5.53.83.1.1 IP 192.168.5.203   (CX Prüfanlage)

		- CX9000 (Prüfanlage)  ==> IP 192.168.5.203  (mit Hilfe von CERHOST)
			==> mittesl Netzwerkeinstellungen
			- Route hinzufügen . IM CX9000 wurde der Name vom CP7701 + AMS + IP hinzugefügt.
			==> CERHOST ==> EXPLORER ==> Harddisk ==> System ==> TcAmsRemoteMgr
				Name: CP_076018		AMS 5.7.96.24.1.1	IP 192.168.5.205 (2. Schnittstelle verwendet)
*/

/*  Mit der Funktion AdsSyncReadWriteReq kann aus einer x-beliebigen Steuerung durch Angabe der AMS-Ned-Id und Port_nr
    eine Variable bzw. ein Array gelesen werden.


	Erkenntnis:

	nErr = AdsSyncReadWriteReq(@Addr, 0xF004, 0, AnzLesen, @ZielVar, len(sVar), @sVar)
	Will man nur Daten aus Beckhoff lesen, reicht die funktion AdsSyncReadWrite mit Indexgroup F004
	d.h. man kann Variableninhalte aus der Steuerung lesen per Angabe des Vriablennamens

	Will man Daten in die Beckhoffsteuerung schreiben, und dies auch per Name, erfolgt dies in zwei Schritten
	1. nErr = AdsSyncReadWriteReq(@Addr, 0xF003, 0, 4, @nHandl, len(sVar), @sVar)
	   Handl zu dem Variablennamen aus Steuerung lesen ==> Wichtig Indexgroup F003
	2. nErr = AdsSyncWriteReq(@Addr, 0xF005, @nHandl, 2, @sVar)
	   Mittels Handl Variablenwert schreiben  ==> Wichtig Indexgroup F005

	Mit dieser Methode könnte man auch Daten lesen
	1. nErr = AdsSyncReadWriteReq(@Addr, 0xF003, 0, 4, @nHandl, len(sVar), @sVar)
	   Handl zu dem Variablennamen aus Steuerung lesen ==> Wichtig Indexgroup F003
	2. nErr = AdsSyncReadReq(@Addr, 0xF005, @nHandl, AnzLesen, @ZielVar)
	   Mittels Handl Variablenwert lesen ==> Wichtig Indexgroup F005

*/

/*********************************************************************************************/
// AMS NET ID zusammenstellen  z.B 5.5.53.83.1.1
Addr := stuff(Addr,1,1,chr(5))
Addr := stuff(Addr,2,1,chr(5))
Addr := stuff(Addr,3,1,chr(53))
Addr := stuff(Addr,4,1,chr(83))
Addr := stuff(Addr,5,1,chr(1))
Addr := stuff(Addr,6,1,chr(1))
// Portadresse zusammenstellen  z.B 801
Addr := stuff(Addr,7,2,u2bin(801))
sVar := ".test_com"
AnzLesen := 20		// Anzahl Lesen in Bytes d.h. Word ==> *2  DWord *4
nErr = AdsSyncReadWriteReq(@Addr, 0xF004, 0, AnzLesen, @ZielVar, len(sVar), @sVar)
//********************************************************************************************/

for i:=1 to 10
    y := (I*2) - 1
    bWerte[i] := bin2u(substr(ZielVar,y,2))
next i

ZielVar := Space(200)

sVar := ".test_com"
nErr = AdsSyncReadWriteReq(@Addr, 0xF003, 0, 4, @nHandl, len(sVar), @sVar)

sVar := u2bin(125)
nErr = AdsSyncWriteReq(@Addr, 0xF005, @nHandl, 2, @sVar)

nErr = AdsSyncReadReq(@Addr, 0xF005, @nHandl, AnzLesen, @ZielVar)

for i:=1 to 10
    y := (I*2) - 1
    bWerte[i] := bin2u(substr(ZielVar,y,2))
next i


nErr :=AdsPortClose()

return
mfg.

mkersch

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 12:14
von Tom
Hallo, Mkersch.

OS-Fehler 126 bedeutet: "The specified module could not be found." Das bedeutet nicht, dass eine Datei nicht gefunden werden konnte, sondern etwas Abhängiges. Entweder also stammen beide DLLs nicht aus derselben Version oder Du hast durch die diversen Versuche noch irgendwo Reste auf dem Testrechner. Lösch doch also mal alle Instanzen beider DLLs und stell sie ausschließlich im Ausführungsverzeichnis der App zur Verfügung.

Re: Anfängerfrage zu DLL

Verfasst: Mi, 14. Jul 2010 13:48
von mkersch
Hallo Forenmitglieder,

Ihr hattet recht, die ADSDLL benötigt noch eine weitere DLL Datei (in meinen Fall die TCATADSDLL.DLL).
D.h. wenn ich als erste DLL diese Lade, wird auch die ADSDLL korrekt geladen.

Vielen Dank für Eure Unterstützung

mfg.

mkersch