private static void BildResults(Dictionary <ReadItem, S7DataItemSpecification> result, ReadPackage normalized, IEnumerable <S7DataItemSpecification> readResults)
        {
            var items = normalized.Items.GetEnumerator();

            foreach (var item in readResults)
            {
                if (items.MoveNext())
                {
                    var current = items.Current;
                    if (current.IsPart)
                    {
                        if (!result.TryGetValue(current.Parent, out var parent) || parent == null)
                        {
                            parent = new S7DataItemSpecification
                            {
                                TransportSize = item.TransportSize,
                                Length        = current.Parent.NumberOfItems,
                                Data          = new byte[current.Parent.NumberOfItems]
                            };
                            result[current.Parent] = parent;
                        }

                        parent.ReturnCode = item.ReturnCode;

                        item.Data.CopyTo(parent.Data.Slice(current.Offset - current.Parent.Offset, current.NumberOfItems));
                    }
                    else
                    {
                        result[current] = item;
                    }
                }
            }
        }
Beispiel #2
0
        private DataValue CreateTestValue <T>(T value)
        {
            ushort countItems = 1;

            if (value is IList l)
            {
                countItems = (ushort)l.Count;
            }
            else if (value is string s)
            {
                countItems = (ushort)s.Length;
            }


            var ri       = ReadItem.Create <T>("DB1", 0, countItems);
            var itemData = ri.ConvertDataToMemory(value);

            Memory <byte> buffer = new byte[4 + itemData.Length];

            buffer.Span[0] = 255;
            buffer.Span[1] = 3;
            BinaryPrimitives.WriteUInt16BigEndian(buffer.Span.Slice(2, 2), (ushort)itemData.Length);
            itemData.CopyTo(buffer.Slice(4));
            return(new DataValue(ri, S7DataItemSpecification.TranslateFromMemory(buffer)));
        }
Beispiel #3
0
 internal DataValue(ReadItem meta, S7DataItemSpecification data)
 {
     _meta       = meta;
     _returnCode = data.ReturnCode;
     _data       = data.Data;
 }
Beispiel #4
0
 internal DataValue(ReadItem meta, S7DataItemSpecification data)
 {
     _meta      = meta;
     ReturnCode = (ItemResponseRetValue)data.ReturnCode;
     Data       = data.Data;
 }
Beispiel #5
0
        public async Task <IEnumerable <S7DataItemSpecification> > ReadAsync(IEnumerable <ReadItem> vars)
        {
            if (ConnectionState != ConnectionState.Opened)
            {
                throw new Dacs7NotConnectedException();
            }

            var result = vars.ToDictionary(x => x, x => null as S7DataItemSpecification);

            foreach (var normalized in CreateReadPackages(_s7Context, vars))
            {
                var id       = GetNextReferenceId();
                var sendData = DataTransferDatagram.TranslateToMemory(
                    DataTransferDatagram.Build(_context,
                                               S7ReadJobDatagram.TranslateToMemory(
                                                   S7ReadJobDatagram.BuildRead(_s7Context, id, normalized.Items))).FirstOrDefault());


                try
                {
                    IEnumerable <S7DataItemSpecification> readResults = null;
                    using (await SemaphoreGuard.Async(_concurrentJobs))
                    {
                        var cbh = new CallbackHandler <IEnumerable <S7DataItemSpecification> >(id);
                        _readHandler.TryAdd(cbh.Id, cbh);
                        try
                        {
                            if (await _socket.SendAsync(sendData) != SocketError.Success)
                            {
                                return(new List <S7DataItemSpecification>());
                            }
                            readResults = await cbh.Event.WaitAsync(_timeout);
                        }
                        finally
                        {
                            _readHandler.TryRemove(cbh.Id, out _);
                        }
                    }

                    if (readResults == null)
                    {
                        throw new TimeoutException();
                    }

                    var items = normalized.Items.GetEnumerator();
                    foreach (var item in readResults)
                    {
                        if (items.MoveNext())
                        {
                            if (items.Current.IsPart)
                            {
                                if (!result.TryGetValue(items.Current.Parent, out var parent) || parent == null)
                                {
                                    parent = new S7DataItemSpecification
                                    {
                                        TransportSize = item.TransportSize,
                                        Length        = items.Current.Parent.Length,
                                        Data          = new byte[items.Current.Parent.Length]
                                    };
                                    result[items.Current.Parent] = parent;
                                }

                                parent.ReturnCode = item.ReturnCode;
                                item.Data.CopyTo(parent.Data.Slice(items.Current.Offset - items.Current.Parent.Offset, items.Current.Length));
                            }
                            else
                            {
                                result[items.Current] = item;
                            }
                        }
                    }
                }
                catch (TaskCanceledException)
                {
                    throw new TimeoutException();
                }
            }
            return(result.Values);
        }