Verbesserte ModBus Anbindung (IP-Symcon 7.0)

… eine Frage zur verbesserten ModBus Anbindung: ich benutze die ‚alte‘ Anbindung recht intensiv, was passiert damit wenn ich jetzt das aktuelle Update rein fahre? Funktioniert das ‚alte‘ Zeug noch und kann ich dann parallel dazu die Features der neuen Anbindung testen oder fliegt mir alles um die Ohren?

Gruß Michael

Es sollte alles weiter funktionieren. Das ist nur zusätzlich und neu. Und du kannst beides parallel nutzen.

paresy

Danke, das wollte ich hören :slight_smile:

Ist das ein Bug bei denen in der API? Denn es ist ja super untypisch, dass sich die Endianess im selben Gerät ändert. Oder steht das in der API auch Dokumentiert so?

Ja, das korrigiere ich zum nächsten Update. Ist mir auch schon aufgefallen.

Das halte ich nicht wirklich für einen Use-Case der existent ist. Trotzdem will ich anbieten, dass man den Ident selbst festlegen kann. Das ist insbesondere praktisch, wenn in der ModBus Tabelle Identartige Dinge verfügbar sind, die man vorgeben könnten. Und es macht es einfacher dies bei den virtuellen Adressen nutzbar zu machen.

Könnte ich abfangen - bin mir nicht sicher, ob sich der Aufwand lohnt. Mit den „eigenen“ Idents von oben kann man aber sehr schön Differenzieren auch bei gleichem Namen

Auch dies wäre mit einem selbst vergebbarem Ident gelöst. Wobei der Name ja nur der initiale Name ist. Du kannst den Namen in der Variable ja immer umbenennen.

paresy

Jein, es gibt den Wechselrichter, da brauch ich den ByteSwap und es gibt den LG Resu 10h Speicher der per Modbus am Wechselrichter hängt. Bei den 32bit Werten vom Speicher brauche ich keinen ByteSwap. Keine Ahnung welcher Fuchs sich das ausgedacht hat.

Gruß
Stephan

Perfekt, das hört sich gut an.

Bitte den Punkt nicht aus den Augen verlieren:

Der Fall schlägt hier zu leicht zu. Wie gesagt, mein Vorschlag wäre: die Variable nicht löschen, sondern nur den Ident leeren. Dann hat man eine Chance, noch Referenzen zu suchen und alles zu reparieren.

Das ist leider eine sehr große, generelle Änderung auf einer sehr tiefen Ebene. Ich bin mir unsicher ob wir das tatsächlich machen wollen - evtl. macht es Sinn, dass du dort im PHP SDK Forum mal ein Thema eröffnest, sodass wir und die Modulentwickler uns darüber austauschen. Denn am Ende würde es alle betreffen - und insbesondere das nicht aufräumen würde überall „Müll“-Variablen hinterlassen - was uns wieder ausgelegt werden könnte, dass wir Leute an ihr Variablen Limit bringen wollen. Wie gesagt: Bitte woanders dazu gerne eine Diskussion eröffnen, da es genereller und ich sehr skeptisch bin.

paresy

Fände ich auch gut. Beim Kostal Wechselrichter gibt es auch einige Werte, welche von der Allgemeinen Einstellung im WR abweichen und entsprechend andersherum ausgelesen werden müssen. Das ist zwar wohl ein Bug in der Firmware des WR, könnte so aber elegant umgangen werden.

Ev. gäbe es die folgenden Optionen für den Byte Swap:

  • Default - übernimmt was im Gateway steht
  • Little Endian
  • Big Endian
    Damit könnte man den GW überschreiben wenn nötig, muss es aber mit Default nicht unbedingt konfigurieren.

Gruss
Jotata

Nach dem Update auf die Version von heute werden nun bei mir keine Variablen der neuen ModBus Geräteinstanzen mehr aktualisiert.

Die alten ModBus Adress Instanzen funktionieren weiterhin (bis auf die zwei bereits genannten Problemfälle)

Hat noch jemand das Problem?

Die Idents sind nun frei vergebbar. Sehr gut. Schön wäre noch, wenn die Idents auch in der Liste ausgegeben werden. Dann behält man besser die Übersicht.

Auch könnte die Fehlermeldung zu einem fehlerhaften Ident eher kommen:
image

In der Situation wird momentan ein unvollständiges Objekt mit leerem Ident angelegt

Da scheint etwas noch nicht zu passen.

Gibt es im Log Fehlermeldungen?

paresy

Stimmt, da kann das Textfeld direkt vorher validieren. Gute Idee. Baue ich ein.

paresy

Nein. Nur die von den alten Instanzen:

Ergänzung:

Nur eine der beiden Geräteinstanzen wird nicht aktualisiert. Die andere schon. Sehr seltsam. Da wären Debuginformation schon hilfreich :slight_smile:

Ergänzung 2:
Jetzt geht es. Es war noch eine fehlerhafte Adresse aktiv:
image
(Das „Watt“ Thema)

Nun mit deaktivierter Adresse geht es.

Ergänzung 3:

Es wäre schön, wenn die Instanz auf Fehler ginge. Dann hätte ich es wohl sofort gesehen.

Ich habe gerade für mich die Importdatei zum schnellen Erfassen und Bearbeiten der Adressen entdeckt. Dabei sind mir jedoch drei Tippfehler unterlaufen, die etwas schwerer zu finden waren.

Die Punkte sind sicherlich nicht so relevant, da die Exportdatei ja eigentlich nicht zum Bearbeiten gedacht ist, aber vielleicht lässt sich da ja dennoch etwas machen :slight_smile:

  • Bei dem ersten Fehler konnte ich den Import erfolgreich durchführen, aber beim ApplyChanges kam es dann zur Fehlermeldung:

Bei der Suche nach dem Fehler kam es dann beim Aufruf von „Expertenoptionen“ bei dem fehlerhaften Element zu

Ursache war letztendlich ein falscher Eintrag in

            "Translation": "[{\"Language\":\"de\",\"Name\":Zählerstand Batterieentladung, in Wh\"}]",

Hier wäre es schöner, wenn in der Fehlermeldung nicht der deutsche Text, sondern der Name der Adresse stände.

  • der dritte Fehler trat auf, nachdem alle Fehler korrigiert waren

hier war die Ursache, dass unter der Instanz eine Variable ohne Ident lag.

Dies ist übrigens die Datei mit den beiden Fehlern

modbus.json (8,8 KB)

Ich habe mal zum nächsten Update ein paar Kleinigkeiten optimiert:

  • Im JSON waren die Translations als String kodiert. Das ist jetzt ordentlich als Array.
  • Idents werden validiert
  • Die Skript Editoren für virtuelle Adressen sind standardmäßig leer

paresy

Hallo,

ich habe gerade mal auf die 7.0 Testing auf meinen Testsystem hochgerüstet.

Ich habe 3 x Wago SPS über Modbus an IPS.

Jetzt ist mir folgendes aufgefallen.
Aus den Datentypen Word wird UINT.

In meinen Skripten spreche ich z. B. meine Rollos auf der Wago über ein Aktionskript wie folgt an

<?php

if(($_IPS['SENDER'] == "WebFront") or ($_IPS['SENDER'] == "SetValue"))

{// Befehle für Rollo AUF /AB/Stop   
    switch($IPS_VALUE)
    {
        case 1:
     	ModBus_WriteRegisterWord(19177, 1); //Rollo_Auf
		break;
        case 2:
     	ModBus_WriteRegisterWord(19177, 2); //Rollo_STOP
		break;
		case 3:
     	ModBus_WriteRegisterWord(19177, 3); //Rollo_Ab
		break;
		
    }
} 

?>

Das wirft jetzt folgenden Error
grafik

Dann lasse ich das (Word) beim schalten auf die Modbus Instanz weg.
und zwar so.

<?php
if(($_IPS['SENDER'] == "WebFront") or ($_IPS['SENDER'] == "SetValue"))

{// Befehle für Rollo AUF /AB/Stop   
    switch($IPS_VALUE)
    {
        case 1:
     	ModBus_WriteRegister(41811, 1); //Rollo_Auf
		break;
        case 2:
     	ModBus_WriteRegister (41811, 2); //Rollo_STOP
		break;
		case 3:
     	ModBus_WriteRegister(41811, 3); //Rollo_Ab
		break;
		
    }
} 

?>

Dann läuft es.
Blöd nur, ich habe ca.  80 Skripte mit 

ModBus_WriteRegister Word
``

Muss ich die jetzt alle ändern???
Braucht man den Datentypen nicht mehr explizit ansprechen, bzw. mache ich das so überhaupt richtig?

Meine Instanz sieht so aus

Ich teste jetzt mal weiter, ob mir noch was auffällt.

Warum hast du überhaupt ein Aktions-Skript?
Die Variablen sollten doch auch so bedienbar sein.
Michael

Genau so. Das DWord kann aus dem Namen raus. Aber eigentlich sollte es Kompatibilität Funktionen geben. Ich prüfe das gleich.

paresy

Das habe ich so gemacht, weil ich mit dem Profil das Case Statement anspreche, wüsste nicht wie das anders geht.
Das mache ich ganz oft so, nicht nur bei Rollos.

Aber dein Case und dein gesendet Wert sind doch identisch :thinking:
Einfach mal mit der Standardaktion ausprobieren.
Michael