Initial commit
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
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}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user