Suche Hilfe bei Modulerstellung - Modbus

Hallo, nach dem ich mich jetzt über den langsamen Abfrageintervall von IPS bei Modbus in Zusammenhang mit blockierenden Senden geärgert habe. Habe ich mich mit der php Modbus Klasse beschäftigt. Dabei kam folgender Code raus.


define("FIRST_MODBUS_BIT", 12288 /*12288*/);
define("MAX_MODBUS_BIT", 90);  

$modbus = new ModbusMasterUdp(IPADRESS); 
$bits_alt = $modbus->readCoils(0, FIRST_MODBUS_BIT, MAX_MODBUS_BIT); 

while(true) {
    $bits = $modbus->readCoils(0, FIRST_MODBUS_BIT, MAX_MODBUS_BIT); 
    foreach($bits as $key => $bit){
         if($bits_alt[$key]!==$bit){
            tuEtwas( (FIRST_MODBUS_BIT+$key)." ist jetzt ".var_export($dates,true) );
         }
    }
    $bits_alt = $bits;
     usleep(20000); // schlafen 20ms 
} 

Da ich mit IP Symcon aber keinen PHP Thread durchlaufen lassen kann (was hierfür aber u.a. zur effizienten Nutzung des Arbeitsspeichers notwendig ist) benötige ich den o.g. Code als Modul, welches entsprechende Variablen mit dem neuen Wert versieht.
Am Besten natürlich direkt mit „automatischen Aktionen fürs Webfront“ sprich es wird direkt der entsprechende Modbus Wert bei Aktion über Modbus geändert. Eine OwnModbus_WriteCoil Methode wäre zwar wünschenswert, kann aber relativ einfach über eine „autoinclude.php“ von mir per php geschrieben werden.

Ich habe am Wochenende Methoden für das automatische Lesen (s.o.) manuelle lesen und schreiben für real, byte, int, bit inkl. php Typ-Konvertierung geschrieben, welche ich bei Interesse und weiterer Fehlersuche durch mich auch gerne noch veröffentliche.

Jetzt zur eigentliche Frage: sieht sich jemand in der Lage das o.g. Script (inkl. den noch nicht veröffentlichen Ergänzungen) in ein Modul für IP-Symcon zu übertragen oder kann mir erste Hilfestellungen geben?

Wenn ich das richtige verstehe, benötige ich eine spezielle Delphi Entwicklungsumgebung, welche schon nirgends namentlich genannt ist. Dann natürlich Programmierkenntnisse in einer für mich vollkommen fremden Sprache.

PS: der PHP-Tag scheint defekt zu sein. Zeilenumbrüche werden ignoriert.

für den Einstieg ist evtl. diese Seite nützlich.

Tommi

Danke für die Rückmeldung. Die Seite werde ich mir aufjedenfall mal ansehen und durcharbeiten. Ich finde unter den genannten IDEs eine ganze Handvoll Werkzeuge. Größtenteils aber keine Downloadlinks. Kann mir jemand eine spezielle Version empfehlen, ggf. sogar mit Downloadlinks bzw. konkreten Hinweisen zum Finden von Downloads?

Sehe ich das richtig, dass nur TurboDelphi Win32 von seiner ursprünglichen Lizenzidee frei ist und daher, wenn man denn einen Downloadlink findet, die einzig richtige? Was heißt „Einbindung von Drittanbieterkomponenten nicht möglich“ -> kann ich dann keine externen DLLs, wie die Modbus DLL

Delphi ModBusTCP library | SourceForge.net einbinden?

TurboDelphi wird leider nicht mehr angeboten und die noch vorhandenen Downloadlinks dürften allesamt illegal sein. Du kannst nur versuchen, eine gebrauchte TurboDelphi oder Delphi2006/2007 Voll-Version zu bekommen. Mal abgesehen davon, das die aktuelle Delphi Versionen sowohl beim Neukauf als auch beim Update „etwas“ überteuert sind, war darin auch die Möglichkeit eines Keys für Delphi2006/2007 enthalten. Besser ist es IMHO jedoch gleich ganz auf ein echtes Modul zu verzichten und dafür lieber einen selbstgeschriebenen externen Service über Sockets oder Json an IPS zu tackern. Da das neue IPS ohnehin auf C++ basiert, macht es meiner meiner Meinung nach auch keinen Sinn mehr Zeit in die Delphi Technologie zu Investieren. Ich habe auch noch nicht gehört, das es für die C++ Version ein SDK geben soll.

Die Beschränkung der 3th-Party Module bei TurboDelphi bezieht sich auf visuelle IDE-Komponenten, die sich nicht hinzufügen lassen. Fertige DCUs kann man natürlich verwenden und muss dann selber für die richtigen includes sorgen.

BTW: Ich würde meine Delphi2007 Lizenz jetzt verkaufen wollen, bin mir aber nicht sicher, ob man die Lizenz auch wirklich übertragen kann.

Tommi

Ich sehe viel zu viele Probleme. Daher ja meine Anfrage, dass ich den Code in einer mir bekannten Programmiersprache (hier speziell PHP) entwickel und dann jemandem zum Modulentwickeln weitergebe - der dann quasi „nur noch“ den Code in Delphi übersetzt und fertig ist die Sache.

Gibt es von jemandem genauere Informationen wieso/ab wann das auf c++ umgestellt wird? Welche Restriktionen damit kommen? Ob es weiterhin die Möglichkeit gibt Module zu entwickeln? Vielleicht endlich ohne sie permanent neu zu kompilieren?

Ich werf mal kurz meine Gedanken dazu:
Es dürfte eher schwer werden das ganze von PHP zu einem Modul zu konvertieren.
Die Module funktionieren intern anders und es muss so Modular und Unabhängig umgesetzt werden dass es auf jedesm System läuft; alle IPS-Objekte selbst verwealtet und kennt. Also direkt IDs von Vars in den Quellcode… das geht so nicht.
Ich würde mich eher an Paresy wenden ob er die ModBus-Instanz nicht überarbeiten kann um Blockweise Daten zu lesen.
Wenn du möchtest kannst du mit ja mal ein Beispiel in PHP zusenden und ich schaue mal ob es machbar ist…

Wegen der Zukunft des SDKs… naja ich hoffe (und bettel) mal weiter :smiley:

Michael

Ein Viertel des Leseanteils steht schon oben. Die komplette PHP Datei schicke ich dir per PN/E-Mail.

Es stimmt natürlich, dass die Zuordnung der Schreibadresse/Leseadresse zu IPS Objekten das Modul auch übernehmen muss.

Habe da schon eine ganz gemeine Idee um nicht auch das Schreiben umsetzen zu müssen :wink:
Michael

Das schreiben könnte theoretisch doch auch IPS direkt machen. Wenn ich es schaffen würde, das „nur lesen“ der Variablen zu entfernen, könnte ich auch alles mit meinem externen php Script machen. Dann würde das externe script die Anzeige/Wert ändern und das schreiben IPS weiterhin auf den alten Adressen übernehmen.

Das Lesen in IPS komplett deaktivieren (refresh auf 0s) und dann mittels z.B. json API die Werte zu ändern.

Aber Statusvariablen können halt nicht beschrieben werden.
Michael

Hallo.

In der Zwischenzeit habe ich ein neues Projekt mit IPS und Wago. Nun auch mit IPS V5.2. Das Problem der Response Zeiten bei einzelner Abfrage der Bits bleibt. Daher habe ich bereits angefangen ein PHP Modul zu entwickeln.

Bisher geht: Bereich an Modbus bits auswählen, welche dann über ReadMultipleCoils am Stück ausgelesen werden.
Danach aufgeteilt und bei Änderungen an die einzelnen Instanzen verteilt.

Gerade in Arbeit ist das ganze für andere Datentypen. Das ist schon etwas aufwändiger aufgrund der Datenkonvertierung, Adressierung (Überlagerung von Word, DWord, etc.), Endianness, etc.

Da ein veröffentliches Modul auch weitere Randbedingungen erfordert (Tests, Fehlerbehandlung, Fehlerkorrektur, Übersetzung, Code Style, etc.) frage ich lieber vor einer eventuellen Veröffentlichung ob
a) Überhaupt Interesse an einem solchen Modul besteht
b) Es eventuell schon erfahrene Modulentwickler gibt, welche sich aktiv an der Entwicklung (insbesondere Fehlerbehandlung bei geschlossenem Socket, Style Prüfung, Variablen Profile, Testen, etc.) beteiligen möchten.
c) Ich bereits einen git Link veröffentlichen soll, bevor das Modul wirklich „vorzeigbar“ ist, ohne dafür 1. Zerrissen zu werden oder 2. jemand dieses Modul trotz aller Warnungen versucht produktiv einzsetzen.

Gruß
Tobias

Hallo Tobias,

ich habe soeben mein erstes Modul „JoTKPP - Kostal Plenticore plus“ im Store veröffentlicht.
Dabei greife ich auf die Daten des Wechselrichters mit einer eigenen ModBus-Library zu.

Aktuell spiele ich mit dem Gedanken, diese zu erweitern und als eigenes Modul „ModBus Advanced“ zur Verfügung zu stellen. Die Lib bietet im Moment die folgenden Funktionen:

  • Lesen von ModBus via Splitter-Instanz (Schreiben war für das andere Modul nicht nötig)
  • Endianess (BigEndian, BigEndian WordSwap, LittleEndian, LittleEndian WordSwap)
  • Verschiedene Datentypen (Boolean/Bit, Int, UInt, SInt, Float, String)
  • Anzahl der zu lesenden Register

Da ich in Zukunft auch meine Heizung mit ModBus auslesen will, habe ich mir gedacht, das Modul so zu gestalten, dass man damit beliebige Werte unter einer Instanz auslesen und später auch schreiben könnte. Aktuell habe ich aber noch Probleme mit dem Konfigurator, da die Verarbeitung noch sehr komplex wäre. Ab IPS 5.3 gibt es da aber voraussichtlich deutliche Verbesserungen (Auslesen aller Einträge eines List-Elementes) und ich werde mich wohl nochmals dran setzen.

Vielleicht könnte man damit auch deinen Bedarf abdecken? Dann hätte ich bereits einen Beta-Tester :smiley:
Was wären denn deine genauen Anforderungen? Bei Interesse könnte ich auch den aktuellen Stand als als Beta zur Verfügung stellen.

Hi das Klingt spannend. Ich werde mein Modul hoffentlich bis morgen soweit fertig haben, dass ich es bei GIT committe. Den Link allerdings erstmal „halb öffentlich“ nur ein, zwei Testern schicken werde.

Vielleicht findet sich ja die Möglichkeit aus beiden Modulen das Beste herauszuholen oder eine gemeinsame Bibliothek zu schreiben.

Hallo tobiasr,

die aktuellste Version meiner Library findest du auf GitHub in der Source vom Modul JoTKPP (musste am Wochenende noch einen Bug betreffend SInt16-Werten fixen).

Mit ReadMultipleCoils habe ich mich noch nicht auseinander gesetzt, weil das beim Wechselrichter nichts gebracht hätte. Bei der Heizung würde es aber durchaus Sinn machen. Ich habe zwar aktuell keine WAGO im Einsatz und könnte daher ein spezifisches Modul nicht testen. Mir schwebt eher ein universelles ModBus-Modul vor, dass zusätzliche Funktionalitäten zur bestehenden ModBus-Instanz bietet, da ich in späteren Projekten nicht für jedes ModBus-Device ein eigenes Modul schreiben möchte.

Vielleicht können wir aber mit gegenseitigen Ideen / Inputs etwas gutes auf die Beine stellen (ob es am Ende ein universales Ding wäre oder eben zwei Module wären ist ja noch nicht wichtig). Ich fände es vor allem interessant, ModBus-spezifische Fragen/Lösungen mit jemandem diskutieren zu können, der sich auch damit auseinander setzt (zwei Köpfe machen Situationen manchmal einfacher :rolleyes:)

Kann/darf man deinen Code schon irgendwo anschauen (allenfalls Link per PN)?