using NModbus; using NModbus.Device; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace StacjaProb { public class modBusFunctions { public static System.Net.Sockets.TcpClient modbusClient; public static bool isConnected = false; public static IModbusMaster modbusMaster; public class RegisterValue { public int Index { get; set; } public float Value { get; set; } } //public List modbusData_list { get; private set; } = new List(); public static List modbusData_list { get; } = new List(); public static void initConnection() { /* // wczytuje, zapisuje z rejestru aktualne dane const string userRoot = "HKEY_CURRENT_USER\\SoftSPM"; string noSuch = (string)Microsoft.Win32.Registry.GetValue(userRoot, "COMPANY_NAME", ""); if (String.Compare(noSuch, "SoftSPM", true) != 0) { Microsoft.Win32.Registry.SetValue(userRoot + "\\SPM_TST", "MODBUS_TCP", "192.168.1.110"); Microsoft.Win32.Registry.SetValue(userRoot + "\\SPM_TST", "MODBUS_PORT", "502"); } else { vGlobal.vModbus_hostname = Microsoft.Win32.Registry.GetValue(userRoot + "\\SPM_TST", "MODBUS_TCP", "").ToString(); vGlobal.vModbus_port = Microsoft.Win32.Registry.GetValue(userRoot + "\\SPM_TST", "MODBUS_PORT", "").ToString(); } */ try { modbusClient = new System.Net.Sockets.TcpClient(); modbusClient.Connect("192.168.1.110", 502); var factory = new ModbusFactory(); modbusMaster = factory.CreateMaster(modbusClient); isConnected = true; //MessageBox.Show("Połączono z PLC!"); //Log("Połączono z PLC!"); } catch (Exception ex) { isConnected = false; modbusClient = null; modbusMaster = null; MessageBox.Show($"Błąd połączenia: {ex.Message}"); //Log($"Błąd połączenia: {ex.Message}"); } } public static void CloseConnection() { try { modbusClient.Close(); isConnected = false; modbusMaster = null; //btnConnect.Enabled = true; //btnDisconnect.Enabled = false; //MessageBox.Show("Rozłączono z PLC."); //Log("Rozłączono z PLC."); } catch (Exception ex) { //Log($"Błąd rozłączania: {ex.Message}"); MessageBox.Show($"Błąd rozłączania: {ex.Message}"); } } public static void registerReadAll() { if (!isConnected || modbusMaster == null) { //Log("Brak połączenia z PLC."); MessageBox.Show("Brak połączenia z PLC."); return; } try { // Każdy float to 2 rejestry, 31 floatów = 62 rejestry ushort startAddress = 0; ushort numRegisters = 62; ushort[] registers = modbusMaster.ReadHoldingRegisters(1, startAddress, numRegisters); //var list = new List(); modbusData_list.Clear(); for (int i = 0; i < 31; i++) { ushort hi = registers[i * 2]; ushort lo = registers[i * 2 + 1]; uint raw = ((uint)hi << 16) | lo; float value = BitConverter.ToSingle(BitConverter.GetBytes(raw), 0); modbusData_list.Add(new RegisterValue { Index = i, Value = value }); } //ładuje listę do grida //dgvRegisters.DataSource = list; //Log("Pobrano komplet pomiarów z rejestrów 0-26."); //MessageBox.Show("Pobrano komplet pomiarów z rejestrów 0-26."); } catch (Exception ex) { //Log($"Błąd odczytu rejestrów: {ex.Message}"); MessageBox.Show($"Błąd odczytu rejestrów: {ex.Message}"); } } //zapis do rejestrów 100-108 public static void registerWriteAll(ushort startStop, ushort tor, ushort napiecie, ushort odplyw, uint czasOtwarcia, ushort kierunek, ushort licznik, ushort startStopPompy) { if (!isConnected || modbusMaster == null) { //Log("Brak połączenia z PLC."); MessageBox.Show("Brak połączenia z PLC."); return; } try { ushort[] values = new ushort[9]; values[0] = startStop; values[1] = tor; values[2] = napiecie; values[3] = odplyw; values[4] = (ushort)(czasOtwarcia >> 16); // starsze 16 bitów values[5] = (ushort)(czasOtwarcia & 0xFFFF); // młodsze 16 bitów values[6] = kierunek; values[7] = licznik; values[8] = startStopPompy; modbusMaster.WriteMultipleRegisters(1, 100, values); } catch (Exception ex) { MessageBox.Show($"Błąd zapisu: {ex.Message}"); } } // zapis do rejestrów dla Start Stop public static void start_stopWriteAll(ushort startStop, ushort licznik, ushort startStopPompy) { if (!isConnected || modbusMaster == null) { //Log("Brak połączenia z PLC."); MessageBox.Show("Brak połączenia z PLC."); return; } try { ushort[] addresses = new ushort[] { 100, 107, 108 }; ushort[] values = new ushort[] { startStop, licznik, startStopPompy }; for (int i = 0; i < addresses.Length; i++) { modbusMaster.WriteSingleRegister(1, addresses[i], values[i]); } } catch (Exception ex) { MessageBox.Show($"Błąd zapisu: {ex.Message}"); } } // zapis do rejestrów dla Zamknij Otwórz zasuwę public static void zamknij_otworzWriteAll(ushort czasOtwarcia, ushort kierunek, ushort licznik) { if (!isConnected || modbusMaster == null) { //Log("Brak połączenia z PLC."); MessageBox.Show("Brak połączenia z PLC."); return; } try { ushort[] addresses = new ushort[] { 105, 106, 107 }; ushort[] values = new ushort[] { czasOtwarcia, kierunek, licznik }; for (int i = 0; i < addresses.Length; i++) { modbusMaster.WriteSingleRegister(1, addresses[i], values[i]); } } catch (Exception ex) { MessageBox.Show($"Błąd zapisu: {ex.Message}"); } } // zapis do rejestrów dla Zamknij Otwórz zasuwę public static void sendSingleRegister(ushort address, ushort value) { if (!isConnected || modbusMaster == null) { //Log("Brak połączenia z PLC."); MessageBox.Show("Brak połączenia z PLC."); return; } try { modbusMaster.WriteSingleRegister(1, address, value); } catch (Exception ex) { MessageBox.Show($"Błąd zapisu: {ex.Message}"); } } } }