Some registers have the type float. It's important to know that these are always 4 byte which means 2 modbus words - so the length has to be 2.
It's possible to read registers of the same space blockwisen but in this case it's important to care about the endianness. For example it's possible to read all CTRL or LUGO registers at once.
There is no way of doing block reads between different types. The module would send an NACK in these cases.
method | FC (name) | FC (dec) |
---|---|---|
read (r) | READ_HOLDING_REGISTERS | 3 |
write (w) | PRESET_SINGLE_REGISTER | 6 |
read (r) | Read Device Identification | 0x2B |
name | length (words) | description |
---|---|---|
bool | 1 | 0 - off 1 - on |
int16 | 1 | Signed-Integer (–32768 to 32767) |
int32 | 2 | Signed-Integer (–2147483648 to 2147483647) |
uint16 | 1 | Unsigned-Integer (0-65536) |
uint32 | 2 | Unsigned-Integer (0-4294967296) |
float | 2 | Float |
MenuState_t | 1 | 0 - unknown 1 - not written yet 2 - error 3 - written 4 - read (FW>106) 5 - invalid (FW>122) |
Baudrate_t | 1 | 0 - 9600 1 - 19200 2 - 38400 3 - 57600 4 - 115200 255 - unset (use default, 9600) |
Command_t | 1 | 1 - Reset |
TestMode_t | 1 | 0 - normal/no test 1 - heating 2 - off 3 - ventilation 10 - unknown |
RemoteType_t | 1 | 0 - unknown 1 - AC, old remote 2 - AC, BEMS 3 - FCC |
endianness | register value | meaning |
---|---|---|
little-endian | 1 | return word 0..n (modbus standard) |
big-endian | * | return word n..0 (default setup) |
After ModBus version 220 the device answers to function code 0x2B (Read Device Identification).
The objects are:
Object Id | Object Name | Value | Comments |
---|---|---|---|
0x00 | VendorName | e-design | |
0x01 | ProductCode | bm-gw | |
0x02 | MajorMinorRevision | <firmware-rev>/<modbus-rev> | |
0x03 | VendorURL | ed-solutions.de | |
0x04 | ProductName | Biddle-ModBus Gateway | |
0x05 | ModelName | v30x (bems) |
address (hex) | address (dec) | description | type | ro/rw/eep1) | |
---|---|---|---|---|---|
0x0000 | 0 | on/off (contact) | bool | rw | invalid for BEMS, rw >FV218 |
0x0001 | 1 | ModBus Slave-address | uint16 | rw,eep | FW>110 |
0x0002 | 2 | Endianess-setup | uint16 | rw,eep | FW>145, Default 1 for BEMS & FW>=230 |
0x0003 | 3 | enable auto-Baudrate | bool | rw,eep | TODO |
0x0004 | 4 | Baudrate | Baudrate_t | rw,eep | FW>145 |
0x0005 | 5 | Serial | uint16 | ro | FW>101 |
0x0006 | 6 | Command | Command_t | wo | FW>145, read=0 FW>219 |
0x000A | 10 | ModBus- Revision | uint16 | ro | |
0x000B | 11 | Firmware- Revision | uint16 | ro | |
0x000F | 15 | Biddle-Version | uint16 | ro | |
0x0014 | 20 | Biddle-Queries | uint16 | ro | FW>100 |
0x0015 | 21 | Biddle-Queries-Timeout | uint16 | ro | FW>115 |
0x0016 | 22 | Biddle-Queries-Errors | uint16 | ro | FW>120 |
0x0017 | 23 | Biddle-Restarts | uint16 | ro | FW>193 |
0x0019 | 25 | Uptime (min) | uint16 | ro | FW>115 |
0x001E | 30 | ModBus CRC-Errors | uint16 | ro | FW>115 |
0x0028 | 40 | detected remote type | RemoteType_t | ro | FW>240 |
0x0032 | 50 | AC-Count | uint16 | ro | FW>121 |
0x0064 | 100 | MENU/0 | int16 | ro | rw for FW>106 |
0x0065 | 101 | MENU/1 | int16 | ro | rw for FW>106 |
0x0066 | 102 | MENU/2 | int16 | ro | rw for FW>106 |
0x0067 | 103 | MENU/3 | int16 | ro | rw for FW>106 |
… | |||||
0x00BD | 189 | MENU/89 | int16 | ro | rw for FW>106 |
0x00FA | 250 | MENU.state/0 | MenuState_t | ro | |
0x00FB | 251 | MENU.state/1 | MenuState_t | ro | |
0x00FC | 252 | MENU.state/2 | MenuState_t | ro | |
0x00FE | 253 | MENU.state/3 | MenuState_t | ro | |
… | |||||
0x0153 | 339 | MENU.state/89 | MenuState_t | ro | |
0x012C | 400 | ADC | uint16 | ro | |
0x0190 | 450 | INP | uint16 | ro | implement! |
0x01F4 | 500 | DIAG/tx | uint32 | ro | |
0x01F6 | 502 | DIAG/rx | uint32 | ro | |
0x01F8 | 504 | DIAG/retr | uint16 | ro | |
0x01F9 | 505 | DIAG/fail | uint16 | ro | |
0x0258 | 600 | CONF/1/snr | uint32 | ro | FW>129 |
0x025A | 602 | CONF/1/cc | uint16 | ro | FW>129 |
0x025B | 603 | CONF/1/sw | uint16 | ro | FW>129 |
0x025C | 604 | CONF/1/comm | uint16 | ro | FW>129 |
0x025D | 605 | CONF/1/flws | uint16 | ro | FW>129, BEMS only, else 0 |
0x025E | 606 | CONF/2/snr | uint32 | ro | FW>129 |
… | |||||
0x02BC | 700 | MODEL/sterkte | uint16 | ro | FW>113 |
0x02BD | MODEL/tuitbl | uint16 | ro | FW>113 | |
0x02BE | MODEL/tbuiten | uint16 | ro | FW>113 | |
0x02BF | MODEL/tbfilt | uint16 | ro | FW>113 | |
0x02C0 | MODEL/h | uint16 | ro | FW>113 | |
0x02C1 | MODEL/d0 | uint16 | ro | FW>113 | |
0x02C2 | MODEL/nlim | uint16 | ro | FW>113 | |
0x02C3 | MODEL/uw | uint16 | ro | FW>113 | |
0x02C4 | MODEL/u0c | uint16 | ro | FW>113 | |
0x02C5 | MODEL/u0v | uint16 | ro | FW>113 | |
0x02C6 | MODEL/u0t | uint16 | ro | FW>113 | |
0x0320 | 800 | PID/tsp | float | ro | implement! |
PID/taanz | float | ro | implement! | ||
PID/tact | float | ro | implement! | ||
PID/tuitsp | float | ro | implement! | ||
PID/tuitpv | float | ro | implement! | ||
PID/sterkte | float | ro | implement! | ||
PID/vheat | float | ro | implement! | ||
PID/pheat | float | ro | implement! | ||
PID/p | float | ro | implement! | ||
PID/i | float | ro | implement! | ||
PID/d | float | ro | implement! | ||
0x0384 | 900 | CTRL/1/flwspeed | int16 | ro | FW>159 |
0x0385 | 901 | CTRL/2/flwspeed | int16 | ro | FW>159 |
0x0386 | 902 | CTRL/3/flwspeed | int16 | ro | FW>159 |
0x0387 | 903 | CTRL/4/flwspeed | int16 | ro | FW>159 |
0x0388 | 904 | LUGO/vent | int16 | ro | FW>159 |
0x0389 | 905 | CTRL/1/flwpress | int16 | ro | FW>232 |
0x038A | 906 | CTRL/2/flwpress | int16 | ro | FW>232 |
0x038B | 907 | CTRL/3/flwpress | int16 | ro | FW>232 |
0x038C | 908 | CTRL/4/flwpress | int16 | ro | FW>232 |
0x038D | 909 | CTRL/1/hvlv | int16 | ro | FW>232 |
0x038E | 910 | CTRL/2/hvlv | int16 | ro | FW>232 |
0x038F | 911 | CTRL/3/hvlv | int16 | ro | FW>232 |
0x0390 | 912 | CTRL/4/hvlv | int16 | ro | FW>232 |
0x03E8 | 1000 | CTRL/1/tuitsp | float | ro | |
0x03EA | 1002 | CTRL/1/klpsp | float | ro | |
0x03EC | 1004 | CTRL/1/flwsp | float | ro | |
0x03EE | 1006 | CTRL/1/ena | float | ro | |
0x03F0 | 1008 | CTRL/1/afzsp | float | ro | |
0x03F2 | 1010 | CTRL/1/tinpv | float | ro | |
0x03F4 | 1012 | CTRL/1/tuitpv | float | ro | |
0x03F6 | 1014 | CTRL/1/err | float | ro | |
0x03F8 | 1016 | CTRL/1/stat | float | ro | |
0x03FA | 1018 | CTRL/1/foul | float | ro | |
0x03FC | 1020 | CTRL/1/toptpv | float | ro | |
0x03FE | 1022 | CTRL/1/flwspeed | float | ro | Uflws on BEMS |
0x0400 | 1024 | CTRL/1/flwpress | float | ro | only on BEMS && FW>160 |
0x0402 | 1026 | CTRL/1/vlvoff | float | ro | only on BEMS && FW>160 |
0x0404 | 1028 | CTRL/1/cvlv | float | ro | only on BEMS && FW>160 |
0x0406 | 1030 | CTRL/1/hvlv | float | ro | only on BEMS && FW>160 |
0x0400 | 1024 | CTRL/2/tuitsp | float | ro | |
0x0408 | 1032 | CTRL/2/tuitsp | float | ro | only on BEMS && FW>160 |
… | |||||
0x07D0 | 2000 | LUGO/tuitsp | float | ro | |
0x07D2 | 2002 | LUGO/klep | float | ro | |
0x07D4 | 2004 | LUGO/vent | float | ro | |
0x07D6 | 2006 | LUGO/on | float | ro | |
0x07D8 | 2008 | LUGO/heat | float | ro | |
0x07DA | 2010 | LUGO/cool | float | ro | |
0x07DC | 2012 | LUGO/nivo | float | ro | does not exist for BEMS |
0x07DE | 2014 | LUGO/h | float | ro | |
0x07E0 | 2016 | LUGO/u0c | float | ro | |
0x07E2 | 2018 | LUGO/u0t | float | ro | |
0x07F4 | 2020 | LUGO/pheat | float | ro | |
0x0BB8 | 3000 | VEKO/pv | float | ro | |
0x0BBA | 3002 | VEKO/sp | float | ro | |
0x0BBC | 3004 | VEKO/spuit | float | ro | |
0x0BBE | 3006 | VEKO/vent | float | ro | |
0x0BC0 | 3008 | VEKO/klep | float | ro | |
0x0BC2 | 3010 | VEKO/on | float | ro | |
0x0BC4 | 3012 | VEKO/h | float | ro | |
0x0BC6 | 3014 | VEKO/c | float | ro | |
0x0BC8 | 3016 | VEKO/vh | float | ro | |
0x0BCA | 3018 | VEKO/vv | float | ro | |
0x0BCC | 3020 | VEKO/dt | float | ro | |
0x0BDE | 3022 | VEKO/bs | float | ro | |
0x0FA0 | 4000 | I/51/0 | float | ro | FW<107 |
0x0FA2 | 4002 | I/51/1 | float | ro | FW<107 |
0x0FA4 | 4004 | I/52/0 | float | ro | FW<107 |
0x0FA6 | 4006 | I/52/1 | float | ro | FW<107 |
… | |||||
0x0FEC | 4076 | I/89/1 | float | ro | FW<107 |
0x1388 | 5000 | GG/0/0 | float | ro | FW<107 |
0x138A | 5002 | GG/0/1 | float | ro | FW<107 |
0x138C | 5004 | GG/1/0 | float | ro | FW<107 |
0x138E | 5006 | GG/1/1 | float | ro | FW<107 |
… | |||||
0x13A0 | 5024 | GG/11/0 | float | ro | FW<107 |
0x1770 | 6000 | KLV/pv | int16 | ro | FW>240, FCC only |
0x1771 | 6001 | KLV/sp | int16 | ro | FW>240, FCC only |
0x1772 | 6002 | KLV/spuit | int16 | ro | FW>240, FCC only |
0x1773 | 6003 | KLV/flow | int16 | ro | FW>240, FCC only |
0x1774 | 6004 | KLV/vent | int16 | ro | FW>240, FCC only |
0x1775 | 6005 | KLV/klep | int16 | ro | FW>240, FCC only |
0x1776 | 6006 | KLV/h | int16 | ro | FW>240, FCC only |
0x1777 | 6007 | KLV/c | int16 | ro | FW>240, FCC only |
0x1778 | 6008 | KLV/on | int16 | ro | FW>240, FCC only |
0x17D4 | 6100 | CTRL[0]/tuitsp | int16 | ro | FW>240, FCC only |
0x17D5 | 6101 | CTRL[0]/uitblklp | int16 | ro | FW>240, FCC only |
0x17D6 | 6102 | CTRL[0]/ventklp | int16 | ro | FW>240, FCC only |
0x17D7 | 6103 | CTRL[0]/flwsp | int16 | ro | FW>240, FCC only |
0x17D8 | 6104 | CTRL[0]/ena | int16 | ro | FW>240, FCC only |
0x17D9 | 6105 | CTRL[0]/ventpct | int16 | ro | FW>240, FCC only |
0x17DA | 6106 | CTRL[0]/tinpv | int16 | ro | FW>240, FCC only |
0x17DB | 6107 | CTRL[0]/tuitpv | int16 | ro | FW>240, FCC only |
0x17DC | 6108 | CTRL[0]/err | int16 | ro | FW>240, FCC only |
0x17DD | 6109 | CTRL[0]/stat | int16 | ro | FW>240, FCC only |
0x17DE | 6110 | CTRL[0]/co2pv | int16 | ro | FW>240, FCC only |
0x17DF | 6111 | CTRL[0]/heatklp | int16 | ro | FW>240, FCC only |
0x17E0 | 6112 | CTRL[0]/coolklp | int16 | ro | FW>240, FCC only |
0x2710 | 10000 | SETBEMS/on | int16 | rw | BEMS only |
0x2711 | 10001 | SETBEMS/heat | int16 | rw | BEMS only |
0x2712 | 10002 | SETBEMS/auto | int16 | rw | BEMS only |
0x2713 | 10003 | SETBEMS/fan | int16 | rw | BEMS only |
0x2714 | 10004 | SETBEMS/fanoffs | int16 | rw | BEMS only |
0x2715 | 10005 | SETBEMS/temp | int16 | rw | BEMS only |
0x271a | 10010 | SETBEMS/on.state | int16 | ro | BEMS only |
0x271b | 10011 | SETBEMS/heat.state | int16 | ro | BEMS only |
0x271c | 10012 | SETBEMS/auto.state | int16 | ro | BEMS only |
0x271d | 10013 | SETBEMS/fan.state | int16 | ro | BEMS only |
0x271e | 10014 | SETBEMS/fanoffs.state | int16 | ro | BEMS only |
0x271f | 10015 | SETBEMS/temp.state | int16 | ro | BEMS only |
0x2742 | 10050 | BEMS/TempAanz | int16 | ro | BEMS only |
0x2743 | 10051 | BEMS/TempUitbl | int16 | ro | BEMS only |
0x2744 | 10052 | BEMS/TBuiten | int16 | ro | BEMS only |
0x2745 | 10053 | BEMS/TbFilt | int16 | ro | BEMS only |
0x2746 | 10054 | BEMS/TestMode | uint16 | ro | BEMS only |
0x2747 | 10055 | BEMS/ErrFlags | uint16 | ro | BEMS only |
0x2748 | 10056 | BEMS/RealHeat | int16 | ro | BEMS only |
0x2749 | 10057 | BEMS/DoorRatio | uint16 | ro | BEMS only |
0x274A | 10058 | BEMS/Inp1Cnt | uint16 | ro | BEMS only, not used >FV230 |
0x274B | 10059 | BEMS/ErrFlags2 | int16 | ro | BEMS only, >FV218 |
0x274C | 10060 | BEMS/Person | uint32 | ro | BEMS only, >FV218 |
0x274E | 10062 | BEMS/Inp1Cnt | uint32 | ro | BEMS only, >=FV230 |
0x2774 | 10100 | TESTMODE/Remaining | uint16 | ro | BEMS only |
0x2775 | 10101 | TESTMODE/Mode | TestMode_t | rw | BEMS only, >FV220 |
0x2776 | 10102 | TESTMODE/Duration | uint16 | rw | BEMS only, >FV220 |
0x277E | 10110 | TESTFILT/FilterPct | uint16 | rw | BEMS only, >FV218 |
0x277F | 10111 | TESTFILT/Busy | uint16 | rw | BEMS only, >FV218 |
0x2780 | 10112 | TESTFILT/Command | uint16 | w | BEMS only, >FV218 |
0x2788 | 10120 | CURRENTTOUT | int16 | rw | BEMS only, >FV219 |
0x2789 | 10121 | CURRENTTOUT_timer | uint16 | r | BEMS only, >FV495 |
r/w | function | register |
---|---|---|
read+write | on/off | OnOff [0] |
read | supply-temp | CTRL/TinPv [1010] |
read | exhaust-temp | CTRL/TuitPv [1012] |
read | device on/off real state | LUGO/ON [2006] |
read | mode | LUGO/Heat [2008] (1=Heat 0=Fan) |
read | install height | LUGO/Nivo [2012] (0=A-level ; 1=B-level) or MENU/58 (0=A-level) |
read | fanspeed | CTRL/FlwSp [1004] |
read | filter dirt sensor | CTRL/FlwSpeed [1022] |
read | error code | CTRL/ERR [1014] |
Use the same procedure you use for setting the baudrate: