Exemple #1
0
        /// <summary>
        /// 对外接口,通过CAN发送数据
        /// </summary>
        /// <param name="str">发送数据的命令</param>
        /// <returns>发送状态</returns>
        public bool Write(string str)
        {
            List <SendCMD> sendCMDs = new List <SendCMD>();
            CAN_DataFrame  sendobj  = new CAN_DataFrame();

            sendobj.nDataLen = 8;
            //str = str.Substring(1);
            str = str.Replace('$', ' ');
            var cmds = str.Split(',');

            for (int i = 0; i < cmds.Length; i++)
            {
                if (cmds[i] == "" || cmds[i] == ",")
                {
                    continue;
                }
                SendCMD a = new SendCMD();
                a.Name = cmds[i].Substring(0, 6);
                var ttt = cmds[i].Substring(6);
                a.Value     = Convert.ToInt32(cmds[i].Substring(6));
                a.ID        = CheckID(a.Name);
                sendobj.uID = a.ID;
                sendCMDs.Add(a);
            }

            sendobj.nSendType   = 0; //Normal send
            sendobj.bRemoteFlag = 0; //不是远程帧
            sendobj.bExternFlag = 1; //扩展帧
            sendobj.nDataLen    = 8;
            OganizeData(sendCMDs, ref sendobj);
            if (IsCANopen)
            {
                if (CanCmd.CAN_ChannelSend(CANDeviceHandle, canDeviceChannel, ref sendobj, 1) == 0)
                {
                    Info?.Invoke("[E]发送失败");
                }
                else
                {
                    Info?.Invoke("[I]发送成功");
                }
            }
            else
            {
                Info?.Invoke("[E]CAN未打开");
            }
            return(true);
        }
Exemple #2
0
        /// <summary>
        /// 一对一发送命令/数据
        /// </summary>
        /// <param name="nDestId"></param>命令/数据目的ID
        /// <param name="nCmd"></param>命令
        /// <param name="rData"></param>数据
        /// <returns></returns>
        public bool SyncRequest(int nDestId, int nCmd, byte[] Data)
        {
            bool   boRC = false;//运行正常与否标志位
            Socket socket;

            if (nCmd != (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_OFF &&
                nCmd != (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON &&
                !SubsysIsConnected(Commonfunction.GetSubsysIndex(nDestId)))
            {
                Trace.WriteLine(string.Format("当前子系统不可用,函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd));
#if REALEASE
                GlobalDataInterface.WriteErrorInfo(string.Format("当前子系统不可用,函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd));
#endif
                return(false);
            }
            //C++: AfxGetApp()->BeginWaitCursor();

            string strIP     = "";
            int    nSubsysId = Commonfunction.GetSubSysID(nDestId);
            int    nPortNum  = ConstPreDefine.FSM_PORT_NUM;

            if (nCmd >= 0x2000 && nCmd < 0x3000) //判断为HC->IPM的发送命令
            {
                nPortNum  = ConstPreDefine.IPM_PORT_NUM;
                nSubsysId = Commonfunction.GetIPMID(nDestId);
            }
            string strTemp = ConstPreDefine.LC_IP_ADDR_TEMPLATE;
            strIP = strTemp + nSubsysId;          //得到发送的IP地址
            //if (nCmd >= 0x7100 && nCmd <= 0x7101) //判断为HC->SIM的发送命令
            if (nCmd >= 0x7000 && nCmd <= 0x7102) //判断为HC->SIM的发送命令
            {
                nPortNum = ConstPreDefine.SIM_PORT_NUM;
                strIP    = ConstPreDefine.SIM_IP_ADDR;//得到发送的IP地址
            }

            try
            {
                Lock(1000);//资源加锁


                socket = CreateSocket();              //创建socket
                socket.SendBufferSize = 0;            //网络发送缓冲区为0
                socket.SendTimeout    = nTrySendTime; //设置发送超时时间
                socket.NoDelay        = false;

                //if (nCmd == (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON)
                //    boRC = ConnectoServer(socket, strIP, nPortNum, true);//初始连接
                //else
                //boRC = ConnectoServer(socket, strIP, nPortNum, false);//运行状态下连接
                boRC = ConnectoServer(socket, strIP, nPortNum, true);//2015-5-14 运行过程中会存在网线断了的情况


                if (!boRC)
                {
                    Trace.WriteLine("网络连接失败!");
#if REALEASE
                    GlobalDataInterface.WriteErrorInfo(string.Format("网络连接失败!"));
#endif
                    UnLock();

                    socket.Close();
                    socket = null;
                    Trace.WriteLine("Socket关闭");
#if REALEASE
                    GlobalDataInterface.WriteErrorInfo("Socket关闭");
#endif
                    return(boRC);
                }
                //byte[] ABC = new byte[1];
                //ABC[0] = 100;
                //if (nCmd == (int)HC_IPM_COMMAND_TYPE.HC_CMD_CONTINUOUS_SAMPLE_ON)
                //{
                //    QueryPerformanceFrequency(ref freq);
                //    QueryPerformanceCounter(ref count);
                //    Trace.WriteLine("发送连续采集前同步信息开始");
                //    boRC = Send(socket, ABC);//发送同步信息
                //    Trace.WriteLine("发送连续采集前同步信息结束");
                //}
                SendCMD cmd = new SendCMD();

                cmd.SYNC    = 0x434e5953;
                cmd.nSrcId  = ConstPreDefine.HC_ID; //发送源ID
                cmd.nDestId = nDestId;              //发送目的ID
                cmd.nCmd    = nCmd;

                int    nStructLen = 4 * sizeof(int);
                byte[] bytes      = new byte[nStructLen];
                bytes = Commonfunction.StructToBytes(cmd);//将结构体转化为byte数组
                //if (nCmd == (int)HC_IPM_COMMAND_TYPE.HC_CMD_CONTINUOUS_SAMPLE_ON)
                //    Trace.WriteLine("发送连续采集命令头开始");
                boRC = Send(socket, bytes);//发送命令头
                //if (nCmd == (int)HC_IPM_COMMAND_TYPE.HC_CMD_CONTINUOUS_SAMPLE_ON)
                //{
                //    //socket.RE
                //    Trace.WriteLine("发送连续采集命令头结束");
                //}
                ////测试获取图像命令发送时间
                //QueryPerformanceCounter(ref count1);
                //count = count1 - count;
                //result = (double)(count) / (double)freq;
                //Trace.WriteLine("发送连续采集同步信息+命令头时间:" + result);
                if (!boRC)
                {
                    Trace.WriteLine("网络发送命令头错误!");
#if REALEASE
                    GlobalDataInterface.WriteErrorInfo(string.Format("网络发送命令头错误!"));
#endif
                    goto leave;
                }

                int A = BitConverter.ToInt32(bytes, 12);

                if (Data != null)
                {
                    boRC = Send(socket, Data);//发送数据

                    if (!boRC)
                    {
                        Trace.WriteLine("网络发送数据错误!");
#if REALEASE
                        GlobalDataInterface.WriteErrorInfo(string.Format("网络发送数据错误!"));
#endif
                        goto leave;
                    }
                }


leave:
                DestroySocket(socket, boRC);
                UnLock();
                //AfxGetApp()->EndWaitCursor();
                if (boRC)
                {
                    if (Data != null)
                    {
                        Trace.WriteLine(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length));
//#if REALEASE
//                        GlobalDataInterface.WriteErrorInfo(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length));
//#endif
                    }
                    else
                    {
                        Trace.WriteLine(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd));
//#if REALEASE
//                        GlobalDataInterface.WriteErrorInfo(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd));
//#endif   //delete by xcw 20201207
                    }
                }
                else
                {
                    if (nCmd == (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON)
                    {
                        m_IsConnected[Commonfunction.GetSubsysIndex(nDestId)] = false;
                    }
                    if (Data != null)
                    {
                        Trace.WriteLine(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2},当前时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nDestId, nCmd, Data.Length));
#if REALEASE
                        GlobalDataInterface.WriteErrorInfo(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2},当前时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nDestId, nCmd, Data.Length));
#endif
                    }
                    else
                    {
                        Trace.WriteLine(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},当前时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nDestId, nCmd));
#if REALEASE
                        GlobalDataInterface.WriteErrorInfo(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},当前时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nDestId, nCmd));
#endif   //add by xcw 20201207
                    }
                }
            }
            catch (Exception e)
            {
                Trace.WriteLine("失败:函数SyncRequest" + e);
#if REALEASE
                GlobalDataInterface.WriteErrorInfo("失败:函数SyncRequest" + e);
#endif
                return(false);
            }

            return(boRC);
        }
        /// <summary>
        /// 一对一发送命令/数据
        /// </summary>
        /// <param name="nDestId"></param>命令/数据目的ID
        /// <param name="nCmd"></param>命令
        /// <param name="rData"></param>数据
        /// <returns></returns>
        public bool SyncRequest(int nDestId, int nCmd, byte[] Data)
        {
            bool   boRC = false;//运行正常与否标志位
            Socket socket;

            if (nCmd != (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_OFF &&
                nCmd != (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON &&
                !SubsysIsConnected(Commonfunction.GetSubsysIndex(nDestId)))
            {
                Trace.WriteLine(string.Format("当前子系统不可用,函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd));
#if REALEASE
                GlobalDataInterface.WriteErrorInfo(string.Format("当前子系统不可用,函数SyncRequest nDestId:{0},nCmd={1}", nDestId, nCmd));
#endif
                return(false);
            }
            //C++: AfxGetApp()->BeginWaitCursor();

            string strIP     = "";
            int    nSubsysId = Commonfunction.GetSubSysID(nDestId);
            int    nPortNum  = ConstPreDefine.FSM_PORT_NUM;

            if (nCmd >= 0x2000 && nCmd < 0x3000) //判断为HC->IPM的发送命令
            {
                nPortNum  = ConstPreDefine.IPM_PORT_NUM;
                nSubsysId = Commonfunction.GetIPMID(nDestId);
            }

            string strTemp = ConstPreDefine.LC_IP_ADDR_TEMPLATE;
            strIP = strTemp + nSubsysId;//得到发送的IP地址


            try
            {
                Lock(1000);                //资源加锁

                socket = CreateSocket();   //创建socket
                socket.SendBufferSize = 0; //网络发送缓冲区为0
                if (nCmd == (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON)
                {
                    boRC = ConnectoServer(socket, strIP, nPortNum, true, true);                                                                                                                                                                       //初始连接
                }
                else if ((nCmd >= (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_OFF && nCmd <= (int)HC_FSM_COMMAND_TYPE.HC_CMD_CUPSTATERESET) || (nCmd > (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON && nCmd <= (int)HC_FSM_COMMAND_TYPE.HC_CMD_GRADE_INFO)) //所有子系统发送
                {
                    boRC = ConnectoServer(socket, strIP, nPortNum, false, true);                                                                                                                                                                      //运行状态下连接
                }
                else
                {
                    boRC = ConnectoServer(socket, strIP, nPortNum, false, false);//运行状态下连接
                }
                if (!boRC)
                {
                    Trace.WriteLine("网络连接失败!");
#if REALEASE
                    GlobalDataInterface.WriteErrorInfo(string.Format("网络连接失败!"));
#endif
                    UnLock();
                    socket.Close();
                    return(boRC);
                }

                SendCMD cmd = new SendCMD();

                cmd.SYNC    = 0x434e5953;
                cmd.nSrcId  = ConstPreDefine.HC_ID; //发送源ID
                cmd.nDestId = nDestId;              //发送目的ID
                cmd.nCmd    = nCmd;

                int    nStructLen = 4 * sizeof(int);
                byte[] bytes      = new byte[nStructLen];
                bytes = Commonfunction.StructToBytes(cmd); //将结构体转化为byte数组

                boRC = Send(socket, bytes);                //发送命令头
                if (!boRC)
                {
                    Trace.WriteLine("网络发送命令头错误!");
#if REALEASE
                    GlobalDataInterface.WriteErrorInfo(string.Format("网络发送命令头错误!"));
#endif
                    goto leave;
                }

                int A = BitConverter.ToInt32(bytes, 12);

                if (Data != null)
                {
                    boRC = Send(socket, Data);//发送数据
                    if (!boRC)
                    {
                        Trace.WriteLine("网络发送数据错误!");
#if REALEASE
                        GlobalDataInterface.WriteErrorInfo(string.Format("网络发送数据错误!"));
#endif
                        goto leave;
                    }
                }


leave:
                DestroySocket(socket, boRC);
                UnLock();
                //AfxGetApp()->EndWaitCursor();
                if (boRC)
                {
                    Trace.WriteLine(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length));
#if REALEASE
                    GlobalDataInterface.WriteErrorInfo(string.Format("成功:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length));
#endif
                }
                else
                {
                    if (nCmd == (int)HC_FSM_COMMAND_TYPE.HC_CMD_DISPLAY_ON)
                    {
                        m_IsConnected[Commonfunction.GetSubsysIndex(nDestId)] = false;
                    }
                    Trace.WriteLine(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length));
#if REALEASE
                    GlobalDataInterface.WriteErrorInfo(string.Format("失败:函数SyncRequest nDestId:{0},nCmd={1},数据长度={2}", nDestId, nCmd, Data.Length));
#endif
                }
            }
            catch (Exception e)
            {
                Trace.WriteLine("失败:函数SyncRequest" + e);
#if REALEASE
                GlobalDataInterface.WriteErrorInfo("失败:函数SyncRequest" + e);
#endif
                return(false);
            }

            return(boRC);
        }