--m10k, each register is -9999~9999 function m2b(context, mvalue) --we define bigint as the endian of Modbus value local endian = context.bigint local bvalue = 0.0 for i = 1, context.regcnt, 1 do local first = mvalue:byte(i*2 - 1) local second = mvalue:byte(i*2) local each if endian % 2 == 0 then -- 2,4 each = first * 256 + second else -- 1 or 3 each = second * 256 + first end if each > 32767 then each = each - 65536 end --negative if each > 9999 or each < -9999 then return nil end if endian >= 3 then -- 3 or 4 each = each * 10000^(context.regcnt - i) else -- 1 or 2 each = each * 10000^(i - 1) end bvalue = bvalue + each end return bvalue; end function b2m(context, bvalue) local endian = context.bigint bvalue = math.floor(bvalue + 0.5) --round local mvalue = "" for i = 1, context.regcnt, 1 do local each = math.modf(bvalue / (10000^(context.regcnt - i))) if each > 9999 then each = 9999 elseif each < -9999 then each = -9999 end bvalue = bvalue - each * (10000^(context.regcnt - i)) if each < 0 then each = each + 65536 end --negative local high = each // 256 local low = each % 256 local regstr if endian % 2 == 0 then -- 2 or 4 regstr = string.char(high, low) else -- 1 or 3 regstr = string.char(low, high) end if endian > 2 then --3 or 4 mvalue = mvalue .. regstr else mvalue = regstr .. mvalue end end return mvalue end return m2b, b2m