Beispiel #1
0
        public BCP_FrameHandler(BCPHeader head, byte length_H, byte length_L)  //无数据,但数据长度由用户指定
        {
            CRC16 crc6_modbus = new CRC16();

            this.bcp_ProcessedFrame    = new byte[14];
            this.bcp_ProcessedFrame[0] = head.Frame_Head;
            this.bcp_ProcessedFrame[1] = head.Protocal_Num;
            this.bcp_ProcessedFrame[2] = head.Version_Num;
            this.bcp_ProcessedFrame[3] = head.Target_Addr;
            this.bcp_ProcessedFrame[4] = head.Source_Addr;
            this.bcp_ProcessedFrame[5] = head.Port_Num;
            this.bcp_ProcessedFrame[6] = head.Control_Code;
            this.bcp_ProcessedFrame[7] = 0x00;           //保留
            this.bcp_ProcessedFrame[8] = head.StartReg_Addr_L;
            this.bcp_ProcessedFrame[9] = head.StartReg_Addr_H;

            this.bcp_ProcessedFrame[10] = length_L;      //数据长度由用户指定
            this.bcp_ProcessedFrame[11] = length_H;


            byte[] arrayForCRC = new byte[this.bcp_ProcessedFrame.Length - 2]; //不包括 CRC_L,CRC_H
            for (int i = 0; i < arrayForCRC.Length; i++)
            {
                arrayForCRC[i] = this.bcp_ProcessedFrame[i];
            }
            crc6_modbus.CRC16_modbus(arrayForCRC, arrayForCRC.Length);  //计算出CRC校验码
            this.bcp_ProcessedFrame[this.bcp_ProcessedFrame.Length - 2] = crc6_modbus.getCRC16_L();
            this.bcp_ProcessedFrame[this.bcp_ProcessedFrame.Length - 1] = crc6_modbus.getCRC16_H();
        }
Beispiel #2
0
        public bool enterData(BCPHeader h, byte length_H, byte length_L)
        {
            BCP_FrameHandler bcp_frame = new BCP_FrameHandler(h, length_H, length_L);

            bcp_frame.getBCP_Frame(ref this.IAP_frame);  //将结果复制出来
            this.currentCRC[0] = this.IAP_frame[this.IAP_frame.Length - 2];
            this.currentCRC[1] = this.IAP_frame[this.IAP_frame.Length - 1];
            return(true);
        }
Beispiel #3
0
        /*重新载入第一帧*/
        public bool reloadFirstFrame(byte targetAddr, byte srcAddr)
        {
            if (this.config_data == null)
            {
                return(false);
            }
            setCurrentFrameNum(0);
            if (this.currentFrameNum == totalFrameNum)
            {
                return(false);
            }

            int leftBytesNum = this.config_data.Length - this.currentFrameNum * frameDataSize;  //剩余的字节数

            byte[] rawData = null;
            if (leftBytesNum < frameDataSize)
            {
                rawData = new byte[leftBytesNum];
                for (int i = 0; i < leftBytesNum; i++)
                {
                    rawData[i] = this.config_data[currentFrameNum * frameDataSize + i];
                }
            }
            else
            {
                rawData = new byte[frameDataSize];
                this.currentFrame.IAP_frame = new byte[frameDataSize];          //下一帧满2k
                for (int i = 0; i < 1024; i++)
                {
                    rawData[i] = this.config_data[currentFrameNum * frameDataSize + i];
                }
            }

            BCPHeader h = new BCPHeader();

            h.Frame_Head      = 0x7e;
            h.Protocal_Num    = 0x00;
            h.Version_Num     = 0x00;
            h.Target_Addr     = targetAddr;
            h.Source_Addr     = srcAddr;
            h.Port_Num        = 0x00;
            h.Control_Code    = 0x11;
            h.StartReg_Addr_L = (byte)((this.currentFrameNum + 1) & 0x0f);
            h.StartReg_Addr_H = (byte)((this.currentFrameNum + 1) & 0xf0);
            this.currentFrame.enterData(h, rawData);
            currentFrameNum++; //当前帧数加1
            return(true);
        }
Beispiel #4
0
        /*获取下一帧*/
        public bool loadNextFrame(byte targetAddr, byte srcAddr)
        {
            if (this.config_data == null)
            {
                return(false);
            }
            if (this.currentFrameNum == totalFrameNum)
            {
                return(false);
            }

            int leftBytesNum = this.config_data.Length - this.currentFrameNum * frameDataSize; //剩余的字节数

            byte[] rawData = null;                                                             //需要传送的裸数据
            if (leftBytesNum < frameDataSize)                                                  //下一帧的大小不足文本框中设定的一帧的大小
            {
                rawData = new byte[leftBytesNum];
                for (int i = 0; i < leftBytesNum; i++)
                {
                    rawData[i] = this.config_data[currentFrameNum * frameDataSize + i];
                }
            }
            else
            {
                rawData = new byte[frameDataSize];
                this.currentFrame.IAP_frame = new byte[frameDataSize];          //下一帧的大小为文本框中设定的一帧的大小
                for (int i = 0; i < frameDataSize; i++)
                {
                    rawData[i] = this.config_data[currentFrameNum * frameDataSize + i];
                }
            }
            BCPHeader h = new BCPHeader();

            h.Frame_Head   = 0x7e;
            h.Protocal_Num = 0x00;
            h.Version_Num  = 0x00;
            h.Target_Addr  = targetAddr;
            h.Source_Addr  = srcAddr;
            h.Port_Num     = 0x00;
            h.Control_Code = 0x11;

            h.StartReg_Addr_L = (byte)((this.currentFrameNum + 1) & 0x00ff);
            h.StartReg_Addr_H = (byte)(((this.currentFrameNum + 1) & 0xff00) >> 8);
            this.currentFrame.enterData(h, rawData); //将数据按照BCP协议写入一帧
            currentFrameNum++;                       //当前帧数加1
            return(true);
        }
Beispiel #5
0
        public BCP_FrameHandler(BCPHeader head, byte[] data)  //数据长度自动计算
        {
            CRC16 crc6_modbus = new CRC16();

            if (data == null)  //不携带数据
            {
                this.bcp_ProcessedFrame    = new byte[14];
                this.bcp_ProcessedFrame[0] = head.Frame_Head;
                this.bcp_ProcessedFrame[1] = head.Protocal_Num;
                this.bcp_ProcessedFrame[2] = head.Version_Num;
                this.bcp_ProcessedFrame[3] = head.Target_Addr;
                this.bcp_ProcessedFrame[4] = head.Source_Addr;
                this.bcp_ProcessedFrame[5] = head.Port_Num;
                this.bcp_ProcessedFrame[6] = head.Control_Code;
                this.bcp_ProcessedFrame[7] = 0x00;           //保留
                this.bcp_ProcessedFrame[8] = head.StartReg_Addr_L;
                this.bcp_ProcessedFrame[9] = head.StartReg_Addr_H;

                this.bcp_ProcessedFrame[10] = 0x00;      //数据长度为0
                this.bcp_ProcessedFrame[11] = 0x00;

                byte[] arrayForCRC = new byte[this.bcp_ProcessedFrame.Length - 2]; //不包括 CRC_L,CRC_H
                for (int i = 0; i < arrayForCRC.Length; i++)
                {
                    arrayForCRC[i] = this.bcp_ProcessedFrame[i];
                }
                crc6_modbus.CRC16_modbus(arrayForCRC, arrayForCRC.Length);  //计算出CRC校验码

                this.bcp_ProcessedFrame[12] = crc6_modbus.getCRC16_L();
                this.bcp_ProcessedFrame[13] = crc6_modbus.getCRC16_H();
            }
            else
            {
                this.bcp_ProcessedFrame    = new byte[14 + data.Length];
                this.bcp_ProcessedFrame[0] = head.Frame_Head;
                this.bcp_ProcessedFrame[1] = head.Protocal_Num;
                this.bcp_ProcessedFrame[2] = head.Version_Num;
                this.bcp_ProcessedFrame[3] = head.Target_Addr;
                this.bcp_ProcessedFrame[4] = head.Source_Addr;
                this.bcp_ProcessedFrame[5] = head.Port_Num;
                this.bcp_ProcessedFrame[6] = head.Control_Code;
                this.bcp_ProcessedFrame[7] = 0x00;           //保留
                this.bcp_ProcessedFrame[8] = head.StartReg_Addr_L;
                this.bcp_ProcessedFrame[9] = head.StartReg_Addr_H;

                int data_length = data.Length;
                this.bcp_ProcessedFrame[10] = (byte)(data_length);      //数据长度L
                this.bcp_ProcessedFrame[11] = (byte)(data_length >> 8); //数据长度H

                for (int i = 0; i < data.Length; i++)                   //载入数据
                {
                    this.bcp_ProcessedFrame[12 + i] = data[i];
                }

                byte[] arrayForCRC = new byte[this.bcp_ProcessedFrame.Length - 2]; //不包括 CRC_L,CRC_H
                for (int i = 0; i < arrayForCRC.Length; i++)
                {
                    arrayForCRC[i] = this.bcp_ProcessedFrame[i];
                }
                crc6_modbus.CRC16_modbus(arrayForCRC, arrayForCRC.Length);  //计算出CRC校验码
                this.bcp_ProcessedFrame[this.bcp_ProcessedFrame.Length - 2] = crc6_modbus.getCRC16_L();
                this.bcp_ProcessedFrame[this.bcp_ProcessedFrame.Length - 1] = crc6_modbus.getCRC16_H();
            }
        }