RE: Modbus profiles examples - tthamm - 03.10.2022
(03.10.2022, 07:54)Daniel Wrote: Try this:
Code: {
"bus_datatype": "int64",
"address": 20480,
"type": "register",
"units": "kWh",
"value_multiplier": 0.01,
"name": "Active import",
"datatype": "uint64"
},
Try using profile generator if this is simpler.
https://forum.logicmachine.net/showthread.php?tid=3053&pid=19678#pid19678
I´ve tested it but it doesnt work. Here are some pictures. I always get a "operation time out", but the read test works!
RE: Modbus profiles examples - Daniel - 04.10.2022
What are the RTU settings?
RE: Modbus profiles examples - Dré - 04.10.2022
(02.10.2022, 10:48)tthamm Wrote: (24.01.2022, 07:14)admin Wrote: LM does not have D0/D1 markings, but A/B/GND. A is positive, B is negative. Try swapping A/B lines and also check that the serial port settings match.
now the communikation works!
I´ve found the manufactur manual with chapter 9 (Communication with Modbus) inside.
Here are the fields: Quantity, Details, Start reg (hex), Size, Res., Unit, Data type,
for Example:
Quantity: Active import, Details: Tariff 1, Start reg (hex): 5170, Size: 4, Res.: 0,01, Unit: kWh, Data type: Unsigned
When i try reading Active import with these settings:
- Function: Holding register (#3)
- Address: 20480
- Data type: uint64
- Read swap: Word
the Answer is 94425 (i think its 944,25 kWh), that is correct.
but how i have to "translate" for the Logicmachine? I know, that i have to calculate hex into dec (like 5000 in hex is 20480 in dec). In the Modbus Profile Generater are Fields like bus_datatype, datatype, value_custom, read_swap...
Can you give me an example? Thankx
I have the ABB B21 and have the next script what is working, maybe this can help you?
Code: {
"product_code": "ABB_B21",
"mapping": [
{
"bus_datatype": 14,
"address": 20480,
"value_multiplier": 0.01,
"type": "register",
"units": " kWh",
"name": "Active import",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20484,
"value_multiplier": 0.01,
"type": "register",
"units": " kWh",
"name": "Active export",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20488,
"value_multiplier": 0.01,
"type": "register",
"units": "kWh",
"name": "Active Net",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20489,
"value_multiplier": 0.01,
"type": "register",
"units": "Kvarh",
"name": "Reactive Import",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20496,
"value_multiplier": 0.01,
"type": "register",
"units": "Kvarh",
"name": "Reactive Export",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20500,
"value_multiplier": 0.01,
"type": "register",
"units": "Kvarh",
"name": "Reactive Net",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20504,
"value_multiplier": 0.01,
"type": "register",
"units": "Kvarh",
"name": "Apparent Import",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20505,
"value_multiplier": 0.01,
"type": "register",
"units": "Kvarh",
"name": "Apparent Export",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20512,
"value_multiplier": 0.01,
"type": "register",
"units": "Kvarh",
"name": "Apparent Net",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20516,
"value_multiplier": 0.001,
"type": "register",
"units": "kg",
"name": "Active Import CO2",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 20532,
"value_multiplier": 0.001,
"type": "register",
"units": "currency",
"name": "Active Import Currency",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 23296,
"value_multiplier": 0.1,
"type": "register",
"units": "currency",
"name": "Volatage",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 23316,
"value_multiplier": 0.01,
"type": "register",
"units": " W",
"name": "Active power",
"datatype": "int64"
},
{
"bus_datatype": 14,
"address": 23296,
"value_multiplier": 0.1,
"type": "register",
"units": " V",
"name": "Voltage L1-N",
"datatype": "int32"
},
{
"bus_datatype": 14,
"address": 23308,
"value_multiplier": 0.01,
"type": "register",
"units": " A",
"name": "Current Ampere L1",
"datatype": "int32"
},
{
"bus_datatype": 14,
"address": 23316,
"value_multiplier": 0.01,
"type": "register",
"units": " W",
"name": "Active Total Power",
"datatype": "int32"
},
{
"bus_datatype": 14,
"address": 23340,
"value_multiplier": 0.01,
"type": "register",
"units": " Hz",
"name": "Frequency",
"datatype": "uint16"
},
{
"bus_datatype": 10,
"address": 35328,
"value_multiplier": 0,
"type": "register",
"units": " time",
"name": "date / time",
"datatype": "int64"
}
],
"manufacturer": "ABB",
"name": "B21",
"product_range": "PM",
"description": "Power Meter P21 1 fase",
"read_delay": 1
}
The last read_delay is because is had 2 devices and the next device i activate didn't work
link to post from Admin
RE: Modbus profiles examples - efredlund@gmail.com - 14.12.2022
(04.11.2020, 20:56)stemic01 Wrote: FYI: I've just implemented and written a modbus JSON profile for the FLEXIT NORDIC S4 ventilation system. Now I can retrieve vital information and change certain parameters. PM if you are in need of this for your flexit. (PS! The CI66 JSON did not work for me).
Hello, I have also tried the CI66 JSON with no success. Are you interested in sharing your file that would be great
My unit is a Flexit Uni 4
Regards
Modbus profiles examples - fabiorusco - 27.12.2022
Hallo,
I created this modbus profile, but if I try to import it in LM, it show me "invalid profile":
{
"manufacturer": "Rehom",
"description": "Unità Master",
"product_code": "REH11001",
"mapping":
[
{
"name": "richiesta_lettura_dati",
"bus_datatype": 7,
"type": "register",
"address": 6,
"writable": "true"
},
{
"name": "richiesta_lettura_contatore",
"bus_datatype": 7,
"type": "register",
"address": 7,
"writable": "true"
},
{
"name": "consumo_calorie",
"bus_datatype": 14,
"units": "kWh",
"type": "register",
"address": 3015,
"value_multiplier": 1
},
{
"name": "consumo_frigorie",
"bus_datatype": 14,
"units": "kWh",
"type": "register",
"address": 3017
"value_multiplier": 1
}
]
}
Can someone help me please
Best regards
Fabio Rusconi
RE: Modbus profiles examples - CristianAgata - 28.12.2022
(27.12.2022, 14:48)fabiorusco Wrote: Hallo,
I created this modbus profile, but if I try to import it in LM, it show me "invalid profile":
{
"manufacturer": "Rehom",
"description": "Unità Master",
"product_code": "REH11001",
"mapping":
[
{
"name": "richiesta_lettura_dati",
"bus_datatype": 7,
"type": "register",
"address": 6,
"writable": "true"
},
{
"name": "richiesta_lettura_contatore",
"bus_datatype": 7,
"type": "register",
"address": 7,
"writable": "true"
},
{
"name": "consumo_calorie",
"bus_datatype": 14,
"units": "kWh",
"type": "register",
"address": 3015,
"value_multiplier": 1
},
{
"name": "consumo_frigorie",
"bus_datatype": 14,
"units": "kWh",
"type": "register",
"address": 3017
"value_multiplier": 1
}
]
}
Can someone help me please
Best regards
Fabio Rusconi
Hi Fabio,
After "address":3017 there's no the ,
BR Cristian
RE: Modbus profiles examples - fabiorusco - 28.12.2022
(28.12.2022, 05:47)CristianAgata Wrote: (27.12.2022, 14:48)Thank you,Fabiofabiorusco Wrote: Hallo,
I created this modbus profile, but if I try to import it in LM, it show me "invalid profile":
{
"manufacturer": "Rehom",
"description": "Unità Master",
"product_code": "REH11001",
"mapping":
[
{
"name": "richiesta_lettura_dati",
"bus_datatype": 7,
"type": "register",
"address": 6,
"writable": "true"
},
{
"name": "richiesta_lettura_contatore",
"bus_datatype": 7,
"type": "register",
"address": 7,
"writable": "true"
},
{
"name": "consumo_calorie",
"bus_datatype": 14,
"units": "kWh",
"type": "register",
"address": 3015,
"value_multiplier": 1
},
{
"name": "consumo_frigorie",
"bus_datatype": 14,
"units": "kWh",
"type": "register",
"address": 3017
"value_multiplier": 1
}
]
}
Can someone help me please
Best regards
Fabio Rusconi
Hi Fabio,
After "address":3017 there's no the ,
BR Cristian
RE: Modbus profiles examples - admin - 28.12.2022
Profile is missing datatype fields, most likely kWh readings will be incorrect. Can you provide documentation for this device?
RE: Modbus profiles examples - fabiorusco - 28.12.2022
(28.12.2022, 07:30)admin Wrote: Profile is missing datatype fields, most likely kWh readings will be incorrect. Can you provide documentation for this device?
Hello,
I inserted them like uint32.
Thank you
RE: Modbus profiles examples - pritorianz - 10.03.2023
Hi all!
I made and checked the profile for the Haier YCJ-A002 module (for connecting Haier air conditioners via Modbus).
For writing, I used the site https://jsoneditoronline.org/
And modbus profile generator https://forum.logicmachine.net/showthread.php?tid=3053&pid=19678#pid19678
LG AWHP Modbus RTU Profile - KoBra - 08.04.2023
Dears,
attached the Modbus RTU direct connection profile of LG AWHP to logic machine incl all custom values.
LG AirCondition PMBUSB00A Modbus profile - merel - 08.04.2023
Hello everbody,
attached the Modbus RTU direct connection profile of LG PMBUSB00A LG Modbus Gateway to logic machine incl all custom values..
RE: Modbus profiles examples - AEK - 25.09.2023
Hi, small script, which will help to create json profile for daikin modbus interface DIII (D3)
Code: require('json')
data = {
manufacturer = "daikin",
description = "modbus gateway",
mapping = {
{
}
}
}
str = json.encode(data)
--log(str)
--io.writefile('home/ftp/modbus.json', str)
ac_zones = {
[1] ={
[0] = '2_15 Мастер спальня',
[1] = '2_01 Прихожая',
[2] = '2_07 Cпальня 2',
[3] = '2_02 Cпальня 1'
},
[2] ={
[0] = '1_18 Каминная',
[1] = '1_16 Холл 2',
[2] = '1_09 Массажная',
[3] = '1_08 Спортзал',
[4] = '1_04 Гостиная',
[5] = '1_05 кухн'
},
[3] ={
[0] = '0_06-1 Бар',
[1] = '0_06-2 Бар',
[2] = '0_03 ДК'
},
}
function ac_mapping_create (zones_table)
mapping_table = {}
for line, zones in pairs(zones_table) do
for unit, name in pairs(zones) do
-- статус подключения
table.insert(mapping_table,
{
name = name.." - connection",
type = "inputregister",
bus_datatype = "bool",
address = 1 + (line-1),
datatype = "int16",
value_bitmask = 2^(unit)
}
)
-- ошибка коммуникации
table.insert(mapping_table,
{
name = name.." - communication error",
type = "inputregister",
bus_datatype = "bool",
address = 5 + (line-1),
datatype = "int16",
value_bitmask = 2^(unit)
}
)
-- уставка
table.insert(mapping_table,
{
name = name.." - setpoint ctrl",
type = "register",
bus_datatype = "temperature",
address = 2002 + (line-1)*16*3 + unit*3,
datatype = "int16",
writable = 1,
write_only = 1,
value_multiplier = 0.1
}
)
table.insert(mapping_table,
{
name = name.." - setpoint status",
type = "inputregister",
bus_datatype = "temperature",
address = 2002 + (line-1)*16*6 + unit*6,
datatype = "int16",
value_multiplier = 0.1
}
)
-- текущая
table.insert(mapping_table,
{
name = name.." - Room temp",
type = "inputregister",
bus_datatype = "temperature",
address = 2004 + (line-1)*16*6 + unit*6,
datatype = "int16",
value_multiplier = 0.1
}
)
-- opermode
table.insert(mapping_table,
{
name = name.." - Operation mode status",
type = "inputregister",
bus_datatype = "uint8",
address = 2001 + (line-1)*16*6 + unit*6,
datatype = "int16",
value_bitmask = 15
}
)
table.insert(mapping_table,
{
name = name.." - Operation mode ctrl",
type = "register",
bus_datatype = "uint8",
address = 2001 + (line-1)*16*3 + unit*3,
datatype = "int16",
writable = 1,
write_only = 1,
value_bitmask = 15,
write_bitmask = true
}
)
--fan st
table.insert(mapping_table,
{
name = name.." - fan speed status",
type = "inputregister",
bus_datatype = "uint8",
address = 2000 + (line-1)*16*6 + unit*6,
datatype = "int16",
value_bitmask = 28672
}
)
table.insert(mapping_table,
{
name = name.." - fan status",
type = "inputregister",
bus_datatype = "uint8",
address = 2000 + (line-1)*16*6 + unit*6,
datatype = "int16",
value_bitmask = 32
}
)
-- power st
table.insert(mapping_table,
{
name = name.." - onoff status",
type = "inputregister",
bus_datatype = "uint8",
address = 2000 + (line-1)*16*6 + unit*6,
datatype = "int16",
value_bitmask = 1
}
)
-- controls
table.insert(mapping_table,
{
name = name.." - fan speed ctrl",
type = "register",
bus_datatype = "uint8",
address = 2000 + (line-1)*16*3 + unit*3,
datatype = "int16",
writable = 1,
write_only = 1,
value_bitmask = 28672,
write_bitmask = true
}
)
table.insert(mapping_table,
{
name = name.." - fan flag ctrl",
type = "register",
bus_datatype = "uint8",
address = 2000 + (line-1)*16*3 + unit*3,
datatype = "int16",
writable = 1,
write_only = 1,
value_bitmask = 240,
write_bitmask = true
}
)
table.insert(mapping_table,
{
name = name.." - onoff ctrl",
type = "register",
bus_datatype = "bool",
address = 2000 + (line-1)*16*3 + unit*3,
datatype = "int16",
writable = 1,
write_only = 1,
value_bitmask = 1,
write_bitmask = true
}
)
end
end
return mapping_table
end
data.mapping = ac_mapping_create(ac_zones)
str = json.encode(data)
log(io.writefile('home/ftp/KP1_DAIKIN_modbus.json', str))
just fill the ac_zones table according to your room names
ac_zones[i][j]
i - line(1-4)
j - ac unit (00-15)
and then download profile fromlocal ftp server using "ftp" login. you can add more registers if it is needed
RE: Modbus profiles examples - fabiorusco - 30.09.2023
Hello,
I used a scheduled script to read the modbus register. In the device instructions it's indicated that I must repeat the reading in case of error. I attach the script that I used to detect if there is an error. It doesn't work. Can someone help me, please?
nappartamento = grp.getvalue('32/1/2')
nappartamento = nappartamento + 1
if (nappartamento > 211 ) then
nappartamento = 200
end
grp.update('32/1/2', nappartamento)
log(nappartamento)
require('luamodbus')
mb = luamodbus.rtu()
mb:open('/dev/ttyUSB0', 9600, 'N', 8, 1, 'H')
mb:connect()
mbetslave(32) --CENTRALINA MASTER
--IMPOSTO LETTURA NAPPARTAMENTO
contatore1=1
mb:writeregisters(7, nappartamento)
os.sleep(10)
--RIPETO SE RISPONDE CON ERRORE 5 VOLTE
contatore1=1
while (contatore1 > 0) do
res, err = mb:readregisters(7, nappartamento)
if not res then
os.sleep(30)
mb:writeregisters(7, nappartamento)
contatore1 = contatore1 + 1
if contatore1 > 5 then
alert('errore1')
return
end
else -- TUTTO OK
contatore1=0
end
end
mb:writeregisters(6, nappartamento)
os.sleep(35)
--RIPETO SE RISPONDE CON ERRORE 5 VOLTE
contatore2=1
while (contatore2 > 0) do
res, err = mb:readregisters(6, nappartamento)
if not res then
os.sleep(30)
mb:writeregisters(6, nappartamento)
contatore2 = contatore2 + 1
if contatore2 > 5 then
alert('errore2')
return
end
else -- TUTTO OK
contatore2=0
end
end
-- LEGGO VALORI
--log(mb:readregisters(3015,8))
os.sleep(1)
calorieh,caloriel,frigorieh,frigoriel,acs_lo,afs_lo,acs_hi,afs_hi = mb:readregisters(3015,8)
calorie = caloriel + (calorieh*65535)
log(calorie)
frigorie=frigoriel + (frigorieh*65535)
log(frigorie)
acs=acs_lo+(acs_hi*65535)
log(acs)
--afs=afs_lo+(afs_hi*65535)
--RIPETO SE RISPONDE CON ERRORE 5 VOLTE
mb:close()
RE: Modbus profiles examples - Erwin van der Zwart - 30.09.2023
Looked quickly and noticed this already:
res, err = mb:readregisters(6, nappartamento)
Where nappartamento seems to be a value around 200 resulting in a command where you try to read register 6 to 206 at once and those 200 registers probably don’t even exist (consecutive), given the “res, err =“ you probably want to read only register 6..
I think your command needs to be:
res, err = mb:readregisters(6)
RE: Modbus profiles examples - tomnord - 30.09.2023
I'm trying to figure out how to combine two registers as one. I want to read register 11(high) and 12(low) as one value. value_bitmask?
RE: Modbus profiles examples - Erwin van der Zwart - 01.10.2023
Same question as yesterday..
https://forum.logicmachine.net/showthread.php?tid=4998&pid=32303#pid32303
Change datatype and swap as needed ..
NIBE S1155 Modbus profile - merel - 25.01.2024
Hello,
here is modbus profile for NIBE S1155 heat pump.
|