Variabel zuordnen aus RegisterVariable

Hallo zusammen,

hat jemand eine Idee für mich wie ich die Daten die über eine RegisterVariabel kommen
in einzelne diverse Variabel im IPS die Werte zuweisen kann.

Kurz gesprochen, so sehen meine Empfangsdaten aus z.B.

1;223;1;185; usw.

Soll ich die Variabel vorher als Bool, Float etc. anlegen, oder soll ich die dann zur Laufzeit anlegen wenn der
Empfang aus der RegVar zerlegt wird?

RegVarZuordnung.JPG

Das ist nur ein kleiner Auszug wie ich die Variable anlegen würde.

Gruß
MacToolz

Hallo,

ich hoffe ich habe deine Frage richtig verstanden, dir geht es nur darum, wann du die Variablen anlegen sollst?
Also in meinem Tasmota Modul mache ich es so, die Variablen werden erst angelegt, wenn das erste Mal Werte eintrudeln.
Allerdings glaube ich, es ist reine Geschmackssache, wie man es macht.

Grüße,
Kai

Hi,

also wann ich die Anlege wäre mir fasst egal. Es gibt aber da ein paar handling Probleme.

Es ist so, wie lege ich meinen Empfangsstring 1;223;1;185; auf die Variabel um.

Weil, wenn ich die Variabel vorher anlege und mir die im IPS suche, heißt es ja noch lange nicht das diese dann immer in der selben Reihenfolge für mich vorliegen. Ich meine damit, das die Variabel unter eine Kategorie angelegt sind und mir dann die Childs ausgeben lasse.

Also wie in dem Screenshot wie mein Variabel angelegt sind.

In meinem String (1;223;1;185;) kenne ich die Reihenfolge. Nur als Information, der String kommt von meiner SPS.
Heißt, ich baue mir so zu sagen ein eigens Protokoll auf.

Entweder müsste ich jetzt mit dem ObjectIdent arbeiten, und mir aus der SPS noch für jede Variabel eine IdentNummer mitgeben lassen, dann würde ich die Variabel dann zur Laufzeit anlegen mit dem dazugehörigen Ident.

ODer was gibt es da noch für Lösungsansätze.

Gruß
MacToolz

Hallo,

ich würde es genauso machen wie du es selbst beschreibst, dir die Idents mitgeben lassen und mit diesem dann die Variablen anlegen.
Es gibt bestimmt wie fast immer eine bessere Lösung. :smiley:

Grüße,
Kai

Hi,

ok, ja es gibt immer was besseres. Aber das ist ok so.

Das heßt, werde den String in Teilstrings zerlegen, dann prüfen ob dieser Ident existiert und wenn nicht wird die Variabel angelegt und der Wert aktualisiert.

Weil irgendwie muss ja ich ja meine SPS Variabel im IPS identifizieren um entsprechend die Werte richtig zuordnen zu können.

Nur der IDent ist ja eigentlich kein eindeutiges Merkmal? Heißt, ich muss mir was überlegen was es generell nicht gibt damit ich meine Variabel ermitteln kann?

Gruß
MacToolz

Hallo,

ich würde mir ein Dummy Modul anlegen, darunter die Variablen mit deinen Idents.
Die Variablen ID würde ich dann so erfragen: IPS_GetObjectIDByIdent (IPS_GetObjectIDByIdent — IP-Symcon :: Automatisierungssoftware)

Grüße,
Kai

Hi,

warum ein Dummy Module? Nur so zum Verständnis?

Gruß

Weil der Ident pro Ebene gilt.
Und zum zusammenfassen von Variablen zu einem Gerät nutzt man halt (auch wegen der Möglichkeit der direkten Visualisierung als ein Gerät) ein Dummy Modul.
Michael

Hi,

ok, aber dann haut das ja nicht mit der Vielzahl der Variabel hin. Das sind ja nur ein paar als Muster, es werden
einige aus der SPS kommen.

oder meint ihr das ich dann für jede Variabel ein Dummy Module erstellen sein.
Wie gesagt mein Ziel ist es eine eindeutige Zuordnung meiner SPS Werte zu einer Variabel
zu schaffen.

So kann ich ja nicht mehrere Variabel unter ein Dummy packen.

Ich brauche ein eindeutiges Merkmal.

Gruß
MacToolz

Hallo,

die Variablen aus deiner SPS gehören doch sicherlich zu verschiedenen Geräten, die an der SPS angeschlossen sind? (Ich kenne mich mit SPS überhaupt nicht aus, korrigiere mich bitte, wenn das falsch ist.)

Ich würde dann für jedes Gerät, welches an der SPS angeschlossen ist ein Dummy Modul anlegen.
Darunter dann nur die Variablen, die zu diesem Gerät gehören, somit solltest du doch deine Zuordnung haben?

Grüße,
Kai

Es werden viele… Ja und?
Für das WebFront arbeitest du dann mit Links.
Bohr das Protokoll SPS seitig so auf, dass es sonst Gruppen gibt. Und dies sind dann wieder DummyInstanz.
Michael

Hi,

ja ok, viele ist nicht das Thema.

Heißt also das jede Variabel unter einem Dummy Modul liegt damit ich damit das Ident setzen kann und somit meine eindeutige Zuordung zu meiner SPS Variabel finden kann.

Richtig ???

Gruß
MacToolz

Hallo,

kann man so sagen, du kannst natürlich auch mehrere Variablen unter ein Dummy Modul legen, das würde Sinn machen, wenn diese Variablen zusammengehören.

Beispiel:

Steckdose mit Messfunktion:

[ul]
[li]Status[/li][li]Watt[/li][/ul]
Die beiden Variablen würde ich dann zusammen unter ein Dummy Modul setzen.

Grüße,
Kai

Hi,

ne das geht ja leider nicht, meiner Meinung nach. Ich muss ja meinen Wert aus meinem SPS String einer IPS Variabel zuordnen, sprich muss sie ja suchen und nach dem Ident schauen.

Wenn der SPS String z.B. so aussieht … 1,223;2,165;3,111;

aufgelöst nach Semikolon separiert …
1,222
2,165
3,111

sind drei verschiedene Variabel. Heißt, die Zahl vor dem Komma wäre so zu sagen mein IDent.
Wird dann später anders heißen, wäre aber jetzt erstmal egal.

Wenn ich jetzt das Ident Abrufe und darunter dann zwei weitere Variabel liegen, wie soll ich die dann zuordnen.
Über den Var Name wäre es sehr schlecht weil der kann ja sich sehr schnell ändern und auch leicht im IPS zu ändern…

Solange die Variabel bleibt und nicht gelöscht wird, kann ich den Namen ändern wie ich will und den Link in das Webfront direkt auch den Variabel Namen übernehmen.

Aber das Ident ist ja erstmal nicht sichtbar und bleibt im Hintergrund und ist nicht so schnell editierbar, also von der Anfälligkeit erstmal gering.

Und die SPS würde in erster Linie das Ident bestimmen. Aber das baucht es ja eigentlich nicht. Nur beim ersten Übertragen.
Der String wird zerlegt, der Ident wird gesucht, wenn nicht gefunden dann wird das Dummy Modul angelegt, darunter die Variabel und der Wert dazu …

Später wir der SPS String dann so aussehen.

SPS_FBH_WZ_LINKS_KP,165;SPS_FBH_WZ_TN,120; usw …

Oder andere Ideen, bin da für alles offen …

Gruß
MacToolz

Hallo,

ich verstehe dein Problem nicht wirklich.
Das Dummy Modul hat eine InstanzID, alle Variablen, die du darunter anlegst haben eine ID und ein Ident.

Wenn du weißt welche Variable zu welchem Dummy Modul gehört, kannst du anhand der ID der Instanz, mit

IPS_GetObjectIDByIdent ( string $ObjektIdent, integer $ÜbergeordneteID )

die ID der Variable erfragen.

Du müsstest halt nur noch wissen, welche Variablen zu welcher Dummy Instanz gehören. Aber wenn du doch den String der SPS aufbauen kannst wie du möchtest, könntest du sowas doch auch noch mit einfließen lassen? Oder habe ich dich falsch verstanden?

Grüße,
Kai

Ich habe da vollkommen falsch gedacht, und gleichzeitig beim testen den Fehler gemacht das dass Ident auf der selben Ebene unterschiedlich sein muss und habe es immer wieder gleich genannt auf die verschiedenenen Variabel.

Ich war gerade wirklich der Meinung das dass IDent nur im Dummy verändert werden kann und dachte das es nicht für die Variabel geht mit dem Ident zu arbeiten.

Oh man, sorry … und dann kann ich ja die Variabel die zusammen gehören unter ein Dummy Modul legen.

Z.B. wenn ich für die mehreren PID Regler jeder z.B. sein KP hat …

Liege ich jetzt da richtig ???

Gruß

Hallo,

zeig doch vielleicht mal deinen Code, so langsam verwirrst du mich. :smiley:

Grüße,
Kai

Hi,

ne grad nicht noch voll die Baustelle … :smiley:

Als erstes war mein Fehler das ich das Ident alle gleich benannt hatte. Das geht natürlich nicht auf gleicher Ebene,
also in meinem Fall alle unter einer Kategorie.

Dann war ich der Meinung das es für Variable nicht gehen würde. Keine Ahnung warum …

Also riesen Fehler von mir im Verständnis … Sorry …

Also dann hab ich es wie ich mir die Variabel zuordnen kann …

Danke

Gruß
MacToolz

Hi,

das ist mal mein erster Ansatz.

<?

/*
	Objekt-Typ (0: Kategorie, 1: Instanz, 2: Variable, 3: Skript, 4: Ereignis, 5: Media, 6: Link

	0	Legt eine Variable vom Typ Boolean an
	1	Legt eine Variable vom Typ Integer an
	2	Legt eine Variable vom Typ Float an
	3	Legt eine Variable vom Typ String an
*/

include(IPS_GetScriptFile(51740 /*[Scripte\HET\000_MyCodeArchive\FUNCTIONS\FN_GetVarList]*/));
include(IPS_GetScriptFile(25031 /*[Scripte\HET\000_MyCodeArchive\FUNCTIONS\FN_GetObjectList]*/));
include(IPS_GetScriptFile(49292 /*[Scripte\HET\000_MyCodeArchive\FUNCTIONS\FN_CreateVariableByIdent]*/));
// PrintLog
$xPrintLog = TRUE;

// Variabeltyp als Objekt sichen
$GetVarObj = 2;

// Zu suchende Teil String in den SPS Daten um zu verifizieren welcher Teil der Variabel angelegt werden soll ..
// Beispiel : 	SPS_FBH_KuecheKochInsel --> ist der Variabel Name der von der SPS kommt, dieser soll nach "SPS gesucht werden
// 				Wenn der Teil String SPS gefunden wurde soll es eine Variabel sein die angelegt werden soll
$sSearchSring = 'SPS';

// SPS String woraus die Daten ausgelesen und zerlegt werden
$InstSpsStringVar = 33619 /*[Geräte\SPS\HZ Keller Wago\WagoSocketClientString]*/;
$SpsStringValue = GetValue($InstSpsStringVar);

// SPS String zuerst nach Semikolen trennen
$datasets = explode(';', $SpsStringValue);

// Dann die getrennten Semikolen innerhalb durch weiteres Trennzeichen "Komma" trennen
foreach ($datasets as $Obj)
{
	$datasets1[] = explode(',', $Obj);
}

// Eigener Aufruf
$SelfObj = $_IPS['SELF'];	

// Eigene Instanz aus Aufruf ermitteln
$Obj = IPS_GetObject($SelfObj);
$ParentID = $Obj['ParentID'];
 
// Variabel unter dem darunter ligeenden Objekt abrufen
$arVarList = FN_GetVarList($SelfObj, $GetVarObj);

// Suchstring absichern
if ($sSearchSring <> '')
{
	// Die getrennten Daten anhand der Trennzeichen als Array abarbeiten
	foreach ($datasets1 as $Obj)
	{		
		// zuerst versuchen das IDENT abzufragen, wenn durch die ID kein Objekt gefunden wurde, wird es angelegt
		// @ --> keine Fehlerausgabe, wird damit unterdrückt ...
		$ID = @IPS_GetObjectIDByIdent($Obj[0] , $ParentID);
		
		// Prüfen ob ID gültig, zum absichern
		if ($ID > 0)
		{
			$arIdentList[] = IPS_GetObjectIDByIdent($Obj[0], $ParentID);				
		}
		else
		{
			// abrufen ob in diesem Array auch der zu suchenden Teilstring drin ist, 
			// erst dann soll es eine Variabel sein und wird nicht mewhr angelegt
			// damit werden Zusatzinformationen nicht als Variabel angelegt
			$iPosStr = strpos($Obj[0], $sSearchSring);
		
			// die zu suchende Stelle steht an Nullter Position ...
			// dann anlegen
			if ($iPosStr === 0)
			{	
				// Variabel erzeugen, gleicher Variabel Name im IPS und mit gleichem Ident
				FN_CreateVariableByIdent($ParentID, $Obj[0], $Obj[0], '', 0);
			}
		}																
	}
}

// PrintLog
if ($xPrintLog)
{
	$ObjList = FN_GetObjectList($arIdentList);
	print_r($ObjList);
}
?>

Ich werde dann noch die Zuweisung der Werte einbringen und ich denke ich werde sogar dann den Typ mit aus der SPS vorgeben.
Heißt werde meinen Sende String von der SPS erweitern … z.B. so …

NAME , DATENTYP , WERT ; NAME , DATENTYP , WERT ; ZÄHLERSTATUS … usw …

Die Trennung ist das Komma für eine Variabel und nach dem Semikolon folgt eine neue Variabel …

Wenn einer Ideen hat oder Vorschläge sehr gerne …

Gruß
MacToolz