用lua生成modbus协议中的ascii模式的1363格式(适合爱默生公司的ups或者空调之类的协议命令)

--协议格式
local str = "7E 32 31 30 31 36 30 00 00 30 30 30 30 00 00 00 00 0D"

local var = {}
local addr = ""

--通过命令行参数获取CID2的参数
for i, v in pairs(arg) do
    if i > 0 then
        addr = v
    end
end


--把var的字符插入到var这个table中
for w in string.gfind(str, "%S+") do
    table.insert(var, w);
end

--往var这个table中的合适位置插入CID2的参数
var[8] = string.format("%02x", string.byte(addr, 1))
var[9] = string.format("%02x", string.byte(addr, 2))

print("---------------------")

local newstr = ""


--校验checksum
local sum = 0
local t_begin = 2
local t_end = 13
for i = t_begin, t_end do
    sum  = sum + tonumber("0x" .. var[i])
end

local checksum = 65536 - sum

local code = (string.format("%04x", checksum))


--当ascii为'a'-'z'时应该转化为'A'-'Z',在这里没有做错误处理
local a = string.byte(code, 1)
if a >= 97 then
    a = a - 32
end
local b = string.byte(code, 2)
if b >= 97 then
    b = b - 32
end
local c = string.byte(code, 3)
if c >= 97 then
    c = c -32
end
local d = string.byte(code, 4)
if d >= 97 then
    d = d - 32
end

--往var这个table合适位置插入校验码
var[14] = string.format("%02x", a)
var[15] = string.format("%02x", b)
var[16] = string.format("%02x", c)
var[17] = string.format("%02x", d)

local str = ""
for k, v in pairs(var) do
    str = str .. v .. " "
end

--打印出正确的协议命令
print(str)








你可能感兴趣的:(Lua)