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; }
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}"); }