Check!
Funktioniert
Ankündigung
Einklappen
Keine Ankündigung bisher.
LBS: 19001030: Modbus TCP Master Read
Einklappen
X
-
Ok, neue Version 0.3 ist online. Das Umpacken hatte noch gefehlt... hatte ich glatt in PHPType übersehen.
Danke Wago
- Likes 1
Einen Kommentar schreiben:
-
Ist mir jetzt zu anstrengend alles durch zu lesen. Float hat bei mir so funktioniert:
Code:$modbus = new ModbusMaster("192.168.2.45", "TCP"); try { // FC 3 2x16-bit float $recData = $modbus->readMultipleRegisters(0, $v1, $v2); } catch (Exception $e) { exit; } $raw = (($recData[0] & 0xFF)<<24) | (($recData[1] & 0xFF)<<16) | (($recData[2] & 0xFF)<<8) | (($recData[3] & 0xFF)); $ulong = pack('L*', $raw); $float = unpack('f*', $ulong); setLogicLinkAusgang($id,1,$float[1]);
- Likes 1
Einen Kommentar schreiben:
-
ist die AntwortPHP-Code:Array
(
[0] => 67
[1] => 103
[2] => 11
[3] => 228
)
der ungefähre wert der rauskommen sollte wäre "231.04644775391"
Ist die aktuelle netzspannung
Einen Kommentar schreiben:
-
Versuch mal in dem modbus.php die letzte echo Zeile durch das hier zu ersetzten:
PHP-Code:print_r($recData);
Einen Kommentar schreiben:
-
wenn ich an den inhalt der 4 Bytes kommen würde....
das Komische ist wenn ich die modbus.php aufrufe (also das beispiel was du geschickt hast) und die var $recdata anzeigen lasse zeigt er auch nichts an erst nach dem konvertieren
Einen Kommentar schreiben:
-
Ja da ist noch ein Schritt drin den ich übersehen habe, Ich hab nur deinen code kopiert und da ich es ohne Daten nicht testen kann gehofft das es klappt.
Irgendwie ist das Log auch komisch, es hört genau da auf wo es interessant für mich währe... Also er fäng tnoch an mit Array start aber dann kommt nichts mehr...
Ist das wirklich so im Log? Dann währe nämlich so wie es aussieht der Logger abgeschmiert und dann kommt natürlich auch nichts sinnvolles raus.
Wenn du mir mal den Inhalt der 4 Bytes schicken könntest dann kann ich damit mal rumspielen (und natürlich auch was das korrekte Ergebnis sein soll).
Einen Kommentar schreiben:
-
Alos Bug´s gefixt
Log:
Ergebnis is blöderweise das selbe..Code:[TABLE="border: 0, cellpadding: 0, cellspacing: 0"] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]110222[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Data:1130713930[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]110780[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: i:1[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]111102[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: input:13[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]111434[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: address:3[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]114037[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Status:<pre>readMultipleRegisters: START[LF]Connected[LF]Packet: ee4c00000006010300030002[LF]Send[LF]Wait data ... [LF]Data received[LF]Packet: ee4c000000070103044364c683[LF]Modbus response error code: NOERROR[LF]Disconnected[LF]readMultipleRegisters: DONE[LF]</pre>[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]114505[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Type:2[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]114856[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Data:228.77543640137[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]120743[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: i:2[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]121094[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: input:17[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]121433[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: address:5[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]130023[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Status:<pre>readMultipleRegisters: START[LF]Connected[LF]Packet: 077500000006010300050002[LF]Send[LF]Wait data ... [LF]Data received[LF]Packet: 0775000000070103044365a36e[LF]Modbus response error code: NOERROR[LF]Disconnected[LF]readMultipleRegisters: DONE[LF]</pre>[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]130374[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Type:2[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]130711[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Data:229.6383972168[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]132672[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: i:3[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]132997[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: input:21[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]133311[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: address:55[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]135833[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Status:<pre>readMultipleRegisters: START[LF]Connected[LF]Packet: 948c00000006010300370002[LF]Send[LF]Wait data ... [LF]Data received[LF]Packet: 948c000000070103044247e772[LF]Modbus response error code: NOERROR[LF]Disconnected[LF]readMultipleRegisters: DONE[LF]</pre>[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]136172[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Type:2[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]136686[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Data:49.976020812988[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]137260[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: i:4[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]137597[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: input:25[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]137909[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: address:7[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]140314[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Status:<pre>readMultipleRegisters: START[LF]Connected[LF]Packet: 13ec00000006010300070002[LF]Send[LF]Wait data ... [LF]Data received[LF]Packet: 13ec0000000701030443c65d0f[LF]Modbus response error code: NOERROR[LF]Disconnected[LF]readMultipleRegisters: DONE[LF]</pre>[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]140789[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Type:2[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]141127[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Data:396.72702026367[/TD] [/TR] [TR] [TD]2017-03-09 07:11:51[/TD] [TD]142013[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Delay:1000[/TD] [/TR] [TR] [TD]2017-03-09 07:11:52[/TD] [TD]143095[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: end of delay[/TD] [/TR] [TR] [TD]2017-03-09 07:11:52[/TD] [TD]143511[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: i:0[/TD] [/TR] [TR] [TD]2017-03-09 07:11:52[/TD] [TD]143826[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: input:9[/TD] [/TR] [TR] [TD]2017-03-09 07:11:52[/TD] [TD]144140[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: address:1[/TD] [/TR] [TR] [TD]2017-03-09 07:11:52[/TD] [TD]146856[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Status:<pre>readMultipleRegisters: START[LF]Connected[LF]Packet: 611d00000006010300010002[LF]Send[LF]Wait data ... [LF]Data received[LF]Packet: 611d000000070103044365511d[LF]Modbus response error code: NOERROR[LF]Disconnected[LF]readMultipleRegisters: DONE[LF]</pre>[/TD] [/TR] [TR] [TD]2017-03-09 07:11:52[/TD] [TD]147183[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Type:6[/TD] [/TR] [TR] [TD]2017-03-09 07:11:52[/TD] [TD]147813[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: Data before convertion:[/TD] [/TR] [TR] [TD]2017-03-09 07:11:52[/TD] [TD]147857[/TD] [TD]8066[/TD] [TD]debug[/TD] [TD]EXE19001030 [v0.2]: ================ ARRAY/OBJECT START ================[/TD] [/TR] [/TABLE]
Ich hab mich jetzt Hingesetzt und hab mir die PHPType genau Angesehen
Wenn du das Wirklich in den LBS integrieren willst müsste eigt. der gesamte teile rein mit den "private static function" so wie ich verstanden hab sind die nicht von extern aufrufbar (aber habs auch nicht nachgelesen).PHP-Code:<?php
class PhpType {
public static function bytes2float($values, $endianness = 0) {
$data = array();
$real = 0;
// Überprüft die Daten auf Korrektheit
$data = self::checkData($values);
// Tauscht die Bytes je nach endianness
$real = self::combineBytes($data, $endianness);
// Konvertiert nach Float
return (float) self::real2float($real);
}
private static function checkData($data) {
// Überprüft die daten
if (!is_array($data) ||
count($data)<2 ||
count($data)>4 ||
count($data)==3) {
throw new Exception('The input data should be an array of 2 or 4 bytes.');
}
// Fill the rest of array by zeroes
if (count($data) == 2) {
$data[2] = 0;
$data[3] = 0;
}
// Check the values to be number
if (!is_numeric($data[0]) ||
!is_numeric($data[1]) ||
!is_numeric($data[2]) ||
!is_numeric($data[3])) {
throw new Exception('Data are not numeric or the array keys are not indexed by 0,1,2 and 3');
}
return $data;
}
private static function combineBytes($data, $endianness) {
$value = 0;
// Tauscht die Bytes
if ($endianness == 0)
$value = (($data[3] & 0xFF)) |
(($data[2] & 0xFF)<<8) |
(($data[1] & 0xFF))<<16|
(($data[0] & 0xFF)<<24);
else
$value = (($data[3] & 0xFF)<<24) |
(($data[2] & 0xFF)<<16) |
(($data[1] & 0xFF)<<8) |
(($data[0] & 0xFF));
return $value;
}
private static function real2float($value) {
// Konvertiert zu Float
// get unsigned long
$ulong = pack("L", $value);
// set float
$float = unpack("f", $ulong);
return $float[1];
}
}
?>]
Bzw man könnte das reduzieren auf den teil den man wirklich brauch den else teil könnte man weglassen weil man bei Float Byte Swap nur den ersten teil brauch okay das wars eigt. was man weglassen kann das müsste man halt so in den LBS integrieren oder was ich wiederum einfacher finde die endianess in den baustein und ne kleinstmodifikation in der PhpType.php
ergebniss wäre folgendes mod.jpgPHP-Code:private static function combineBytes($data, $endianness) {
$value = 0;
// Combine bytes
if ($endianness == 0)
$value = (($data[3] & 0xFF)<<16) |
(($data[2] & 0xFF)<<24) |
(($data[1] & 0xFF)) |
(($data[0] & 0xFF)<<8);
if ($endianness == 2)
$value = (($data[3] & 0xFF)) |
(($data[2] & 0xFF)<<8) |
(($data[1] & 0xFF))<<16|
(($data[0] & 0xFF)<<24);
if ($endianness == 1)
$value = (($data[3] & 0xFF)<<24) |
(($data[2] & 0xFF)<<16) |
(($data[1] & 0xFF)<<8) |
(($data[0] & 0xFF));
return $value;
}
Einen Kommentar schreiben:
-
Hab noch einen kleinen Fehler gefunden...
Bitte mal Zeile 342 durch dies hier ersetztenDann kann über V4 die Endianess bestimmt werden. Ich weiß leider nicht welche du brauchst...PHP-Code:if (getLogicElementVar($id, 4) == 0){
Der Code ansich ist nur copy & past von dir und sollte daher eigendlich gehen.
Vielleicht mal noch vor dem If in 342 folgendes und dann den Logeintrag posten. Dann kann ich sehen was konkret zurück kommt.
Hm, gerdae noch ein Typop gefunden, bin mir aber nicht sicher ob der auch im LBS drin ist.PHP-Code:logging($id,"Data before convertion:" , $recData);
Zeile 351 sollte so aus sehenDa war bei mir im Variablennamen noch ein zusatz "d".PHP-Code:(($recData[0] & 0xFF));
Einen Kommentar schreiben:
-
oh ja ... so geht das wenn man nur überfliegt klar dann stimmt auch zeile 340
und ja in 6 hab ich ihn geändert
e11.jpg
E11 ist schon 6 und die andern noch 2 deshalb steht bei {382} auch so ne Blöde Zahl.
ich hab auch Sicherheitshalber schon die kompletten daten von PhpModbus neu auf Edomi kopiert fals es daran liegt hat aber an den Daten nichts geändert.
Das Projekt hab ich natürlich auch neu Aktiviert ^^
Einen Kommentar schreiben:
-
Das hab ich genau gemacht
Hast du auch den Type auf 6 geändert?
Fängt alles ab Zeile 341 an
Einen Kommentar schreiben:
-
Also Funktioniert nicht ich hab mir mal kurz angeschaut was du für ne änderung gemacht hast und auch nen "Fehler" gefunden der hat aber keine abhilfe geschafft.
Zeile 340
müsstePHP-Code:$ret=PhpType::bytes2string($recData);
heißenPHP-Code:$ret=PhpType::bytes2float($recData);
ich vermute das Problem liegt aber darin das du die bytes im LBS swapst und sie aber auch nochmal im PHPType geswappt werden theoretisch müsste man also den kompletten teil von der phptype bytes2float in den lbs machen nur dafür sind meine php kenntnisse nicht ausreichend das ich das ordentlich da umgesetzt bekomme
Denkst du nicht es wäre einfacher die Endianess im LBS einzufügen und in der PhpType.php um eine funktion zu erweitern
PHP-Code:if ($endianness == 0)
$value = (($data[3] & 0xFF)<<16) |
(($data[2] & 0xFF)<<24) |
(($data[1] & 0xFF)) |
(($data[0] & 0xFF)<<8);
if ($endianess == 2)
$value = (($data[3] & 0xFF)<<24) |
(($data[2] & 0xFF)<<16) |
(($data[1] & 0xFF))<<8|
(($data[0] & 0xFF));
else
$value = (($data[3] & 0xFF)<<24) |
(($data[2] & 0xFF)<<16) |
(($data[1] & 0xFF)<<8) |
(($data[0] & 0xFF));
return $value;
Einen Kommentar schreiben:
-
Fehler gefunden und hoffentlich behoben
Das mit A9 ist genau so geplant, steht auch in der Hilfe
Ich missbrauche ihn auch für einen Watchdog weil meine PV Anlage abundzu ihre 30s hat in der Sie nicht will und ich so den LBS neu starten kann.
In v0.2 gibts jetzt den Type 6 als Swap Float, probier mal ob das bei dir so geht.
Ich hab auch in V4 die Endianess gepackt, wird aber nur für die Swap Float genutzt.
Einen Kommentar schreiben:
-
Ja ist halt die Frage ob das oft verwendet wird. ansonnsten wäre vllt ne einfachere möglichkeit die Modbus Libs zu forken sind ja eigt. nur funktionen die dazu kommen.
Bin mir auch nicht sicher obs bei Modbus überhaupt noch weitergeht die letze Aktualisierung ist schon 2 Jahre her wenn ich mich nicht verschaut hab
Wie hast du das eigt. gelöst wenn du mehrer der LBS´s hast die auf ein und die Selbe IP adresse zugreifen? ich bin hingegangen und hab den ersten lbs auf Loop gestellt und den "A9" zum nächsten LBS weitergeleitet den aber nicht auf Loop gestellt.
Oder war der "A9" für was anderes geplant
?
Mir ist grad nochn kleiner Bug aufgefallen
wenn ich "E7" loop auf "0" setze kommt nach jedem start von edomi im log ein fehler
Code:[TABLE="border: 0, cellpadding: 0, cellspacing: 0"] [TR] [TD]2017-03-07 13:35:08[/TD] [TD]185054[/TD] [TD]?[/TD] [TD]20251[/TD] [TD]Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001030.php | Fehlercode: 1 | Zeile: 152 | Call to undefined function str()[/TD] [TD]FATALERROR[/TD] [/TR] [/TABLE]
Zuletzt geändert von Peterich; 07.03.2017, 13:36.
Einen Kommentar schreiben:
-
Hm, sieht so aus also ob bei dir jeweils 2 Bytes "swapped" sind, das sieht eher so aus also ob dieses Float Swat tatsächlich ein eigenes Format ist wenn das im IO Broker schon so drin ist.
Ich muss jetzt mal in mich gehen wie man das am besten löst... an den Modbus Libs will ich eigentlich wenn möglich nichts ändern... (Mal von meiner kleinen Logging modifikation abgesehen). Entweder das ich die Typumwandlung direkt im LBS mache oder das man die Bytes "roh" ausgibt und sich einenen kleinen LBS baut der das Umwandelt.
Einen Kommentar schreiben:


Einen Kommentar schreiben: