Logic Machine Forum
Scripting / Resident / MODBUS RS-485 energy meter clock update - Printable Version

+- Logic Machine 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.