[Gelöst:] Hilfe zu Modbus RS485 Programierung

Begonnen von DJ-Mix, 11 Juli 2016, 12:51:37

Vorheriges Thema - Nächstes Thema

pc1246

Hallo DJ
Ja, das ist eine Methode. Du kannst Dir aber auch die Schieberei sparen, und gleich mit dem entsprechenden Wert ver-unden! (Das ist dann die sogenannte Maske!)
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

DJ-Mix

wäre das in etwa dann so . . .
attr Saltlange obj-h256-expr $val & 0x16

oder habe ich das falsch verstanden?
FHEM - RaspberryPi/Fritz!Box 7390 - 1x HM-CFG-LAN - 3x HM-CC-RT-DN - 3x HM-LC-Bl1PBU-FM - 1x HM-LC-Sw1PBU-FM

pc1246

Ja, das hast Du falsch verstanden!
Du hast jetzt drei Bits freigeschaltet! (Bit 1, 2 und 3) Das 16. Bit liegt etwas weiter links! attr Saltlange obj-h263-expr & 0x8000
Zur Erklaerung, 263dez ist 107hex und 0x8000 entspricht 2#10000000_00000000 !

Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

DJ-Mix

2 Sachen wüsste ich noch gerne

Zitatattr Saltlange obj-h263-expr & 0x8000
benötige ich $val nicht?


bei Mask 0x000F mit 4 Bits (0-3) muss ich das so angeben?
Wenn ich z.B. das 2 Bit anzeigen möchte.
attr Saltlange obj-h263-expr ($val >> 2) & 0x000F
FHEM - RaspberryPi/Fritz!Box 7390 - 1x HM-CFG-LAN - 3x HM-CC-RT-DN - 3x HM-LC-Bl1PBU-FM - 1x HM-LC-Sw1PBU-FM

pc1246

Moin
Doch das $val brauchst du wohl.  Deine 2. Frage verstehe ich nicht. Du schiebst jetzt um 2 Bit nach rechts, und maskierst dann auf die letzten 4 Bit. Da haettest du dann Bit 3-6.
Mache es am Besten wie Tunte Ju beschrieben hat, schiebe Dir das entsprechende Bit an die letzte stelle und nimm 0x01 als Maske. Das ist dann das gewollte Bit!
Hast du den Taschenrechner von Windofs mal ausprobiert? Da kann man auch die Bits anklicken, und es wird einem der Hex- oder Dez-Code angezeigt!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

DJ-Mix

ich wollte Register 0x0107 Mask 0x000F und dann eins von den Bits 0-3

als Beispiel hatte ich 2 ausgewählt.

wäre dann also
attr Saltlange obj-h263-expr ($val >> 2) & 0x01

siehe Anhang
FHEM - RaspberryPi/Fritz!Box 7390 - 1x HM-CFG-LAN - 3x HM-CC-RT-DN - 3x HM-LC-Bl1PBU-FM - 1x HM-LC-Sw1PBU-FM

tante ju

Zitat von: DJ-Mix am 15 Juli 2016, 06:32:07
letzte Zeile
attr Saltlange obj-h258 stateFormat {sprintf("%.1f", ReadingsVal($name,"pH",0))}

Das sieht besser aus.

Zitat von: DJ-Mix am 15 Juli 2016, 06:32:07
zu den Bits
heißt das ich jeweils um x nach recht schieben muss um an das Bit zu kommen welches ich benötige.
Also wenn ich Bit 16 sehen möchte muss ich attr Saltlange obj-h256-expr ($val >> 16) & 0x01 eingeben!?

Na ja. Theoretisch hast Du Recht. Aber ein normales Register bei Modbus hat nur 16 Bit. Damit ist das höchste Bit Nummer 15. Es gibt kein Bit 16.
Ausnahme: Wenn das niedrigste Bit nicht als 0 bezeichnet wird, sondern als 1, dann wäre das höchste 16. Aber dann mußt Du um 15 schieben (Bitnummer - 1), da die Nummerierung jeweils eins zu hoch ist.

Wenn wirklich Bit 16, also das richtige, verwendet wird, dann ist das ein Double-Register, dort werden zwei aufeinanderfolgende Register zu einer Zahl kombiniert. Dann wäre Bit 16 das Bit 0 des anderen Registers. Hier müsstest Du aber aufpassen. Manchmal kommen erst die niedrigen Bits 0-15 im ersten Register und 16-31 im zweiten, aber es kann auch umgekehrt sein: Erst 16-31 und dann 0-15.

Gehe aber mal davon aus, daß die mit 16 das oberste Bit meinen und mit 1 angefangen haben zu zählen.

DJ-Mix

vielen Dank - glaube ich habe es so weit verstanden.

nun habe ich das Problem, dass ich keine Verbindung hinbekomme . . . .  :(

Internals:
   DEF        1 10
   DEST
   INTERVAL   10
   IODev      ModBusLine
   MODBUSID   1
   NAME       Saltlange
   NR         25
   PROTOCOL   RTU
   STATE      opened
   TYPE       ModbusAttr
   getList    MBF_MEASURE_PH
   setList
   Helper:
     lsend      1468698532.02859
   Lastread:
Attributes:
   IODev      ModBusLine
   dev-h-defPoll 1
   dev-h-defShowGet 1
   dev-h-read 3
   event-on-change-reading *
   obj-h258-reading MBF_MEASURE_PH
   userattr   IODev dev-h-defPoll dev-h-defShowGet dev-h-read event-on-change-reading obj-h258-reading


my %SaltlangeparseInfo = (
    "h258"  =>  {   reading => "pH",
                    name    => "MBF_MEASURE_PH",
                    expr    => '$val / 100',
      len     =>  1,
                },
   
);


my %SaltlangedeviceInfo = (
    "timing"    => {
            timeout     =>  2,     
            commDelay   =>  0.7,   
            sendDelay   =>  0.7,     
            },
    "h"     =>  {               
            combine     =>  5,     
            defShowGet  =>  1,     
            defPoll     =>  1,
            defUnpack   =>  "s>",   
            },
);


Internals:
   BUSY       1
   DEF        /dev/ttyUSB0@19200
   DeviceName /dev/ttyUSB0@19200
   FD         4
   NAME       ModBusLine
   NR         16
   PARTIAL
   RAWBUFFER
   REQUESTHEX 0103010200012436
   STATE      opened
   TYPE       Modbus
   QUEUE:
     HASH(0x1052c18)
   Readings:
     2016-07-16 21:44:38   state           opened
   Request:
     ADR        258
     FCODE      3
     FRAME      $6
     LEN        1
     READING    MBF_MEASURE_PH
     TID        0
     TYPE       h
     Device:
       DEF        1 10
       DEST
       INTERVAL   10
       IODev      ModBusLine
       MODBUSID   1
       NAME       Saltlange
       NR         25
       PROTOCOL   RTU
       STATE      opened
       TYPE       ModbusAttr
       getList    MBF_MEASURE_PH
       setList
       Helper:
         lsend      1468698592.04595
       Lastread:
   Defptr:
     1:
       DEF        1 10
       DEST
       INTERVAL   10
       IODev      ModBusLine
       MODBUSID   1
       NAME       Saltlange
       NR         25
       PROTOCOL   RTU
       STATE      opened
       TYPE       ModbusAttr
       getList    MBF_MEASURE_PH
       setList
       Helper:
         lsend      1468698592.04595
       Lastread:
     5:
       DEF        1 10
       DEST
       INTERVAL   10
       IODev      ModBusLine
       MODBUSID   1
       NAME       Saltlange
       NR         25
       PROTOCOL   RTU
       STATE      opened
       TYPE       ModbusAttr
       getList    MBF_MEASURE_PH
       setList
       Helper:
         lsend      1468698592.04595
       Lastread:
     6:
       DEF        1 10
       DEST
       INTERVAL   10
       IODev      ModBusLine
       MODBUSID   1
       NAME       Saltlange
       NR         25
       PROTOCOL   RTU
       STATE      opened
       TYPE       ModbusAttr
       getList    MBF_MEASURE_PH
       setList
       Helper:
         lsend      1468698592.04595
       Lastread:
   Helper:
     buffer
     lsend      1468698592.04595
Attributes:


wo habe ich den hier einen Fehler?
danke vorab

RS485 USB Adapter ist dieser https://www.amazon.de/Digitus-DA-70157-Seriell-Adapter-USB/dp/B007VZY4CW/ref=sr_1_1?ie=UTF8&qid=1468698781&sr=8-1&keywords=rs485+usb
FHEM - RaspberryPi/Fritz!Box 7390 - 1x HM-CFG-LAN - 3x HM-CC-RT-DN - 3x HM-LC-Bl1PBU-FM - 1x HM-LC-Sw1PBU-FM

DJ-Mix

hat sich erledigt, funktioniert. Hatte vergessen mal Neu zu starten - da hing irgendwas.
FHEM - RaspberryPi/Fritz!Box 7390 - 1x HM-CFG-LAN - 3x HM-CC-RT-DN - 3x HM-LC-Bl1PBU-FM - 1x HM-LC-Sw1PBU-FM