Exemplo n.º 1
0
        public void ParseAndAddMessageToQueue(byte[] RecvBytes, int RecvCount, TcpClient Client, ref int parseCount, byte[] arrayParse)
        {
            //匹配比较数组, -1表示不需要比较,忽略
            int[] arrayCompare = new int[Message.MessageLength]
            {
                Message.MessStartCode, Message.MessVID1, Message.MessVID2, -1, -1, -1, -1, -1,
                -1, -1, -1, -1, -1, -1, -1, -1,
                -1, -1, -1, -1, -1, -1, -1, -1,
                -1, -1, -1, -1, -1, -1, -1, Message.MessEndCode,
            };

            for (int i = 0; i < RecvCount; i++)
            {
                if (arrayCompare[parseCount] != -1)               //需要匹配
                {
                    if (RecvBytes[i] == arrayCompare[parseCount]) //相等
                    {
                        arrayParse[parseCount++] = RecvBytes[i];
                    }
                    else  //不相等,复位计数器
                    {
                        parseCount = 0;
                    }
                }
                else  //不需要比较,直接赋值,并更新计数器
                {
                    arrayParse[parseCount++] = RecvBytes[i];
                }

                if (parseCount >= Message.MessageLength)
                {
                    parseCount = 0;                                         //和校验

                    if (MyMath.CheckSum(arrayParse, Message.MessageLength)) //分析数据,把数据添加到队列m_TcpMeas
                    {
                        TcpMeasType MeasType = TcpMeasType.MEAS_TYPE_ARM;
                        byte        MeasCode = arrayParse[Message.MessageCommandIndex];

                        TcpMeas TempMeas = new TcpMeas();
                        if (TempMeas != null)
                        {
                            TempMeas.Client   = Client;
                            TempMeas.MeasType = MeasType;
                            TempMeas.MeasCode = MeasCode;
                            Array.Copy(RecvBytes, TempMeas.Param, TempMeas.Param.Length);
                            m_RecvMeasQueue.Enqueue(TempMeas);
                        }
                    }
                    else  //校验和错误,则更新错误码后发回
                    {
                        arrayParse[Message.MessageStateIndex] = Message.MessErrorState;
                        using (NetworkStream stream = Client.GetStream())
                        {
                            stream.Write(arrayParse, 0, arrayParse.Length);
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        public void ProcessArmMessage()
        {
            if (m_MyTcpClientArm != null && m_MyTcpClientArm.IsConnected)
            {
                while (m_MyTcpClientArm.m_RecvMeasQueue.Count != 0)
                {
                    TcpMeas TempMeas = m_MyTcpClientArm.m_RecvMeasQueue.Dequeue();
                    if (TempMeas != null && TempMeas.Client != null)
                    {
                        if (TempMeas.MeasType == TcpMeasType.MEAS_TYPE_ARM)  // 处理和ARM之间的消息
                        {
                            Message.MessageCodeARM Code = (Message.MessageCodeARM)TempMeas.MeasCode;
                            switch (Code)
                            {
                            case Message.MessageCodeARM.ArmUpdate:       //收到升级指令回复
                            {
                                m_UpdateAction = UpdateAction.UpdateAction_Update;
                                //m_UpdateAction = UpdateAction.UpdateAction_SendFileLength;
                            }
                            break;

                            case Message.MessageCodeARM.ArmUpdateFileLength:        //收到升级文件长度指令回复
                            {
                                m_UpdateAction = UpdateAction.UpdateAction_SendFileData;
                            }
                            break;

                            case Message.MessageCodeARM.ArmUpdateFileData:          //收到升级文件每包数据指令回复
                            {
                                m_CurrentPage++;
                                m_UpdateAction = UpdateAction.UpdateAction_SendFileData;
                            }
                            break;

                            case Message.MessageCodeARM.ArmUpdateSucceed:           //升级成功回复
                            {
                                byte Result = TempMeas.Param[Message.MessageCommandIndex + 1];
                                if (Result == 0x01)
                                {
                                    m_UpdateResult = true;
                                }
                                else
                                {
                                    m_UpdateResult = false;
                                }

                                m_UpdateAction = UpdateAction.UpdateAction_Result;
                            }
                            break;

                            default: break;
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        public void ProcessTcpServerMessage()
        {
            if (m_MyTcpServerArm != null)
            {
                while (m_MyTcpServerArm.m_RecvMeasQueue.Count != 0)
                {
                    TcpMeas TempMeas = m_MyTcpServerArm.m_RecvMeasQueue.Dequeue();
                    if (TempMeas != null && TempMeas.Client != null)
                    {
                        if (TempMeas.MeasType == TcpMeasType.MEAS_TYPE_ARM)  // 处理和PLC之间的消息
                        {
                            Message.MessageCodeARM Code = (Message.MessageCodeARM)TempMeas.MeasCode;
                            Debug.WriteLine(Code);

                            switch (Code)
                            {
                            case Message.MessageCodeARM.ArmUpdate:
                            {
                                //断开服务后重新创建
                                m_MyTcpServerArm.CloseServer();
                                Thread.Sleep(1000);
                                if (m_MyTcpServerArm != null)
                                {
                                    IPAddress ServerIp   = IPAddress.Parse(TextBoxIp.Text);
                                    int       ServerPort = int.Parse(TextBoxPort.Text);
                                    m_MyTcpServerArm.CreatServer(ServerIp, ServerPort);
                                }
                            }
                            break;

                            case Message.MessageCodeARM.ArmUpdateFileLength:
                            {
                                m_FileSize = BitConverter.ToInt32(TempMeas.Param, Message.MessageCommandIndex + 1);
                            }
                            break;

                            case Message.MessageCodeARM.ArmUpdateFileData:
                            {
                                m_TotalPages++;
                                if (m_TotalPages != 0 && m_TotalPages * 16 >= m_FileSize)
                                {
                                    m_Writer.Write(TempMeas.Param, Message.MessageCommandIndex + 3, (m_FileSize - (m_TotalPages - 1) * 16));
                                }
                                else
                                {
                                    m_Writer.Write(TempMeas.Param, Message.MessageCommandIndex + 3, 16);
                                }

                                m_CurrentPage = BitConverter.ToInt16(TempMeas.Param, Message.MessageCommandIndex + 1);
                                Debug.WriteLine("Current Page: " + m_CurrentPage);

                                if (m_TotalPages != 0 && m_TotalPages * 16 >= m_FileSize)
                                {
                                    TempMeas.Param[Message.MessageCommandIndex] = (byte)Message.MessageCodeARM.ArmUpdateSucceed;
                                    TempMeas.Param[TempMeas.Param.Length - 2]   = 0x00;

                                    byte Sum = MyMath.CalculateSum(TempMeas.Param, TempMeas.Param.Length);
                                    TempMeas.Param[TempMeas.Param.Length - 2] = Sum;
                                }
                            }
                            break;

                            default: break;
                            }

                            NetworkStream stream = TempMeas.Client.GetStream();
                            stream.Write(TempMeas.Param, 0, TempMeas.Param.Length);
                        }
                    }
                }
            }
        }