Beckhoff / TF6000_ADS_DOTNET_V5_Samples

Sample code for the Version 6.X series of the TwinCAT ADS .NET Packages
https://infosys.beckhoff.com/content/1033/tc3_ads.net/9407515403.html?id=6770980177009971601
BSD Zero Clause License
37 stars 15 forks source link

Twincat Ads Reactive Handle values #32

Closed JazwinskiMichal closed 2 years ago

JazwinskiMichal commented 2 years ago

I'm working with TwincatAds.Reactive 6.0.190 in .NET 6 WPF Desktop application. I'm also using MVVM pattern. My goal is to create a Class that is going to observe for a PLC Variable changes, collect those variables to a dictionary, and later on use those values in the ViewModel. Here's the method where I'm attaching the notification and action where I'm handling the notification.

`public void AttachNotification(IEnumerable<(string key, Type type)> Symbols) { _observerValueNotification = Observer.Create(val => { // Does handle really start from 2? var handle = val.Handle; if (val.UserData is object[] objects) { string tag = objects[handle - 2].ToString();

                if (!_values.Any(x => x.Key == tag))
                    _values.Add(new SymbolModel { Key = tag, Value = val.Value });
                else
                {
                    var symbol = _values.First(x => x.Key == tag);
                    symbol.Value = val.Value;
                }
            }

            ValuesChanged?.Invoke(_values);
        });

        if (_plcWrapper.AdsClient != null)
        {
            // Get Symbols from SymbolLoader
            List<AnySymbolSpecifier> list = new();
            List<string> userData = new();
            foreach (var (key, type) in Symbols)
            {
                list.Add(new AnySymbolSpecifier(key, new AnyTypeSpecifier(type)));
                userData.Add(key);
            }
            _subscription2 = _plcWrapper.AdsClient.WhenNotificationEx(list, NotificationSettings.ImmediatelyOnChange, userData.ToArray())
                                                  .Subscribe(_observerValueNotification);
        }
    }`

I'm using ValueNotification simply because, I'd like to use this pattern also for complex PLC Variables like Structs. As You can see, in the WhenNotificationEx method I'm using UserData[] to provide some sort of identification of what Variable has changed when handling the change. My idea was to use Handle property from ValueNotification as an indexer in UserData[] to identify what variable I'm dealing with, but for some reason Handle starts from 2.

My question is, is it expected behaviour, does the Handle value really always start from 2?