neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Antworten
tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von tom_g » 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)
Dateianhänge
tag_input.dll
(147 KiB) 269-mal heruntergeladen
Curiousity makes us progress !

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von tom_g » Sonntag 30. Januar 2011, 11:45

Hier ein Demo-Projekt zur "Datenschnittstelle"

Gruss tom_g
Dateianhänge
tag_input.zip
(77.55 KiB) 371-mal heruntergeladen
Curiousity makes us progress !

KAKTUS
Beiträge: 645
Registriert: Samstag 18. Oktober 2008, 21:12

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von KAKTUS » Sonntag 30. Januar 2011, 13:45

Hallo tom_g,

da hast du ja eine sehr nützliche DLL erstellt.
Man kann damit also aus einer Textdatei Daten auslesen und PLE verwenden. Ich habe das bisher mit Readline und einem Zähler gemacht, anschließend mit Part die Texte zerlegt. Ist relativ aufwendig.

Frage:
-Könnte die DLL selbst erkennen in welchem Laufwerks Pfad sie sich befindet, weil dort würde dann auch die Textdatei (Setup) liegen.
-Ich bräuchte mehr Tags, so 16 Stück wären schon mal nicht schlecht. Oder eine Möglichkeit tag_input in Reihe zu schalten, so das immer aus der selben Text Datei gelesen wird, nur das erste tag_input liest tags 1-4 das zweite 5-8 usw.
Meine Setup Daten sind durch Semikolon getrennt, wenn man das Trennzeichen noch angeben könnte wäre s super.

fw;Firmware Version der Steuerung;006
t0;Verzögerung;25
t1;Ansprechschwelle;260
stachlige Grüße, Kaktus

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von tom_g » Sonntag 30. Januar 2011, 14:09

Hallo Kaktus,
danke für Deine Rückmeldung.

Ich werd's mal versuchen, das mit dem Pfad. Doch heute wohl kaum mehr, meinem Hund ist's stinklangweilig, während ich hier im PC "wühle", werde also noch etwas in die Nordschweizer Kälte rausgehen müssen :-)

Wenn Du mehr Tags benötigst, kannst Du, wie in der Demo vorgeführt, mehrere Instanzen der DLL verwenden, welche aber unterschiedliche Tags referenzieren. Die DLLs können auf ein und dieselbe Text-Datei verweisen. Die Datei selbst kann ja viel mehr als die 4 Tags enthalten (siehe init.txt)

Aber es ist eine Kleinigkeit, z.B. die doppelte Menge Ein/Ausgänge zu schaffen, kann ich mir auch überlegen.
Bisher habe ich mich halt noch nicht mit GUIs für die Einstellbarkeit von Eigenschaften beim Einbinden der DLL beschäftigt, will ich aber noch erschliessen. Das wäre die richtige Art, z.B. 4/8/16 Eingänge einstellbar zu machen.

Im Unterschied zu Deiner Lösung (es gibt ja immer viele andere Wege) kann "meine" Textdatei dynamische Zuweisungen vornehmen, d.h. sie kann mal gar nichts enthalten, dann mal nur einen Tag, dann mal viele. Die DLL wirkt als Tag-Namen-Filter und lässt nur dann Daten an den Ausgang durch, wenn der Tag erkannt wird.
In Deinem Lösungsansatz muss Du wohl darauf achten, dass immer dieselben Tags an der richtigen Stelle erscheinen, sonst weist Du falsche Daten zu ?

Viele Grüsse, und schönen Sonntag von
tom_g
Curiousity makes us progress !

breitech
Beiträge: 19
Registriert: Mittwoch 20. April 2011, 13:10

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von breitech » Mittwoch 20. April 2011, 13:16

Hallo Tom_g
bin Neuling im Thema ProfiLab, komm aber bestens klar damit
nur mit Programmieren direkt da fehlt es
die DLL von dir hab ich probiert - ist klasse
suche eigentlich so was ähnliches - nur das nicht aus einer Datei gelesen wird sonder aus einer anderen DLL an der eine Hardware hängt
diese wird über IP-Adresse und RS485 Subadresse angesprochen
wenn Interresse hast mir dabei zu helfen kann ich dir die Unterlagen zukommen lassen

Gruß
Breitech

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von tom_g » Mittwoch 20. April 2011, 14:34

Hallo Breitec,

Du darfst mir die Unterlagen gerne mal senden. Bitte versteh' auch, dass ich eigentlich keine "Kundenprogrammierung" betreibe. Aber wenn der Aufwand nicht zu gross ist, müsste es möglich sein - manchmal packt es einen dann...

Etwas Geduld, und wie gesagt ohne Versprechen !

Gruss Thomas
Curiousity makes us progress !

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von tom_g » Samstag 23. April 2011, 08:41

Guten Morgen,

hier eine von Kaktus gewünschte Variante der tag_read Schnittstelle als DLL.

@KAKTUS: Dein Wunsch datiert ja schon einige Zeit zurück...ich löse hiermit mein Versprechen ein - der Hund liegt zufrieden inmitten wunderschönen Frühjahrsblust unserer Obstbäume und schaut auf den Rhein herunter - und ich habe mich nach längerer Pause wieder mal hinter die Software geklemmt !

@ABACOM: bitte erlaubt mir zu Ostern, meinen "Osterhund" hochzuladen ;-)

Ich habe erst gestern Deinen "Wunsch" nochmals gelesen: Du verwendest mehrere Zeilen, und im Beispiel sind zwei Namen und ein Wert pro Zeile genannt. Leider "kann" meine DLL Dein ini-Format nicht, weil sie für einen anderen Zweck gemacht ist. Vielleicht kannst Du Dein Ini-Format aber abwandeln ?

Ich führe die Eigenschaften der tag_read Schnittstelle nochmals auf:

* 16 $In, 16 numOut aufs Mal
* nur noch file specifier, der Pfad wird selbst detektiert (weil die DLL vom Projekt instanziert wird, wird das Directory des text-Files immer auf dem selben Pfad erwartet wie das PL-Projekt)
* spezifizierbarer delimiter

Es bleibt zunächst dabei, dass das text-file nur einzeilig ausgewertet wird. Auf jeden fallenden Takt liest die DLL das Textfile und versucht, Paare aus Namen und Werten zu bilden, dabei muss zwischen jedem Element (ob Name oder Wert) ein delimiter stehen.
An bis zu 16 Eingängen kann (muss aber nicht) der Benutzer verschiedene Referenz-Namen spezifizieren (variable_names, tag_names). Sobald die DLL einen passenden Namen (match) im File findet, wird der nachfolgende Wert auf dem gepaarten Ausgang ausgegeben.

Wird ein passendes Paar gefunden und der Wert auf den Ausgang zugewiesen, so bleibt der Ausgang erhalten, auch wenn sich Namen und Werte im File zwischenzeitlich ändern !

Die Referenz-Namen, der Specifier, der Filename und die Extension dürfen während der Laufzeit modifiziert werden ! (Ob das Sinn macht, muss der Anwender entscheiden)
Die Reihenfolge jeder Einheit (Name<delim>Wert<delim>) ist zwingend, nicht aber die Reihenfolge von verschiedenen Einheit gegenüber derjenigen der DLL.

Diese DLL versteht sich als dynamisches Namens- und Wertefilter. Ihre Anwendung ist als einfache unidirektionale textbasierte Schnittstelle zu anderen Pogrammen gedacht.

Beispiel: 3 PID-Regler (Gasmassenstrom, Luftmassenstrom, und Strom an einer Brennstoffzelle) formuliert in einem PL-Projekt, sollen von einer formal programierten Anwendung so geführt werden, dass die relevanten Kenngrössen der Brennstoffzelle erfasst werden können. In diesem Fall wird die maximale Brennstoffausnutzung für jeden Messpunkt als Kombination der drei Parameter gemessen und geloggt, und später in einer Auswertung 3D-aufgetragen. Die Messung dauert Stunden, bis alle Punkte abgefahren sind.

Ich verwende bewusst verschiedene Softwaresysteme und nutze deren Stärken gezielt aus. PL eignet sich sehr gut als "real time" Reglerumgebung für nicht allzukritische Aufgaben, und für das unbürokratische Datalogging, auch als ProzessgrössenViewer (Quick-Look). Als super Trender habe ich immer auch RealView per TCP localhost "hintendran" gekoppelt.

Hingegen ist PL mühsam zu verwenden, wenn es um (meist langsame) Abarbeitung gezielter Schritte geht. Hier kommt mein freiprogramierbarer Sequencer (Euphoria-Anwendung) ins Spiel. Dieser schreibt gezielt Namen/Wertepaare ins Schnittstellenfile, wenn in PL ein oder auch mehrere Parameter zusammen (eben bis zu 16) (Sollwerte der Regler) verändert werden sollen. Typischerweise exponiere ich die Namens/Wertepaare nur für kurze Zeit im File, und nur genau diejenigen, welche ich verändern möchte. Danach lösche ich den Inhalt des Files wieder. Somit kriegen die Regler in PL einen neuen Sollwert nur dynamisch zugewiesen. In der Zwischenzeit bleiben sie für manuelle Intervention befreit (hierzu habe ich noch ein eventgesteuertes Makro ins Beispielprojekt eingebaut - entweder aus der Automatisierung oder aus der Handebene können damit Prozesswerte beschrieben werden)

Ich bin offen für sinnvolle Erweiterungen !

Schöne Ostern allerseits und freundliche Grüsse von Thomas
Dateianhänge
tag_input_kaktus.prj
23.04.2011 12:12 ergänzt mit dynamischer Handebene
(9.22 KiB) 349-mal heruntergeladen
tag_input_kaktus.dll
(157.5 KiB) 265-mal heruntergeladen
Curiousity makes us progress !

KAKTUS
Beiträge: 645
Registriert: Samstag 18. Oktober 2008, 21:12

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von KAKTUS » Sonntag 24. April 2011, 09:39

Danke für das Ostergeschenk tom_g !

Das muss ich mir mal in Ruhe anschauen wenn ich wieder zuhause bin.

Schöne Ostergrüße aus Koh Samui/Thailand.

PS: Schöner Hund
stachlige Grüße, Kaktus

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von tom_g » Sonntag 24. April 2011, 10:26

Sawadii krap kun KAKTUS,

ko: hai pak ro:n di: ma:g lä sanuk dschang lö:i samrab kun !
A:gat gamlang arai ti: go: samui ?

(In der Annahme, dass Du Thai sprichst !
Ich bin schon lange dran (am Thai lernen), im Vergleich E, F, It, Sp, Pt komme ich bei Thai aber nur langsam voran)

Viel Spass und eben hoffentlich nicht soviel Wasser wie es da vor einigen Wochen runterkam !
Curiousity makes us progress !

irrerpolterer
Beiträge: 105
Registriert: Mittwoch 19. November 2008, 16:20

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von irrerpolterer » Donnerstag 28. April 2011, 13:23

Hallo!

Schöner Hund, noch keine 5, nicht? Ich drücke Dir die Daumen, dass er auch knuddeln mag.

Bei der Bildbetrachtung habe ich mich gefragt, woher sind die bunten Streifen oder Bänder?

Grüße

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: neue "Datenschnittstelle" in Textform zu ProfiLab (als DLL)

Beitrag von tom_g » Donnerstag 28. April 2011, 14:55

Hi Irrepolterer,

vielen Dank für Dein Lob ! Doch, unsere Hera hat schon 11 Jahr auf dem Buckel, aber wir haben bisher richtig Glück mit ihr gehabt - kürzlich jedoch hatte sie Pyometra und ist fast dran gestorben. Noch mal gut gegangen ! Ansonsten ist sie ein Sonnenschein und eine richtige Schmuserin.

Die Fäden stammen von einem Gleitschirm. Ich mache hier meine autodidaktischen Versuche zum Hochziehen der Kappe. Würde gerne richtig fliegen lernen, habe mich bisher doch nie dazu durchgerungen.

Fliegst Du ?

Viele Grüsse von Thomas
Curiousity makes us progress !

Antworten

Zurück zu „DLL-Programmierung“