demo.lua

--[[
Very simple demo of using client/master APIs
Karl Palsson, April 2016
--]]

mb = require("libmodbus")
print("using libmodbus runtime version: ", mb.version())
print("using lua-libmodbus compiled against libmodbus: ", mb.VERSION_STRING)

local dev = mb.new_tcp_pi("localhost", 1502)
print(dev:get_byte_timeout())
print(dev:get_response_timeout())
print(dev)
dev:set_debug()
--dev:set_error_recovery(mb.ERROR_RECOVERY_LINK, mb.ERROR_RECOVERY_PROTOCOL)
--dev:set_error_recovery(mb.ERROR_RECOVERY_NONE)
ok, err = dev:connect()
if not ok then error("Couldn't connect: " .. err) end

function lmb_unit_test(dev)
	dev:set_slave(17)
	local base_address = 0x16b
	local regs, err
	regs, err = dev:read_registers(base_address, 3)
	if not regs then error("read failed: " .. err) end

	print("read 3 from 0x16b: ")
	for r,v in ipairs(regs) do
		print(string.format("register (offset %d) %d: %d (%#x): %#x (%d)",
			r, r, r + base_address - 1, r + base_address -1, v, v))
	end

	print("write single 0x16c -> 0xabcd ", dev:write_register(0x16c, 0xabcd))
	regs, err = dev:read_registers(0x16c, 1)
	if not regs then error("read1 failed: ", err) end
	print("reading back:  single 0x16c: ", string.format("%x", regs[1]))

	regs, err = dev:read_input_registers(0x108, 1)
	if not regs then print("read input regs failed", err) end
	print("should be 0xa: ", string.format("%x", regs[1]))

	bits, err = dev:read_bits(0x130, 0x25)
	if not bits then print("read bits failed", err) end
	for r,v in ipairs(bits) do
		print(string.format("bit (offset %d) %d: %d (%#x): %#x (%d)",
			r, r, r + 0x130 - 1, r + 0x130 -1, v, v))
	end

	bits, err = dev:write_bits(0x130, { 0xffff,0, true,0,false,1,0,99 })
	if not bits then print("write bits failed", err) end
	bits, err = dev:read_bits(0x130, 8)
	print("reading back 8 bits, should be 0xa5")
	for r,v in ipairs(bits) do
		print(string.format("bit (offset %d) %d: %d (%#x): %#x (%d)",
			r, r, r + 0x130 - 1, r + 0x130 -1, v, v))
	end

	err = dev:write_bit(0x131, 1);
	if err then print("write bit returned:", err) end
	bits, err = dev:read_bits(0x131, 1)
	if not bits then print("re-reading bits failed", err) end
	print("rereading bits should be 1 now: ", bits[1])

	bits, err = dev:read_input_bits(0x1c4, 8)
	if not bits then print("read bits failed", err) end
	for r,v in ipairs(bits) do
		print(string.format("bit (offset %d) %d: %d (%#x): %#x (%d)",
			r, r, r + 0x1c4 - 1, r + 0x1c4 -1, v, v))
	end

	report = dev:report_slave_id()
	print("report slaveid: ", report:byte(1), report:byte(2), report:sub(3))

end


function write_test(dev)
-- will autoround 32.98 to 32.  no magic support for writing floats yet :|
-- numbers are cast to uint16_t internally.
	local res, err = dev:write_registers(0x2000, { 0xabcd, 32.98, 0xfffe, 0xabcd, -1 })
	if not res then print(err) end
	regs, err = dev:read_registers(base_address, 5)
	print("so, no magic casting 16bit tosigned!", regs[5], -1)

	print(dev:write_register(0x2006, 2))
end

lmb_unit_test(dev)
generated by LDoc 1.4.6 Last updated 2022-12-02 11:44:08