//此文件内容都在CAN线程内 import usb2canfd; import thread.command; import win.timer; import thread.table; var thrdTable_CANHW = thread.table("CAN设备") //初始化CAN句柄对象 CANHw = usb2canfd.USB2CANHW(); CANHw.LoadDll(); DiagReqID = 0x720;//0x18dadff1; DiagRespID = 0x620;//0x18daf1df; DiagGloableID = 0x7DF;//0x18DB33F1; stopflag = 0; FuncSetID = function(req,rsp){ DiagReqID = req; DiagRespID = rsp; } //注册一个消息钩子函数 FuncLoopMsg = function(msg){ select(msg.message) { case 100 {//刷新硬件 FuncFreshHw(); } case 101 {//连接硬件 FuncConnect(msg.wParam,msg.lParam); } case 102 {//更改ID FuncSetID(msg.wParam,msg.lParam); } case 110 {//readDID FuncReadDID(msg.wParam); } case 111 { FuncReq10(false,msg.wParam); } case 112 { FuncReq28(msg.wParam); } case 113 { FuncReq85(msg.wParam); } case 114 { FuncReq27(msg.wParam); } case 115 { FuncReq3E(); } case 116 { FuncDIDWriteValue2B(msg.wParam,msg.lParam); } case 117 { FuncDIDWriteValue1B(msg.wParam,msg.lParam); } case 118 { FuncDIDWriteValue4B(msg.wParam,msg.lParam); } else { } } } FuncFreshHw = function(){ var hwnum = CANHw.FlashHw(); thrdTable_CANHW.clear(); if(hwnum == 0){ } else { FuncDisplay("找到硬件") var ret = CANHw.GetAvailableHW(); for(k,v in ret){ //console.log(v.name); thrdTable_CANHW.push(v.name); } } } FuncConnect = function(dev,chn){ var canfd = (chn&0x80)==0x80?true:false; var ret = CANHw.OpenDevice(dev,chn&0x7f,canfd); if(ret == 0){ FuncDisplay("连接成功"); //console.log("连接成功"); CANHw.GetAvailableHW(); thread.command.$Connected(); autoval1 = dev; autoval2 = chn; } else { FuncDisplay("连接失败"); //console.log("连接失败"); } } FuncDisplay = function(str){ thread.command.$Display(str);//"线程" + } loadcodex("\CANThread\Diag10code.aardio"); loadcodex("\CANThread\Diag11code.aardio"); loadcodex("\CANThread\Diag22code.aardio"); loadcodex("\CANThread\Diag27code.aardio"); loadcodex("\CANThread\Diag2Ecode.aardio"); loadcodex("\CANThread\Diag28code.aardio"); loadcodex("\CANThread\Diag7Fcode.aardio"); loadcodex("\CANThread\Diag85code.aardio"); FuncReq3E = function(){ var data = {0x02,0x3E,0x80,0, 0,0,0,0}; CANHw.SendMsg(DiagReqID,data); } RespState = 0; FuncDiagPro = function(diagmsg){ //console.log("发送数据"); thread.command.$LastDiagResp(diagmsg);//发送诊断数据 select(diagmsg.sid) { case 0x50 { FuncDiag10Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x62 { FuncDiag22Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x67 { FuncDiag27Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x74 { FuncDiag34Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x71 { FuncDiag31Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x76 { FuncDiag36Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x68 { FuncDiag28Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0xC5 { FuncDiag85Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x7F { FuncDiag7FPro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x6E { FuncDiag2EPro(table.slice(diagmsg.data,1,diagmsg.len)) } else { } } RespState = diagmsg.sid; } var PackNext = 0x21; var Packdata = {}; var PackID = 0; var FuncSendPackage = function(){ while(#Packdata > 0) { sleep(0.3); var data = {PackNext,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC}; var max = #Packdata > 7 ? 7 : #Packdata; for(i=1;max;1){ data[i+1] = table.remove(Packdata); } sleep(2); CANHw.SendMsg(PackID,data); PackNext += 1; if(PackNext > 0x2f){ PackNext = 0x20; } } } FuncPushPackage = function(ID,data){ PackNext = 0x21; Packdata = data; PackID = ID; } diagresp = {}; RxTask = function(){ ret = CANHw.GetMsg(); //console.log("报文=" ++ #ret); for(i=1;#ret;1){ //console.log("id = " + tostring(ret[i].id)) if(ret[i].id & 0x7FFFFFFF == DiagRespID){ if(ret[i].data[1] == 0x10){//首帧 var data = {0x30,0x00,0x14,0x00,0,0,0,0}; CANHw.SendMsg(DiagReqID,data); diagresp["sid"] = ret[i].data[3]; diagresp["len"] = ret[i].data[2]-1; diagresp["data"] = {}; diagresp["next"] = 0x21; table.append(diagresp["data"],table.slice(ret[i].data,4)); } elseif(ret[i].data[1] <= 0x07){//单帧 //console.dumpJson() diagresp["sid"] = ret[i].data[2]; diagresp["len"] = ret[i].data[1]-1; diagresp["data"] = table.slice(ret[i].data,3); FuncDiagPro(diagresp); } elseif(ret[i].data[1] >= 0x21 && ret[i].data[1] <= 0x2f){ if(ret[i].data[1] == diagresp["next"]){//多帧 diagresp["next"] += 1; if(diagresp["next"] >= 0x2F){ diagresp["next"] = 0x20; } table.append(diagresp["data"],table.slice(ret[i].data,2)); if(#diagresp["data"] >= diagresp["len"]){ FuncDiagPro(diagresp); } } } elseif(ret[i].data[1] == 0x30){// FuncSendPackage(); } } else { //console.varDump(ret[i].id); //显示报文 } RxPro(ret[i].id,ret[i].data); //console.varDump(ret[i].id); } } //自动重连 AutoReconnectCount=0; AutoReconnectTaks = function(){ AutoReconnectCount += 1; if(AutoReconnectCount > 100){ AutoReconnectCount = 0; var ret,DeviceInfo,str = CANHw.GetNowInfo(); //console.log("ret = " ++ ret); //console.dumpJson(DeviceInfo); //console.log(str); if(ret == 0){ FuncConnect(autoval1,autoval2); } } } loadcodex("\CANThread\CAN_Msg.aardio"); CT_timer = win.timer(,10); CT_timer.onTimer = function(){ if(CANHw.isConnected() == false){ return; } RxTask(); //console.log("发送报文"); TxTask(); AutoReconnectTaks(); } CT_timer.enable(); FuncDisplay("正在运行");