NEWS
Modbus Datenpunkte in Visu
-
@ghifunk said: hier die Objekteigenschaften der 3 Zeilen:
So funktioniert es nicht. Es muss ein Alias erzeugt werden, der 2 Modbus-Datenpunkte verknüpft: 1 Kommando, 1 Status.
Welches ist der Status? holdingRegisters oder inputRegisters?Erstelle den Alias mit folgendem Script (einmal kurz starten), wenn Kommando- und Status-ID richtig zugeordnet sind:
// Original-Datenpunkt const idOrigin = 'modbus.0.holdingRegisters.12339_Licht_Waschküche'; // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt. // Bei Nicht-Verwendung Leerstring '' zuweisen const idRead = 'modbus.0.inputRegisters.12340_Licht_Waschküche'; // Alias-Datenpunkt const idAlias = 'Keller.Licht.Waschkueche'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich nameAlias = 'Licht Waschküche'; desc = 'per Script erstellt'; // typeAlias = 'boolean'; // oder 'number' // read = "val > -20 ? val : -20"; // Erkennung "Aus" --> false erfolgt automatisch write = "val ? true : true"; role = 'switch.light'; // min = 0; // nur Zahlen // max = 100; // nur Zahlen // unit = '%'; // nur für Zahlen // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein) custom = []; // verhindert doppelte Ausführung von history, ... // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten ! // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten ! // Ab hier nichts ändern !! function createAlias(idDst, idSrc, idRd) { if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn'); else { var obj = {}; obj.type = 'state'; obj.common = getObject(idSrc).common; obj.common.alias = {}; if(idRd) { obj.common.alias.id = {}; obj.common.alias.id.read = idRd; obj.common.alias.id.write = idSrc; obj.common.read = true; } else obj.common.alias.id = idSrc; if(typeAlias) obj.common.type = typeAlias; if(obj.common.read !== false && read) obj.common.alias.read = read; if(obj.common.write !== false && write) obj.common.alias.write = write; if(nameAlias) obj.common.name = nameAlias; if(role) obj.common.role = role; if(desc) obj.common.desc = desc; if(obj.common.type == 'number') { if(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; } else { if(obj.common.min !== undefined) delete obj.common.min; if(obj.common.max !== undefined) delete obj.common.max; if(obj.common.unit) delete obj.common.unit; } if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj, function() { if(idRd) setState(idRd, getState(idRd).val, true); else setState(idSrc, getState(idSrc).val, true); }); if(raum && existsObject('enum.rooms.' + raum)) { let obj = getObject('enum.rooms.' + raum) obj.common.members.push(idDst); setObject('enum.rooms.' + raum, obj); } if(gewerk && existsObject('enum.functions.' + gewerk)) { let obj = getObject('enum.functions.' + gewerk) obj.common.members.push(idDst); setObject('enum.functions.' + gewerk, obj); } } } createAlias('alias.0.' + idAlias, idOrigin, idRead);EDIT: "write" für Toggle-Button ergänzt.
-
@ghifunk said: hier die Objekteigenschaften der 3 Zeilen:
So funktioniert es nicht. Es muss ein Alias erzeugt werden, der 2 Modbus-Datenpunkte verknüpft: 1 Kommando, 1 Status.
Welches ist der Status? holdingRegisters oder inputRegisters?Erstelle den Alias mit folgendem Script (einmal kurz starten), wenn Kommando- und Status-ID richtig zugeordnet sind:
// Original-Datenpunkt const idOrigin = 'modbus.0.holdingRegisters.12339_Licht_Waschküche'; // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt. // Bei Nicht-Verwendung Leerstring '' zuweisen const idRead = 'modbus.0.inputRegisters.12340_Licht_Waschküche'; // Alias-Datenpunkt const idAlias = 'Keller.Licht.Waschkueche'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich nameAlias = 'Licht Waschküche'; desc = 'per Script erstellt'; // typeAlias = 'boolean'; // oder 'number' // read = "val > -20 ? val : -20"; // Erkennung "Aus" --> false erfolgt automatisch write = "val ? true : true"; role = 'switch.light'; // min = 0; // nur Zahlen // max = 100; // nur Zahlen // unit = '%'; // nur für Zahlen // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein) custom = []; // verhindert doppelte Ausführung von history, ... // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten ! // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten ! // Ab hier nichts ändern !! function createAlias(idDst, idSrc, idRd) { if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn'); else { var obj = {}; obj.type = 'state'; obj.common = getObject(idSrc).common; obj.common.alias = {}; if(idRd) { obj.common.alias.id = {}; obj.common.alias.id.read = idRd; obj.common.alias.id.write = idSrc; obj.common.read = true; } else obj.common.alias.id = idSrc; if(typeAlias) obj.common.type = typeAlias; if(obj.common.read !== false && read) obj.common.alias.read = read; if(obj.common.write !== false && write) obj.common.alias.write = write; if(nameAlias) obj.common.name = nameAlias; if(role) obj.common.role = role; if(desc) obj.common.desc = desc; if(obj.common.type == 'number') { if(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; } else { if(obj.common.min !== undefined) delete obj.common.min; if(obj.common.max !== undefined) delete obj.common.max; if(obj.common.unit) delete obj.common.unit; } if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj, function() { if(idRd) setState(idRd, getState(idRd).val, true); else setState(idSrc, getState(idSrc).val, true); }); if(raum && existsObject('enum.rooms.' + raum)) { let obj = getObject('enum.rooms.' + raum) obj.common.members.push(idDst); setObject('enum.rooms.' + raum, obj); } if(gewerk && existsObject('enum.functions.' + gewerk)) { let obj = getObject('enum.functions.' + gewerk) obj.common.members.push(idDst); setObject('enum.functions.' + gewerk, obj); } } } createAlias('alias.0.' + idAlias, idOrigin, idRead);EDIT: "write" für Toggle-Button ergänzt.
-
@ghifunk du kannst auch einfach spezielle Widgets nutzen. Von inventwo gibt es welche die haben senden und rückmelde direkt getrennt über 2 objekte
-
@ghifunk said: Der Status ist das Input Register.
Dann kannst Du das Script unverändert zur Erstellung des Alias verwenden.
@paul53 guten Morgen,
habe das Script gestartet und nun den Datenpunkt unter Alias vorhanden. die Statusanzeige funktioniert auch. Bei dem Befehl ist es so, daß ich in der Wago einen Stromstoßschalter verwende, der nur einen kurzen Tastimpuls benötigt. Hier bleibt der Eingang beim schalten dann immer stehen - müßte also noch eine Tastfunktion rein.
Aber ich muß ehrlich sagen, in die Script-Sachen muß ich mich erst mal einarbeiten. Ich habe mom. da noch keinen Plan dazu oder ich bin schon zu alt dafür... vieleicht kannst du mir ja nochmal helfen.
Wenn das dann funktioniert muß ich das Skript mit den ensprechenden Änderungen (Name und Adresse) für jeden Datenpunkt einmal aufrufen - ist das korrekt?
Gruß -
@paul53 guten Morgen,
habe das Script gestartet und nun den Datenpunkt unter Alias vorhanden. die Statusanzeige funktioniert auch. Bei dem Befehl ist es so, daß ich in der Wago einen Stromstoßschalter verwende, der nur einen kurzen Tastimpuls benötigt. Hier bleibt der Eingang beim schalten dann immer stehen - müßte also noch eine Tastfunktion rein.
Aber ich muß ehrlich sagen, in die Script-Sachen muß ich mich erst mal einarbeiten. Ich habe mom. da noch keinen Plan dazu oder ich bin schon zu alt dafür... vieleicht kannst du mir ja nochmal helfen.
Wenn das dann funktioniert muß ich das Skript mit den ensprechenden Änderungen (Name und Adresse) für jeden Datenpunkt einmal aufrufen - ist das korrekt?
Gruß@ghifunk said: Bei dem Befehl ist es so, daß ich in der Wago einen Stromstoßschalter verwende, der nur einen kurzen Tastimpuls benötigt.
Ist der Befehl ein Button, der toggled ? Dann ergänze in der RAW-Ansicht der Objekteigenschaft den Eintrag unter common.alias um ",write":
"alias": { "id": { "read": "modbus.0.inputRegisters.12340_Licht_Waschküche", "write": "modbus.0.holdingRegisters.12339_Licht_Waschküche" }, "write": "val ? true : true" }@ghifunk said in Modbus Datenpunkte in Visu:
muß ich das Skript mit den ensprechenden Änderungen (Name und Adresse) für jeden Datenpunkt einmal aufrufen - ist das korrekt?
Ja, für jeden neuen Alias-Datenpunkt.
"write" für den Button habe ich oben ergänzt.
-
@ghifunk said: nach Eingabe der Änderung schaltet der DP nicht mehr.
Wie muss der Datenpunkt im Tab "Objekte" verändert werden, damit geschaltet wird ? Reicht dort nicht "true" zu bestätigen ?
@paul53 nein, ich mußte auch im vorherigem Skript immer erst ein "0" eingeben um den Impuls wieder zurück zu stellen. Dann hat er ein weiteres "1" angenommen und damit den Ausgang geschaltet. Also bei jeder Betätigung muß ein kurzer "true" Impuls kommen dann wieder auf false.
-
@paul53 nein, ich mußte auch im vorherigem Skript immer erst ein "0" eingeben um den Impuls wieder zurück zu stellen. Dann hat er ein weiteres "1" angenommen und damit den Ausgang geschaltet. Also bei jeder Betätigung muß ein kurzer "true" Impuls kommen dann wieder auf false.
-
@ghifunk said:
bei jeder Betätigung muß ein kurzer "true" Impuls kommen dann wieder auf false.
Dann weiß ich nicht, wie man es ohne Script lösen kann.
-
@ghifunk said: wie meinst du "ohne skript"?
Man benötigt ein zusätzliches (ständig aktives) Script, um die Datenpunkte auf false zurück zu stellen.
-
@paul53 ist es nicht möglich nur für eine kurze Zeit zB. 0,5s einen true Impuls auf die Modbus Adresse zu geben?
-
@ghifunk said:
ist es nicht möglich nur für eine kurze Zeit zB. 0,5s einen true Impuls auf die Modbus Adresse zu geben?
Ja, aber ich kenne keine Lösung, wie man es ausschließlich mit Alias macht.
-
@paul53 dann versuche ich jetzt mal, den gesendeten true Wert über die SPS einfach wieder auf false zu schalten -
dann wieder mit der Variante des 1. Script!@ghifunk said: true Wert über die SPS einfach wieder auf false zu schalten
Wenn alle "holdingRegisters" Button (Stromstoßschalter) sind, kann man es mit einem einfachen Script für alle DP lösen:
on({id: /^modbus\.0\.holdingRegisters\..+/, val: true}, function(dp) { setStateDelayed(dp.id, false, 200); }); -
@paul53 dann versuche ich jetzt mal, den gesendeten true Wert über die SPS einfach wieder auf false zu schalten -
dann wieder mit der Variante des 1. Script! -
@ghifunk said: true Wert über die SPS einfach wieder auf false zu schalten
Wenn alle "holdingRegisters" Button (Stromstoßschalter) sind, kann man es mit einem einfachen Script für alle DP lösen:
on({id: /^modbus\.0\.holdingRegisters\..+/, val: true}, function(dp) { setStateDelayed(dp.id, false, 200); });@paul53 hallo, Vielen Dank erstmal für Deine Mühe mit meinem Problem aber ich werd noch verrückt --
- mit der Signalabschaltung in der SPS das hat funktioniert! Ich habe in der Objektseite unter Rolle jetzt mal
einen Button verwendet und kann von hier aus nun meine Datenpunkte korrekt schalten.
Wenn ich nun in dei Visu gehe, sieht das schon wieder anders aus. Einschalten einer Leuchte funktioniert und das Ausschalten reagiert jetzt erst beim eigentlichen nächsten einschalten wenn wieder ein True Impuls kommt...
Es ist zum verzweifeln - ich bin schon ein paar Tage daran und werde nicht fertig!
Gibt es denn keinen Benutzer, der ebenfalls eine WAGO SPS über iobroker bedient und dort auch zum Schalten von Leuchten Stromstoß- Funktionsblöcke benutzt?
@ThaBam
Ich habe auch mal in verschiedene Taster Widgets reingeschaut, dort aber vieleicht auch auf Grund der Vielfalt nicht das richtige ausfindig machen können. Ich bin für jeden Rat, Hilfe und Hinweis dankbar,
Gruß
Gerhard - mit der Signalabschaltung in der SPS das hat funktioniert! Ich habe in der Objektseite unter Rolle jetzt mal
-
@paul53 hallo, Vielen Dank erstmal für Deine Mühe mit meinem Problem aber ich werd noch verrückt --
- mit der Signalabschaltung in der SPS das hat funktioniert! Ich habe in der Objektseite unter Rolle jetzt mal
einen Button verwendet und kann von hier aus nun meine Datenpunkte korrekt schalten.
Wenn ich nun in dei Visu gehe, sieht das schon wieder anders aus. Einschalten einer Leuchte funktioniert und das Ausschalten reagiert jetzt erst beim eigentlichen nächsten einschalten wenn wieder ein True Impuls kommt...
Es ist zum verzweifeln - ich bin schon ein paar Tage daran und werde nicht fertig!
Gibt es denn keinen Benutzer, der ebenfalls eine WAGO SPS über iobroker bedient und dort auch zum Schalten von Leuchten Stromstoß- Funktionsblöcke benutzt?
@ThaBam
Ich habe auch mal in verschiedene Taster Widgets reingeschaut, dort aber vieleicht auch auf Grund der Vielfalt nicht das richtige ausfindig machen können. Ich bin für jeden Rat, Hilfe und Hinweis dankbar,
Gruß
Gerhard@ghifunk said: Einschalten einer Leuchte funktioniert und das Ausschalten reagiert jetzt erst beim eigentlichen nächsten einschalten wenn wieder ein True Impuls kommt...
Mit common.alias.write ?
"alias": { "id": { "read": "modbus.0.inputRegisters.12340_Licht_Waschküche", "write": "modbus.0.holdingRegisters.12339_Licht_Waschküche" }, "write": "val ? true : true" } - mit der Signalabschaltung in der SPS das hat funktioniert! Ich habe in der Objektseite unter Rolle jetzt mal
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden




