public Task<OpcDaItemValue[]> Start(IList<OpcDaItem> items, CancellationToken token)
        {
            try
            {
                var serverHandles = ArrayHelpers.GetServerHandles(items);
                
                HRESULT[] ppErrors;
                int cancelId = _asyncIO2.Read(serverHandles, TransactionId, out ppErrors);

                if (ppErrors.All(e => e.Failed)) // if all errors no callback will take place
                {
                    _requestManager.CompleteRequest(TransactionId);
                    var result = new OpcDaItemValue[ppErrors.Length];
                    for (var i = 0; i < result.Length; i++)
                    {
                        result[i] = new OpcDaItemValue {Error = ppErrors[i], Item = items[i]};
                    }
                    _tcs.SetResult(result);
                }
                else
                {
                    CancellationId = cancelId;
                    RequestHelpers.SetCancellationHandler(token, Cancel);
                }

                return Task;
            }
            catch (Exception ex)
            {
                _requestManager.CompleteRequest(TransactionId);
                _tcs.SetException(ex);
                return Task;
            }
        }
        public Task <OpcDaItemValue[]> Start(IList <OpcDaItem> items, IList <TimeSpan> maxAge, CancellationToken token)
        {
            try
            {
                var       serverHandles = ArrayHelpers.GetServerHandles(items);
                HRESULT[] ppErrors;
                int       cancelId = _asyncIO3.ReadMaxAge(serverHandles, maxAge, TransactionId, out ppErrors);
                if (ppErrors.All(e => e.Failed)) // if all errors no callback will take place
                {
                    _requestManager.CompleteRequest(TransactionId);
                    var result = new OpcDaItemValue[ppErrors.Length];
                    for (var i = 0; i < result.Length; i++)
                    {
                        result[i] = new OpcDaItemValue {
                            Error = ppErrors[i], Item = items[i]
                        };
                    }
                    _tcs.SetResult(result);
                }
                else
                {
                    CancellationId = cancelId;
                    RequestHelpers.SetCancellationHandler(token, Cancel);
                }

                return(Task);
            }
            catch (Exception ex)
            {
                _requestManager.CompleteRequest(TransactionId);
                _tcs.SetException(ex);
                return(Task);
            }
        }
 public void Test_WriteVQT()
 {
     string[]         itemIds = new[] { "Write Only.Int1", "Write Only.Int2" };
     OpcDaItemValue[] values  = new OpcDaItemValue[]
     {
         new OpcDaItemValue()
         {
             Value   = 0,
             Quality = (short)OPC_QUALITY_STATUS.BAD
         },
         new OpcDaItemValue()
         {
             Value     = 0,
             Timestamp = DateTimeOffset.Now - TimeSpan.FromHours(1)
         },
     };
     HRESULT[] errors = _server.WriteVQT(itemIds, values);
     errors.Should().OnlyContain(hres => hres.Succeeded);
 }
Ejemplo n.º 4
0
        private void OnDataChange(int dwTransid, int hGroup, HRESULT hrMasterquality, HRESULT hrMastererror,
                                  int dwCount, int[] phClientItems,
                                  object[] pvValues, short[] pwQualities, FILETIME[] pftTimeStamps, HRESULT[] pErrors)
        {
            try
            {
                Log.TraceFormat(
                    "On data change. Transaction id: {0}. Client group handle: {1}. Master quality: {2}. Error: {3}.",
                    dwTransid, hGroup, hrMasterquality, hrMastererror);
                if (hGroup != _opcDaGroup.ClientHandle)
                {
                    throw new ArgumentException("Wrong group handle", "hGroup");
                }

                OpcDaItemValue[] values = OpcDaItemValue.Create(_opcDaGroup, dwCount, phClientItems, pvValues,
                                                                pwQualities,
                                                                pftTimeStamps, pErrors);
                if (dwTransid == 0) // Data from subscription
                {
                    OnNewItemValues(values);
                    return;
                }

                IAsyncRequest request = CompleteRequest(dwTransid);
                if (request == null)
                {
                    return;
                }

                if (request.TransactionId != dwTransid)
                {
                    throw new ArgumentException("Wrong transaction id.", "dwTransid");
                }

                request.OnDataChange(dwTransid, hGroup, hrMasterquality, hrMastererror, values);
                OnNewItemValues(values);
            }
            catch (Exception ex)
            {
                Log.Error("Error on data change.", ex);
            }
        }
        public async Task WriteValiesToAnItemOfAnOpcServerAsynchronously()
        {
            Uri url = UrlBuilder.Build("Matrikon.OPC.Simulation.1");

            using (var server = new OpcDaServer(url))
            {
                // Connect to the server first.
                server.Connect();

                // Create a group with items.
                OpcDaGroup group = CreateGroupWithItems(server);

                // Write value to the item.
                OpcDaItem   item   = group.Items.FirstOrDefault(i => i.ItemId == "Bucket Brigade.Int4");
                OpcDaItem[] items  = { item };
                object[]    values = { 123 };

                HRESULT[] results = await group.WriteAsync(items, values);

                // Handle write result.
                if (results[0].Failed)
                {
                    Console.WriteLine("Error writing value");
                }

                // Read and output value.
                OpcDaItemValue value = group.Read(items, OpcDaDataSource.Device)[0];
                Console.WriteLine("ItemId: {0}; Value: {1}; Quality: {2}; Timestamp: {3}",
                                  value.Item.ItemId, value.Value, value.Quality, value.Timestamp);

                // The output should be like the following:
                //   ItemId: Bucket Brigade.Int4; Value: 123; Quality: Good+Good+NotLimited; Timestamp: 04/18/2016 14:04:11 +03:00

                value.Value.Should().Be(123);
                value.Quality.Master.Should().Be(OpcDaQualityMaster.Good);
            }
        }
 protected virtual void OnNewItemValues(OpcDaItemValue[] values)
 {
     Action<OpcDaItemValue[]> handler = NewItemValues;
     if (handler != null) handler(values);
 }
 public void OnDataChange(int dwTransid, int hGroup, int hrMasterquality, int hrMastererror,
     OpcDaItemValue[] values)
 {
     _tcs.TrySetResult(values);
 }
 public void OnReadComplete(int dwTransid, int hGroup, int hrMasterquality, int hrMastererror,
     OpcDaItemValue[] values)
 {
     throw new NotSupportedException();
 }