local function Checksum(chkbuf,buflen)
local xorconst = 0xA001
local sum = 0xFFFF
local max_len = #chkbuf
if buflen < max_len then
max_len = buflen
end
for i = 1,max_len do
sum = (sum~(0xFFFF&chkbuf[i]))
for Counter = 1,8,1 do
if(sum&0x01)~=0 then
sum = (sum>>1)~xorconst
else
sum = sum>>1
end
end
end
local sum1 = (sum & 0x00FF)
sum1 = sum1 << 8
sum1 = sum1 + (sum >> 8)
return sum1
end
function byteCDAB_ToFloat( byte_buff )
if byte_buff == nil then
return 0
end
local _byteCD = (byte_buff[1]<<8|byte_buff[2]);
local _byteAB = (byte_buff[3]<<8|byte_buff[4]);
local hexNums = (_byteAB<<16)|_byteCD;
local sign = math.modf(hexNums/(2^31))
local exponent = hexNums % (2^31)
exponent = math.modf(exponent/(2^23)) -127
local mantissa = hexNums % (2^23)
for i=1,23 do
mantissa = mantissa / 2
end
mantissa = 1+mantissa
local result = (-1)^sign * mantissa * 2^exponent
return result
end
function type57511_to_mb_rtu(raw_data)
if #raw_data<78 then
print("raw_data length less than 78")
return nil
end
buff4 = {raw_data[67],raw_data[68],raw_data[69],raw_data[70]}
TEMP = byteCDAB_ToFloat(buff4)
buff4 = {raw_data[71],raw_data[72],raw_data[73],raw_data[74]}
HeadWater = byteCDAB_ToFloat(buff4)
buff4 = {raw_data[75],raw_data[76],raw_data[77],raw_data[78]}
WaterLevel = byteCDAB_ToFloat(buff4)
reslt = {["TEMP"]=TEMP,["HeadWater"]=HeadWater,["WaterLevel"]=WaterLevel}
return reslt
end
function type57511_com_test ()
ret = {}
for i=1,198 do
ret[i]=i;
end
ret[67]=0x00
ret[68]=0x00
ret[69]=0x3F
ret[70]=0x00
ret[71]=0x99
ret[72]=0x9A
ret[73]=0x3F
ret[74]=0x19
ret[75]=0xCC
ret[76]=0xCD
ret[77]=0xBF
ret[78]=0x4C
local testSumVar = Checksum(ret,(#ret-2))
ret[#ret-1] = 0xFF&(testSumVar>>8)
ret[#ret] = 0xFF&testSumVar
if #ret < 78 then
print("Receive data length is less than 78")
return -5
end
local checkSumVar = Checksum(ret,(#ret-2))
local revSunVar = ((ret[#ret-1]&0x00FF)<<8 |(0x00FF&ret[#ret]))
if revSunVar~=checkSumVar then
print("Error Checksum.")
return -6
end
local decode_data = type57511_to_mb_rtu(ret)
if decode_data==nill then
print("Error to decode result.")
return -7
end
return decode_data
end
function main()
print("start.")
print(type57511_com_test())
print("end")
end
main()