Пример #1
0
        private void ConnectPlc()
        {
            _activePlc   = 0;
            _activePorts = GetActivePlcPorts("127.0.0.1.1.1", 851);
            _plcConnections.Clear();
            ComboBoxPlc.Items.Clear();
            SymbolListViewItems?.Clear();
            foreach (int port in _activePorts)
            {
                PlcConnection plcCon = new PlcConnection(new AmsAddress($"127.0.0.1.1.1:{port}"));
                plcCon.PlcConnectionError += PlcOnPlcConnectionError;
                plcCon.Connect();
                if (plcCon.Connected)
                {
                    plcCon.Connection.AdsStateChanged        += PlcAdsStateChanged;
                    plcCon.Connection.ConnectionStateChanged += PlcOnConnectionStateChanged;
                    plcCon.Connection.AmsRouterNotification  += PlcOnAmsRouterNotification;
                }
                _plcConnections.Add(plcCon);
            }

            if (_plcConnections.Count == 0)
            {
                UpdateDumpStatus("No active PLCs found", Colors.Orange);
                return;
            }

            if (_plcConnections[_activePlc].Connected)
            {
                UpdateDumpStatus("Retrieving symbols", Colors.GreenYellow);
                PopulateListView();
            }

            // Populate Combobox
            if (_plcConnections.Count > 0)
            {
                foreach (int activePort in _activePorts)
                {
                    ComboBoxItem cbi = new ComboBoxItem();
                    cbi.Content = activePort.ToString();
                    ComboBoxPlc.Items.Add(cbi);
                }

                ComboBoxPlc.SelectedIndex = 0;
            }

            PlcConnected             = _plcConnections[_activePlc].Connected;
            ButtonDumpData.IsEnabled = PlcConnected;
        }
Пример #2
0
        private async Task ReadAll(PlcConnection plcCon)
        {
            // Stopwatch sw = Stopwatch.StartNew();
            _symbolValues.Clear();

            // Split up load in packages of 500 Variables at once. More would be faster but stresses the PLC more.
            SymbolCollection symbolColl = new SymbolCollection();
            int cnt = 0;

            foreach (var symbol in plcCon.Symbols)
            {
                if (cnt >= 500)
                {
                    SumSymbolRead sumSymbolRead = new SumSymbolRead(plcCon.Connection, symbolColl);
                    await Task.Run(() =>
                    {
                        object[] symbolValuesReturn = sumSymbolRead.Read();
                        _symbolValues.AddRange(symbolValuesReturn);
                    });

                    cnt        = 0;
                    symbolColl = new SymbolCollection();
                }
                symbolColl.Add(symbol);
                cnt++;
            }

            // Final sum symbol read for the rest in symbolColl
            if (cnt != 0)
            {
                SumSymbolRead sumSymbolRead = new SumSymbolRead(plcCon.Connection, symbolColl);
                await Task.Run(() =>
                {
                    object[] symbolValuesReturn = sumSymbolRead.Read();
                    _symbolValues.AddRange(symbolValuesReturn);
                });
            }
            // Debug.WriteLine($"Collecting data from PLC: {sw.Elapsed}");
        }