Files
2026-09-03 10:50:01 +02:00

224 lines
8.0 KiB
C#

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<RegisterValue> modbusData_list { get; private set; } = new List<RegisterValue>();
public static List<RegisterValue> modbusData_list { get; } = new List<RegisterValue>();
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<RegisterValue>();
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}");
}
}
}
}