LogicMachine Forum
Scripting / Resident / MODBUS RS-485 energy meter clock update - 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: Scripting / Resident / MODBUS RS-485 energy meter clock update (/showthread.php?tid=1994)



Scripting / Resident / MODBUS RS-485 energy meter clock update - andeug - 31.03.2019

Hi,


I am using the below script to update the clock of my energy meters connected to RS-485 bus (I have 3 units) and each time I want to update the clock, I have to manually trigger the script. 

   

I have enclosed a capture where these scripts are located:

   

(the below code is for my first power meter):

Code:
require('luamodbus') mb = luamodbus.rtu() mb:open('/dev/RS485-1', 19200, 'E', 8, 1, 'H') mb:connect() mb:setslave(1) -- Enter the correct Modbus slave address of the kWh meter -- Function to get value as bits from registers function toBits(num,bits)     -- returns a table of bits, most significant first.     bits = bits or select(2,math.frexp(num))     local t={} -- will contain the bits             for b=bits,1,-1 do         t[b]=math.fmod(num,2)         num=(num-t[b])/2     end     return table.concat(t) end -- Get current data as table now = os.date('*t') -- Set date and time to command interface datanumber = 1003 reservedalways = '' mbyear = now.year     -- 2000–2099 Year mbmonth = now.month   -- 1–12 Month mbday = now.day       -- 1–31 Day mbhour = now.hour     -- 23 Hour mbminute = now.min    -- 0–59 Minute mbsecond = now.sec    -- 0–59 Second reserved_1 = ''       -- (Reserved) -- Write command to the command interface mb:writeregisters(5249, datanumber, reservedalways, mbyear, mbmonth, mbday, mbhour, mbminute, mbsecond, reserved_1) --max 123 parameters entered by , , , , --Register 5250 = Requested command, 5251 = Not used, 5252 = parameter 1 -- Get results of command interface action to set date and time r1, r2 = mb:readregisters(5374, 2) log ("Result Command: " .. r1 .. ": Set date and time") if r2 == 0 then   log ("Result = valid operation, success")  elseif r2 == 3000 then   log ("Result = invalid operation, failed") elseif r2 == 3001 then   log ("Result = invalid parameter(s), failed") elseif r2 == 3002 then   log ("Result = invalid number of parameters, failed") elseif r2 == 3002 then   log ("Result = invalid number of parameters, failed") elseif r2 == 3007 then   log ("Result = operation not perfomed, failed") end log ("Result Code: " .. r2) -- 0 = valid operation, 3000 = invalid Operation, 3001 = Invalid Parameter, 3002 = Invalid number of parameters, 3007 = Operation not perfomed -- Read result from meter: -- Get year year = mb:readregisters(1844, 1) -- Get Month, Weekday, Day month_weekday_day = mb:readregisters(1845, 1) month_weekday_day_bits = toBits(month_weekday_day,16) month = tonumber (string.sub(month_weekday_day_bits, 5, 8), 2) wday = tonumber (string.sub(month_weekday_day_bits, 9, 11), 2) day = tonumber (string.sub(month_weekday_day_bits, -5), 2) -- Get Hour, Minute hour_minute = mb:readregisters(1846, 1) hour_minute_bits = toBits(hour_minute,16) hour = tonumber (string.sub(hour_minute_bits, 4, 8), 2) minute = tonumber (string.sub(hour_minute_bits, -6), 2) -- Get Seconds (in milliseconds) second = mb:readregisters(1847, 1) / 1000 -- Set Human readable weekdays wdaytable = {   'sunday',   'monday',   'tuesday',   'wednesday',   'thursday',   'vriday',   'saterday', } -- Log result as human readable string log('current date in meter 1 is: ' .. wdaytable[wday] .. ' ' .. day .. '-' .. month .. '-20' .. string.format("%02d", year) .. ' ' .. string.format("%02d", hour) .. ':' .. string.format("%02d", minute) .. ':' .. string.format("%02d", second))  mb:close() -- Self disable of script script.disable(_SCRIPTNAME)


Can you please guide me regarding how I can set this script to automatically update the clock of my power meters, let's say, once per day? The script goes offline after each triggering and I cannot set it to be active (I might have added it on a wrong place and it should not be in Resident scripts).


Thank you,
Andreas


RE: Scripting / Resident / MODBUS RS-485 energy meter clock update - admin - 31.03.2019

Use scheduled script and remove the last line that disables the script itself.


RE: Scripting / Resident / MODBUS RS-485 energy meter clock update - andeug - 31.03.2019

(31.03.2019, 12:44)admin Wrote: Use scheduled script and remove the last line that disables the script itself.

I'll fix it now.

Regarding the below part of the code, I see some typos:

Code:
-- Set Human readable weekdays wdaytable = {   'sunday',   'monday',   'tuesday',   'wednesday',   'thursday',   'vriday',   'saterday', }

Is it correlated to something that part? I would rename two days into friday and saturday.


RE: Scripting / Resident / MODBUS RS-485 energy meter clock update - admin - 31.03.2019

This I'd only for debug logs, it does not affect script operation.