Example #1
0
        /// <summary>
        /// CanBus連線
        /// </summary>
        /// <returns> 連線成功回傳1,否則回傳0</returns>
        public static int CanConnect()
        {
            //開始連線
            if (m_bOpen == 1)
            {
                CanBusTool.VCI_CloseDevice(m_devtype, m_devind);
                m_bOpen = 0;
            }
            else
            {
                //開啟第一個device,用於轉向馬達
                m_devtype  = m_arrdevtype[1];
                m_devind   = 0;
                m_canind   = 0;
                m_devind_2 = 0;
                m_canind_2 = 1;

                if (CanBusTool.VCI_OpenDevice(m_devtype, m_devind, 0) == 0)
                {
                    return(0);
                }

                m_bOpen = 1;
                VCI_INIT_CONFIG config = new VCI_INIT_CONFIG();
                config.AccCode = System.Convert.ToUInt32("0x" + "40e00000", 16);
                config.AccMask = System.Convert.ToUInt32("0x" + "FFFFFFFF", 16);

                /*config.AccCode = System.Convert.ToUInt32("0x" + "41600000", 16);
                *  config.AccMask = System.Convert.ToUInt32("0x" + "0FFFFFFF", 16);*/
                config.Timing0 = System.Convert.ToByte("0x" + "03", 16);
                config.Timing1 = System.Convert.ToByte("0x" + "1c", 16);
                config.Filter  = (Byte)(1);
                config.Mode    = (Byte)0;

                VCI_INIT_CONFIG config2 = new VCI_INIT_CONFIG();
                config2.AccCode = System.Convert.ToUInt32("0x" + "30e00000", 16);
                config2.AccMask = System.Convert.ToUInt32("0x" + "FFFFFFFF", 16);

                /*config2.AccCode = System.Convert.ToUInt32("0x" + "31600000", 16);
                *  config2.AccMask = System.Convert.ToUInt32("0x" + "0FFFFFFF", 16);*/
                config2.Timing0 = System.Convert.ToByte("0x" + "03", 16);
                config2.Timing1 = System.Convert.ToByte("0x" + "1c", 16);
                config2.Filter  = (Byte)(1);
                config2.Mode    = (Byte)0;

                CanBusTool.VCI_InitCAN(m_devtype, m_devind, m_canind, ref config);
                CanBusTool.VCI_InitCAN(m_devtype, m_devind_2, m_canind_2, ref config2);

                ComputerThread = new Thread(StartComputerMonitorThread);
                MotorThread    = new Thread(StartMotorMonitorThread);
            }
            if (m_bOpen == 1)
            {
                return(1);             //CAN連線
            }
            else
            {
                return(0);//CAN斷線
            }
        }
Example #2
0
 /// <summary>
 /// 關閉CanBus通訊
 /// </summary>
 public static void ResetCan()
 {
     if (m_bOpen == 0)
     {
         return;
     }
     CanBusTool.VCI_ResetCAN(m_devtype, m_devind, m_canind);
     CanBusTool.VCI_ResetCAN(m_devtype, m_devind_2, m_canind_2);
 }
Example #3
0
        /// <summary>
        /// 收到堆高機馬達傳送過來資料,修改後傳送給電腦
        /// </summary>
        unsafe public static void StartMotorMonitorThread()
        {
            while (true)
            {
                UInt32 res = new UInt32();
                res = CanBusTool.VCI_Receive(m_devtype, m_devind_2, m_canind_2, ref m_recobj_2[0], 1000, 100);
                if (res > 10000 || res < 0)
                {
                    return;
                }
                if (!CanControl) //初始化
                {
                    for (UInt32 i = 0; i < res; i++)
                    {
                        //收到馬達傳送過來資料,傳送給電腦
                        VCI_CAN_OBJ recobj    = m_recobj_2[i];
                        byte        Datalen   = (byte)(m_recobj_2[i].DataLen % 9);
                        byte[]      TransData = new byte[Datalen];
                        for (int k = 0; k < TransData.Length; k++)
                        {
                            TransData[k] = recobj.Data[k];
                        }
                        SendCommand(recobj.ID, Datalen, TransData);
                        if (recobj.ID == 391) //ID187 轉向站號
                        {
                            Array.Copy(TransData, ReceiveMotor, TransData.Length);
                            Array.Copy(TransData, ReceiveMotor_Storage, TransData.Length);
                        }
                        if (recobj.ID == 395) //ID18B 行走站號
                        {
                            Array.Copy(TransData, ReceiveMoveMotor, TransData.Length);
                            Array.Copy(TransData, ReceiveMoveMotor_Storage, TransData.Length);
                        }
                    }
                }
                else
                {
                    if (GlobalVar.isCanBusDebug) //記錄回傳角度資訊
                    {
                        for (UInt32 i = 0; i < res; i++)
                        {
                            VCI_CAN_OBJ recobj = m_recobj_2[i];

                            //分析馬達回傳資料
                            AnalysisMotorData(recobj, i);
                        }
                    }
                }
            }
        }
Example #4
0
        /// <summary>
        /// 傳送資料給堆高機的馬達
        /// </summary>
        /// <param name="ID">[IN] 傳送ID</param>
        /// <param name="len">[IN] 數據長度</param>
        /// <param name="data">[IN] 傳送數據</param>
        unsafe public static void SendCommandToMotor(uint ID, int len, byte[] data)
        {
            if (m_bOpen == 0)
            {
                return;
            }
            VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ();

            sendobj.RemoteFlag = 0;
            sendobj.ExternFlag = 0;
            sendobj.ID         = ID;
            sendobj.DataLen    = System.Convert.ToByte(len);
            for (int i = 0; i < len; i++)
            {
                sendobj.Data[i] = data[i];
            }
            CanBusTool.VCI_Transmit(m_devtype, m_devind_2, m_canind_2, ref sendobj, 1);
        }
Example #5
0
        /// <summary>
        /// 開啟CanBus通訊
        /// </summary>
        /// <returns>連線成功回傳1,否則回傳0</returns>
        public static int OpenCan()
        {
            //開啟CanBus
            if (m_bOpen == 0)
            {
                return(0);
            }
            CanBusTool.VCI_StartCAN(m_devtype, m_devind, m_canind);
            CanBusTool.VCI_StartCAN(m_devtype, m_devind_2, m_canind_2);

            ComputerThread.Start();
            MotorThread.Start();
            if (m_bOpen == 1)
            {
                return(1);
            }
            else
            {
                return(0);
            }
        }
Example #6
0
        /// <summary>
        /// 攔截堆高機電腦傳送過來資料,修改後傳送給馬達
        /// </summary>
        unsafe private static void  StartComputerMonitorThread()
        {
            while (true)
            {
                UInt32 res = new UInt32();
                res = CanBusTool.VCI_Receive(m_devtype, m_devind, m_canind, ref m_recobj[0], 1000, 100);
                if (res > 10000 || res < 0)
                {
                    return;
                }
                for (UInt32 i = 0; i < res; i++)
                {
                    if (!CanControl) //初始化
                    {
                        //收到電腦傳送過來資料,直接傳送給馬達
                        VCI_CAN_OBJ recobj = m_recobj[i];
                        string      StrID  = Convert.ToString(recobj.ID, 16);
                        //Console.WriteLine("ReceiveComputerID: " + StrID);

                        byte   Datalen   = (byte)(m_recobj[i].DataLen % 9);
                        byte[] TransData = new byte[Datalen];
                        for (int k = 0; k < TransData.Length; k++)
                        {
                            TransData[k] = recobj.Data[k];
                        }
                        SendCommandToMotor(recobj.ID, Datalen, TransData);
                        //ID 207 轉向馬達
                        if (recobj.ID == 519)
                        {
                            Array.Copy(TransData, ReceiveComputer_Storage, TransData.Length);
                            Array.Copy(TransData, ReceiveComputer, TransData.Length);
                        }
                        //ID 20B 行走馬達
                        if (recobj.ID == 523)
                        {
                            Array.Copy(TransData, ReceiveMoveComputer_Storage, TransData.Length);
                            Array.Copy(TransData, ReceiveMoveComputer, TransData.Length);
                        }
                    }
                    else //開始介入
                    {
                        VCI_CAN_OBJ recobj  = m_recobj[i];
                        string      StrID   = Convert.ToString(recobj.ID, 16);
                        byte        Datalen = (byte)(recobj.DataLen % 9);
                        //收到ID 207
                        if (recobj.ID == 519) //轉向馬達站號
                        {
                            //將上次傳送結果複製給比較buffer
                            Array.Copy(ReceiveComputer, BufferData, BufferData.Length);
                            //更改ID207資料
                            if (isSend)
                            {
                                Array.Copy(TransData, ReceiveComputer, TransData.Length);//傳送資料
                                isSend = false;
                            }
                            //計算ID207的Check的資料
                            CalCheckData();
                            //傳送指令給馬達
                            SendCommandToMotor(recobj.ID, ReceiveComputer.Length, ReceiveComputer);
                            //回傳給電腦虛擬馬達ID187資料
                            SendCommand(391, ReceiveMotor_Storage.Length, ReceiveMotor_Storage);
                        }
                        if (recobj.ID == 523) //行走馬達站號
                        {
                            //修改ID523資料
                            if (isMoveSend)
                            {
                                Array.Copy(TransMoveData, ReceiveMoveComputer, TransMoveData.Length);//傳送資料
                                isMoveSend = false;
                            }
                            //傳送指令給馬達
                            SendCommandToMotor(recobj.ID, ReceiveMoveComputer.Length, ReceiveMoveComputer);
                            //回傳給電腦虛擬馬達ID18B資料
                            SendCommand(395, ReceiveMoveMotor_Storage.Length, ReceiveMoveMotor_Storage);
                        }
                    }
                }
            }
        }