实例介绍
【实例简介】
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
/*------------兼容ZLG的数据类型---------------------------------*/
//1.ZLGCAN系列接口卡信息的数据类型。
public struct VCI_BOARD_INFO
{
public UInt16 hw_Version;
public UInt16 fw_Version;
public UInt16 dr_Version;
public UInt16 in_Version;
public UInt16 irq_Num;
public byte can_Num;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=20)] public byte []str_Serial_Num;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
public byte[] str_hw_Type;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] Reserved;
}
/////////////////////////////////////////////////////
//2.定义CAN信息帧的数据类型。
unsafe public struct VCI_CAN_OBJ //使用不安全代码
{
public uint ID;
public uint TimeStamp; //时间标识
public byte TimeFlag; //是否使用时间标识
public byte SendType; //发送标志。保留,未用
public byte RemoteFlag; //是否是远程帧
public byte ExternFlag; //是否是扩展帧
public byte DataLen; //数据长度
public fixed byte Data[8]; //数据
public fixed byte Reserved[3];//保留位
}
//3.定义初始化CAN的数据类型
public struct VCI_INIT_CONFIG
{
public UInt32 AccCode;
public UInt32 AccMask;
public UInt32 Reserved;
public byte Filter; //0或1接收所有帧。2标准帧滤波,3是扩展帧滤波。
public byte Timing0; //波特率参数,具体配置,请查看二次开发库函数说明书。
public byte Timing1;
public byte Mode; //模式,0表示正常模式,1表示只听模式,2自测模式
}
/*------------其他数据结构描述---------------------------------*/
//4.USB-CAN总线适配器板卡信息的数据类型1,该类型为VCI_FindUsbDevice函数的返回参数。
public struct VCI_BOARD_INFO1
{
public UInt16 hw_Version;
public UInt16 fw_Version;
public UInt16 dr_Version;
public UInt16 in_Version;
public UInt16 irq_Num;
public byte can_Num;
public byte Reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)] public byte []str_Serial_Num;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] str_hw_Type;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] str_Usb_Serial;
}
/*------------数据结构描述完成---------------------------------*/
public struct CHGDESIPANDPORT
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] szpwd;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] szdesip;
public Int32 desport;
public void Init()
{
szpwd = new byte[10];
szdesip = new byte[20];
}
}
namespace WindowsApplication1
{
public partial class mainPage : Form
{
const int DEV_USBCAN = 3;
const int DEV_USBCAN2 = 4;
static string text1 = " ";
static string currerror1 = "";
/// <summary>
///
/// </summary>
/// <param name="DeviceType"></param>
/// <param name="DeviceInd"></param>
/// <param name="Reserved"></param>
/// <returns></returns>
/*------------兼容ZLG的函数描述---------------------------------*/
[DllImport("controlcan.dll")]
static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_CloseDevice(UInt32 DeviceType, UInt32 DeviceInd);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_InitCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_INIT_CONFIG pInitConfig);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_ReadBoardInfo(UInt32 DeviceType, UInt32 DeviceInd, ref VCI_BOARD_INFO pInfo);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_GetReceiveNum(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_ClearBuffer(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_StartCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_ResetCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_Transmit(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pSend, UInt32 Len);
[DllImport("controlcan.dll")]
//static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pReceive, UInt32 Len, Int32 WaitTime);
static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, IntPtr pReceive, UInt32 Len, Int32 WaitTime);
/*------------其他函数描述---------------------------------*/
[DllImport("controlcan.dll")]
static extern UInt32 VCI_ConnectDevice(UInt32 DevType,UInt32 DevIndex);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_UsbDeviceReset(UInt32 DevType,UInt32 DevIndex,UInt32 Reserved);
[DllImport("controlcan.dll")]
static extern UInt32 VCI_FindUsbDevice(ref VCI_BOARD_INFO1 pInfo);
/*------------函数描述结束---------------------------------*/
static UInt32 m_devtype = 4;//USBCAN2
static UInt32 m_bOpen = 0;
// CAN接收使能
static UInt32 m_bRec = 1;
static UInt32 m_bDisplay = 1;
static UInt32 m_devind = 0;
static UInt32 m_canind = 0;
// 数据存储使能
public static UInt32 m_DatStoreEnable = 0;
// 数据存储时间间隔,以ms为单位
public static Double m_DatStoreInterval = 1000;
// CAN升级时的数据包发送间隔
public static Byte CANupdateTimeInterval = 0;
// 每组最多单体数
UInt32 m_bMaxCellNum = 60;
// 每组最多温度数
UInt32 m_bMaxTmpNum = 20;
VCI_CAN_OBJ[] m_recobj = new VCI_CAN_OBJ[1000];
UInt32[] m_arrdevtype = new UInt32[20];
public static string user = mainPage.text1; //接收CAN信号
public static string CurrErroruser = mainPage.currerror1; //当前故障信息
public static int recTimerEnable = 1; //接收CAN使能
//申明全局变量。
byte[] BinBuffer = new byte[1024 * 1024 * 50];
public mainPage()
{
InitializeComponent();
user = mainPage.text1;
Control.CheckForIllegalCrossThreadCalls = false;
timer_rec.Enabled = false;
timer_send.Enabled = true;
timer_updata.Enabled = false;
timer_save.Enabled = true;
}
public static void ModelParamResverdSet()
{
mainPage.bmsu.BattGroupNumber = 2;
mainPage.bmsu.TempNumOneGroup = 12;
mainPage.bmsu.Bsu[0].Type = 3;
mainPage.bmsu.Bsu[0].Num = 48;
mainPage.bmsu.Bsu[0].TmpNum = 12;
mainPage.bmsu.Bsu[0].InvalidNum = 0;
mainPage.bmsu.BSUNum = 2;
mainPage.bmsu.Bsu[1].Type = 3;
mainPage.bmsu.Bsu[1].Num = 47;
mainPage.bmsu.Bsu[1].TmpNum = 12;
mainPage.bmsu.Bsu[1].InvalidNum = 0;
}
private void Form1_Load(object sender, EventArgs e)
{
ModelParamResverdSet();
mainPage.CANupdateTimeInterval = 2;
comboBox1.SelectedIndex = 2;//波特率250kbit/s
comboBox_DevIndex.SelectedIndex = 0;//设备索引号,挂载的CAN设备序号
comboBox_CANIndex.SelectedIndex = 0; ///CAN通道
CurPageIndex = Page_Main;
mainPage.BMSInfoSendEnable = 1;
// comboBox_Filter.SelectedIndex = 0; //接收所有类型
comboBox_SendType.SelectedIndex = 0; //0:正常工作模式
comboBox_FrameFormat.SelectedIndex = 0; //帧格式,0:数据帧
comboBox_FrameType.SelectedIndex = 1;////帧类型,1:扩展帧
textBox_ID.Text = "00000123";
textBox_Data.Text = "00 01 02 03 04 05 06 07 ";
//
Int32 curindex = 0;
comboBox_devtype.Items.Clear();
curindex = comboBox_devtype.Items.Add("DEV_USBCAN");
m_arrdevtype[curindex] = DEV_USBCAN;
//comboBox_devtype.Items[2] = "VCI_USBCAN1";
//m_arrdevtype[2]= VCI_USBCAN1 ;
curindex = comboBox_devtype.Items.Add("DEV_USBCAN2");
m_arrdevtype[curindex] = DEV_USBCAN2 ;
//comboBox_devtype.Items[3] = "VCI_USBCAN2";
//m_arrdevtype[3]= VCI_USBCAN2 ;
comboBox_devtype.SelectedIndex = 1;///////////////////类型
comboBox_devtype.MaxDropDownItems = comboBox_devtype.Items.Count;
label4.Text = "未连接";//显示设备连接状况
label4.BackColor = System.Drawing.Color.Red;
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (m_bOpen==1)
{
VCI_CloseDevice(m_devtype, m_devind);
}
}
private void buttonConnect_Click(object sender, EventArgs e)
{
if (m_bOpen==1)
{
VCI_CloseDevice(m_devtype, m_devind);
m_bOpen = 0;
label4.Text = "未连接";
label4.BackColor = System.Drawing.Color.Red;
//label4.ForeColor = System.Drawing.Color.Red;
}
else
{
m_devtype = m_arrdevtype[comboBox_devtype.SelectedIndex];
m_devind=(UInt32)comboBox_DevIndex.SelectedIndex;
m_canind = (UInt32)comboBox_CANIndex.SelectedIndex;
if (VCI_OpenDevice(m_devtype, m_devind, 0) == 0)
{
MessageBox.Show("打开设备失败,请检查设备类型和设备索引号是否正确", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
m_bOpen = 1;
VCI_INIT_CONFIG config=new VCI_INIT_CONFIG();
config.AccCode = 0x00000000;
config.AccMask = 0xFFFFFFFF;
string txt = comboBox1.Text;
if (txt == "125kbit/s")
{
config.Timing0 = 0X03;
config.Timing1 = 0X1C;
}
else if (txt == "250kbit/s")
{
config.Timing0 = 0X01;
config.Timing1 = 0X1C;
}
else if (txt == "500kbit/s")
{
config.Timing0 = 0X00;
config.Timing1 = 0X1C;
}
else if (txt == "1000kbit/s")
{
config.Timing0 = 0X00;
config.Timing1 = 0X14;
}
config.Filter = 1;// (Byte)(comboBox_Filter.SelectedIndex 1);
config.Mode = (Byte)comboBox_SendType.SelectedIndex;
VCI_InitCAN(m_devtype, m_devind, m_canind, ref config);
VCI_StartCAN(m_devtype, m_devind, m_canind);
// 开启接收定时器
timer_rec.Enabled = true;
label4.Text = "连接中";//////////////////////////////////////////////////////////////////////////////////////
//label4.ForeColor = System.Drawing.Color.LawnGreen;
label4.BackColor = System.Drawing.Color.LawnGreen;
}
buttonConnect.Text = m_bOpen==1?"断开设备":"连接设备";
timer_rec.Enabled = m_bOpen==1?true:false;
if (m_bOpen == 0)
{
//label4.Text = "断开中";
Resultlabel.Text = "";
Resultlabel.BackColor = System.Drawing.Color.Red;
}
}
int savedatatime = 0;
private void timer_save_Tick(object sender, EventArgs e)
{
this.timer_save.Interval = (int)mainPage.m_DatStoreInterval;
if (mainPage.m_DatStoreEnable == 1)
{
//savedata();
savedatatime ;
}
}
#region 系统成员变量
public static BMSU bmsu = new BMSU();
public static float[] cellTemp = new float[200];
public static float[] cellVolt = new float[6000];
public static float[] cellTemp1 = new float[2000];
public static float[] balCurrt = new float[600];
public static float[] balState = new float[600];
public static string Tempup1 = null;
public static string Tempup1addr = null;
public static string Tempup2 = null;
public static string Tempup2addr = null;
public static string Tempup3 = null;
public static string Tempup3addr = null;
public static string Tempup4 = null;
public static string Tempup4addr = null;
public static string Templow1 = null;
public static string Templow1addr = null;
public static string Templow2 = null;
public static string Templow2addr = null;
public static string Templow3 = null;
public static string Templow3addr = null;
public static string Templow4 = null;
public static string Templow4addr = null;
public static string Voltup1 = null;
public static string Voltup1addr = null;
public static string Voltup2 = null;
public static string Voltup2addr = null;
public static string Voltup3 = null;
public static string Voltup3addr = null;
public static string Voltup4 = null;
public static string Voltup4addr = null;
public static string Voltlow1 = null;
public static string Voltlow1addr = null;
public static string Voltlow2 = null;
public static string Voltlow2addr = null;
public static string Voltlow3 = null;
public static string Voltlow3addr = null;
public static string Voltlow4 = null;
public static string Voltlow4addr = null;
#endregion
#region 系统升级使用相关变量
byte[] Frame1C8data = new byte[8];
byte[] Frame1C9data = new byte[8];
// 0:IDDLE 1:主控触发升级 2:从控发送获取数据指令 3:主控回应从控指令 4:32帧数据传输 5:升级完成
byte UpdateStep = 0;
// 0:正常工作模式 1:升级模式
byte UpdateStus = 0;
// bin文件的偏移地址
UInt32 ulImageAddr = 0;
// 获取的字节数
UInt16 uiLength = 0;
// 要升级的测控的地址
byte LcuAddrForUpdate = 255;
byte g_u8SelfAddr = 0xF0;
// bin文件的大小
Int32 g_ui32LCUsize = 0;
public const int Page_Main = 0;
const int Page_FormSysParam = 1;
const int Page_Charger = 2;
const int Page_CellInfo = 3;
const int Page_CANParam = 4;
const int Page_Calibration = 5;
const int Page_BMUParam = 6;
const int Page_DataStore = 7;
const int Page_batGroup = 8;
const int Page_Debug = 9;
const int Page_CellCalibration = 10;
const int Page_PVDebug = 11;
const int Page_BMSFactoryInfo = 12;
// 当前页面索引,向BMS发送当前索引,BMS根据页面索引发送数据包
public static byte CurPageIndex = Page_Main;
#endregion
/*
unsafe private void chk_SpecialFrame(string id, string strinfo)
{
// 判断是否显示特定帧,用于识别CAN2和CAN3的数据包
string frameID = "";
if (textBoxID1.Text != "")
{
frameID = Convert.ToString(textBoxID1.Text);
if (frameID.Contains(id))
{
textBoxID1Rec.Text = strinfo;
textBoxID1Cnt.Text = Convert.ToString((Convert.ToUInt32(textBoxID1Cnt.Text)) 1);
}
}
if (textBoxID2.Text != "")
{
frameID = Convert.ToString(textBoxID2.Text);
if (frameID.Contains(id))
{
textBoxID2Rec.Text = strinfo;
textBoxID2Cnt.Text = Convert.ToString((Convert.ToUInt32(textBoxID2Cnt.Text)) 1);
}
}
}*/
// 获取CAN数据帧中的字节流,转换为温度数据
private float get_tmp(byte high, byte low)
{
byte[] tmpByte = new byte[2];
Int16 itmp16 = 0;
tmpByte[0] = low;
tmpByte[1] = high;
itmp16 = BitConverter.ToInt16(tmpByte, 0);
return Convert.ToSingle(itmp16) / 100;
}
unsafe private void get_36Info(int modenum, VCI_CAN_OBJ obj)
{
#region 36串采样板数据接收
switch (obj.Data[3])
{
// 36串单体信息
case 0x05:
cellVolt[modenum * m_bMaxCellNum 0] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 1] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x06:
cellVolt[modenum * m_bMaxCellNum 2] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 3] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x07:
cellVolt[modenum * m_bMaxCellNum 4] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 5] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x08:
cellVolt[modenum * m_bMaxCellNum 6] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 7] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x09:
cellVolt[modenum * m_bMaxCellNum 8] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 9] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0A:
cellVolt[modenum * m_bMaxCellNum 10] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 11] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0B:
cellVolt[modenum * m_bMaxCellNum 12] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 13] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0C:
cellVolt[modenum * m_bMaxCellNum 14] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 15] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x13:
cellVolt[modenum * m_bMaxCellNum 16] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 17] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x14:
cellVolt[modenum * m_bMaxCellNum 18] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 19] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x15:
cellVolt[modenum * m_bMaxCellNum 20] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 21] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x16:
cellVolt[modenum * m_bMaxCellNum 22] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 23] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x17:
cellVolt[modenum * m_bMaxCellNum 24] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 25] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x18:
cellVolt[modenum * m_bMaxCellNum 26] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 27] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x19:
cellVolt[modenum * m_bMaxCellNum 28] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 29] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x1A:
cellVolt[modenum * m_bMaxCellNum 30] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 31] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x1B:
cellVolt[modenum * m_bMaxCellNum 32] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 33] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x1C:
cellVolt[modenum * m_bMaxCellNum 34] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 35] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
// 36串温度信息
case 0x03:
cellTemp1[modenum * m_bMaxTmpNum 0] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 1] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x04:
cellTemp1[modenum * m_bMaxTmpNum 2] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 3] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0D:
cellTemp1[modenum * m_bMaxTmpNum 4] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 5] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0E:
cellTemp1[modenum * m_bMaxTmpNum 6] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 7] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0F:
cellTemp1[modenum * m_bMaxTmpNum 8] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 9] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x10:
cellTemp1[modenum * m_bMaxTmpNum 10] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 11] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x11:
cellTemp1[modenum * m_bMaxTmpNum 12] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 13] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x12:
cellTemp1[modenum * m_bMaxTmpNum 14] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 15] = get_tmp(obj.Data[6], obj.Data[7]);
break;
// 36串均衡信息
// 36串单体测量状态
// 36串温度测量状态
default:
break;
}
#endregion
}
unsafe private void get_LbInfo(int modenum, VCI_CAN_OBJ obj)
{
#region 主动均衡采样板数据接收(最大支持16个单体,16个温度)
switch (obj.Data[3])
{
// 主动均衡单体信息
case 0x05:
cellVolt[modenum * m_bMaxCellNum 0] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 1] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x06:
cellVolt[modenum * m_bMaxCellNum 2] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 3] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x07:
cellVolt[modenum * m_bMaxCellNum 4] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 5] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x08:
cellVolt[modenum * m_bMaxCellNum 6] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 7] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x09:
cellVolt[modenum * m_bMaxCellNum 8] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 9] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0A:
cellVolt[modenum * m_bMaxCellNum 10] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 11] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0B:
cellVolt[modenum * m_bMaxCellNum 12] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 13] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0C:
cellVolt[modenum * m_bMaxCellNum 14] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 15] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
// 主动均衡温度信息
case 0x03:
cellTemp1[modenum * m_bMaxTmpNum 0] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 1] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x04:
cellTemp1[modenum * m_bMaxTmpNum 2] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 3] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0D:
cellTemp1[modenum * m_bMaxTmpNum 4] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 5] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0E:
cellTemp1[modenum * m_bMaxTmpNum 6] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 7] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0F:
cellTemp1[modenum * m_bMaxTmpNum 8] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 9] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x10:
cellTemp1[modenum * m_bMaxTmpNum 10] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 11] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x11:
cellTemp1[modenum * m_bMaxTmpNum 12] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 13] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x12:
cellTemp1[modenum * m_bMaxTmpNum 14] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 15] = get_tmp(obj.Data[6], obj.Data[7]);
break;
// 主动均衡均衡信息
//主动均衡单体测量状态
// 主动均衡温度测量状态
default:
break;
}
#endregion
}
unsafe private void get_48Info(int modenum, VCI_CAN_OBJ obj)
{
#region 48串采样板数据接收
switch (obj.Data[3])
{
// 48串单体信息
case 0x05:
cellVolt[modenum * m_bMaxCellNum 0] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 1] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
//textBox1.Text = "123456";
//textBox1.Text = Convert.ToString(cellVolt[modenum * m_bMaxCellNum 1]);
break;
case 0x06:
cellVolt[modenum * m_bMaxCellNum 2] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 3] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x07:
cellVolt[modenum * m_bMaxCellNum 4] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 5] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x08:
cellVolt[modenum * m_bMaxCellNum 6] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 7] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x09:
cellVolt[modenum * m_bMaxCellNum 8] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 9] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0A:
cellVolt[modenum * m_bMaxCellNum 10] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 11] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0B:
cellVolt[modenum * m_bMaxCellNum 12] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 13] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x0C:
cellVolt[modenum * m_bMaxCellNum 14] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 15] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x13:
cellVolt[modenum * m_bMaxCellNum 16] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 17] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x14:
cellVolt[modenum * m_bMaxCellNum 18] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 19] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x15:
cellVolt[modenum * m_bMaxCellNum 20] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 21] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x16:
cellVolt[modenum * m_bMaxCellNum 22] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 23] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x17:
cellVolt[modenum * m_bMaxCellNum 24] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 25] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x18:
cellVolt[modenum * m_bMaxCellNum 26] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 27] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x19:
cellVolt[modenum * m_bMaxCellNum 28] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 29] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x1A:
cellVolt[modenum * m_bMaxCellNum 30] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 31] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x1E:
cellVolt[modenum * m_bMaxCellNum 32] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 33] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x1F:
cellVolt[modenum * m_bMaxCellNum 34] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 35] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x20:
cellVolt[modenum * m_bMaxCellNum 36] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 37] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x21:
cellVolt[modenum * m_bMaxCellNum 38] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 39] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x22:
cellVolt[modenum * m_bMaxCellNum 40] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 41] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x23:
cellVolt[modenum * m_bMaxCellNum 42] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 43] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x24:
cellVolt[modenum * m_bMaxCellNum 44] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 45] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
case 0x25:
cellVolt[modenum * m_bMaxCellNum 46] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
cellVolt[modenum * m_bMaxCellNum 47] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
break;
#region 48串温度信息
case 0x03:
cellTemp1[modenum * m_bMaxTmpNum 0] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 1] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x04:
cellTemp1[modenum * m_bMaxTmpNum 2] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 3] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0D:
cellTemp1[modenum * m_bMaxTmpNum 4] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 5] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0E:
cellTemp1[modenum * m_bMaxTmpNum 6] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 7] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x0F:
cellTemp1[modenum * m_bMaxTmpNum 8] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 9] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x10:
cellTemp1[modenum * m_bMaxTmpNum 10] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 11] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x11:
cellTemp1[modenum * m_bMaxTmpNum 12] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 13] = get_tmp(obj.Data[6], obj.Data[7]);
break;
case 0x12:
cellTemp1[modenum * m_bMaxTmpNum 14] = get_tmp(obj.Data[4], obj.Data[5]);
cellTemp1[modenum * m_bMaxTmpNum 15] = get_tmp(obj.Data[6], obj.Data[7]);
break;
#endregion
// 48串均衡信息
// 48串单体测量状态
// 48串温度测量状态
default:
break;
}
#endregion
}
int saveTimeStart = 0;
unsafe private void timer_rec_Tick(object sender, EventArgs e)
{
UInt32 res = new UInt32();
#region 定时接收部分基本处理/////////////////////////////////////////////////////////////////////////
if (saveTimeStart > 20)
{
timer_save.Enabled = true;
}
if (m_bOpen != 1)
return;
//res = VCI_Receive(m_devtype, m_devind, m_canind, ref m_recobj[0], 1000, 100);
// 未接收到数据或者接收到的数据异常,不解析数据,防止线程间设备开关不同步
res = VCI_GetReceiveNum(m_devtype, m_devind, m_canind);//连续打印数据
if ((res == 0) || (res >= 10000))
return;
if (res > 200)
res = 200;
UInt32 con_maxlen = 50;
IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VCI_CAN_OBJ)) * (Int32)con_maxlen);
res = VCI_Receive(m_devtype, m_devind, m_canind, pt, con_maxlen, 100);//打印一行
String str = "";
text1 = null;
int j = 0;
VCI_CAN_OBJ obj;
for (UInt32 i = 0; i < res; i )
{
obj = (VCI_CAN_OBJ)Marshal.PtrToStructure((IntPtr)((UInt32)pt i * Marshal.SizeOf(typeof(VCI_CAN_OBJ))), typeof(VCI_CAN_OBJ));
text1 = null;
str = "接收到数据: ";
string text2 = System.Convert.ToString((Int32)obj.ID, 16);
str = " 帧ID:0x";
for (int jj = text2.Length; jj < 8; jj )
{
str = "0";
text1 = "0";
}
str = System.Convert.ToString((Int32)obj.ID, 16);
text1 = System.Convert.ToString((Int32)obj.ID, 16);
str = " 帧格式:";
if (obj.RemoteFlag == 0)
str = "数据帧 ";
else
str = "远程帧 ";
if (obj.ExternFlag == 0)
str = "标准帧 ";
else
str = "扩展帧 ";
//////////////////////////////////////////
if (obj.RemoteFlag == 0)
{
str = "数据: ";
byte len = (byte)(obj.DataLen % 9);
byte jj = 0;
if (j < len)
{
text2 = System.Convert.ToString(obj.Data[0], 16);
str = " ";
for (int ij = text2.Length; ij < 2; ij )
{
str = "0";
}
str = text2;
}
if (j < len)
{
text2 = System.Convert.ToString(obj.Data[1], 16);
str = " ";
for (int ij = text2.Length; ij < 2; ij )
{
str = "0";
}
str = text2;
}
if (j < len)
{
text2 = System.Convert.ToString(obj.Data[2], 16);
str = " ";
for (int ij = text2.Length; ij < 2; ij )
{
str = "0";
}
str = text2;
}
if (j < len)
{
text2 = System.Convert.ToString(obj.Data[3], 16);
str = " ";
for (int ij = text2.Length; ij < 2; ij )
{
str = "0";
}
str = text2;
}
if (j < len)
{
text2 = System.Convert.ToString(obj.Data[4], 16);
str = " ";
for (int ij = text2.Length; ij < 2; ij )
{
str = "0";
}
str = text2;
}
if (j < len)
{
text2 = System.Convert.ToString(obj.Data[5], 16);
str = " ";
for (int ij = text2.Length; ij < 2; ij )
{
str = "0";
}
str = text2;
}
if (j < len)
{
text2 = System.Convert.ToString(obj.Data[6], 16);
str = " ";
for (int ij = text2.Length; ij < 2; ij )
{
str = "0";
}
str = text2;
}
if (j < len)
{
text2 = System.Convert.ToString(obj.Data[7], 16);
str = " ";
for (int ij = text2.Length; ij < 2; ij )
{
str = "0";
}
str = text2;
}
j = (j >= len) ? 0 : j;
for (jj = 0; jj < 8; jj )
{
if (obj.Data[jj] >= 16)
{
text1 = System.Convert.ToString(obj.Data[jj], 16);
}
else
{
text1 = "0" System.Convert.ToString(obj.Data[jj], 16);
}
}
}
#endregion///////////////////////////////////////////////////
//listBox_Info.Items.Add(str);
//listBox_Info.SelectedIndex = listBox_Info.Items.Count - 1;
if (m_bDisplay == 1)
{
listBox_Info.Items.Add(str);
listBox_Info.SelectedIndex = listBox_Info.Items.Count - 1;
//label4.Text = "连接中";
}
//chk_SpecialFrame(System.Convert.ToString((Int32)obj.ID, 16), str);
user = text1;
text1 = null;
string currerror = "";
string addr1 = null;
string addr2 = null;
switch ((Int32)obj.ID)
{
#region 主控的综合信息
// 总电压、总电流、SOC、DO输出状态、DI输入状态
case 0x0631C001:
bmsu.BatVolt = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 10;
bmsu.BatCur = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10 - 1000;
bmsu.SOC = (float)(Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) * 0.01 / 100);
bmsu.DO1 = (Byte)(((obj.Data[6] & (Byte)0x01) == 0x01) ? 1 : 0);
bmsu.DO2 = (Byte)(((obj.Data[6] & (Byte)0x02) == 0x02) ? 1 : 0);
bmsu.DO3 = (Byte)(((obj.Data[6] & (Byte)0x04) == 0x04) ? 1 : 0);
bmsu.DO4 = (Byte)(((obj.Data[6] & (Byte)0x08) == 0x08) ? 1 : 0);
bmsu.DO5 = (Byte)(((obj.Data[6] & (Byte)0x10) == 0x10) ? 1 : 0);
bmsu.DO6 = (Byte)(((obj.Data[6] & (Byte)0x20) == 0x20) ? 1 : 0);
bmsu.DO7 = (Byte)(((obj.Data[6] & (Byte)0x40) == 0x40) ? 1 : 0);
bmsu.DO8 = (Byte)(((obj.Data[6] & (Byte)0x80) == 0x80) ? 1 : 0);
bmsu.DI1 = (Byte)(((obj.Data[7] & (Byte)0x01) == 0x01) ? 1 : 0);
bmsu.DI2 = (Byte)(((obj.Data[7] & (Byte)0x02) == 0x02) ? 1 : 0);
bmsu.DI3 = (Byte)(((obj.Data[7] & (Byte)0x04) == 0x04) ? 1 : 0);
bmsu.DI4 = (Byte)(((obj.Data[7] & (Byte)0x08) == 0x08) ? 1 : 0);
// 刷控件
VALL.Text = Convert.ToString(bmsu.BatVolt);
//label4.Text = "连接中";
//textBoxBatVolt.Text = Convert.ToString(bmsu.BatVolt);
//textBoxBatCur.Text = Convert.ToString(bmsu.BatCur);
//textBoxSOC.Text = Convert.ToString(bmsu.SOC * 100) "%";
//pictureBoxDO1.Image = imageList2.Images[bmsu.DO1];
//pictureBoxDO2.Image = imageList2.Images[bmsu.DO2];
//pictureBoxDO3.Image = imageList2.Images[bmsu.DO3];
//pictureBoxDO4.Image = imageList2.Images[bmsu.DO4];
//pictureBoxDO5.Image = imageList2.Images[bmsu.DO5];
//pictureBoxDO6.Image = imageList2.Images[bmsu.DO6];
//pictureBoxDO7.Image = imageList2.Images[bmsu.DO7];
//pictureBoxDO8.Image = imageList2.Images[bmsu.DO8];
//pictureBoxDI1.Image = imageList2.Images[bmsu.DI1];
//pictureBoxDI2.Image = imageList2.Images[bmsu.DI2];
//pictureBoxDI3.Image = imageList2.Images[bmsu.DI3];
//pictureBoxDI4.Image = imageList2.Images[bmsu.DI4];
break;
// 最高单体,组号,编号,最低单体,组号,编号
case 0x0631C002:
bmsu.BattHighVoltReading.fBattSignalReading = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.BattHighVoltReading.ucBattBoxSn = obj.Data[2];
bmsu.BattHighVoltReading.ucBattSensorSn = obj.Data[3];
bmsu.BattLowVoltReading.fBattSignalReading = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
bmsu.BattLowVoltReading.ucBattBoxSn = obj.Data[6];
bmsu.BattLowVoltReading.ucBattSensorSn = obj.Data[7];
//// 刷控件
//textBoxHighVolt.Text = Convert.ToString(bmsu.BattHighVoltReading.fBattSignalReading);
//textBoxLowVolt.Text = Convert.ToString(bmsu.BattLowVoltReading.fBattSignalReading);
//BattHighVoltSensorSn.Text = "G" Convert.ToString(bmsu.BattHighVoltReading.ucBattBoxSn) "N" Convert.ToString(bmsu.BattHighVoltReading.ucBattSensorSn);
//BattLowVoltSensorSn.Text = "G" Convert.ToString(bmsu.BattLowVoltReading.ucBattBoxSn) "N" Convert.ToString(bmsu.BattLowVoltReading.ucBattSensorSn);
break;
// 最高温度,组号,编号,最低温度,组号,编号
case 0x0631C003:
bmsu.BattHighTempReading.fBattSignalReading = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 100 - 40;
bmsu.BattHighTempReading.ucBattBoxSn = obj.Data[2];
bmsu.BattHighTempReading.ucBattSensorSn = obj.Data[3];
bmsu.BattLowTempReading.fBattSignalReading = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 100 - 40;
bmsu.BattLowTempReading.ucBattBoxSn = obj.Data[6];
bmsu.BattLowTempReading.ucBattSensorSn = obj.Data[7];
// // 刷控件
// textBoxHighTemp.Text = Convert.ToString(bmsu.BattHighTempReading.fBattSignalReading);
// BattHighTempSensorSn.Text = "G" Convert.ToString(bmsu.BattHighTempReading.ucBattBoxSn) "N" Convert.ToString(bmsu.BattHighTempReading.ucBattSensorSn);
// textBoxLowTemp.Text = Convert.ToString(bmsu.BattLowTempReading.fBattSignalReading);
// BattLowTempSensorSn.Text = "G" Convert.ToString(bmsu.BattHighTempReading.ucBattBoxSn) "N" Convert.ToString(bmsu.BattLowTempReading.ucBattSensorSn);
break;
// 正绝缘电阻值、负绝缘电阻值、主控软件版本号、配置软件版本号
case 0x0631C004:
bmsu.PInsuRes = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) * 1000; // 正对地绝缘电阻
bmsu.NInsuRes = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) * 1000; // 负对地绝缘电阻
bmsu.mSoftVersion = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000; // 主控软件版本号
bmsu.mSetdataVersion = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000; // 主控设置参数版本号
// 刷控件
//textBoxPInsuRes.Text = Convert.ToString(bmsu.PInsuRes);
//textBoxNInsuRes.Text = Convert.ToString(bmsu.NInsuRes);
//textBoxmSoftVersion.Text = Convert.ToString(bmsu.mSoftVersion);
//textBoxmParamVersion.Text = Convert.ToString(bmsu.mSetdataVersion);
break;
// 年-月-日 时-分-秒
case 0x0631C005:
bmsu.year = Convert.ToUInt16(obj.Data[1] << 8 | obj.Data[0]);
bmsu.mon = obj.Data[2];
bmsu.day = obj.Data[3];
bmsu.hour = obj.Data[4];
bmsu.min = obj.Data[5];
bmsu.sec = obj.Data[6];
break;
// 平均电压,最大压差,平均温度,最大温差
case 0x0631C006:
bmsu.AverBattVolt = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000; // 平均电压
bmsu.MaxBattVoltDiff = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 5000) / 1000; // 最大压差
bmsu.AverBattTmp = (float)(Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 100.0 - 100); // 平均温度
bmsu.MaxBattTmpDiff = (float)(Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 100.0 - 100); // 最大温差
// 刷控件
//textBoxAverBattVolt.Text = Convert.ToString(bmsu.AverBattVolt);
//textBoxMaxBattVoltDiff.Text = Convert.ToString(bmsu.MaxBattVoltDiff);
//textBoxAverBattTmp.Text = Convert.ToString(bmsu.AverBattTmp);
//textBoxMaxBattTmpDiff.Text = Convert.ToString(bmsu.MaxBattTmpDiff);
break;
// CC电压、CP占空比、CC2电压、故障代码、最大放电电流、最大充电电流
case 0x0631C007:
bmsu.CC = obj.Data[0];
bmsu.CP = obj.Data[1];
bmsu.CC2 = obj.Data[2];
bmsu.FaultCode = obj.Data[3]; // 故障代码
bmsu.MaxChgCur = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]); // 最大充电电流
bmsu.MaxDisChgCur = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]); // 最大放电电流
// 刷控件
//textBoxCC.Text = Convert.ToString(bmsu.CC / 10);
//textBoxCP.Text = Convert.ToString(bmsu.CP);
//textBoxCC2.Text = Convert.ToString(bmsu.CC2 / 10);
//textBoxFaultCode.Text = Convert.ToString(bmsu.FaultCode);
//textBoxMaxChgCur.Text = Convert.ToString(bmsu.MaxChgCur);
//textBoxMaxDisChgCur.Text = Convert.ToString(bmsu.MaxDisChgCur);
// 根据故障代码判断系统故障状态
if (bmsu.FaultCode < 150)
{
// textBoxSysStus.BackColor = System.Drawing.Color.LimeGreen;
// textBoxSysStus.Text = "正常";
}
else
{
//textBoxSysStus.BackColor = System.Drawing.Color.Red;
//textBoxSysStus.Text = "告警";
}
break;
// 充电次数、充电AH数、放电AH数、SOH
case 0x0631C008:
//bmsu.ChgCnt; // 充电次数
//bmsu.ChgAH; // 充电安时数
bmsu.DisAH = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]); // 放电安时数
bmsu.SOH = obj.Data[7];
break;
// 主继电器切断原因、负继电器切断原因
case 0x0631C009:
bmsu.PCutMode = obj.Data[0]; // 主继电器切断原因
bmsu.NCutMode = obj.Data[1]; // 负继电器切断原因
//bmsu.ChgCutMode; // 充电继电器切断原因
// 刷控件
//textBoxPCutMode.Text = Convert.ToString(bmsu.PCutMode);
//textBoxPCutMode.Text = Convert.ToString(bmsu.NCutMode);
break;
// 电池箱数、温度数/箱、标称容量、实际容量
case 0x0631C00A:
bmsu.BattGroupNumber = obj.Data[0]; // 电池箱数
bmsu.TempNumOneGroup = obj.Data[1]; // 温度数每箱
bmsu.StdCap = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10; // 标称容量
bmsu.RealCap = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 10; // 实际容量
// 刷控件
//textBoxStdCap.Text = Convert.ToString(bmsu.StdCap);
//textBoxRealCap.Text = Convert.ToString(bmsu.RealCap);
break;
// 测控1~16采样状态
case 0x0631C00B:
break;
// 测控1单体数、测控2单体数、测控3单体数、测控4单体数、测控5单体数、测控6单体数、测控7单体数、测控8单体数
case 0x0631C00C:
bmsu.Bsu[0].bmsNum = obj.Data[0];
bmsu.Bsu[1].bmsNum = obj.Data[1];
bmsu.Bsu[2].bmsNum = obj.Data[2];
bmsu.Bsu[3].bmsNum = obj.Data[3];
bmsu.Bsu[4].bmsNum = obj.Data[4];
bmsu.Bsu[5].bmsNum = obj.Data[5];
bmsu.Bsu[6].bmsNum = obj.Data[6];
bmsu.Bsu[7].bmsNum = obj.Data[7];
break;
// 测控9单体数、测控10单体数、测控11单体数、测控12单体数、测控13单体数、测控14单体数、测控15单体数、测控16单体数
case 0x0631C00D:
bmsu.Bsu[8].bmsNum = obj.Data[0];
bmsu.Bsu[9].bmsNum = obj.Data[1];
bmsu.Bsu[10].bmsNum = obj.Data[2];
bmsu.Bsu[11].bmsNum = obj.Data[3];
bmsu.Bsu[12].bmsNum = obj.Data[4];
bmsu.Bsu[13].bmsNum = obj.Data[5];
bmsu.Bsu[14].bmsNum = obj.Data[6];
bmsu.Bsu[15].bmsNum = obj.Data[7];
break;
// 电压告警状态、电流告警状态、容量告警状态、最高电压告警状态、最低电压告警状态、单体压差告警状态、绝缘告警状态
case 0x0631C00E:
break;
// 电池箱平均温度告警状态、高温告警状态、低温告警状态、温差告警状态、主控故障
case 0x0631C00F:
break;
// 电池电压高1级、电池电压高2级、电池电压高3级、电池电压高4级
case 0x0631C010:
bmsu.BatHighL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 10;
bmsu.BatHighL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10;
bmsu.BatHighL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 10;
bmsu.BatHighL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 10;
break;
// 电池电压低1级、电池电压低2级、电池电压低3级、电池电压低4级
case 0x0631C011:
bmsu.BatLowL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 10;
bmsu.BatLowL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10;
bmsu.BatLowL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 10;
bmsu.BatLowL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 10;
break;
// 放电电流高1级、放电电流高2级、放电电流高3级、放电电流高4级
case 0x0631C012:
bmsu.BatDisChgL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.BatDisChgL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
bmsu.BatDisChgL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
bmsu.BatDisChgL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;
break;
// 充电电流高1级、充电电流高2级、充电电流高3级、充电电流高4级
case 0x0631C013:
bmsu.BatChgL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.BatChgL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
bmsu.BatChgL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
bmsu.BatChgL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;
break;
// 单体电压高1级、单体电压高2级、单体电压高3级、单体电压高4级
case 0x0631C014:
bmsu.CellHighL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.CellHighL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
bmsu.CellHighL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
bmsu.CellHighL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;
break;
// 单体电压低1级、单体电压低2级、单体电压低3级、单体电压低4级
case 0x0631C015:
bmsu.CellLowL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.CellLowL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
bmsu.CellLowL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
bmsu.CellLowL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;
break;
// 电池温度高1级、电池温度高2级、电池温度高3级、电池温度高4级
case 0x0631C016:
bmsu.CellTmpHighL1 = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 10000) / 100;
bmsu.CellTmpHighL2 = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 10000) / 100;
bmsu.CellTmpHighL3 = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
bmsu.CellTmpHighL4 = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 10000) / 100;
break;
// 电池温度低1级、电池温度低2级、电池温度低3级、电池温度低4级
case 0x0631C017:
bmsu.CellTmpLowL1 = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 10000) / 100;
bmsu.CellTmpLowL2 = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 10000) / 100;
bmsu.CellTmpLowL3 = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
bmsu.CellTmpLowL4 = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 10000) / 100;
break;
// 绝缘电阻低1级、绝缘电阻低2级、绝缘电阻低3级、绝缘电阻低4级
case 0x0631C018:
bmsu.CellInsuLowL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) * 100;
bmsu.CellInsuLowL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) * 100;
bmsu.CellInsuLowL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) * 100;
bmsu.CellInsuLowL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) * 100;
break;
// 单体压差高1级、单体压差高2级、单体压差高3级、单体压差高4级
case 0x0631C019:
bmsu.CellDiffHighL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.CellDiffHighL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
bmsu.CellDiffHighL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
bmsu.CellDiffHighL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;
break;
// 电池温差高1级、电池温差高2级、电池温差高3级、电池温差高4级
case 0x0631C01A:
bmsu.CellTmpDiffHighL1 = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 10000) / 100;
bmsu.CellTmpDiffHighL2 = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 10000) / 100;
bmsu.CellTmpDiffHighL3 = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
bmsu.CellTmpDiffHighL4 = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 10000) / 100;
break;
// SOC过高1级、SOC过高2级、SOC过高3级、SOC过高4级
case 0x0631C01B:
bmsu.SocHighL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 100;
bmsu.SocHighL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 100;
bmsu.SocHighL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 100;
bmsu.SocHighL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 100;
break;
// SOC过低1级、SOC过低2级、SOC过低3级、SOC过低4级
case 0x0631C01C:
bmsu.SOCLow1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 100;
bmsu.SOCLow2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 100;
bmsu.SOCLow3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 100;
bmsu.SOCLow4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 100;
break;
// 霍尔系数A、霍尔系数B、电流校准系数K、电流校准系数B
case 0x0631C01D:
bmsu.CurrHallSensorA = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]);
bmsu.CurrHallSensorB = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]);
bmsu.CurrHallPosCoeffK = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 3000) / 1000;
bmsu.CurrHallPosCoeffB = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 3000) / 1000;
break;
// 满充SOC校准电压、满放SOC校准电压、SOC低告警平均电压、SOC高告警平均电压
case 0x0631C01E:
bmsu.SOCChgCellVolt = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.SOCDisChgCellVolt = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
bmsu.SOCLowAverVolt = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
bmsu.SOCHighAverVolt = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;
break;
// 过充自恢复电压、过放自恢复电压、高温自恢复温度、不均衡平均电压限制
case 0x0631C01F:
bmsu.CellHighCutResetVolt = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.CellLowCutResetVolt = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
bmsu.TmpHighCutResetVolt = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
break;
// 电流零飘阈值、高压电压基准校准系数、电池电压校准系数
case 0x0631C020:
bmsu.CurZeroDriftThreshold = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
break;
// 调试模式使能位、OCV使能位、直接执行OCV校准
//case 0x0631C021:
// 风扇启动,风扇停止,加热启动,加热停止温度
case 0x0631C022:
bmsu.FanCtrlTemperature = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 10000) / 100;
bmsu.FanNOTCtrlTemperature = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 10000) / 100;
bmsu.HeatCtrlTemperature = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
bmsu.HeatNOTCtrlTemperature = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 10000) / 100;
break;
// 霍尔校正系数k(放) 霍尔校正系数b(放) 分流器系数A 分流器系数B
case 0x0631C023:
bmsu.CurrHallNegCoeffK = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 3000) / 1000;
bmsu.CurrHallNegCoeffB = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 3000) / 1000;
bmsu.CurrShuntSensorA = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]);
bmsu.CurrShuntSensorB = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]);
break;
// 分流器校正系数k(充)、分流器校正系数b(充)分流器校正系数k(放) 分流器校正系数b(放)
case 0x0631C024:
bmsu.CurrShuntPosCoeffK = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 3000) / 1000;
bmsu.CurrShuntPosCoeffB = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 3000) / 1000;
bmsu.CurrShuntNegCoeffK = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 3000) / 1000;
bmsu.CurrShuntNegCoeffB = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 3000) / 1000;
break;
// 电流传感器类型 粘连检测类型 TF卡数据存储类型 CAN数据存储类型
case 0x0631C025:
bmsu.BattCurrSensorType = obj.Data[0];
bmsu.SDCardInserted = obj.Data[2];
break;
// 绝缘监测使能 绝缘保护使能 压差保护使能 温差保护使能 风扇使能 加热使能 OCV使能 OCV直接执行
case 0x0631C026:
bmsu.InsulationDetectEnable = obj.Data[0];
bmsu.InsulationLowLVDEnable = obj.Data[1];
bmsu.CellVoltDiffHighLVDEnable = obj.Data[2];
bmsu.BattTempDiffHighLVDEnable = obj.Data[3];
bmsu.FanCtrlEnable = obj.Data[4];
bmsu.HeatCtrlEnable = obj.Data[5];
bmsu.OCVEnable = obj.Data[6];
bmsu.DirectOCVEnable = obj.Data[7];
break;
// 均衡使能 主正粘连检测使能 主负粘连检测使能 快充粘连检测使能 慢充检测使能
case 0x0631C027:
bmsu.CellEqualizeEnable = obj.Data[0];
break;
// 均衡电压阈值 不均衡电压阈值 均衡压差限 不均衡压差限
case 0x0631C029:
bmsu.CellHighVoltEqualize = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
bmsu.CellVoltNOTEqualize = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
bmsu.CellVoltDiffEqualize = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
bmsu.CellVoltDiffNotEqualize = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;
break;
// 母线负对地电压 高压回采1电压 高压回采2电压 高压回采3电压
case 0x0631C030:
bmsu.HighVoltNeg = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 10;
bmsu.HighVolt1 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10;
bmsu.HighVolt2 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 10;
bmsu.HighVolt3 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 10;
//textBoxHighVoltNeg.Text = Convert.ToString(bmsu.HighVoltNeg);
//textBoxHighVolt1.Text = Convert.ToString(bmsu.HighVolt1);
//textBoxHighVolt2.Text = Convert.ToString(bmsu.HighVolt2);
//textBoxHighVolt3.Text = Convert.ToString(bmsu.HighVolt3);
break;
#endregion
default:
try
{
#region 接收采样板信息
if ((obj.ID & 0x062f8000) == 0x062f8000)
{
// 获取测控地址信息
int modenum = Convert.ToInt16(obj.ID & 0x7F8) / 8;
UInt16 utmp16 = 0;
// 识别出主控地址--这个地方需要改为0xF0
if (modenum == 0xE0)
modenum = 0;
// 获取对应测控的配置信息
utmp16 = bmsu.Bsu[modenum].Type;
// 主动均衡采样板
if ((utmp16 == 0) || (utmp16 == 1))
{
get_LbInfo(modenum, obj);
//textBox1.Text = "123456";
}
// 36串采样板
if (utmp16 == 2)
{
get_36Info(modenum, obj);
//textBox1.Text = "123456";
}
// 48串采样板
if (utmp16 == 3)
{
//textBox1.Text = "123456";
get_48Info(modenum, obj);
}
}
#endregion
#region 升级信息
else if (((obj.ID & 0x1FF00000) >> 20) == 0x1C8)
{
Byte updateRecEnable = 0;
// 判断是不是被升级对象
//if (comboBoxLCUAddr.Text == "MBU")
//{
// if (((obj.ID & 0x7F8) >> 3) == utility.Addr_BMU_UPDATE)
// updateRecEnable = 1;
//}
//else
//{
// if (((obj.ID & 0x7F8) >> 3) == LcuAddrForUpdate)
// updateRecEnable = 1;
//}
if (updateRecEnable == 1)
{
Frame1C8data[0] = obj.Data[0];
Frame1C8data[1] = obj.Data[1];
Frame1C8data[2] = obj.Data[2];
Frame1C8data[3] = obj.Data[3];
Frame1C8data[4] = obj.Data[4];
Frame1C8data[5] = obj.Data[5];
Frame1C8data[6] = obj.Data[6];
Frame1C8data[7] = obj.Data[7];
UpdateStep = 2;
}
}
else if (((obj.ID & 0x1FF00000) >> 20) == 0x1C9)
{
Byte updateRecEnable = 0;
// 判断是不是被升级对象
//if (comboBoxLCUAddr.Text == "MBU")
//{
// if (((obj.ID & 0x7F8) >> 3) == utility.Addr_BMU_UPDATE)
// updateRecEnable = 1;
//}
//else
//{
// if (((obj.ID & 0x7F8) >> 3) == LcuAddrForUpdate)
// updateRecEnable = 1;
//}
if (updateRecEnable == 1)
{
Frame1C9data[0] = obj.Data[0];
Frame1C9data[1] = obj.Data[1];
Frame1C9data[2] = obj.Data[2];
Frame1C9data[3] = obj.Data[3];
Frame1C9data[4] = obj.Data[4];
Frame1C9data[5] = obj.Data[5];
Frame1C9data[6] = obj.Data[6];
Frame1C9data[7] = obj.Data[7];
// 如果已经处于数据传输阶段,则不切换状态,避免打断正常时序
if (UpdateStep != 4)
UpdateStep = 3;
}
}
#endregion
//labelSysInfo.Text = "数据接收正常!";
}
catch
{
//labelSysInfo.Text = "数据接收异常,请检查BMS设置!";
}
finally
{
}
break;
}
}
//Marshal.FreeHGlobal(ptArray[0]);
Marshal.FreeHGlobal(pt);
}
public static Byte BMSInfoSendEnable = 0;
private void timer_send_Tick(object sender, EventArgs e)
{
if (recTimerEnable == 1)
{
timer_rec.Enabled = true;
}
else if (recTimerEnable == 0)
{
timer_rec.Enabled = false;
}
//timer_rec.Enabled = false;
if (UpdateStep == 0)
sendPageNum2BMS();
//timer_rec.Enabled = true;
//SetData();
//setdata = new Thread(SetData);
//setdata.IsBackground = true;
//setdata.Start();
}
public unsafe void sendPageNum2BMS()
{
Byte ret = 0;
UInt16 data = 0;
UInt16 data1 = 0;
VCI_CAN_OBJ setobj = new VCI_CAN_OBJ();////////////////////////////////////////////////////////////////////////////////////
setobj.SendType = (byte)comboBox_SendType.SelectedIndex;
setobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
setobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
setobj.ID = CAN.paramSetID;
if (m_bOpen == 1)
{
try
{
setobj.DataLen = 8;
setobj.Data[0] = 0x52;
setobj.Data[1] = 0x01;
setobj.Data[2] = 0;
setobj.Data[3] = 1; //BMSInfoSendEnable;//BMS使能数据。当0:BMS不发数据
setobj.Data[4] = 0;
setobj.Data[5] = 0;
setobj.Data[6] = 0;
setobj.Data[7] = CurPageIndex;
if (VCI_Transmit(m_devtype, m_devind, m_canind, ref setobj, 1) == 0)
{
ret = 1;
//MessageBox.Show("参数设置发送失败", "错误",
//MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
catch
{
ret = 2;
//MessageBox.Show("发送错误!!!");
}
}
else
ret = 3;
/// return ret;
}
public unsafe Byte SendMessageToBMS(VCI_CAN_OBJ setobj)
{
Byte ret = 0;
UInt16 data = 0;
UInt16 data1 = 0;
setobj.SendType = 0;// comboBox_SendType.SelectedIndex;
setobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
setobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
if (m_bOpen == 1)
{
try
{
setobj.DataLen = 8;
if (VCI_Transmit(m_devtype, m_devind, m_canind, ref setobj, 1) == 0)
{
ret = 1;
//MessageBox.Show("参数设置发送失败", "错误",
//MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
catch
{
ret = 2;
//MessageBox.Show("发送错误!!!");
}
}
else
ret = 3;
return ret;
}
private void button_StopCAN_Click(object sender, EventArgs e)
{
//if (m_bOpen == 0)
// return;
VCI_ResetCAN(m_devtype, m_devind, m_canind);
}
/// <summary>
/// ///////////////
/// </summary>测试按键
/// <param name="sender"></param>
/// <param name="e"></param>
unsafe private void button_Send_Click(object sender, EventArgs e)///////////测试
{
VCI_StartCAN(m_devtype, m_devind, m_canind);
////////////////////////////////////////////////////////////////////////////////////////////////////////开始测试
VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ();
//sendobj.Init();
sendobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
sendobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
sendobj.ID = System.Convert.ToUInt32("0x" textBox_ID.Text,16);
int len = (textBox_Data.Text.Length 1) / 3;
sendobj.DataLen =System.Convert.ToByte(len);
String strdata = textBox_Data.Text;
int i=-1;
if(i <len-1)
sendobj.Data[0]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16);
if (i < len - 1)
sendobj.Data[1]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16);
if (i < len - 1)
sendobj.Data[2]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16);
if (i < len - 1)
sendobj.Data[3]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16);
if (i < len - 1)
sendobj.Data[4]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16);
if (i < len - 1)
sendobj.Data[5]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16);
if (i < len - 1)
sendobj.Data[6]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16);
if (i < len - 1)
sendobj.Data[7] = System.Convert.ToByte("0x" strdata.Substring(i * 3, 2), 16);
if(VCI_Transmit(m_devtype,m_devind,m_canind,ref sendobj,1)==0)
{
MessageBox.Show("发送失败", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
if (m_bOpen == 1)
{
//label4.Text = "连接中";
Resultlabel.Text = "Fail ";
Resultlabel.BackColor = System.Drawing.Color.LawnGreen;
}
}
private void button_Clear_Click(object sender, EventArgs e)
{
listBox_Info.Items.Clear();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
unsafe private void timer_updata_Tick(object sender, EventArgs e)
{
VCI_CAN_OBJ sobj = new VCI_CAN_OBJ();
sobj.SendType = (byte)comboBox_SendType.SelectedIndex;
sobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
sobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
sobj.DataLen = 8;
for (byte nn = 0; nn < 8; nn )
{
sobj.Data[nn] = 0xff;////////////
}
// Frame1C8data,Frame1C9data
switch (UpdateStep)
{
// 0x1C8
case 2:
ulImageAddr = (UInt32)((Frame1C8data[0] << 24) | (Frame1C8data[1] << 16) | (Frame1C8data[2] << 8) | (Frame1C8data[3] << 0));
uiLength = (UInt16)((Frame1C8data[4] << 8) | (Frame1C8data[5] << 0));
SendResponse(LcuAddrForUpdate, ulImageAddr, uiLength, _CMD_TYPE_INFO);
break;
// 0x1C9
case 3:
// 切换到数据传输模式
UpdateStep = 4;
break;
case 4:
// 传输数据
ulImageAddr = (UInt32)((Frame1C9data[0] << 24) | (Frame1C9data[1] << 16) | (Frame1C9data[2] << 8) | (Frame1C9data[3] << 0));
uiLength = (UInt16)((Frame1C9data[4] << 8) | (Frame1C9data[5] << 0));
SendResponse(LcuAddrForUpdate, ulImageAddr, uiLength, _CMD_TYPE_DATA);
break;
default:
break;
}
}
const Byte _RET_RESPONSE_OK = 1;
const Byte _RET_RESPONSE_FINISHED = 2;
const UInt16 _COMM_DATA_LENGTH_EACHTIME = 256;
const Byte _CMD_TYPE_INFO = 00;
const Byte _CMD_TYPE_DATA = 01;
Byte cRetFlag = 0;
unsafe private void SendResponse(Int32 i32Address, UInt32 ulImageAddr, UInt16 uiLength, Byte ui8CmdType)
{
UInt16 i = 0;
UInt32 utmp32 = 0;
VCI_CAN_OBJ sobj = new VCI_CAN_OBJ();
sobj.SendType = (byte)comboBox_SendType.SelectedIndex;
sobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
sobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
sobj.DataLen = 8;
if (_CMD_TYPE_DATA == ui8CmdType)//发送内容
{
for (i = 0; i < (uiLength / 8); i )//连续发
{
sobj.ID = 0x1D080003 (((UInt32)i) << 20) (((UInt32)g_u8SelfAddr) << 3) (((UInt32)LcuAddrForUpdate) << 11);
// 数据填充
sobj.Data[0] = BinBuffer[ulImageAddr i * 8 0];
sobj.Data[1] = BinBuffer[ulImageAddr i * 8 1];
sobj.Data[2] = BinBuffer[ulImageAddr i * 8 2];
sobj.Data[3] = BinBuffer[ulImageAddr i * 8 3];
sobj.Data[4] = BinBuffer[ulImageAddr i * 8 4];
sobj.Data[5] = BinBuffer[ulImageAddr i * 8 5];
sobj.Data[6] = BinBuffer[ulImageAddr i * 8 6];
sobj.Data[7] = BinBuffer[ulImageAddr i * 8 7];
if (VCI_Transmit(m_devtype, m_devind, m_canind, ref sobj, 1) == 0)
{
//MessageBox.Show("数据发送失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
//labelSysInfo.Text = "CAN 数据发送失败";////////////////////
}
System.Threading.Thread.Sleep(mainPage.CANupdateTimeInterval);
}
System.Threading.Thread.Sleep(10);
cRetFlag = _RET_RESPONSE_OK;
}
else //_CMD_TYPE_INFO
{
char[] i8uStr = new char[20];
Byte i8uPercentFinished = 0;
sobj.ID = 0x1CF80003 (((UInt32)g_u8SelfAddr) << 3) (((UInt32)LcuAddrForUpdate) << 11);
// 把偏移地址填入发送缓冲区
sobj.Data[0] = Frame1C8data[0];
sobj.Data[1] = Frame1C8data[1];
sobj.Data[2] = Frame1C8data[2];
sobj.Data[3] = Frame1C8data[3];
if ((ulImageAddr % (_COMM_DATA_LENGTH_EACHTIME * 4)) == 0)
{
i8uPercentFinished = (Byte)((float)ulImageAddr / (float)g_ui32LCUsize * 100);
if (i8uPercentFinished >= 100)//显示100%
{
i8uStr[0] = '1';
i8uStr[1] = '0';
i8uStr[2] = '0';
i8uStr[3] = '%';
i8uStr[4] = '\r';
i8uStr[5] = '\n';
}
else if (i8uPercentFinished >= 10)//显示XX%
{
i8uStr[0] = Convert.ToChar(i8uPercentFinished / 10);
i8uStr[1] = Convert.ToChar(i8uPercentFinished % 10);
i8uStr[2] = '%';
i8uStr[3] = ' ';
}
else //显示X%
{
i8uStr[0] = Convert.ToChar(i8uPercentFinished % 10);
i8uStr[1] = '%';
i8uStr[2] = ' ';
}
//labelUpdateProgress.Text = Convert.ToString(i8uPercentFinished);
//progressBarUpdate.Value = i8uPercentFinished;
}
if (g_ui32LCUsize <= ulImageAddr) //已全部请求完
{
//SerialPutString("\r\n");
uiLength = 0;
cRetFlag = _RET_RESPONSE_FINISHED;
// 升级完成
UpdateStep = 5;
// labelUpdateStus.Text = "升级完成!!!";
// labelUpdateProgress.Text = "100";
// progressBarUpdate.Value = 100;
// 关闭升级任务
timer_updata.Enabled = false;
// 使能相关升级参数配置控件
//MCUBox.Enabled = true;
//comboBoxLCUAddr.Enabled = true;
// button1.Enabled = true;
}
else if (g_ui32LCUsize > ulImageAddr _COMM_DATA_LENGTH_EACHTIME)
{
uiLength = _COMM_DATA_LENGTH_EACHTIME;
cRetFlag = _RET_RESPONSE_OK;
}
else
{
uiLength = Convert.ToUInt16(g_ui32LCUsize - ulImageAddr);
uiLength = Convert.ToUInt16(((uiLength % 8) > 0) ? ((uiLength / 8 1) * 8) : uiLength);
cRetFlag = _RET_RESPONSE_OK;
}
utmp32 = ((UInt32)uiLength << 16) (UInt32)cyg_crc16(ulImageAddr, uiLength);
sobj.Data[4] = Convert.ToByte((utmp32 >> 24) & 0xFF);
sobj.Data[5] = Convert.ToByte((utmp32 >> 16) & 0xFF);
sobj.Data[6] = Convert.ToByte((utmp32 >> 8) & 0xFF);
sobj.Data[7] = Convert.ToByte((utmp32 >> 0) & 0xFF);
if (VCI_Transmit(m_devtype, m_devind, m_canind, ref sobj, 1) == 0)
{
//MessageBox.Show("指令发送失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
System.Threading.Thread.Sleep(mainPage.CANupdateTimeInterval);
if (UpdateStep == 5)
UpdateStep = 0;
}
}
/* Table of CRC constants - implements x^16 x^12 x^5 1 */
static private UInt16[] crc16_tab = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
};
UInt16 cyg_crc16(UInt32 index, Int32 len)
{
Int32 i;
UInt16 cksum;
cksum = 0;
for (i = 0; i < len; i )
{
cksum = Convert.ToUInt16((crc16_tab[((cksum >> 8) ^ BinBuffer[index i]) & 0xFF] ^ (cksum << 8)) & 0xffff);
}
return cksum;
}
private void groupBox1_Enter(object sender, EventArgs e)
{
}
private void 单体信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
//if (m_bOpen == 0)
//{
// MessageBox.Show("设备未启动,请检查设备连接!");
// return;
//}
// 切换页码
CurPageIndex = 3;// Page_CellInfo;
//mainPage.BMSInfoSendEnable = 0;
CellInfo child = new CellInfo();
child.Show();
}
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论