/// <summary> /// Returns id actully used for OPC subscription, always as original id. /// valueSubscription.Update() is called using сallbackDoer, see Initialize(..). /// </summary> /// <param name="elementId"></param> /// <param name="valueSubscription"></param> public void AddItem(string?elementId, IValueSubscription valueSubscription) { //Logger?.LogDebug("XiDataProvider.AddItem() " + elementId); if (String.IsNullOrEmpty(elementId)) { var callbackDispatcher = CallbackDispatcher; if (callbackDispatcher is not null) { try { callbackDispatcher.BeginInvoke(ct => valueSubscription.Update(new ValueStatusTimestamp { ValueStatusCode = ValueStatusCode.ItemDoesNotExist })); } catch (Exception) { } } return; } var valueSubscriptionObj = new ValueSubscriptionObj(elementId, valueSubscription); _valueSubscriptionsCollection.Add(valueSubscription, valueSubscriptionObj); if (IsInitialized) { valueSubscription.MappedElementIdOrConst = AddItem(valueSubscriptionObj); } }
/// <summary> /// If valueSubscription is not subscribed - does nothing. /// </summary> /// <param name="valueSubscription"></param> public void RemoveItem(IValueSubscription valueSubscription) { if (!_valueSubscriptionsCollection.Remove(valueSubscription, out ValueSubscriptionObj? valueSubscriptionObj)) { return; } if (IsInitialized) { RemoveItem(valueSubscriptionObj); } }
/// <summary> /// /// </summary> /// <param name="valueSubscription"></param> /// <param name="valueStatusTimestamp"></param> /// <param name="userFriendlyLogger"></param> public void Write(IValueSubscription valueSubscription, ValueStatusTimestamp valueStatusTimestamp, ILogger?userFriendlyLogger) { BeginInvoke(ct => { if (_xiServerProxy is null) { throw new InvalidOperationException(); } _xiDataListItemsManager.Subscribe(_xiServerProxy, CallbackDispatcher, XiDataListItemsManagerOnElementValuesCallback, true, ct); _xiDataListItemsManager.Write(valueSubscription, valueStatusTimestamp); }); }