/// <summary> /// Called when a data change event arrives. /// </summary> /// <param name="clientHandles">The client handles.</param> /// <param name="values">The values.</param> internal void OnDataChange(int[] clientHandles, DaValue[] values) { // check if callbacks are enabled. if (m_monitoredItems == null) { return; } // lookup client handle a report change directly to monitored item. lock (m_monitoredItems) { for (int ii = 0; ii < clientHandles.Length; ii++) { DataChangeInfo info = null; if (!m_monitoredItems.TryGetValue(clientHandles[ii], out info)) { continue; } MonitoredItem[] monitoredItems = info.MonitoredItems; // convert the value to a UA value. info.LastValue = new DataValue(); info.LastError = ReadRequest.GetItemValue(values[ii], info.LastValue, DiagnosticsMasks.All); info.LastValue.ServerTimestamp = DateTime.UtcNow; // queue the values. for (int jj = 0; jj < monitoredItems.Length; jj++) { monitoredItems[jj].QueueValue(info.LastValue, info.LastError); } } } }
/// <summary> /// Reads the property values and stores the results in the request objects. /// </summary> /// <param name="requests">The requests.</param> public void ReadPropertyValues(List <ReadRequest> requests) { for (int ii = 0; ii < requests.Count; ii++) { ReadRequest request = requests[ii]; if (request != null && request.PropertyIds != null) { request.PropertyValues = ReadPropertyValues( request.ItemId, request.PropertyIds.ToArray()); } } }
/// <summary> /// Reads the item values and stores the results in the request object. /// </summary> /// <param name="requests">The requests.</param> public void ReadItemValues(List <ReadRequest> requests) { ComDaGroup group = new ComDaGroup(this, false); try { int count1 = 0; GroupItem[] items = new GroupItem[requests.Count]; ReadRequest[] addItemRequests = new ReadRequest[requests.Count]; // create the items in the temporary group. for (int ii = 0; ii < requests.Count; ii++) { ReadRequest request = requests[ii]; if (request == null) { continue; } if (!request.ValueRequired) { continue; } // add the item. items[count1] = group.CreateItem(request.ItemId, 0, 0, true); addItemRequests[count1] = request; count1++; } // create the items on the server. group.ApplyChanges(); // build the list of values to write. int count2 = 0; int[] serverHandles = new int[count1]; ReadRequest[] readRequests = new ReadRequest[count1]; for (int ii = 0; ii < count1; ii++) { // check for error on create. GroupItem item = items[ii]; ReadRequest request = addItemRequests[ii]; if (item.ErrorId < 0) { request.Value.Error = item.ErrorId; continue; } serverHandles[count2] = item.ServerHandle; readRequests[count2] = request; count2++; } // write values to the server. DaValue[] values = group.SyncRead(serverHandles, count2); // read the values. for (int ii = 0; ii < count2; ii++) { readRequests[ii].Value = values[ii]; } } finally { // delete the group and items. group.Delete(); } }