neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)
Verfasst: Sonntag 30. Januar 2011, 07:08
Liebes Forum,
meine erste kleine Anwendung will ich Euch nicht vorenthalten.
Ich kann mir vorstellen, dass der Eine oder Andere die Funktionalität gebrauchen kann.
Ich bitte um Feedback.
Viel Spass !
Anwendung:
numerische Variablen aus einem Textfile einlesen.
Die vorliegende DLL "tag_input.dll" stellt eine einseitige numerische Datenverbindung zu ProfiLab her.
Motiv der Entwicklung:
Ich habe in PL eine Messumgebung aufgebaut, welche drei Parameter abhängig von Zeit und von gewissen anderen Bedingungen automatisch verfahren soll. Die grafische Programmierung dieses Vorgangs hat sich als sehr mühsam und unübersichtlich erwiesen.
Für einen Teststand habe ich schon einen sog. Sequenzer programmiert, welcher freiprogrammierbar ist und sich ideal für die genannte 3D-Verfahrweise eignet. Er steuert eine Prozessvisualisierung (SCADA, Citect) über eine einfache Textzeile. Was liegt näher, als diese Funktionalität auch auf PL zu übertragen ?
Funktion:
Diese DLL liest auf eine fallende Taktflanke hin eine (einzige) Textzeile aus einem externen Textfile, welches durch einen
Filepfad gewählt werden kann. Die Zeile muss abwechselnd einen Variablen-(= tag)Namen und einen numerischen Wert enthalten, getrennt durch einen Leerschlag <space> = d32
Es dürfen mehrere (viele) Namen/Wertepaare in der Textzeile erscheinen
Sofern einer oder mehrere der Referenz-tag-Namen mit den Namen in der Textzeile übereinstimmt (muss identisch sein),
(wobei Reihenfolge der tag-Namen im Textfile nicht relevant ist), dann wird der zugehörige Wert aus dem File auf den dem tag-Namen zugehörigen Ausgang zugewiesen.
Die Ausgänge bleiben unverändert, wenn keine Übereinstimmung gefunden wird, entweder durch andere tag-Informationen im File, oder auch bei einem nichtgefundenen Textfile (letzteres wird durch den "OK"-Pin gezeigt). Es gibt keinen Plausibilitäts/Bereichstest.
Die Ausgänge verhalten sich nichtflüchtig (werden von/zu die UserMemMap gespeichert)
Die DLL kann bis zu 4 tag-Namen gleichzeitig verarbeiten. Es können mehrere DLLs auf dasselbe File oder auf verschiedene Files zugreifen.
Die Referenz-tag-Namen dürfen dynamisch (auch durch die Anwendung) während der Ausführung modifiziert werden.
Auch die Filenamen dürfen dynamisch (auch durch die Anwendung) modifiziert werden (z.B. für Reciping), da sie bei jeder Taktflanke ausgewertet werden, so wie auch die Textzeile.
Somit können verschiedene Datenquellen verwendet werden, oder es kann die Anzahl der zu steuernden PL-Variablen vervielfältigt werden.
Achtung: noch keine ausreichende Fehlerbehandlung ! -> PL-Projekt immer vor Ausführung speichern ! Ich übernehme keine Verantwortung für nachteilige Folgen während der Entwicklung noch be der Anwendung !
Diese DLL ist in Euphoria programmiert. Euphoria ist OpenSource
Die DLL kann mittels Euphoria zu C Translator und mit dem OpenWatcom Compiler hergestellt werden.
Mittels batchfile wird der Entwicklungsablauf auf einen Maus-Click reduziert und auf wenige Sekunden reduziert.
Noch etwas Hintergrund:
-- Motiv:
-- Nutzen der DLL-Programierschnittstelle von ProfiLab
-- Euphoria und ProfiLab "in-the-loop" !
-- Vorgang:
-- Um aus Euphoria eine DLL zu erzeugen:
-- OpenWatcom C-Compiler installieren, dieser kann EXEs und auch DLLs erzeugen
-- Das Euphoria-Tool"ecw" (Aufruf mittels ecw -wat -dll c:\daten\euphoria\test_dll.exw)
-- verwendet den EU2C Translator und stellt aus EU source code die nötigen C-Files und ein batchfile her,
-- welches die passenden Compiler-Direktiven enthält (im obigen Aufruf wird mit der Option "-wat" der Watcom Compiler
-- gewählt, und mittels seiner Umgebungsvariable auch gefunden),
-- und um eine DLL zu erzeugen und um danach die "Ballastfiles" zu entsorgen.
--
-- Ich habe ein erweitertes Batchfile erzeugt *, welches die DLL vollautomatisch erzeugt.
-- Dabei muss ProfiLab jeweils geschlossen sein, da sonst die DLL verwendet wird. Sie kann dann nicht neu erzeugt werden.
Inhalt des Batchfiles: (* muss natürlich dem Sourcenamen angepasst werden)
--ecw -wat -dll c:\daten\euphoria\test_dll.exw
--@echo off
--if not exist main-.c goto nofiles
--echo compiling with WATCOM
--echo main-.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s main-.c
--echo test_dll.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s test_dll.c
--echo misc.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s misc.c
--echo machine.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s machine.c
--echo init-.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s init-.c
--echo linking
--wlink FILE test_dll.obj @objfiles.lnk
--del *.obj > NUL
--if not exist test_dll.dll goto done
--echo you can now link with: test_dll.dll
--del main-.c
--del main-.h
--del init-.c
--del objfiles.lnk
--del test_dll.c
--del misc.c
--del machine.c
--goto done
--:nofiles
--echo Run the translator to create new .c files
--:done
-- Die eingebundenen DLLs müssen konform zum DLL-Aufruf des DLL-Funktionsblocks in ProfiLab sein.
-- Die untenstehend markierten Funktionen/Prozeduren sind zwingend für ProfiLab und müssen vom Code global verfügbar gemacht werden
-- Ansonsten kann wie gewohnt in EU programmiert werden (aber leider ohne die Nutzbarkeit des EU-Multitaskings)
-- Speziell gilt wegen Anforderungen der ProfiLab Real Time Simulation:
-- Ausführungszeit so kurz wie möglich, da "CCalculate" in jedem PL-Simulationszyklus durchlaufen wird.
-- Daher darin sicher keine Endlos-Loops, keine delays, kein blocking code, weil die Simulationsfrequenz direkt von der runtime von
-- "CCalculate" beeinflusst wird !
-- In der DLL-Doc wird gezeigt, dass Unterschiede bei den float Datentypen von Delphi und C++ existieren
-- Delphi hat "extended" = 10bytes, C++ hat "double" = 8bytes
-- Euphoria hat "atom", das sind doubles, also 8bytes von C++
-- Weil der DLL-Aufruf diese Unterscheidung macht, müssen von EU die C++-Funktionen verwendet werden,
-- somit sind nur diese nachstehend gelistet.
-- Das Speicherzugriffsverfahren von EU ist byte-weise mittels "peek/poke"
-- EU muss also die korrekte Datenbreite für den gewünschten Datentyp und den korrekten Index in die von PL
-- offerierten Tabellen berechnen
-- zwingende Funktionen:
--C++ function: unsigned char _stdcall NumInputs()
--C++ function: unsigned char _stdcall CNumInputsEx(double *PUser)
--C++ function: unsigned char _stdcall NumOutputs()
--C++ function: unsigned char _stdcall CNumOutputsEx(double *PUser)
--C++ procedure: void _stdcall GetInputName(unsigned char Channel, unsigned char *Name)
--C++ procedure: void _stdcall GetOutputName(unsigned char Channel, unsigned char *Name)
--C++ procedure: void _stdcall CCalculate(double *PInput, double *POutput, double *PUser)
--C++ procedure: void _stdcall CCalculateEx(double *PInput, double *POutput, double *PUser; StringParam PStrings)
--C++ procedure: void _stdcall CSimStart(double *PInput, double *POutput, double *PUser)
--C++ procedure: void _stdcall CSimStop(double *PInput, double *POutput, double *PUser)
--C++ procedure: void _stdcall CConfigure(double *PUser)
meine erste kleine Anwendung will ich Euch nicht vorenthalten.
Ich kann mir vorstellen, dass der Eine oder Andere die Funktionalität gebrauchen kann.
Ich bitte um Feedback.
Viel Spass !
Anwendung:
numerische Variablen aus einem Textfile einlesen.
Die vorliegende DLL "tag_input.dll" stellt eine einseitige numerische Datenverbindung zu ProfiLab her.
Motiv der Entwicklung:
Ich habe in PL eine Messumgebung aufgebaut, welche drei Parameter abhängig von Zeit und von gewissen anderen Bedingungen automatisch verfahren soll. Die grafische Programmierung dieses Vorgangs hat sich als sehr mühsam und unübersichtlich erwiesen.
Für einen Teststand habe ich schon einen sog. Sequenzer programmiert, welcher freiprogrammierbar ist und sich ideal für die genannte 3D-Verfahrweise eignet. Er steuert eine Prozessvisualisierung (SCADA, Citect) über eine einfache Textzeile. Was liegt näher, als diese Funktionalität auch auf PL zu übertragen ?
Funktion:
Diese DLL liest auf eine fallende Taktflanke hin eine (einzige) Textzeile aus einem externen Textfile, welches durch einen
Filepfad gewählt werden kann. Die Zeile muss abwechselnd einen Variablen-(= tag)Namen und einen numerischen Wert enthalten, getrennt durch einen Leerschlag <space> = d32
Es dürfen mehrere (viele) Namen/Wertepaare in der Textzeile erscheinen
Sofern einer oder mehrere der Referenz-tag-Namen mit den Namen in der Textzeile übereinstimmt (muss identisch sein),
(wobei Reihenfolge der tag-Namen im Textfile nicht relevant ist), dann wird der zugehörige Wert aus dem File auf den dem tag-Namen zugehörigen Ausgang zugewiesen.
Die Ausgänge bleiben unverändert, wenn keine Übereinstimmung gefunden wird, entweder durch andere tag-Informationen im File, oder auch bei einem nichtgefundenen Textfile (letzteres wird durch den "OK"-Pin gezeigt). Es gibt keinen Plausibilitäts/Bereichstest.
Die Ausgänge verhalten sich nichtflüchtig (werden von/zu die UserMemMap gespeichert)
Die DLL kann bis zu 4 tag-Namen gleichzeitig verarbeiten. Es können mehrere DLLs auf dasselbe File oder auf verschiedene Files zugreifen.
Die Referenz-tag-Namen dürfen dynamisch (auch durch die Anwendung) während der Ausführung modifiziert werden.
Auch die Filenamen dürfen dynamisch (auch durch die Anwendung) modifiziert werden (z.B. für Reciping), da sie bei jeder Taktflanke ausgewertet werden, so wie auch die Textzeile.
Somit können verschiedene Datenquellen verwendet werden, oder es kann die Anzahl der zu steuernden PL-Variablen vervielfältigt werden.
Achtung: noch keine ausreichende Fehlerbehandlung ! -> PL-Projekt immer vor Ausführung speichern ! Ich übernehme keine Verantwortung für nachteilige Folgen während der Entwicklung noch be der Anwendung !
Diese DLL ist in Euphoria programmiert. Euphoria ist OpenSource
Die DLL kann mittels Euphoria zu C Translator und mit dem OpenWatcom Compiler hergestellt werden.
Mittels batchfile wird der Entwicklungsablauf auf einen Maus-Click reduziert und auf wenige Sekunden reduziert.
Noch etwas Hintergrund:
-- Motiv:
-- Nutzen der DLL-Programierschnittstelle von ProfiLab
-- Euphoria und ProfiLab "in-the-loop" !
-- Vorgang:
-- Um aus Euphoria eine DLL zu erzeugen:
-- OpenWatcom C-Compiler installieren, dieser kann EXEs und auch DLLs erzeugen
-- Das Euphoria-Tool"ecw" (Aufruf mittels ecw -wat -dll c:\daten\euphoria\test_dll.exw)
-- verwendet den EU2C Translator und stellt aus EU source code die nötigen C-Files und ein batchfile her,
-- welches die passenden Compiler-Direktiven enthält (im obigen Aufruf wird mit der Option "-wat" der Watcom Compiler
-- gewählt, und mittels seiner Umgebungsvariable auch gefunden),
-- und um eine DLL zu erzeugen und um danach die "Ballastfiles" zu entsorgen.
--
-- Ich habe ein erweitertes Batchfile erzeugt *, welches die DLL vollautomatisch erzeugt.
-- Dabei muss ProfiLab jeweils geschlossen sein, da sonst die DLL verwendet wird. Sie kann dann nicht neu erzeugt werden.
Inhalt des Batchfiles: (* muss natürlich dem Sourcenamen angepasst werden)
--ecw -wat -dll c:\daten\euphoria\test_dll.exw
--@echo off
--if not exist main-.c goto nofiles
--echo compiling with WATCOM
--echo main-.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s main-.c
--echo test_dll.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s test_dll.c
--echo misc.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s misc.c
--echo machine.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s machine.c
--echo init-.c
--wcc386 /bd /bt=nt /mf /w0 /zq /j /zp4 /fp5 /fpi87 /5r /otimra /s init-.c
--echo linking
--wlink FILE test_dll.obj @objfiles.lnk
--del *.obj > NUL
--if not exist test_dll.dll goto done
--echo you can now link with: test_dll.dll
--del main-.c
--del main-.h
--del init-.c
--del objfiles.lnk
--del test_dll.c
--del misc.c
--del machine.c
--goto done
--:nofiles
--echo Run the translator to create new .c files
--:done
-- Die eingebundenen DLLs müssen konform zum DLL-Aufruf des DLL-Funktionsblocks in ProfiLab sein.
-- Die untenstehend markierten Funktionen/Prozeduren sind zwingend für ProfiLab und müssen vom Code global verfügbar gemacht werden
-- Ansonsten kann wie gewohnt in EU programmiert werden (aber leider ohne die Nutzbarkeit des EU-Multitaskings)
-- Speziell gilt wegen Anforderungen der ProfiLab Real Time Simulation:
-- Ausführungszeit so kurz wie möglich, da "CCalculate" in jedem PL-Simulationszyklus durchlaufen wird.
-- Daher darin sicher keine Endlos-Loops, keine delays, kein blocking code, weil die Simulationsfrequenz direkt von der runtime von
-- "CCalculate" beeinflusst wird !
-- In der DLL-Doc wird gezeigt, dass Unterschiede bei den float Datentypen von Delphi und C++ existieren
-- Delphi hat "extended" = 10bytes, C++ hat "double" = 8bytes
-- Euphoria hat "atom", das sind doubles, also 8bytes von C++
-- Weil der DLL-Aufruf diese Unterscheidung macht, müssen von EU die C++-Funktionen verwendet werden,
-- somit sind nur diese nachstehend gelistet.
-- Das Speicherzugriffsverfahren von EU ist byte-weise mittels "peek/poke"
-- EU muss also die korrekte Datenbreite für den gewünschten Datentyp und den korrekten Index in die von PL
-- offerierten Tabellen berechnen
-- zwingende Funktionen:
--C++ function: unsigned char _stdcall NumInputs()
--C++ function: unsigned char _stdcall CNumInputsEx(double *PUser)
--C++ function: unsigned char _stdcall NumOutputs()
--C++ function: unsigned char _stdcall CNumOutputsEx(double *PUser)
--C++ procedure: void _stdcall GetInputName(unsigned char Channel, unsigned char *Name)
--C++ procedure: void _stdcall GetOutputName(unsigned char Channel, unsigned char *Name)
--C++ procedure: void _stdcall CCalculate(double *PInput, double *POutput, double *PUser)
--C++ procedure: void _stdcall CCalculateEx(double *PInput, double *POutput, double *PUser; StringParam PStrings)
--C++ procedure: void _stdcall CSimStart(double *PInput, double *POutput, double *PUser)
--C++ procedure: void _stdcall CSimStop(double *PInput, double *POutput, double *PUser)
--C++ procedure: void _stdcall CConfigure(double *PUser)