Hallo Ich habe das Programm ProfiLab Expert. Mit dem Programm kann man Schaltungen am PC realisieren. Für meine Anwendung (Heizungsregeler) muss ich Temperaturen erfassen die ich über den 1 wire Bus auslesen möchte. Es gibt fertige Lösungen z.B. von der Firma Hygrosens, die mir aber etwas zu teuer sind. In ProfiLab kann man aber DLL Dateien importieren die in C++ oder Delphi geschrieben werden müssen. Gibt es eine DLL um den 1 wire Bus in Profilab Expert auszulesen um damit die Temperatur zu messen? Ich habe hier einmal einen Auszug der Hilfe zum DLL-Import von ProfiLab reingestellt. DLL-Import Funktion Mit dem DLL-Import haben Sie ein Bauteil zur Verfügung, dass eine Programmierschnittstelle darstellt, die es ermöglicht selbst eigene Bauteile, z.B. zur Ansteuerung spezieller Hardware, o.ä., für ProfiLab zu programmieren. Dazu benötigen Sie natürlich eine Programmiersprache, die es ermöglicht DLL-Dateien (Dynamic Link Libraries) zu erzeugen, sowie die entsprechenden Programmierkenntnisse. Bei der Programmierung der DLL müssen Sie sich an bestimmte Vorgaben von ProfiLab halten. So muss Ihre DLL bestimmte Routinen enthalten und exportieren, mit denen Sie die Anzahl der Ein- und Ausgänge, deren Bezeichnung und natürlich die interne Funktion des Bauteils bestimmen. Folgende Funktionen muss Ihre DLL bereitstellen: Delphi: function NumInputs: Byte; C++: unsigned char _stdcall NumInputs() Das Ergebnis dieser Funktion muss einen Bytewert mit der gewünschten Anzahl von Bauteileingängen zurückliefern. Delphi: function NumOutputs: Byte; C++: unsigned char _stdcall NumOutputs() Das Ergebnis dieser Funktion muss einen Bytewert mit der gewünschten Anzahl von Bauteilausgängen zurückliefern. Delphi: function InputName(Channel: Byte): ShortString; C++: void _stdcall GetInputName(unsigned char Channel, unsigned char *Name) Das Ergebnis dieser Funktion muss einen Text für die Beschriftungen jedes Eingangs (Channel) zurückliefern. Das Bauteil ruft diese Funktion für jeden Eingang (Channel) auf und fragt so die Beschriftung für jeden Eingangs-Pin ab. Der Parameter CHANNELS gibt an welcher Pin gemeint ist, und läuft von 0 bis NumInputs-1. Delphi: function OutputName(Channel: Byte): ShortString; C++: void _stdcall GetOutputName(unsigned char Channel, unsigned char *Name) Das Ergebnis dieser Funktion muss einen Text für die Beschriftungen jedes Ausgangs (Channel) zurückliefern. Das Bauteil ruft diese Funktion für jeden Eingang (Channel) auf und fragt so (von oben nach unten) die Beschriftung für jeden Eingangs-Pin ab. Der Parameter CHANNELS gibt an welcher Ausgangs-Pin gemeint ist, und läuft von 0 bis NumOutputs-1. Delphi: Procedure Calculate(PInput,POutput,PUser: PDLLParams); C++: void _stdcall CCalculate(double *PInput, double *POutput, double *PUser) Die ist die zentrale Berechnungsroutine Ihres DLL-Bauteils, die die Funktion des Bauteils definiert. Mit den Parametern PINPUT, POUTPUT und PUSER bekommt die Routine drei Zeigervariablen (Pointer) übergeben die folgende Funktion haben: Der Pointer PINPUT zeigt auf einen Speicherbereich, der dazu dient die Eingangswerte des Bauteils an die DLL zu übergeben. Der Pointer POUTPUT zeigt auf einen Speicherbereich, der dazu dient die berechneten Ausgangswerte der DLL an das Bauteil zurückzugeben. Der Pointer PUSER stellt einen Pointer auf einen Speicherbereich zur Verfügung, in dem die DLL eigene (lokale) Werte speichern kann. Hintergrund: Variablen, die die DLL selbst deklariert sind globale Variablen. Werte die in diesen Variablen gespeichrt werden, würden sich gegenseitig überschreiben, wenn man dieselbe DLL mehr als einmal in einem ProfiLab-Projekt verwendet. Um lokale Werte speichern zu können, stellt ProfiLab der DLL den lokalen Speicherbereich zur Verfügung, auf den PUSER zeigt. (Alternativ kann man auch Variablen in der DLL selbst deklarieren. Dann muß man die DLL aber mehrfach unter verschiedenen Dateinamen speichern und importieren, um sie mehrfach in einem ProfiLab-Projekt verwenden zu können.) Alle drei Pointer PINPUT, POUTPUT und PUSER zeigen jeweils auf einen Speicherbereich in dem 100 Variablen vom Typ EXTENDED in einem Array abgelegt sind. Die Pointer sind vom Typ PDLLParams, dessen Deklaration in Delphi so aussieht: type TDLLParams = array[0..100] of extended; PDLLParams = ^TDLLParams; Die Extended-Variablen des Pointers PINPUT enthalten die Eingangszustände des Bauteils. Auf den Wert eines Eingangs des Bauteils können Sie wie folgt zugreifen: PInput^[0] enthält den numerischen Eingangswert des 1. Eingangs, PInput^[1] enthält den numerischen Eingangswert des 2. Eingangs, usw. Die Extended-Variablen des Pointers POUTPUT nehmen die Ausgangszustände des Bauteils auf. Um den Wert der Ausgänge des Bauteils zu setzen, benutzen Sie: POutput^[0] nimmt den numerischen Ausgangswert des 1. Ausgangs auf, POutput^[1] nimmt den numerischen Ausgangswert des 2. Ausgangs, usw. Entsprechend können Sie mit PUser^[0] bis PUser^[99] frei verwenden um eigene Werte zu speichern. Die Werte in diesen Variablen werden von ProfiLab mit in der Projektdatei abgespeichert, und sind so beim nächsten Laden des Projekts wieder verfügbar. Die Variable PUser^[100] wird von ProfiLab gesetzt, und enthält die Nummer des DLL-Bauteils in Ihrem Projekt: 1 für DLL1, 2 für DLL2, usw. Die Routine Calculate wird im RUN-Modus ständig von ProfiLab aufgerufen, um neue Eingangswerte zu übergeben und neue Ausgangswerte für das Bauteil abzurufen. Diese Routine muss daher unbedingt zeitoptimiert programmiert werden, und sollte auf keinen Fall Pausen (in Form von SLEEP-Befehlen oder Warteschleifen) enthalten. Nach dem Abfragen der Eingangswerte und dem Setzen der Ausgangswerte sollte die Routine so schnell wie möglich wieder verlassen werden. Die Rechenzeit für die Routine wirkt sich unmittelbar auf die Simulationsfrequenz von ProfiLab aus. Delphi: Procedure SimStart(PInput,POutput,PUser: PDLLParams); C++: void _stdcall CSimStart(double *PInput, double *POutput, double *PUser) Diese Routine wird beim Starten eines ProfiLab-Projekt aufgerufen, und kann z.B. benutzt werden, um Anfangswerte Ihrer DLL zu initialisieren. Die Funktion der Parameter wurde zuvor bereits beschrieben. Delphi: Procedure SimStop(PInput,POutput,PUser: PDLLParams); C++: void _stdcall CSimStop(double *PInput, double *POutput, double *PUser) Diese Routine wird beim beenden des RUN-Modus eines ProfiLab-Projekt aufgerufen, und kann z.B. um geöffnete Dateien zu schliessen, etc.. Die Funktion der Parameter wurde zuvor bereits beschrieben. Delphi: Procedure Configure(UserValues: PDLLParam); C++: void _stdcall CConfigure(double *PUser) Sofern Ihre DLL diese Prozedur exportiert, wird die Schaltfläche EINSTELLUNGEN... im Eigenschaftendialog des DLL-Bauteils aktiviert. Wird dann diese Schaltfläche betätigt, so springt ProfiLab die CONFIGURE-Prozedur in Ihrer DLL an. Hier können Sie dann z.B. einen eigenen Dialog zum Konfigurieren Ihrer DLL ausführen. Mit diesen Routinen haben Sie alle Möglichkeiten um eigene Bauteile für ProfiLab programmieren zu können. Der Fantasie sind dabei keine Grenzen gesetzt. Sie könnten z.B. Treiber für eigene Hardwaregeräte programmieren, einen eigene Programminterpreter integrieren, oder beliebige andere komplexe Berechnungen in einer DLL ausführen. Um digitale Bauteile zu programmieren, setzen Sie den numerischen Ausgangswert auf 5 um einen HIGH-Pegel zu erzeugen und auf 0 um einen LOW-Pegel zu erzeugen. Ebenso entspricht ein Eingangswert >2.5 einem logischen HIGH-Pegel und ein Eingangswert darunter einem logischen LOW-Pegel. Beim Laden einer DLL-Datei über den Eigenschaften-Dialog des DLL-Bauteils, werden die aus der DLL importierten Routinen zur Kontrolle aufgelistet. Das Bauteil erscheint danach mit den von Ihnen definierten Ein- und Ausgängen im Schaltplan. Um den Aufrufkonventionen von C-Compilern zu genügen, kann dem Namen von exportierten Funktionen und Prodeduren jeweils auch ein Unterstrich _ vorangestellt sein, z.B. _SimStart statt SimStart. Derart exportiere Routinen werden gleichermassen von ProfiLab erkannt und importiert. Beim Compilieren eigener DLL-Projekte müssen Sie ggf. darauf achten, dass Sie die Linkeroption "Dynamische RTL" deaktivieren. Anderfalls kann Ihre DLL auf Systemen ohne installierte C++-Umgebung nicht geladen werden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.