Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS: 19001030: Modbus TCP Master Read

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Peterich
    antwortet
    Check!
    Funktioniert

    Einen Kommentar schreiben:


  • gulp2k
    antwortet
    Ok, neue Version 0.3 ist online. Das Umpacken hatte noch gefehlt... hatte ich glatt in PHPType übersehen.
    Danke Wago

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    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]);

    Einen Kommentar schreiben:


  • Peterich
    antwortet
    PHP-Code:
    Array
    (
        [
    0] => 67
        
    [1] => 103
        
    [2] => 11
        
    [3] => 228

    ist die Antwort
    der ungefähre wert der rauskommen sollte wäre "231.04644775391"
    Ist die aktuelle netzspannung

    Einen Kommentar schreiben:


  • gulp2k
    antwortet
    Versuch mal in dem modbus.php die letzte echo Zeile durch das hier zu ersetzten:
    PHP-Code:
     print_r($recData); 

    Einen Kommentar schreiben:


  • Peterich
    antwortet
    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:


  • gulp2k
    antwortet
    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:


  • Peterich
    antwortet
    Alos Bug´s gefixt

    Log:
    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]
    Ergebnis is blöderweise das selbe..

    Ich hab mich jetzt Hingesetzt und hab mir die PHPType genau Angesehen

    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)<||
    count($data)>||
    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];
    }
    }
    ?>]
    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).
    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

    PHP-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;
        } 
    ergebniss wäre folgendes mod.jpg
    Zuletzt geändert von Peterich; 09.03.2017, 07:50. Grund: ] vergessen

    Einen Kommentar schreiben:


  • gulp2k
    antwortet
    Hab noch einen kleinen Fehler gefunden...
    Bitte mal Zeile 342 durch dies hier ersetzten
    PHP-Code:
    if (getLogicElementVar($id4) == 0){ 
    Dann kann über V4 die Endianess bestimmt werden. Ich weiß leider nicht welche du brauchst...

    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.
    PHP-Code:
      logging($id,"Data before convertion:" $recData); 
    Hm, gerdae noch ein Typop gefunden, bin mir aber nicht sicher ob der auch im LBS drin ist.
    Zeile 351 sollte so aus sehen
    PHP-Code:
    (($recData[0] & 0xFF)); 
    Da war bei mir im Variablennamen noch ein zusatz "d".

    Einen Kommentar schreiben:


  • Peterich
    antwortet
    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:


  • gulp2k
    antwortet
    Das hab ich genau gemacht
    Hast du auch den Type auf 6 geändert?
    Fängt alles ab Zeile 341 an

    Einen Kommentar schreiben:


  • Peterich
    antwortet
    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
    PHP-Code:
                $ret=PhpType::bytes2string($recData); 
    müsste
    PHP-Code:
                $ret=PhpType::bytes2float($recData); 
    heißen

    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:


  • gulp2k
    antwortet
    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:


  • Peterich
    antwortet
    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:


  • gulp2k
    antwortet
    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:

Lädt...
X