对机器人modbus读写带符号整数和浮点数

对modbus寄存器读写带符号整数和浮点数,可以参考以下代码:

--Author:chenliao@elibot.cn
--Aug.7,2023
function GetInt16FromModbus(startAdd)
    -- 读取modbus 1个16bit寄存器,并返回带符号的整数
    ret,result = modbus_read_register(ctx,startAdd)
    if result>32767 then
        result = result-65536
    end
    return result    
end

function SetInt16ToModbus(startAdd,value)
    -- 将带符号16位整数value赋值到地址add的modbus寄存器
    out= value & 65535
    ret1=modbus_write_register(ctx,startAdd,out)
end

function SetFloatToModbus(startAdd, value)
     -- 将浮点数value赋值到地址add开始的连续2个modbus寄存器
     out = string.pack('f',value)
     out = string.unpack('I4',out)
     
     low = out &65535
     high = (out>>16) &65535
    --  elite_print(low..','..high)
     ret1=modbus_write_registers(ctx,startAdd,2,{low,high})
    --  elite_print(ret1)
    --  ret1=modbus_write_register(ctx,startAdd+1,high)
end

function GetFloatFromModbus(startAdd)
    -- 从地址add开始的连续2个modbus寄存器读取数据(add地址为低字节,add+1为高字节),并返回浮点数value
    ret,low = modbus_read_register(ctx,startAdd)
    ret,high = modbus_read_register(ctx,startAdd+1)
    local out = (high<<16) | low
    out = string.pack('I4',out)
    out = string.unpack('f',out)
    return out
end

function SetInt32ToModbus(startAdd, value)
    -- 将带符号32位整数value 赋值到地址add开始的连续2个modbus寄存器,add地址为低字节,add+1为高字节
    low = value &65535
    high = (value>>16) &65535
    ret1=modbus_write_registers(ctx,startAdd,2,{low,high})

end

function GetInt32FromModbus(startAdd)
    -- 从地址add开始的连续2个modbus寄存器读取数据(add地址为低字节,add+1为高字节),并返回带符号32位整数
    ret,low = modbus_read_register(ctx,startAdd)
    ret,high = modbus_read_register(ctx,startAdd+1)
    -- elite_print(low..','..high)
    local out = (high<<16) | low
    out = string.pack('I4',out)
    out = string.unpack('i4',out)
    return out
end

sleep(0.3)
ip="192.168.1.200" --机器人本机ip
port=502
ctx=modbus_new_tcp(ip,port)
modbus_set_slave(ctx,1)
repeat
        ret=modbus_connect(ctx)       
until(ret~=-1)
elite_print('modbus连接成功')

while(true) do
    B001 = get_global_variable('B001')
    if(B001==1)  then
        in16 = GetInt16FromModbus(300)
        elite_print('获取到寄存器300的值为'..in16)
        set_global_variable('B001',0)
    end

    if(B001==2)  then
        in32 = GetInt32FromModbus(300)
        elite_print('获取到寄存器300-301的int32为'..in32)
        set_global_variable('B001',0)
    end

    if(B001==3)  then
        f = GetFloatFromModbus(300)
        elite_print('获取到寄存器300-301浮点数为'..f)
        set_global_variable('B001',0)
    end

    if(B001==4)  then
        SetInt16ToModbus(300,-16) --设置16位带符号整数
        elite_print('寄存器300设置为'..-16)
        set_global_variable('B001',0)
    end

    if(B001==5)  then
        SetInt32ToModbus(300,-70000) --地址300存储低字节, 301存储高字节,设置32位带符号整数
        elite_print('寄存器300-301设置为-70000')
        set_global_variable('B001',0)
    end

    if(B001==6)  then
        SetFloatToModbus(300,-1.987) --地址300存储低字节, 301存储高字节,设置32位浮点数
        elite_print('寄存器300-301设置为-1.987')
        set_global_variable('B001',0)
    end    
end

点击显示全文
赞同0
发表评论
分享

手机扫码分享
0
231
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
举报
请选择举报理由
举报
举报说明