Пример #1
0
        internal AdsSymbolLoader(IAdsConnection connection, SymbolLoaderSettings settings, IAccessorRawValue accessor, ISession session, SymbolUploadInfo symbolsInfo)
        {
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }
            if (accessor == null)
            {
                throw new ArgumentNullException("accessor");
            }
            if (symbolsInfo == null)
            {
                throw new ArgumentNullException("symbolsInfo");
            }
            ISymbolFactory symbolFactory = null;

            this._connection       = connection;
            this._symbolUploadInfo = symbolsInfo;
            symbolFactory          = (settings.SymbolsLoadMode != SymbolsLoadMode.DynamicTree) ? ((ISymbolFactory) new TwinCAT.Ads.TypeSystem.SymbolFactory(settings.NonCachedArrayElements)) : ((ISymbolFactory) new DynamicSymbolFactory(new TwinCAT.Ads.TypeSystem.SymbolFactory(settings.NonCachedArrayElements), settings.NonCachedArrayElements));
            this._settings         = settings;
            AdsBinder binder = new AdsBinder(this._connection.Address, this, symbolFactory, this.UseVirtualInstances);

            this._symbolFactorServices = new SymbolFactoryServices(binder, symbolFactory, accessor, session);
            symbolFactory.Initialize(this._symbolFactorServices);
            this._rootNamespace = this._connection.Address.ToString();
            this._namespaces    = new NamespaceCollection();
        }
Пример #2
0
        private static void PrintSymbols(AdsClient client)
        {
            SymbolLoaderSettings settings = new SymbolLoaderSettings(TwinCAT.SymbolsLoadMode.VirtualTree);
            ISymbolLoader        loader   = SymbolLoaderFactory.Create(client, settings);

            var symbols = loader.Symbols;

            PrintSymbols(symbols);
        }
Пример #3
0
        public void CopyPasteTestStatic()
        {
            Console.WriteLine(string.Empty);
            Console.WriteLine("Press [Enter] for start:");

            // logger.Active = false;
            Stopwatch stopper = new Stopwatch();

            stopper.Start();

            using (AdsSession session = new AdsSession(new AmsNetId("164.4.4.112.1.1"), 853))
            {
                // client.Synchronize = false;

                // Connect the AdsClient to the device target.
                var connection = session.Connect();

                // Creates the Symbol Objects as hierarchical tree
                SymbolLoaderSettings settings = new SymbolLoaderSettings(SymbolsLoadMode.VirtualTree, ValueAccessMode.IndexGroupOffsetPreferred);
                var symbolLoader = session.SymbolServer.Symbols; // SymbolLoaderFactory.Create(client, settings);

                //// Dump Datatypes from Target Device
                // Console.WriteLine(string.Format("Dumping '{0}' DataTypes:", symbolLoader.DataTypes.Count));
                // foreach (IDataType type in symbolLoader.DataTypes)
                // {
                //    Console.WriteLine(type);
                // }
                // Console.WriteLine("");

                // Dump Symbols from target device
                Console.WriteLine("Dumping '{0}' Symbols:", symbolLoader.Count);
                WriteSymbolTree(symbolLoader, (AdsConnection)connection);
            }

            stopper.Stop();
            TimeSpan elapsed = stopper.Elapsed;

            Console.WriteLine(string.Empty);
        }
Пример #4
0
        internal static IAccessorValue createValueAccessor(IAdsConnection connection, SymbolLoaderSettings settings)
        {
            IAccessorValue        value2       = null;
            AdsValueAccessor      inner        = null;
            IAccessorValueFactory valueFactory = null;

            if (settings.SymbolsLoadMode == SymbolsLoadMode.DynamicTree)
            {
                valueFactory = new DynamicValueFactory(settings.ValueCreation);
                inner        = new AdsValueAccessor(connection, settings.ValueAccessMode, valueFactory, NotificationSettings.Default);
                value2       = new DynamicValueAccessor(inner, valueFactory, settings.ValueCreation);
            }
            else
            {
                valueFactory = new ValueFactory(settings.ValueCreation);
                inner        = new AdsValueAccessor(connection, settings.ValueAccessMode, valueFactory, NotificationSettings.Default);
                value2       = inner;
            }
            IAccessorValueFactory2 factory2 = valueFactory as IAccessorValueFactory2;

            if (valueFactory != null)
            {
                factory2.SetValueAccessor(value2);
            }
            inner.AutomaticReconnection = settings.AutomaticReconnection;
            return(value2);
        }
Пример #5
0
        public void CopyPasteTestDynamic()
        {
            using (TcAdsClient client = new TcAdsClient())
            {
                client.Synchronize = false;

                // Connect to the target device
                client.Connect("164.4.4.112.1.1", 853);

                // Usage of "dynamic" Type and Symbols (>= .NET4 only)
                SymbolLoaderSettings settings  = new SymbolLoaderSettings(SymbolsLoadMode.DynamicTree);
                IAdsSymbolLoader     dynLoader = (IAdsSymbolLoader)SymbolLoaderFactory.Create(client, settings);

                // Set the Default setting for Notifications
                dynLoader.DefaultNotificationSettings = new AdsNotificationSettings(AdsTransMode.OnChange, 200, 2000);

                // Get the Symbols (Dynamic Symbols)
                dynamic dynamicSymbols = ((IDynamicSymbolLoader)dynLoader).SymbolsDynamic;

                dynamic adsPort = dynamicSymbols.TwinCAT_SystemInfoVarList._AppInfo.AdsPort;

                // Access Main Symbol with Dynamic Language Runtime support (DLR)
                // Dynamically created property "Main"
                // dynamic symMain = dynamicSymbols.Main;

                // Main is an 'VirtualSymbol' / Organizational unit that doesn't have a value
                // Calling ReadValue is not allowed
                // bool test = symMain.HasValue;
                // dynamic invalid = symMain.ReadValue();

                // Reading TaskInfo Value
                // With calling ReadValue() a 'snapshot' of the Symbols Instance is taken
                dynamic vTaskInfoArray = dynamicSymbols.TwinCAT_SystemInfoVarList._TaskInfo.ReadValue();

                // Getting the Snapshot time in UTC format
                DateTime timeStamp1 = vTaskInfoArray.UtcTimeStamp;

                // Getting TaskInfo Symbol for Task 1
                dynamic symTaskInfo1 = dynamicSymbols.TwinCAT_SystemInfoVarList._TaskInfo[1];

                // Getting CycleCount Symbol
                dynamic symCycleCount = symTaskInfo1.CycleCount;

                // Take Snapshot value of the ApplicationInfo struct
                dynamic vAppInfo = dynamicSymbols.TwinCAT_SystemInfoVarList._AppInfo.ReadValue();

                // Get the UTC Timestamp of the snapshot
                DateTime timeStamp2 = vAppInfo.UtcTimeStamp;

                // Access the ProjectName of the ApplicationInfo Snapshot (type-safe!)
                string projectNameValue = vAppInfo.ProjectName;

                // Reading the CycleCount Value
                uint cycleCountValue = symTaskInfo1.CycleCount.ReadValue(); // Taking a Value Snapshot

                // Registering for dynamic "ValueChanged" events for the Values
                // Using Default Notification settings
                symCycleCount.ValueChanged += new EventHandler <ValueChangedArgs>(CycleCountValueChanged);

                // Override default notification settings
                symTaskInfo1.NotificationSettings = new AdsNotificationSettings(AdsTransMode.Cyclic, 500, 0);

                // Register for ValueChanged event.
                symTaskInfo1.ValueChanged +=
                    new EventHandler <ValueChangedArgs>(TaskInfo1ValueValueChanged); // Struct Type

                Thread.Sleep(10000);                                                 // Sleep main thread for 10 Seconds
            }

            Console.WriteLine("CycleCount Changed events received: {0}", cycleCountEvents);
            Console.WriteLine("taskInfo1 Changed events received: {0}", taskInfo1Events);
        }