This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Write in a Single Bit of a Word
#1
Hello Everyone,
I have to write a single bit of a register with a boolean value.
Can you help me with a script?
In the attachment you can find the register that I have to use.
For example I have to command the Bit0



Thank you so much at all!

Luigi
Reply
#2
See this: https://forum.logicmachine.net/showthrea...9#pid15619
Reply
#3
(14.02.2020, 12:10)admin Wrote: See this: https://forum.logicmachine.net/showthrea...9#pid15619

Thanks for your reply, but I'm a beginner in this things.
Why I have to calculate the value of 3 object together? The post that you send me is good for 1 object also?
Thank you so much for your patience
Reply
#4
Example can be changed to accept any number of input objects.
If you want to convert boolean value to a number you can do this via an event script (1/1/2 is output object):
Code:
value = event.getvalue()
out = value and 1 or 0
grp.write('1/1/2', out)
Reply
#5
(14.02.2020, 12:15)admin Wrote: Example can be changed to accept any number of input objects.
If you want to convert boolean value to a number you can do this via an event script (1/1/2 is output object):
Code:
value = event.getvalue()
out = value and 1 or 0
grp.write('1/1/2', out)

Sorry, I explain all my situation so I can understand all better.
I have created a script that read all the bit of a register (in this case the register 1280):
Code:
require("user.GetBit")

local value
local Status
local Byte        -- Matrice di valori

--- Modbus ---
mb = require('mbproxy').new()
mb:setslave(1)

-- Lettura variabili ——
Status= mb:readregisters(1280) ---- Byte
--log (Status)
if Status ~= nil then
  Byte = {getbit(Status, 0),
    getbit(Status, 1),
    getbit(Status, 2),
    getbit(Status, 3),
    getbit(Status, 4),
    getbit(Status, 5),
    getbit(Status, 6),
    getbit(Status, 7),
    getbit(Status, 8),
    getbit(Status, 9),
    getbit(Status, 10),
    getbit(Status, 11),
    getbit(Status, 12),
    getbit(Status, 13),
    getbit(Status, 14),
    getbit(Status, 15)
  }
  log (Status)
    for i=0, 16, 1 do
      grp.update ('Stato.reg.1280_Bit' .. i ,Byte[i+1])
  end
end

mb:close()
so at my address 32/1/1 there is the boolean value of the Bit0 of the register 1280.
Now I have to command the Bit0 of the register n°1280 with a boolean value.
Can you please write me all the script, so I can write it for the other commands.
Thank you very much and sorry for bothering you.
Reply
#6
Read this thread https://forum.logicmachine.net/showthrea...5#pid11915
This should explain you all what Admin has in mind.
------------------------------
Ctrl+F5
Reply
#7
Thank you very much both!

So this script is correct if I wanna set Bit0 of register 1280 to 0 when 32/1/1's value is 1
Code:
function setbit(value, bitnr)
  local mask = bit.lshift(1, bitnr)
  return bit.bor(value, mask)
end

value = 0

if grp.getvalue('32/1/1') then
  value = setbit(value, 0)
end

log(value)

mb = require('mbproxy').new()
mb:setslave(1)

-- set register at address 1000 to 123
mb:writeregisters(1280, 0)


mb:close()
And another question the 123 near the code below what value is??
Code:
-- set register at address 1000 to 123
Reply
#8
This line is just the comment 123 is the value you write. in line 18 instead of 0 you should have value
------------------------------
Ctrl+F5
Reply
#9
Now I have to set bit 3 of register 1280 to 1

This is the right code?
Code:
require("user.SetBit")

mb = require('mbproxy').new()
mb:setslave(1)

value = 1

if grp.getvalue('32/1/29') then
  value = setbit(value, 3)
end

log(value)

mb:writeregisters(1280, value)

mb:close()
Thanks
Reply


Forum Jump: