Ankündigung

Einklappen
Keine Ankündigung bisher.

Berechnung erst nach vollständiger Modbus-Abfrage durchführen

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

    #16
    Sorry, dass ich so spät auf das Thema nochmal zurückkommen muss. Ich habe jetzt noch mal etwas experimentiert, aber verstehe das Ergebnis weiterhin nicht:

    Ich frage ein Holdingregister als String ab und lese dann mit stringcast Teile des Strings aus. Wenn ich für dest das Argument 0 nehme, wird der korrekte Wert ausgelesen.

    Wenn ich jedoch für dest das Argument 0u16 oder 0s16 wähle, um die ersten beiden bytes auszulesen, rutscht das 2. byte an die erste Stelle und das 1 byte an die zweite Stelle. Die bytes werden also vertauscht.​

    Leider verstehe ich von dem Thema zu wenig und wäre für einen Tipp sehr dankbar.

    Grüße und ein schönes Wochenende!

    Beispiel (s. Screenshot):
    Rohdaten als s16: b7 dd
    Rohdaten als c2: b7 dd 00
    Rohdaten stringcast 0,0u16 b7
    Rohdaten stringcast 0,1u16 dd
    Rohdaten stringcast 0u16,0u16 dd b7(?)

    Code:
    mmPV=modbusmaster($172.20.10.16$, 502u16, 10u32, 240)
    status_mmPV=0
    
    Test_PV_HR_40088c2=$$c2
    
    if cycle(0,10) then {
    status_mmPV=readmodbus(mmPV, MB_HOLDING_REGISTER, 40087u16, Test_PV_HR_40088c2, BIG_ENDIAN, BIG_ENDIAN);
    } endif
    
    Test_PV_HR_40088_st_0=stringcast(Test_PV_HR_40088c2,0,0u16)
    Test_PV_HR_40088_st_1=stringcast(Test_PV_HR_40088c2,0,1u16)
    Test_PV_HR_40088_st_s16=stringcast(Test_PV_HR_40088c2,0s16,0u16)
    Test_PV_HR_40088_st_u16=stringcast(Test_PV_HR_40088c2,0u16,0u16)​


    2025-04-12 10_25_42-Debugger.png

    Kommentar


      #17
      Thema ist hier die Byte-Reihenfolge/Endianess (siehe dazu auch im Handbuch S. 189). Du müsstest die Bytes im s/u16 manuell umdrehen (Funktionen dazu kommen erst noch).

      Aber warum liest du als c2 aus? Mein Vorschlag bezog sich darauf, in einem Zugriff sowohl den Faktor als auch den Wert zu lesen und die auseinanderzulegen. Wenn du eh einzelne Zugriffe hast, lies' doch direkt in den s/u16, dann kannst du beim Auslesen die Endianess auch direkt mit angeben.

      Kommentar


        #18
        Vielen Dank für Deine schnelle Antwort. Ich komme momentan leider nur am Wochenende zum testen. Du hast völlig recht, c10 ist das Ziel, wie von Dir vorgeschlagen. Ich wollte mich aber zunächst mit c2 an die Werte herantasten, da ich leider nur nach dem try and error Prinzip vorgehen kann.

        Ich habe weiter getestet, verstehe aber das Ergebnis leider immer noch nicht. Ich habe Deinen Hinweis mit der Endianess umgesetzt und mich zumindet teilweise den korrekten Werten genähert. Trotzdem sind im Ergebnis die Werte bei der Abfrage mit c10 nicht identisch zur Abfrage mit s16. Beim ersten Register (40088) mag das noch verständlich sein, da dieses Register den Stromverbrauch wiedergibt und dieser naturgemäß laufend schwankt.

        Gänzlich unklar ist mir jedoch das Ergebnis für das Register 40092 (den Skalierungsfaktor): s16 liefert als Rohdaten z.B. ff ff oder ff fe, die c10 Abfrage liefert nach meiner Lesart hingegen als Rohdaten ff 00 (s. Screenshot 1 & 2). Einige Zeit später liefert die Abfrage plötzlich den korrekten Wert (s. 3. Screenshot, hier ist dann aber der Wert des Registers 40088 völlig daneben), dann wieder einen falschen (s. 4. Screenshot) Das verstehe ich leider nicht.

        Für weitere Hinweise und Ideen wäre ich sehr dankbar. Viele Grüße und frohe Ostern!

        PHP-Code:
        mmPV=modbusmaster($172.20.10.16$, 502u1610u32240)
        status_mmPV=0

        Test_PV_HR_40088s16
        =0s16
        Test_PV_HR_40092s16
        =0s16
        PV_SM_HR_40088c10_LB
        =$$c10

        if cycle(0,10then {
        status_mmPV=readmodbus(mmPVMB_HOLDING_REGISTER40087u16Test_PV_HR_40088s16BIG_ENDIANBIG_ENDIAN);
        status_mmPV=readmodbus(mmPVMB_HOLDING_REGISTER40091u16Test_PV_HR_40092s16BIG_ENDIANBIG_ENDIAN);
        status_mmPV=readmodbus(mmPVMB_HOLDING_REGISTER40087u16PV_SM_HR_40088c10_LBLITTLE_ENDIANBIG_ENDIAN);
        } endif

        PV_SM_HR_40088c10_LB_st_1u2_LB=stringcast(PV_SM_HR_40088c10_LB,0s16,0u16)
        PV_SM_HR_40088c10_LB_st_8u9_LB=stringcast(PV_SM_HR_40088c10_LB,0s16,8u16)​ 
        Screenshot 1.png

        Screenshot 2.png

        Screenshot 3.png


        Screenshot 4.png

        Kommentar

        Lädt...
        X