require "internal_api" require "log" require "sys" require "utils" require "patch" require "fs" siganl = require 'posix.signal' syswait = require 'posix.sys.wait' unistd = require 'posix.unistd' mqtt=require "mosquitto" lpack=require("lua_pack") base64=require("base64") dyutils=require("dyutils") math=require("math") cjson=require("cjson") require"lsqlite3" RACK_PATH = "/app/rack/" DB_FILE = RACK_PATH .. "racks.db" LOG_LEVEL = log.LOGLEVEL_TRACE -------------------------[全局参数定义]------------------------- BATT_TEMP_COUNT = 64 BATT_VOL_COUNT = 64 RETRANS_INTERVAL= 30 --重传间隔 DB_CLEAN_INTERVAL=60*60 --计算间隔 -- DEVICE_OFFLINE_TIME = 20*60 DEVICE_OFFLINE_TIME = 20*60 -- 判断离线时间 cluster_obj={} pack_status_obj={} pack_data_obj={} pack_alarm_obj={} alarm_tab= { {"BMU硬件故障","BMUHWFault",9}, {"BCU硬件故障","BCUHWFault",9}, {"熔断器故障","FuseProtectorFault",9}, {"接触器粘连故障","ContactorAdhesionFault",9}, {"BMU通信故障","BMUCommFault",9}, {"BAU通信故障","BAUCommFault",9}, {"电流传感器故障","CurrentSensorFault",9}, {"绝缘监测设备故障","IMDFault",9}, {"隔开开关异常断开","DisconnectorOpen",9}, {"总电压过压一级报警","RackVolHighWarm",1}, {"总电压欠压一级报警","RackVolLowWarm",1}, {"单体过压一级报警","CellVolHighWarm",1}, {"单体电压欠压一级报警","CellVolLowWarm",1}, {"放电电流过大一级报警","DsgOverCurrWarn",1}, {"充电电流过大一级报警","ChgOverCurrWarn",1}, {"放电电池过温一级报警","DsgTempHighWarn",1}, {"放电电池欠温一级报警","DsgTempLowWarn",1}, {"充电电池过温一级报警","ChgTempHighWarn",1}, {"充电电池欠温一级报警","ChgTempLowWarn",1}, {"绝缘阻值过低一级报警","InsulationLowWarn",1}, {"极柱温度过高一级报警","TerminalTempHighWarm",1}, {"高压箱连接器温度过高一级报警","HVBTempHighWarm",1}, {"总电压过压二级报警","RackVolHighAlarm",2}, {"总电压欠压二级报警","RackVolLowAlarm",2}, {"单体过压二级报警","CellVolHighAlarm",2}, {"单体欠压二级报警","CellVolLowAlarm",2}, {"放电电流过大二级报警","DsgOverCurrAlarm",2}, {"充电电流过大二级报警","ChgOverCurrAlarm",2}, {"放电电池过温二级报警","DsgTempHighAlarm",2}, {"放电电池欠温二级报警","DsgTempLowAlarm",2}, {"充电电池过温二级报警","ChgTempHighAlarm",2}, {"充电电池欠温二级报警","ChgTempLowAlarm",2}, {"绝缘阻值过低二级报警","InsulationLowAlarm",2}, {"极柱温度过高二级报警","TerminalTempHighWarn",2}, {"高压箱连接器温度过高二级报警","HVBTempHighAlarm",2}, {"总电压过压三级报警","RackVolHighCriticalAlarm",3}, {"总电压欠压三级报警","RackVolLowCriticalAlarm",3}, {"单体过压三级报警","CellVolHighCriticalAlarm",3}, {"单体欠压三级报警","CellVolLowCriticalAlarm",3}, {"放电电流过大三级报警","DsgOverCurrCriticalAlarm",3}, {"充电电流过大三级报警","ChgOverCurrCriticalAlarm",3}, {"放电电池过温三级报警","DsgTempHighCriticalAlarm",3}, {"放电电池欠温三级报警","DsgTempLowCriticalAlarm",3}, {"充电电池过温三级报警","ChgTempHighCriticalAlarm",3}, {"充电电池欠温三级报警","ChgTempLowCriticalAlarm",3}, {"绝缘阻值过低三级报警","InsulationLowCriticalAlarm",3}, {"极柱温度过高三级报警","TerminalTempHighCriticalAlarm",3}, {"高压箱连接器温度过高三级报警","HVBTempHighCriticalAlarm",3} } local function handler() local pid, status, code = syswait.wait(-1, syswait.WNOHANG) log.error('system exit', pid, status, code) --打印不出来 os.exit(0) end local function replyRackListRequest(gw_sn,dev_sn,port,identifier,param,mi) local obj={Racks={}} for k,v in pairs(pack_data_obj) do if v then local tags={} tags.RackRunState = v.RackRunState tags.RackTotalVoltage = v.RackTotalVoltage tags.RackTotalCurrent = v.RackTotalCurrent tags.RackSoc = v.RackSoc tags.RackSoh = v.RackSoh tags.RackChargeState = v.RackChargeState tags.PositiveContactorState = v.PositiveContactorState tags.PreContactorState = v.PreContactorState table.insert(obj.Racks,{sn=k,tags=tags}) end end internal_api.service_response(gw_sn,dev_sn,port,identifier,obj,mi) end local function replyImmediateAlarm(gw_sn,dev_sn,port,identifier,param,mi) local obj={alarmlist={}} local sql sql = string.format("SELECT sn,rackid,settime,clrtime,alarmid FROM alarm where clrtime is null group by rackid,alarmid order by id desc limit 0,200") log.info("db fetch history sql:",sql) for dev_sn,rackid,st,ct,alarmid in db:urows(sql) do if not rackid or not st or not alarmid then log.error("db",db:errcode(),db:errmsg()) break end local desc= string.format("Rack %d %s",rackid,alarm_tab[alarmid][1]) table.insert(obj.alarmlist,{sn=dev_sn,settime=st,description=desc}) end internal_api.service_response(gw_sn,dev_sn,port,identifier,obj,mi) end local function replyHistoryAlarm(gw_sn,dev_sn,port,identifier,param,mi) local obj={alarmlist={}} local sql sql = string.format("SELECT sn,rackid,settime,clrtime,alarmid FROM alarm where clrtime > 0 group by rackid,alarmid order by id desc limit 0,200") log.info("db fetch history sql:",sql) for dev_sn,rackid,st,ct,alarmid in db:urows(sql) do if not rackid or not st or not ct or not alarmid then log.error("db",db:errcode(),db:errmsg()) break end local desc= string.format("Rack %d %s",rackid,alarm_tab[alarmid][1]) table.insert(obj.alarmlist,{sn=dev_sn,settime=st,clrtime=ct,description=desc}) end internal_api.service_response(gw_sn,dev_sn,port,identifier,obj,mi) end local function db_autoclean() db:exec('delete from alarm where settime= DB_CLEAN_INTERVAL then db_autoclean() end end end) --启动系统框架 sys.init(0, 0) sys.run() end main(arg[1],arg[2])