循环 – 用于在表中创建变量的Lua循环
发布时间:2020-12-14 21:43:48 所属栏目:大数据 来源:网络整理
导读:我在循环中有问题,Lua中的表 这是带变量knx的表(现在它是静态的) regTable = { { RegEddr=3027,count=2,regType="float",knx="1/1/1"},{ RegEddr=3029,knx="1/1/2"},{ RegEddr=3031,knx="1/1/3"},{ RegEddr=2999,knx="1/1/4"},{ RegEddr=3001,knx="1/1/5"},{
我在循环中有问题,Lua中的表
这是带变量knx的表(现在它是静态的) regTable = { { RegEddr=3027,count=2,regType="float",knx="1/1/1"},{ RegEddr=3029,knx="1/1/2"},{ RegEddr=3031,knx="1/1/3"},{ RegEddr=2999,knx="1/1/4"},{ RegEddr=3001,knx="1/1/5"},{ RegEddr=3003,knx="1/1/6"},{ RegEddr=3109,knx="1/1/7"},{ RegEddr=3083,knx="1/1/8"},{ RegEddr=3059,knx="1/1/9"},{ RegEddr=3203,count=4,regType="int64",knx="1/1/10"},} function readRegisters() for idx,register in pairs(regTable) do if register.regType=="int" then valueInt = mb:readregisters(register.RegEddr) grp.write(register.knx,valueInt) elseif register.regType=="float" then value1,value2 = mb:readregisters(register.RegEddr,register.count) if value1 then valueFloat = bit.lshift(value1,16) + value2 valueFloat = lmcore.inttohex(valueFloat,4) valueFloat = knxdatatype.decode(valueFloat,dt.float32) grp.write(register.knx,valueFloat) end elseif register.regType=="int64" then valueInt1,valueInt2,valueInt3,valueInt4 = mb:readregisters(register.RegEddr,register.count) if valueInt4 then valueInt64 = valueInt4 log(valueInt64) grp.write(register.knx,valueInt64) end end end --end for end --end function 从另一个脚本我调用函数readRegisters() 1/1/1 1/1/2 ... 1/1/255 有可能帮助我如何动态地将地址变量knx添加到此表中? 解决方法
您需要一个寄存器分配器功??能,它考虑了最后一个寄存器的地址和大小.此分配器将在您请求时动态创建新寄存器.
local startAddr = 3000 local sizes = {float = 2,int = 2,int64 = 4} local registers = {} local function allocRegister(type) if sizes[type] == nil then error'invalid register type' end local n = #registers local addr if n == 0 then -- If this is the first register,use the starting address. addr = startAddr else -- Determine the next starting address based on the last register's address & size. addr = registers[n].addr + registers[n].count end table.insert(registers,{ addr = addr,count = sizes[type],type = type,knx = '1/1/' .. n + 1 }) end -- Example usage: allocRegister'float' allocRegister'int64' allocRegister'int' -- Resulting table: { { addr = 3000,count = 2,knx = "1/1/1",type = "float" },{ addr = 3002,count = 4,knx = "1/1/2",type = "int64" },{ addr = 3006,knx = "1/1/3",type = "int" } } 您也可以在循环中使用此函数.以下循环将创建一个非常类似于您的问题中的寄存器表. for i=1,9 do allocRegister'float' end allocRegister'int64' 编辑:以下代码应足以说明如何解决您的问题. local sizes = {float = 2,int64 = 4} local registers = {} local usedSpace = {} local function allocRegisters(t) for i=1,#t do local addr,size = t[i].addr,sizes[t[i].type] if size == nil then error('invalid register type: ' .. t[i].type) end -- Check if there's free space for this register. for j=addr,addr+size-1 do if usedSpace[j] then error('address already in use: ' .. addr) end end -- Mark the space for this register as used. for j=addr,addr+size-1 do usedSpace[j] = true end -- Copy the register into the registers table,setting knx by using the length of the table. table.insert(registers,count = size,type = t[i].type,knx = '1/1/' .. #registers + 1}) end end -- Example usage: allocRegisters { { addr = 3000,type = 'float' },{ addr = 3003,type = 'int' },{ addr = 3009,type = 'int64' } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |