Variablenprofil anlegen und einbinden

Hallo zusammen.

Ich schreibe mir gerade mit dem SDK und Delphi 2007 ein Erweiterungsmodul um meinen Steca TR603 Solarregler in IPS 2.5 einbinden zu können. Das klappt auch schon ganz gut.
Ein Problem habe ich allerdings mit der Erstellung von Variablenprofilen und dem anschließenden Einbinden bei der Variablenerstellung.
Ich benätige ein Temperaturprofil mit erweitertem Temperaturbereich. Die 70°C die das Standardprofil hat reichen mir nicht aus, da meine Röhrenklollektoren auch mal deutlich heißer werden können. Also war die Idee ein VAriablenprofil in der Create Routine zu erstellen. Also habe ich mal in den Beispielen nachgeschaut.

TIPSVarProfile.CreateIntegerProfile('TempSolar','Temperatur','','°C',-40,250,1);

funktioniert nicht. Allerdings bekomme ich mit

 fkernel.VariableManager.CreateVariableProfile('TempSolar',vtInteger);
 fkernel.VariableManager.SetVariableProfileText('TempSolar','','°C');
 fkernel.VariableManager.SetVariableProfileValues('TempSolar',-40,250,1);
 fkernel.VariableManager.SetVariableProfileIcon('TempSolar','Temperatur');

das Profil angelegt.

Gleich dahinter lege ich die Variablen an und gebe das neu anglegte Profil da auch gleich mit an.

 RegisterVariable('T1', 'T1', vtinteger, 'TempSolar');
 RegisterVariable('T2', 'T2', vtinteger, 'TempSolar');
...

Die VAriablen werden zwar angelegt, aber sie haben kein Profil zugewiesen. Gebe ich jedoch ein in IPS bereits länger vorhandenes Profil an, dann klapp das Anlegen auch mit dem Profil. Könnte es sein, dass ich zwischen dem Anlegen des Profils und dessen Verwendung noch irgend eine Aktion ausführen muss (sowas wie Applyupdates oder irgendwo ein Refresh) damit das eben angelegte Profil auch gleich verwendet werden kann?
Für Hilfe wäre ich dankbar.

ich mache das so im constructor


RegisterProfile(TIPSVarProfile.CreateFloatProfile('Eur.10', 'Euro','', ' Eur', 0, 10, 1, 3));
...
RegisterVariable('Price_cfVar', 'UnitPrice', vtfloat,'Eur.10');

Tommi

Hallo Tommi.

Danke, so klappt es. Gibt es da auch gleich eine Möglichkeit für ausgewählte VAriablen das Datenbanklogging zu aktivieren?

Habe ich selber noch nicht gemacht. In der Befehlsreferenz steht das auch nicht. Wenn ich aber so durch das SDK blättere, findet sich beim ArchiveControl eine Funktion, der ich das zutrauen würde:

procedure SetLoggingStatus(VariableID: TVariableID; Active: Boolean); stdcall;

Tommi

Ja scheint so zu sein, dass das ArchivControl das macht. Scheint aber so als muss ich da erst eins anlegen.
Gibt es überhaupt irgendwo eine Dokumentation zum SDK aus der man schlau werden kann wie man bestimmte Aufgaben erledigt oder muss man sich da mühevoll durch den Quelltext wühlen und selbst schlau werden?

Ist natürlich quatsch, weil ja eins da ist, aber wie greife ich auf das zu? Schon da fehlt die Doku bei so grundlegenden Dingen.

Mit dem Archivcontrol habe ich mich selber nie beschäftigt, weil ich alles in eine „echte“ DB schreibe, was ich aufheben möchte. Deshalb kann ich dazu nichts weiter sagen.

Das Schöne an der IPS-Entwicklung ist ja, das die PHP und SDK-Befehle identisch sind. Was man unter PHP verwendet, kann man oft mit geringen Anpassungen in Delphi schreiben. Und umgekehrt.
Erster Anlaufpunkt ist deshalb die Befehls und Modulreferenz. Als nächstes suche ich in den SDK-Quelltexten. Zusammenhänge stehen da allerdings auch nicht. Deshalb habe ich ja das Demomodul gemacht, nachdem ich mich am Anfang einmal durchgequält hatte. Manchmal muss man halt „intuitiv“ vorgehen und wenn das auch nicht zum Erfolg führt einfach paresy direkt fragen.

Tommi

Über IIPSInstanceManager das Interface für das ArchiveControl holen und dann auf IIPSArchiveControl casten und auf die entsprechende Funktion zugreifen.

Falls das nicht reicht muss ich mal schauen, das ich ein Beispiel baue :slight_smile:

paresy

Hallo paresi

Danke für den Tipp. An den Archivhandler komm ich so erst mal ran, alleridngs klappt es mit dem Typecast nicht so wie ich will

 
//InstanceID des Archivhandlers holen (funktioniert)
ID2:=fkernel.InstanceManager.GetInstanceIDByName('Archive Handler',0);

 //Register Variables (funktioniert)
 RegisterVariable('T1', 'T1', vtinteger, 'TempSolar'); //Kann da nicht gleich die ID der variablen zurückgegeben werden

 //ID der Variable holen, in instanceID steht ID des eigenen Moduls (funktioniert)
 ID:=fkernel.VariableManager.GetVariableIDByName('T1',InstanceID);

//Aufruf mit Typecast  (funktioniert nicht)
//fkernel.InstanceManager.GetInstance(ID2) sollte die Instanz liefern
//gibt aber Fehler: Inkompatible Typen 'IIPSArchiveControl' und 'TIPSINstance' 
IIPSArchiveControl(fkernel.InstanceManager.GetInstance(ID2)).SetLoggingStatus(ID,true);

Mag sein, dass ich mich da zu blöd anstelle oder gerade wieder einen Augeblick geistiger Umnachtung erlebe.

vielleicht klappt es so besser:


(fkernel.InstanceManager.GetInstance(ID2) as IIPSArchiveControl).SetLoggingStatus(ID,true);

Tommi

Und für die ID der Variable bitte immer GetStatusVariableID(‚T1‘) nutzen. Die nutzt dann auch korrekt die IDENTs statt dem Namen.

paresy

@ Tommi

Leider klappt dein Vorschlag so nicht.

 (fkernel.InstanceManager.GetInstance(ID2) as IIPSArchiveControl).SetLoggingStatus(ID,true);

Liefert mir beim IIPSArchiveControl einen
E2015: Operator auf diesen Operandentyp nicht anwendbar.
Es geht also nicht direkt mit dem Interface.

Das mit GetStatusVariableID(‚T1‘); hab ich eingebaut. Das geht.

Ich hab das mit dem Logging erst mal nach hinten geschoben, da ich momentan gravierendere Probleme habe.
Die Daten die vom Serport kommen werden irgendwie „Zerhackt“. Mit einem Serport-Monitor kommt ein sauberer String an. Das was aber vom IPS Serial Port an mein Modul kommt ist völlig zufällig mit CRLF durchsetzt
Vor allem ist es jedamal an einer anderen Stelle ein CRLF eingefügt.


2012-04-<CR><LF>
23 19:21:46;57;54;51;47;53;53;3;0;0;0;1;1;0;144;<CR><LF>
32767;EU;2;TR0603mc;Err;0;0;;<LF>
<CR><LF>
2012-04-<CR><LF>
23 19:22<CR><LF>
:46;57;5<CR><LF>
4;51;46;<CR><LF>
53;53;3;0;0;0;1;1;0;144;<CR><LF>
32767;EU;2;TR0603mc;Err;<CR><LF>
0;0;;<LF>
<CR><LF>


und so sollte es aussehen

2012-04-23 19:21:46;57;54;51;47;53;53;3;0;0;0;1;1;0;144;32767;EU;2;TR0603mc;Err;0;0;;<LF>
2012-04-23 19:22:46;57;54;51;46;53;53;3;0;0;0;1;1;0;144;32767;EU;2;TR0603mc;Err;0;0;;<LF>
2012-04-23 19:23:46;57;54;50;46;53;53;3;0;0;0;1;1;0;144;32767;EU;2;TR0603mc;Err;0;0;;<LF>

Es scheint so als ob mir der IPS Serial Port das Ganze in 8 Zeichen langen Paketen übergibt (aber nicht immer) und dazwischen ein CRLF einfügt.

Die Daten kommen vom SerialPort in der Tat kontinuierlich blockweise, so das man selber für die Zusammenhänge sorgen muss. <CR> ist auch nur ein Zeichen von vielen. Ich habe auch schon mal gesehen, das mal #0 bytes reinrutschen können, aber eigene CRLF macht das Modul von sich aus eigentlich nicht. Es ist in vielen Fällen sinnvoll, auf Hardwarehandshake zu wechseln, wenn das unterstützt wird. Evtl. auch testweise einen Splitter dazwischen hängen. Die Fragen zum SerialPort kann aber nur Paresy letztendlich beantworten.

Tommi