⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmain.cs

📁 一个用C#写的CDT主站程序
💻 CS
📖 第 1 页 / 共 2 页
字号:
            rtb_Info.AppendText(sHexData);

            SetTextColor(ColorBak);
        }

        private void ShowPackage()
        {
            int i;
            string sHexData = "";
            Color ColorBak = rtb_Info.SelectionColor;

            SetTextColor(Color.Blue);
            for (i = 0; i < (PackageBuf[POS_INFOBYTENUM] * INFOBYTE_SIZE + 12);i++ )
            {
                sHexData += PackageBuf[i].ToString("X2");
                if (((i + 1) % 6) == 0)
                    sHexData += "  ";
            }
            rtb_Info.AppendText(sHexData + "\r\n");

            if (rtb_Info.TextLength > 10240)
            {
                rtb_Info.Select(0, 4096);
                rtb_Info.Cut();
                rtb_Info.Select(rtb_Info.Text.Length, 0);
                rtb_Info.ScrollToCaret();
            }

            SetTextColor(ColorBak);
        }

        private void mi_ShowData_Click(object sender, EventArgs e)
        {
            pFDataShow.ShowDialog();
        }

        private void SetTextColor(Color _color)
        {
            rtb_Info.Select(rtb_Info.Text.Length, 0);
            rtb_Info.SelectionColor = _color;
        }

        private void ParseYCFrame()
        {
            int i;
            uint uiInfoFun;

            for (i = 0; i < PackageBuf[POS_INFOBYTENUM]; i++)
            {
                uiInfoFun = PackageBuf[INFOBYTE_SIZE*2+i*INFOBYTE_SIZE];
                if (uiInfoFun >= 0xF0)//遥信插帧
                {
                    ShowInfo("\r\n遥信插帧  ");
                    ShowInfoWord(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                    ParseYX(INFOBYTE_SIZE*2+i*INFOBYTE_SIZE);
                }
                else if (uiInfoFun == 0xE0)//处理遥控插帧
                {
                    //
                }
                else
                {
                    if(CheckCRC8(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE) )
                        ParseYC(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                }
            }
        }

        private void ParseYXFrame()
        {
            int i;
            uint uiInfoFun;

            for (i = 0; i < PackageBuf[POS_INFOBYTENUM]; i++)
            {
                uiInfoFun = PackageBuf[INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE];
                if (uiInfoFun < 0xF0)
                {
                    ShowErrInfo("遥信信息字功能号不正确!\r\n");
                    ShowInfoWord(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                }
                else
                {
                    if (CheckCRC8(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE))
                        ParseYX(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                }       
            }
        }

        private void ParseDNFrame()
        {
            int i;
            uint uiInfoFun;

            for (i = 0; i < PackageBuf[POS_INFOBYTENUM]; i++)
            {
                uiInfoFun = PackageBuf[INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE];
                if (uiInfoFun >= 0xF0)//遥信插帧
                {
                    ShowInfo("\r\n遥信插帧  ");
                    ShowInfoWord(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                    ParseYX(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                }
                else if (uiInfoFun == 0xE0)//处理遥控插帧
                {
                    //
                }
                else
                {
                    if (CheckCRC8(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE))
                        ParseDN(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                }
            }
        }

        private void ParseSOEFrame()
        {
            int i,j;
            int iOffset;
            uint uiInfoFun;
            bool bLeagal = true; 


            
            for (i = 0; i < 2; i++)
            {
                iOffset = INFOBYTE_SIZE * 2+INFOBYTE_SIZE*i;
                for (j = 0; j < 6; j++)
                {
                    if (PackageBuf[iOffset + j] == PackageBuf[iOffset + INFOBYTE_SIZE*2 + j] &&
                        PackageBuf[iOffset + INFOBYTE_SIZE*2 + j] == PackageBuf[iOffset + INFOBYTE_SIZE * 4 + j])
                    {
                        continue;
                    }
                    else
                    {
                        bLeagal = false;
                        break;
                    }
                }
                if (!bLeagal)
                    break;
            }
            if (!bLeagal)
            {
                ShowErrInfo("SOE信息字没有连续重复三遍\r\n");
            }
            else
            {
                ParseSOE(INFOBYTE_SIZE * 2);
            }

            for (i = 6; i < PackageBuf[POS_INFOBYTENUM]; i++)
            {
                uiInfoFun = PackageBuf[INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE];
                if (uiInfoFun >= 0xF0)//遥信插帧
                {
                    ShowInfo("\r\n遥信插帧  ");
                    ShowInfoWord(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE); 
                    if (CheckCRC8(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE))
                       ParseYX(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                }
                else if (uiInfoFun == 0xE0)//处理遥控插帧
                {
                    //
                }
                else
                {
                    ShowErrInfo("不合适的功能号");
                    ShowInfoWord(INFOBYTE_SIZE * 2 + i * INFOBYTE_SIZE);
                }
            }

        }

        private void ParseYC(int iBaseAddr)
        {
            int iXH;
            int iYC_RTU;
            byte uiHeigh, uiLow;

            iXH = PackageBuf[iBaseAddr] * 2;

            uiLow   = PackageBuf[iBaseAddr + 1];
            uiHeigh = PackageBuf[iBaseAddr + 2];

            if ((uiHeigh & 0x80) != 0)
            {
                ShowErrInfo(iXH.ToString() + "遥测点数值无效");
                ShowInfoWord(iBaseAddr);
                return;
            }
            else if ((uiHeigh & 0x40) != 0)
            {
                ShowErrInfo(iXH.ToString() + "遥测点数值溢出");
                ShowInfoWord(iBaseAddr);
                return;
            }
            else
            {
                iYC_RTU = (uiHeigh << 8) | uiLow;
                if ((uiHeigh & 0x08) != 0)
                {
                    iYC_RTU = ~iYC_RTU;
                    iYC_RTU++;
                    iYC_RTU &= 0x00000FFF;
                    iYC_RTU = -iYC_RTU;
                }
            }

            pFDataShow.UpdateYC(iXH,iYC_RTU);
            
            iXH++;

            uiLow = PackageBuf[iBaseAddr + 3];
            uiHeigh = PackageBuf[iBaseAddr + 4];

            if ((uiHeigh & 0x80) != 0)
            {
                ShowErrInfo(iXH.ToString() + "遥测点数值无效");
                ShowInfoWord(iBaseAddr);
                return;
            }
            else if ((uiHeigh & 0x40) != 0)
            {
                ShowErrInfo(iXH.ToString() + "遥测点数值溢出");
                ShowInfoWord(iBaseAddr);
                return;
            }
            else
            {
                iYC_RTU = (uiHeigh << 8) | uiLow;
                if ((uiHeigh & 0x08) != 0)
                {
                    iYC_RTU = ~iYC_RTU;
                    iYC_RTU++;
                    iYC_RTU &= 0x00000FFF;
                    iYC_RTU = -iYC_RTU;
                }
            }

            pFDataShow.UpdateYC(iXH, iYC_RTU);
        }

        private void ParseYX(int iBaseAddr)
        {
            int i,j;
            int iXH;
            byte bStatus;

            iXH = PackageBuf[iBaseAddr] & 0x0F;
            iXH *= 32;

            for (i = 0; i < 4; i++)
            {
                bStatus = PackageBuf[iBaseAddr + i+1];
                for (j = 0; j < 8; j++)
                {
                    if ((bStatus & 0x01) != 0)
                        pFDataShow.UpdateYX(iXH, true);
                    else
                        pFDataShow.UpdateYX(iXH, false);
                    bStatus = (byte)(bStatus >> 1);
                    iXH ++;
                }
            }
        }

        private void ParseDN(int iBaseAddr)
        {
            int i;
            int iXH;
            uint iDN_RTU = 0;
            byte bDN_Temp;

            iXH = PackageBuf[iBaseAddr] - 0xA0;

            if ((PackageBuf[iBaseAddr + 4] & 0x80) != 0)
            {
                ShowErrInfo(iXH.ToString() + "遥脉数值无效");
                ShowInfoWord(iBaseAddr);
                return;
            }
            else if ((PackageBuf[iBaseAddr + 4] & 0x80) != 0)//BCD
            {
                for (i = 0; i < 3; i++)
                {
                    bDN_Temp = PackageBuf[iBaseAddr + i+1];
                    iDN_RTU += (uint)((bDN_Temp & 0x0F) * (10 ^ i));
                    iDN_RTU += (uint)(((bDN_Temp >> 4) & 0x0F) * (10 ^ (i + 1)));
                }
            }
            else //二进制值
            {
                iDN_RTU = iDN_RTU |
                          (PackageBuf[iBaseAddr + 1]) |
                          ((uint)PackageBuf[iBaseAddr + 2]<<8) |
                          ((uint)PackageBuf[iBaseAddr + 3]<<16);
            }

            pFDataShow.UpdateDN(iXH, iDN_RTU);
        }

        private void ParseSOE(int iBaseAddr)
        {
            int iXH;
            bool bStatus;
            int iMillisecond,iSecond,iMinute,iHour,iDay;

            if (!CheckCRC8(iBaseAddr))
                return;

            if (PackageBuf[iBaseAddr] != 0x80)
            {
                ShowErrInfo("不是用于SOE帧的功能号");
                ShowInfoWord(iBaseAddr);
                return;
            }
            else
            {
                iMillisecond = ((int)(PackageBuf[iBaseAddr+2]<<8)|(int)PackageBuf[iBaseAddr+1])&0x000003FF;
                iSecond      = ((int)PackageBuf[iBaseAddr+3])&0x0000003F;
                iMinute      = ((int)PackageBuf[iBaseAddr+4])&0x0000003F;
            }

            if(!CheckCRC8(iBaseAddr+6))
                return;

            if(PackageBuf[iBaseAddr+6]!=0x81)
            {
                ShowErrInfo("不是用于SOE帧的功能号");
                ShowInfoWord(iBaseAddr);
                return;
            }
            else
            {
                iHour        = ((int)PackageBuf[iBaseAddr+6+1])&0x0000001F;
                iDay         = ((int)PackageBuf[iBaseAddr+6+2])&0x0000001F;               

                iXH = ((((int)PackageBuf[iBaseAddr+6+4])&0x0F)<<8)|PackageBuf[iBaseAddr+6+3];

                if((PackageBuf[iBaseAddr+6+4]&0x80)!=0)
                    bStatus = true;
                else 
                    bStatus = false;
            }
            pFDataShow.UpdateSoe(iXH,bStatus, iMillisecond, iSecond, iMinute, iHour, iDay);
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -