using CCDCount.DLL.AlarmTools; using LogClass; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CCDCount.DLL.CanBus { public class CanManagerClass { UInt32 m_devtype = 4;//USBCAN2 UInt32 m_devind = 0; UInt32 m_canind = 0; int DataLen = 8; VCI_INIT_CONFIG config = new VCI_INIT_CONFIG(); public void OpenDevice() { if (CanLibraryClass.VCI_OpenDevice(m_devtype, m_devind, 0) == 0) { Console.WriteLine("打开设备失败,请检查设备类型和设备索引号是否正确"); return; } } public void InitCan() { //初始化CAN config.AccCode = Convert.ToUInt32("0x00000000", 16); config.AccMask = Convert.ToUInt32("0xFFFFFFFF", 16); config.Timing0 = Convert.ToByte("0x00", 16); config.Timing1 = Convert.ToByte("0x14", 16); config.Filter = (Byte)1; config.Mode = (Byte)0; if (CanLibraryClass.VCI_InitCAN(m_devtype, m_devind, m_canind, ref config) == 0) { Console.WriteLine("初始化Can失败"); SystemAlarm.AlarmAlert(AlarmMessageList.CAN连接失败,"CAN Connect Error", "CAN连接失败","CanManagerClass-InitCan"); return; } if (CanLibraryClass.VCI_StartCAN(m_devtype, m_devind, m_canind) == 0) { Console.WriteLine("开启Can失败"); SystemAlarm.AlarmAlert(AlarmMessageList.CAN连接失败, "CAN Connect Error", "CAN连接失败", "CanManagerClass-InitCan"); return; } SystemAlarm.AlarmCancel(AlarmMessageList.CAN连接失败); } public unsafe bool SenMessage(CanSenMessage senMessage) { bool result = false; VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ(); sendobj.RemoteFlag = (byte)(0); sendobj.ExternFlag = (byte)(0); sendobj.ID = Convert.ToUInt32(Convert.ToString(0, 16), 16); sendobj.DataLen = Convert.ToByte(DataLen); string str = ""; byte SendMessage0 = new byte(); SendMessage0 = senMessage.SendDate; sendobj.Data[0] = SendMessage0; //byte SendMessage1 = new byte(); //SendMessage1 |= (byte)(1 << 0); //sendobj.Data[1] = SendMessage1; byte SendMessage6 = new byte(); SendMessage6 = (byte)(1 << 0); sendobj.Data[6] = SendMessage6; byte SendMessage7 = new byte(); if (!senMessage.IsOK) SendMessage7 |= (byte)(1 << senMessage.TaiHao); sendobj.Data[7] = SendMessage7; str += "发送数据:"; str += string.Format("byte0:{0},byte6:{1},byte7:{2}", SendMessage0.ToString("000"), SendMessage6.ToString("000"), SendMessage7.ToString("000")); if (CanLibraryClass.VCI_Transmit(m_devtype, m_devind, m_canind, ref sendobj, 1) == 0) { Console.WriteLine("发送失败"); return result; } LOG.log(str, 6); result = true; return result; } int previousWriteDone = 0; public unsafe bool GetTrigger(ref bool isFrist) { bool result = false; UInt32 res = new UInt32(); VCI_CAN_OBJ[] m_recobj = new VCI_CAN_OBJ[1000]; res = CanLibraryClass.VCI_Receive(m_devtype, m_devind, m_canind, ref m_recobj[0], 1000, 100); if (res == 0xFFFFFFFF) res = 0; if (res != 0) { for (UInt32 i = 0; i < res; i++) { if (m_recobj[i].RemoteFlag == 0) { int writeDone = -1; fixed (VCI_CAN_OBJ* m_recobj1 = &m_recobj[i]) { writeDone = m_recobj1->Data[6] & 0x01; if(isFrist) { previousWriteDone = writeDone == 0 ? 1 : 0; isFrist = false; LOG.log(string.Format( "通讯状态初始化,prevateWriteDone:{0},WriteDone:{1},IsFrist:{2}", previousWriteDone, writeDone, isFrist), 6); } } if ((writeDone == 1 && previousWriteDone == 0) || (writeDone == 0 && previousWriteDone == 1)) { result = true; } previousWriteDone = writeDone; } } } return result; } public void CloseCan() { if(CanLibraryClass.VCI_ResetCAN(m_devtype, m_devind, m_canind)==0) { LOG.error("CAN关闭失败"); } } } }