查看: 1|回复: 0

英飞源can

[复制链接]

44

主题

2

回帖

164

积分

管理员

积分
164
发表于 1 小时前 | 显示全部楼层 |阅读模式

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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
返回顶部