实例介绍
【实例简介】
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论