|
|
1 新版本的设备,比如pcs主要使用一个canid;前面2个字节作为数据区分
2 旧版本的每个canid表示一个数据类型
local socket = require("socket")
local Redis = require("redis")
local DataLoader = dofile("/opt/luaems2.1/dataLoader.lua")
local ConstDefine = dofile("/opt/luaems2.1/constDefine.lua")
local LogMgr=dofile("/opt/luaems2.1/logmgr.lua")
--local DataLoader = require("dataLoader")
--local ConstDefine = require("constDefine")
local IdCmdtart=1
function GetNextCmdId()
IdCmdtart = IdCmdtart+1
return IdCmdtart
end
local params = {
host=ConstDefine.RdsIp,
port=ConstDefine.RdsPort
}
local redis = Redis.connect(params)
local redisCfg = Redis.connect(params)
local redisMq = Redis.connect(params)
redisCfg:select(2)
redisMq:select(1)
function string.split(str, reps)
local strlist = {}
string.gsub(str,'[^'..reps..']+',function ( w ) strlist[#strlist + 1] = w end)
return strlist
end
function get_time_diff_in_ms(start_time, end_time)
local diff_in_sec = os.difftime(end_time, start_time)
print('time diff ', diff_in_sec)
return diff_in_sec
end
function MakeRawCanCmd(ichannid, uid, bvalues, datalen) --设备自带的can
-- if 1 then print("当前can指令下发无效") return end
local int8_array = {}
-- 通过按位运算和掩码获取每个字节的值
for i = 1, 4 do
iDo = 4-i
local byte_value = bit32.band(bit32.rshift(uid, (iDo) * 8), 0xFF)
--local byte_value = (uid >> ((i - 1) * 8)) & 0xFF
table.insert(int8_array, byte_value)
end
for i, value in ipairs(bvalues) do
--print(string.format("Index %d: %d", i, value))
if i<=datalen then
table.insert(int8_array, value)
end
end
strcmd = ThefitPublic.int_table_to_hex_string(int8_array)
--print(strcmd)
redisMq:rpush(ConstDefine.RdsMq..'RawCan_'..ichannid, strcmd)
end
-- CAN ID构造器(29位有效位)返回int32位
local function MakeCANID_YingFeiYuan(err, devcode, cmd, dstaddr, srcaddr)
-- 验证输入范围
assert(err >= 0 and err < 8, "err must be 3 bits (0-7)")
assert(devcode >= 0 and devcode < 16, "devcode must be 4 bits (0-15)")
assert(cmd >= 0 and cmd < 64, "cmd must be 6 bits (0-63)")
assert(dstaddr >= 0 and dstaddr < 256, "dstaddr must be 8 bits (0-255)")
assert(srcaddr >= 0 and srcaddr < 256, "srcaddr must be 8 bits (0-255)")
-- 创建一个4字节的数组(32位,但只使用低29位)
local canid = {0, 0, 0, 0}
-- 构造29位CAN ID(最高3位为err,接着4位devcode,依此类推)
local value = (err << 26) | (devcode << 22) | (cmd << 16) | (dstaddr << 8) | srcaddr
-- 将29位值分解为4个字节(最高3位在第一个字节的高3位)
canid[1] = (value >> 24) & 0xFF -- 包含最高字节(实际只用了高3位)
canid[2] = (value >> 16) & 0xFF
canid[3] = (value >> 8) & 0xFF
canid[4] = value & 0xFF
return value
--return canid
end
-- 构造数据
function MakeCmdDoCtlCanCmd_YFYData(code1, code2, int32)
print('设置的值为:'..int32)
bcmd = {0,0,0,0,0,0,0,0}
local cur_byte_value1 = code1
local cur_byte_value2 = code2
local cur_byte_value3 = 0
local cur_byte_value4 = 0
local vol_byte_value1 = bit32.band(bit32.rshift(int32, 24), 0xFF)
local vol_byte_value2 = bit32.band(bit32.rshift(int32, 16), 0xFF)
local vol_byte_value3 = bit32.band(bit32.rshift(int32, 8), 0xFF)
local vol_byte_value4 = bit32.band(bit32.rshift(int32, 0), 0xFF)
bcmd[1] = cur_byte_value1
bcmd[2] = cur_byte_value2
bcmd[3] = cur_byte_value3
bcmd[4] = cur_byte_value4
bcmd[5] = vol_byte_value1
bcmd[6] = vol_byte_value2
bcmd[7] = vol_byte_value3
bcmd[8] = vol_byte_value4
return bcmd
end
function MakeCmdDoCtlCanCmd_YfyVolCur(iWantVol, iWantCur)
print('设置的电压为:'..iWantVol..'; 设置的电流为:'..iWantCur)
bcmd = {0,0,0,0,0,0,0,0}
local cur_byte_value1 = bit32.band(bit32.rshift(iWantCur, 24), 0xFF)
local cur_byte_value2 = bit32.band(bit32.rshift(iWantCur, 16), 0xFF)
local cur_byte_value3 = bit32.band(bit32.rshift(iWantCur, 8), 0xFF)
local cur_byte_value4 = bit32.band(bit32.rshift(iWantCur, 0), 0xFF)
local vol_byte_value1 = bit32.band(bit32.rshift(iWantVol, 24), 0xFF)
local vol_byte_value2 = bit32.band(bit32.rshift(iWantVol, 16), 0xFF)
local vol_byte_value3 = bit32.band(bit32.rshift(iWantVol, 8), 0xFF)
local vol_byte_value4 = bit32.band(bit32.rshift(iWantVol, 0), 0xFF)
bcmd[1] = vol_byte_value1
bcmd[2] = vol_byte_value2
bcmd[3] = vol_byte_value3
bcmd[4] = vol_byte_value4
bcmd[5] = cur_byte_value1
bcmd[6] = cur_byte_value2
bcmd[7] = cur_byte_value3
bcmd[8] = cur_byte_value4
return bcmd
end
--启动前清空一下内容
redisMq:del('LuaMq')
__IsRunOld = -1
__InitFadianji=0
__lastFadianjiDI1=nil
__FadianjiIFStart=0
-- 设置地址模式为设设备拨码
MakeRawCanCmd(1, 0x80000000+0x029F3FF0, {1,0,0,0, 0,0,0,0}, 8)
MakeRawCanCmd(1, 0x80000000+0x029F3FF0, {1,0,0,0, 0,0,0,0}, 8)
function DoCmdByCfg()
local acdcOutVol = tonumber(redisCfg:hget('SysCfg', 'Cfg_50000')) or 0
local acdcOutCur = tonumber(redisCfg:hget('SysCfg', 'Cfg_50001')) or 0
local acdcType = tonumber(redisCfg:hget('SysCfg', 'Cfg_50002')) or 0 --1 整流模式
local isStartAcdc = tonumber(redisCfg:hget('SysCfg', 'Cfg_50003')) or 0
local mpptVol = tonumber(redisCfg:hget('SysCfg', 'Cfg_50010')) or 0
local mpptCur = tonumber(redisCfg:hget('SysCfg', 'Cfg_50011')) or 0
local mpptIsStart = tonumber(redisCfg:hget('SysCfg', 'Cfg_50012')) or 0
redisCfg:hset('SysCfg', 'Cfg_50003', -1)-- 负1表示不执行动作
if isStartAcdc== 1 then
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),{0x11, 0x10,0,0, 0,0,0,0xa0},8)--开机
elseif isStartAcdc==0 then
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),{0x11, 0x10,0,0, 0,0,0,0xa1},8)--开机
else
print('acdc 不发生开关机')
end
--0xA0-整流(默认);
--0xA1-并网逆变;
--0xA2-离网逆变
if acdcType==1 then
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),{0x21, 0x10,0,0, 0,0,0,0xa0},8)--整流
elseif acdcType==2 then
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),{0x21, 0x10,0,0, 0,0,0,0xa1},8)--并网逆变
elseif acdcType==3 then
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),{0x21, 0x10,0,0, 0,0,0,0xa2},8)--离网逆变
else
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),MakeCmdDoCtlCanCmd_YFYData(0x10, 0x01, acdcOutVol*1000),8) --acdc 电压
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),MakeCmdDoCtlCanCmd_YFYData(0x10, 0x02, acdcOutCur*1000),8) --acdc 电流
--
--
if mpptIsStart==1 then
MakeRawCanCmd(2, 0x80000000+MakeCANID_YingFeiYuan(0,0X0A,0x1a, 0X81, 0XF0), {0,0,0,0, 0,0,0,0}, 8) -- 开机
elseif mpptIsStart==0 then
MakeRawCanCmd(2, 0x80000000+MakeCANID_YingFeiYuan(0,0X0A,0x1a, 0X81, 0XF0), {1,0,0,0, 0,0,0,0}, 8) -- 关机,关机发0
else
print('mppt 不动作')
end
local candata = MakeCmdDoCtlCanCmd_YfyVolCur(math.floor((setVol)*1000), math.floor(cur*1000))
MakeRawCanCmd(2,MakeCANID(0,0x0A,0x1b,0x81,0xf0), candata, 8)
end
while (true) do
--Loadfgs() -- 来自dataload模块
--HlpSec2IntArr24Hour() -- 来自dataload模块
--LoadRtData()
-- PubRunLoad()
--DoRunAir()
-- CheckGridInfo()
-- print('当前运行模式'..DataLoader.CurMode)
-- print('当前运行状态'..DataLoader.CurIsRun)
print("dcdc测试发送")
-- if DataLoader.RtIsFireStopSys==1 then
-- print('FireAlarm')
-- StopEms()
-- SetLight(0, 1)
-- goto continue
-- end
-- MakeRawCanCmd(2,0x80000000+0x02A43FF0,{0x11,0x10,0,0,0,0,0,0xA0},8)--发送DCDC开机指令
-- socket.select(nil, nil, 0.3)
local canid0 = MakeCANID_YingFeiYuan(0,0x0B,0x1A,0x00,0xF0)
print(string.format('canid %08X', canid0))
local canid1 = MakeCANID_YingFeiYuan(0,0x0B,0x1A,0x01,0xF0)
print(string.format('canid %08X', canid1) )
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x23,0x00,0xF0),{0x11,0x03,0,0, 0,0,0,0x0},8)
--设置500v
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),MakeCmdDoCtlCanCmd_YFYData(0x10, 0x01, 500*1000),8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x24,0x00,0xF0),MakeCmdDoCtlCanCmd_YFYData(0x10, 0x02, 5*1000),8)
socket.select(nil, nil, 1)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x23,0x00,0xF0),MakeCmdDoCtlCanCmd_YFYData(0x10, 0x01, 0),8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x23,0x00,0xF0),MakeCmdDoCtlCanCmd_YFYData(0x10, 0x02, 0),8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x23,0x00,0xF0),{0x21, 0x10,0,0, 0,0,0,0},8)--模式
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x23,0x00,0xF0),MakeCmdDoCtlCanCmd_YfyVolCur(),8)--模式
--
-- 读取dcdc模块
--
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x1,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x2,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x3,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x4,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x6,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x8,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0x9,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0xa,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
MakeRawCanCmd(6,0x80000000+MakeCANID_YingFeiYuan(0,0x0A,0xc,0x81,0xF0),{0,0,0,0, 0,0,0,0},8)
socket.select(nil, nil, 1)
--MakeRawCanCmd(6,0x80000000+0x02A33FF0,{0x11,0x34,0,0, 0,0,0,0xA3},8)
--socket.select(nil, nil, 0.3)
--MakeRawCanCmd(6,0x80000000+0x02A33FF0,{0x40,0x01,0,0, 0,0x08,0x64,0x70},8)
--socket.select(nil, nil, 0.3)
--MakeRawCanCmd(6,0x80000000+0x02A33FF0,{0x51,0x01,0,0, 0,0x08,0x64,0x70},8)
--socket.select(nil, nil, 0.3)
--MakeRawCanCmd(6,0x80000000+0x02A33FF0,{0x51,0x03,0,0, 0,0x03,0x0D,0x40},8)
--
--
--MakeRawCanCmd(6,0x80000000+0x02A300F0,{0x11,0x11,0,0, 0,0,0,0},8) --查询故障
--MakeRawCanCmd(6,0x80000000+0x02A300F0,{0x11,0x10,0,0, 0,0,0,0},8) --查询故障
-- MakeRawCanCmd(2,0x80000000+0x0A233FF0,{0x11,0x10,0,0, 0,0,0,0xA0},8) --查询故障
-- MakeRawCanCmd(2,0x80000000+0x0A233FF0,{0x11,0x11,0,0, 0,0,0,0xA0},8) --查询故障
socket.select(nil, nil, 1)
--if not os.execute("sleep 3") then break end
end
|
|