public static void SetTagValues(string opcServerUrl, BaseTagValueWrapper valuesWrapper) { lock (GetLockObject(opcServerUrl)) { OpcDaServer server = GetOrCreateServer(opcServerUrl); OpcDaGroup group = server.Groups.FirstOrDefault(x => x.Name == "DecisionsWriteGroup"); if (group == null) { group = server.AddGroup("DecisionsWriteGroup"); } BaseTagValue[] values = valuesWrapper.Values; if (values == null || values.Length == 0) { return; } List <OpcDaItemDefinition> missing = new List <OpcDaItemDefinition>(); foreach (BaseTagValue value in values) { OpcDaItem item = group.Items.FirstOrDefault(x => x.ItemId == value.Path); if (item == null) { missing.Add(new OpcDaItemDefinition { ItemId = value.Path }); } } // ensure that tags are in group if (missing.Count > 0) { OpcDaItemResult[] addResults = group.AddItems(missing); foreach (OpcDaItemResult result in addResults) { if (result.Error.Failed) { throw new Exception($"Set tag value failed: could not add tag to group"); } } } List <OpcDaItem> items = new List <OpcDaItem>(); List <object> itemValues = new List <object>(); foreach (BaseTagValue value in values) { OpcDaItem item = group.Items.First(x => x.ItemId == value.Path); //throw if missing items.Add(item); itemValues.Add(OPCAgentUtils.GetObjectValueFromTag(value)); } HRESULT[] writeResults = group.Write(items, itemValues.ToArray()); foreach (HRESULT writeResult in writeResults) { if (writeResult.Failed) { throw new Exception($"Set tag value failed: Error while writing values: {writeResult.ToString()}"); } } } }
private static OpcNode[] GetNodesRecursive(OpcDaBrowserAuto browser, OpcDaGroup group, OpcNode parentNode) { OpcDaBrowseElement[] elements = browser.GetElements(parentNode?.FullPath); // fetches from root if null OpcNode[] results = elements.Select(x => new OpcNode { Name = x.Name, FullPath = x.ItemId, ItemId = x.IsItem ? x.ItemId : null }).ToArray(); foreach (OpcNode node in results) { GetNodesRecursive(browser, group, node); } if (parentNode != null) { parentNode.Children = results; if (!string.IsNullOrEmpty(parentNode.ItemId)) // fetch data types for tags { var def = new OpcDaItemDefinition { ItemId = parentNode.ItemId }; OpcDaItemResult[] groupAddResults = group.AddItems(new OpcDaItemDefinition[] { def }); foreach (OpcDaItemResult addResult in groupAddResults) { if (addResult.Error.Failed) { throw new Exception($"Could not fetch type data for {parentNode.ItemId}"); } } OpcDaItem item = group.Items.FirstOrDefault(x => x.ItemId == parentNode.ItemId); if (item != null) { parentNode.TypeName = item.CanonicalDataType.FullName; } } } return(results); }
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); } }