Logic Machine Forum
Update modbus profile - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Gateway (https://forum.logicmachine.net/forumdisplay.php?fid=10)
+--- Thread: Update modbus profile (/showthread.php?tid=405)



Update modbus profile - sx3 - 02.10.2016

Hi,

Is there any way to update a modbus profile without having to map all the KNX adresses again?
I'm implementing function on the go and would like the already configurated maps to remain unchanged/no need to map the KNX adress again.


RE: Update modbus profile - admin - 02.10.2016

No, but you can set bus_address field in the profile itself so you don't have to do mapping manually after creating a device with new/updated profile.


RE: Update modbus profile - sx3 - 02.10.2016

Thanks!

Code:
"bus_address": 1/1/1,

Will I be able to change the group adress in the web-interface later, or is it hard-written when writing in the profile?


RE: Update modbus profile - admin - 02.10.2016

Yes, you can change or remove mapping later.


RE: Update modbus profile - sx3 - 02.10.2016

Thanks.

Is it possible to set the profile to poll the read values even though it haven't changed?
I have a Gira Homeserver, KNX visualization, but I can't read the modbus values from the KNX bus, by sending a read request or read on init, when the server reboots.


I have tried script, but it returns 0, always.. even though the value should be greater!

Code:
-- init modbus on first script execution
if not mb then
     require('luamodbus')
     mb = luamodbus.rtu()
     mb:open('/dev/RS485', 9600, 'N', 8, 1, 'H')
     mb:connect()
end

-- sets slave ID to read/write data from/to
mb:setslave(1)

result=mb:readregisters(27)
grp.write('2/3/10',result)

mb:close()

I have disabled RTU, and the register adress is 4x00027.
The LM modbus profile can read this register, but it doesn't poll the value since it's not changed often, but I need to learn my KNX devices this value when they reboot or things like that.


RE: Update modbus profile - sx3 - 03.10.2016

If I remove the if query, then it works better.
But it interfer with the RTU, so sometimes the value gets zero, but then jumps back to the static "10".


This works better, but the value still gets 0 sometimes, not that often as with above, but still occours.:
Code:
mbproxy = require('mbproxy')
mb = mbproxy.new()
mb:setslave(1)

result=mb:readregisters(26)
grp.write('2/3/7',result)

The best were if it was possible to let the RTU send values to the bus even though the are unchanged.


RE: Update modbus profile - admin - 03.10.2016

First, you should never access serial port directly if it's used by the Modbus mapper, it will lead to random errors.

It might be that read fails for some reason and returns nil which ends up being sent as 0.
Try this:
Code:
result = mb:readregisters(26)
if result then
  grp.write('2/3/7',result)
end

Another approach is to create a scheduled script which runs every X minutes (depending on frequently you want to resend values). Mark each required object with resend tag, tune interval value in your script as needed.
Code:
now = os.time()
interval = 120 -- resend time in seconds

-- go through all objects with "resend" tag
objects = grp.tag('resend')
for _, object in ipairs(objects) do
  delta = now - object.updatetime
  
  -- check if value must be sent again
  if delta >= interval then
    object:write(object.data)
  end
end



RE: Update modbus profile - sx3 - 03.10.2016

Thanks, yes I read that in another post that I never should open the serial if mapper is used.
But then I read that MBPROXY could be used instead? So my second example should be OK together with mapper right? Or should I skip the proxy and luamodbus in the script, because the serial is already open due to mapper?
It's a LM2 I'm working with.

I think I might have a collision, because I have set the same group adress in mapper and script for same register, so when the script reads value and send it out on the group adress, then the mapper will listen to this GA and write that value to register. Some sort of loop, I will test to use different GA in the script and see if it collides.

I will probably go for an event script triggered by a GA, so on init of my device I will trigger this GA to learn in all the values.


RE: Update modbus profile - sx3 - 03.10.2016

Maybe I should upgrade from 16.07 to 16.09 as well..


RE: Update modbus profile - FatMax - 16.11.2016

Is there any way to set Object name as well? When I put bus_address in the json profile it maps it correctly, but with no name in the Object..


RE: Update modbus profile - admin - 16.11.2016

No, because it only does grp.write or grp.update to the specified address. Object creation must be done through the web interface.


RE: Update modbus profile - FatMax - 16.11.2016

Ok, that makes sense.

Next question;

I´m making 150 profiles (Modbus TCP/IP) to do auto mapping with about 20 registers/coils each. Any idea if the SpaceLYnk can handle that amount of polling..? And if yes, any max modbus devices set for tcp/ip?


RE: Update modbus profile - admin - 16.11.2016

Recommended limit is about 1000 objects per device, though 3000 will work but slower. Another thing to consider is adjusting poll interval as value too small will cause high CPU load.