88 lines
2.7 KiB
C#
Raw Normal View History

using Modbus.Device; // NModbus namespace
using System.Net.Sockets;
internal class Program
{
// Configuration
private const string hostname = "127.0.0.1"; // Replace with your Watlow F4 IP
private const int port = 502;
private const byte slaveId = 0;
// Register 100 should be the first read-only input on the F4
// Value 99 or 100 should work depending on zero indexing
private const ushort loadRegister = 99;
private static void Main(string[] args)
{
TcpClient tcpClient = null;
ModbusIpMaster master = null;
try
{
// Initialize connection
tcpClient = new TcpClient(hostname, port);
master = ModbusIpMaster.CreateIp(tcpClient);
// Monitor continuously
while (true)
{
// Check for Escape key press
if (Console.KeyAvailable)
{
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Escape)
{
Console.WriteLine("Escape pressed. Exiting...");
break;
}
}
try
{
// Read load value (holding register)
ushort[] registers = master.ReadHoldingRegisters(slaveId, loadRegister, 1);
int load = registers[0];
// Display load info
DisplayLoadInfo(load);
// Pause before next read
Thread.Sleep(1000);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Initialization error: {ex.Message}");
}
finally
{
// Clean up
master?.Dispose();
tcpClient?.Close();
}
}
private static void DisplayLoadInfo(int load)
{
Console.Clear(); // Clears the console
// Assume load is 0-65535 for 0.00-100.00% (16-bit range)
int percent = (int)load / 65535 * 100;
int barLength = (int)(percent / 2); // Scale to 50 chars for console
Console.WriteLine($"Load Value: {load}");
Console.WriteLine($"Load Percentage: {percent:F2}%");
Console.Write("Bar Graph: [");
Console.Write(new string('=', barLength));
Console.Write(new string(' ', 50 - barLength));
Console.WriteLine("]");
Console.WriteLine("\nHold ESC to exit.");
}
}