示例#1
0
        public static S7ReadJobAckDatagram TranslateFromMemory(Memory <byte> data)
        {
            var span   = data.Span;
            var result = new S7ReadJobAckDatagram
            {
                Header = S7AckDataDatagram.TranslateFromMemory(data),
            };
            var offset = result.Header.GetParameterOffset();

            result.Function  = span[offset++];
            result.ItemCount = span[offset++];

            for (var i = 0; i < result.ItemCount; i++)
            {
                var res = S7DataItemSpecification.TranslateFromMemory(data.Slice(offset));
                result.Data.Add(res);
                offset += res.GetSpecificationLength();
                if (offset % 2 != 0)
                {
                    offset++;
                }
            }

            return(result);
        }
示例#2
0
        public static IMemoryOwner <byte> TranslateToMemory(S7WriteJobDatagram datagram, out int memoryLength)
        {
            var result = S7HeaderDatagram.TranslateToMemory(datagram.Header, out memoryLength);
            var mem    = result.Memory.Slice(0, memoryLength);
            var span   = mem.Span;
            var offset = datagram.Header.GetHeaderSize();

            span[offset++] = datagram.Function;
            span[offset++] = datagram.ItemCount;

            foreach (var item in datagram.Items)
            {
                S7AddressItemSpecificationDatagram.TranslateToMemory(item, mem.Slice(offset));
                offset += item.GetSpecificationLength();
            }

            foreach (var item in datagram.Data)
            {
                S7DataItemSpecification.TranslateToMemory(item, mem.Slice(offset));
                offset += item.GetSpecificationLength();
                if (offset % 2 != 0)
                {
                    offset++;
                }
            }

            return(result);
        }
示例#3
0
        public static S7WriteJobDatagram TranslateFromMemory(Memory <byte> data)
        {
            var span   = data.Span;
            var result = new S7WriteJobDatagram
            {
                Header = S7HeaderDatagram.TranslateFromMemory(data),
            };
            var offset = result.Header.GetHeaderSize();

            result.Function  = span[offset++];
            result.ItemCount = span[offset++];

            for (var i = 0; i < result.ItemCount; i++)
            {
                var res = S7AddressItemSpecificationDatagram.TranslateFromMemory(data.Slice(offset));
                result.Items.Add(res);
                offset += res.GetSpecificationLength();
            }

            for (var i = 0; i < result.ItemCount; i++)
            {
                var res = S7DataItemSpecification.TranslateFromMemory(data.Slice(offset));
                result.Data.Add(res);
                offset += res.GetSpecificationLength();
            }

            return(result);
        }
示例#4
0
        public static Memory <byte> TranslateToMemory(S7DataItemSpecification datagram, Memory <byte> memory)
        {
            var result = memory.IsEmpty ? new Memory <byte>(new byte[12]) : memory;  // check if we could use ArrayBuffer
            var span   = result.Span;

            span[0] = datagram.ReturnCode;
            span[1] = datagram.TransportSize;
            BinaryPrimitives.WriteUInt16BigEndian(span.Slice(2, 2), GetDataLength(datagram.Length, datagram.TransportSize));
            datagram.Data.CopyTo(result.Slice(4, datagram.Length));
            return(result);
        }
示例#5
0
        public static S7DataItemSpecification TranslateFromMemory(Memory <byte> data)
        {
            var span   = data.Span;
            var result = new S7DataItemSpecification
            {
                ReturnCode    = span[0],
                TransportSize = span[1],
                Length        = SetDataLength(BinaryPrimitives.ReadUInt16BigEndian(span.Slice(2, 2)), span[1])
            };

            result.Data = new byte[result.Length];
            data.Slice(4, result.Length).CopyTo(result.Data);

            return(result);
        }
示例#6
0
        public static Memory <byte> TranslateToMemory(S7ReadJobAckDatagram datagram)
        {
            var result = S7AckDataDatagram.TranslateToMemory(datagram.Header);
            var span   = result.Span;
            var offset = datagram.Header.Header.GetHeaderSize();

            span[offset++] = datagram.Function;
            span[offset++] = datagram.ItemCount;


            foreach (var item in datagram.Data)
            {
                S7DataItemSpecification.TranslateToMemory(item, result.Slice(offset));
                offset += item.GetSpecificationLength();
            }

            return(result);
        }
示例#7
0
        public static Memory <byte> TranslateToMemory(S7DataItemSpecification datagram, Memory <byte> memory)
        {
            var result = memory.IsEmpty ? new Memory <byte>(new byte[12]) : memory;  // check if we could use ArrayBuffer
            var span   = result.Span;

            span[0] = datagram.ReturnCode;
            span[1] = datagram.TransportSize;

            if (datagram.ReturnCode == (byte)ItemResponseRetValue.Success || datagram.ReturnCode == (byte)ItemResponseRetValue.Reserved)
            {
                var size = datagram.ElementSize * datagram.Length;
                BinaryPrimitives.WriteUInt16BigEndian(span.Slice(2, 2), GetDataLength(size, datagram.TransportSize));
                datagram.Data.CopyTo(result.Slice(4, size));
            }
            else
            {
                BinaryPrimitives.WriteUInt16BigEndian(span.Slice(2, 2), 0);
            }
            return(result);
        }
示例#8
0
        public static S7WriteJobDatagram BuildWrite(SiemensPlcProtocolContext context, int id, IEnumerable <WriteItem> vars)
        {
            var numberOfItems = 0;
            var result        = new S7WriteJobDatagram();

            result.Header.ProtocolDataUnitReference = (ushort)id;
            if (vars != null)
            {
                foreach (var item in vars)
                {
                    numberOfItems++;
                    result.Items.Add(new S7AddressItemSpecificationDatagram
                    {
                        TransportSize  = S7AddressItemSpecificationDatagram.GetTransportSize(item.Area, item.VarType),
                        ItemSpecLength = item.NumberOfItems,
                        DbNumber       = item.DbNumber,
                        Area           = (byte)item.Area,
                        Address        = S7AddressItemSpecificationDatagram.GetAddress(item.Offset, item.VarType)
                    });
                }

                foreach (var item in vars)
                {
                    numberOfItems--;
                    result.Data.Add(new S7DataItemSpecification
                    {
                        ReturnCode    = 0x00,
                        TransportSize = S7DataItemSpecification.GetTransportSize(item.Area, item.VarType),
                        Length        = item.NumberOfItems,
                        Data          = item.Data,
                        FillByte      = numberOfItems == 0 || item.NumberOfItems % 2 == 0 ? Array.Empty <byte>() : new byte[1],
                        ElementSize   = item.ElementSize
                    });
                }
            }
            result.Header.ParamLength = (ushort)(2 + result.Items.Count * 12);
            result.Header.DataLength  = (ushort)(S7DataItemSpecification.GetDataLength(vars) + result.Items.Count * 4);
            result.ItemCount          = (byte)result.Items.Count;
            return(result);
        }
示例#9
0
        public static IMemoryOwner <byte> TranslateToMemory(S7ReadJobAckDatagram datagram, out int memoryLength)
        {
            var result = S7AckDataDatagram.TranslateToMemory(datagram.Header, out memoryLength);
            var take   = memoryLength - datagram.Header.GetParameterOffset();
            var mem    = result.Memory.Slice(datagram.Header.GetParameterOffset(), take);
            var span   = mem.Span;
            var offset = 0;

            span[offset++] = datagram.Function;
            span[offset++] = datagram.ItemCount;

            foreach (var item in datagram.Data)
            {
                S7DataItemSpecification.TranslateToMemory(item, mem.Slice(offset));
                offset += item.GetSpecificationLength();
                if (offset % 2 != 0)
                {
                    offset++;
                }
            }

            return(result);
        }