///<summary>
        /// 查询报文
        ///</summary>
        ///<returns></returns>
        public override string Serialize()
        {
            //包头 F3
            //功能码 02
            //变量数 2bytes
            //I口数 2bytes
            //O口数 2bytes
            //CRC校验   2bytes
            var data = new List <string>
            {
                Header,
                Convert.ToString(FunctionCode, 16),
                Convert.ToString((byte)(ValNum & 0xff), 16),
                Convert.ToString((byte)((ValNum >> 8) & 0xff), 16),
                Convert.ToString((byte)(InNum & 0xff), 16),
                Convert.ToString((byte)((InNum >> 8) & 0xff), 16),
                Convert.ToString((byte)(OutNum & 0xff), 16),
                Convert.ToString((byte)((OutNum >> 8) & 0xff), 16)
            };

            var crc = CrcHelper.GetCrc16(data);

            data.AddRange(crc);
            return(data.Join(","));
        }
Beispiel #2
0
        public void TestCRC16BlockSum()
        {
            //see: https://www.sps-forum.de/hochsprachen-opc/56412-upload-von-block-zur-s7-2.html
            var bytes = new byte[] { 0x0C, 0x00, 0x0E, 0xC0, 0x00, 0xC1, 0x00, 0xC3, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xD8, 0x80, 0x65, 0x00 };
            var crc   = CrcHelper.GetCrc16(bytes);

            Assert.AreEqual(crc, 0x7822);
        }
        public bool IsAll()
        {
            if (!DataStrList.Any())
            {
                return(false);
            }

            var len  = DataStrList.Count();
            var body = DataStrList.Take(len - 2);
            var crc  = CrcHelper.GetCrc16(body).ToArray();

            return(crc.Length == 2 && crc[1] == DataStrList.ElementAt(len - 1) && crc[0] == DataStrList.ElementAt(len - 2));
        }
        ///<summary>
        /// 设置变量报文
        ///</summary>
        ///<returns></returns>
        public override string Serialize()
        {
            ValNum = Vals.Count;
            //包头 F3
            //功能码 05
            //变量数 2bytes
            //地址数据 2bytes
            //变量数据 4bytes
            //CRC校验   2bytes
            var data = new List <string>
            {
                Header,
                Convert.ToString(FunctionCode, 16),
                Convert.ToString((byte)(ValNum & 0xff), 16),
                Convert.ToString((byte)((ValNum >> 8) & 0xff), 16),
            };
            var cData1 = new List <string>();
            var tData1 = new List <string>();
            var cData2 = new List <string>();
            var tData2 = new List <string>();

            foreach (var valuePair in Vals)
            {
                tData1.Clear();
                var key = valuePair.Key;
                for (var i = 0; i < 2; i++)
                {
                    tData1.Add(Convert.ToString((byte)(key >> i * 8 & 0xff), 16));
                }
                cData1.AddRange(tData1);

                tData2.Clear();
                var val = valuePair.Value;
                for (var i = 0; i < 4; i++)
                {
                    tData2.Add(Convert.ToString((byte)(val >> i * 8 & 0xff), 16));
                }
                cData2.AddRange(tData2);
            }
            data.AddRange(cData1);
            data.AddRange(cData2);

            var crc = CrcHelper.GetCrc16(data);

            data.AddRange(crc);
            return(data.Join(","));
        }
        /// <summary>
        /// 0 成功 1 失败
        /// </summary>
        /// <returns></returns>
        public override dynamic Deserialize(string response)
        {
            var datas = response.Split(",");

            //包头 F3
            //功能码 05
            if (datas.Length == 0 || datas[0] != "f3" || datas[1] != "05")
            {
                return(null);
            }

            //CRC校验   2bytes
            var bCrc = datas.Skip(3);
            var crc  = CrcHelper.GetCrc16(datas.Take(datas.Length - 2));

            return(datas[2] == "00" ? 0 : 1);
        }
Beispiel #6
0
        ///<summary>
        /// 重启报文
        ///</summary>
        ///<returns></returns>
        public override string Serialize()
        {
            // 包头 F3
            // 功能码	03
            // 子功能码	00
            // CRC校验	2bytes
            var data = new List <string>
            {
                Header,
                Convert.ToString(FunctionCode, 16),
                Convert.ToString(SubFunctionCode, 16),
            };

            var crc = CrcHelper.GetCrc16(data);

            data.AddRange(crc);
            return(data.Join(","));
        }
Beispiel #7
0
        ///<summary>
        /// 报文
        ///</summary>
        ///<returns></returns>
        public override string Serialize()
        {
            //0xF1 10 00 00 01,41,00,00,脚本长度4字节小端,密码长度4字节小端 CRC
            // 包头 F1
            // 功能码	10
            // 子功能码	00
            // 操作码	00
            // 脚本长度4字节小端	01,41
            // 密码长度4字节小端	00,00
            // CRC校验	2bytes
            var data = new List <string>
            {
                Header,
                FunctionCode.ToString(),
                Convert.ToString(SubFunctionCode, 16),
                Convert.ToString(OperateCode, 16),
                "01",
                "41",
                "00",
                "00"
            };
            var cData = new List <string>();

            for (var i = 0; i < 4; i++)
            {
                cData.Add(Convert.ToString((byte)(DataLength >> i * 8 & 0xff), 16));
            }
            data.AddRange(cData);
            cData.Clear();
            for (var i = 0; i < 4; i++)
            {
                cData.Add(Convert.ToString((byte)(PwdLength >> i * 8 & 0xff), 16));
            }
            data.AddRange(cData);

            var crc = CrcHelper.GetCrc16(data);

            data.AddRange(crc);
            return(data.Join(","));
        }
Beispiel #8
0
        public byte[] BuildBytes()
        {
            var list = new List <byte>();

            list.AddRange(Header);
            list.AddRange(EncodingHelper.HexToBytes(Length.ToHex(4)));
            list.AddRange(EncodingHelper.HexToBytes(SessionId));
            list.AddRange(Device.Bytes);
            list.AddRange(Command.GetBytes());

            Crc16 = CrcHelper.GetCrc16(list.ToArray()).ToHex(4);
            list.AddRange(EncodingHelper.HexToBytes(Crc16));

            Body          = list.CloneRange(Header.Length + 2, Length).ToArray();
            BodyHex       = Body.ToHex();
            EncryptedBody = filter.Crypto.Encrypt(Body);

            list.RemoveRange(Header.Length + 2, Length);
            list.AddRange(EncryptedBody);

            return(list.ToArray());
        }