LogicMachine Forum
Modbus RTU and File Descriptor Support for Parallel Interface Monitorin - Printable Version

+- LogicMachine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: Modbus RTU and File Descriptor Support for Parallel Interface Monitorin (/showthread.php?tid=5853)



Modbus RTU and File Descriptor Support for Parallel Interface Monitorin - Blooddah - 21.01.2025

Hello,

I am currently working with the LuaModbus library to communicate with Modbus RTU devices and have successfully implemented basic register reading functionality. Below is a simplified example of my current approach.

Code:
require('luamodbus') -- Modbus RTU communication parameters local port_rtu = "/dev/RS485-2" local baud_rate = 9600 local parity = 'N' local data_bits = 8 local stop_bit = 1 local slave_id = 78 local register_address = 19 local timeout = 5 -- Establish Modbus RTU connection local mb = luamodbus.rtu() mb:open(port_rtu, baud_rate, parity, data_bits, stop_bit) mb:connect() mb:setslave(slave_id) mb:setresponsetimeout(timeout) -- Read the register local value, err = mb:readregisters(register_address, 1) -- Display the result if err then   print("Read error: " .. err) else   print("Value read at register " .. register_address .. ": " .. value[1]) end -- Close the connection mb:close()
However, I would like to extend this functionality to periodically monitor multiple interfaces in parallel without relying on the Copas library, as it does not meet my performance requirements.
Specifically, I am interested in achieving behavior similar to MQTT, where I can use "socket" to monitor multiple file descriptors and trigger events when data is available. Is it possible to retrieve a file descriptor for a Modbus RTU connection (similar to the MQTT socket), which I can integrate into an event loop?
Code:
--[[...]] -- Client initialization while true do     connect_mqtt()     local timerfd = socket.fdmaskset(timer:getfd(), 'r')     local mclientfdset = mclient and socket.fdmaskset(mclient:getfd(), mclient:want_write() and 'rw' or 'r')     local res, timerstat, mclientstat = socket.selectfds(10, timerfd, mclientfdset)     if res then         if timerstat then             handle_timer_event()         end         if mclient and mclientstat then             if socket.fdmaskread(mclientstat) then                 mclient:loop_read()             end             if socket.fdmaskwrite(mclientstat) then                 mclient:loop_write()             end             mclient:loop_misc()         end     end     os.sleep(1) end
This would allow me to efficiently manage multiple Modbus interfaces concurrently within the same script.
Any guidance or advice on how to implement this functionality with LuaModbus would be greatly appreciated.


RE: Modbus RTU and File Descriptor Support for Parallel Interface Monitorin - admin - 21.01.2025

Not possible. Modbus library functions are blocking. You can't perform any other actions until read/write is finished. The only solution I see is to split each Modbus port handler into a different process.