| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | using Core.Communication.Transport;using PLC.Siemens.Protocol.Common;namespace PLC.Siemens.Protocol.Header{    public class HeaderPacket    {        public byte P { get; set; }        // Telegram ID, always 32        public byte PduType { get; set; }  // Header type 1 or 7        public ushort AbEx { get; set; }    // AB currently unknown, maybe it can be used for long numbers.        public ushort Sequence { get; set; }// Message ID. This can be used to make sure a received answer        public ushort ParLen { get; set; }   // Length of parameters which follow this header        public ushort DataLen { get; set; }  // Length of data which follow the parameters        public ushort PacketLength { get{return 0x0A;} }         public virtual void Build(ByteBuffer buffer)        {            P = buffer.PopByte();            PduType = buffer.PopByte();            AbEx = buffer.PopUshort();            Sequence = buffer.PopUshort();            ParLen = buffer.PopUshort(); //ReqFunNegotiateParams自身数据长度 不包含head的            DataLen = buffer.PopUshort();        }        public void Build(PduType pduType, ushort parLen, ushort dataLen)        {            P = 0x32;            PduType = (byte)pduType;            AbEx = 0x0000;            Sequence = GetNextWord();            ParLen = parLen;            DataLen = dataLen;        }        public void GetByteBuffer(ByteBuffer buffer)        {            buffer.Push(P);            buffer.Push(PduType);            buffer.Push(AbEx);            buffer.Push(Sequence);            buffer.Push(ParLen);            buffer.Push(DataLen);        }        private static ushort _cntword = 1;        protected static ushort GetNextWord()        {            if (_cntword == 0xFFFF)                _cntword = 1;            return _cntword++;        }    }}
 |