69 lines
1.9 KiB
C#
69 lines
1.9 KiB
C#
using System;
|
|
using Modbus.Device;
|
|
using static System.Console;
|
|
|
|
namespace ProtosXdigitalDemo
|
|
{
|
|
internal class RegisterReader
|
|
{
|
|
private readonly ModbusIpMaster _master;
|
|
|
|
public RegisterReader(ModbusIpMaster master)
|
|
{
|
|
_master = master;
|
|
}
|
|
|
|
public void ReadAll()
|
|
{
|
|
WriteLine("Reading all input registers…");
|
|
try
|
|
{
|
|
// Read all input registers as ushorts
|
|
ushort[] registers = _master.ReadInputRegisters(0, ChannelCache.AnalogInputCount);
|
|
Display(registers);
|
|
|
|
// Convert to bool[] and display
|
|
bool[] bits = ConvertRegistersToBools(registers);
|
|
Display(bits);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
WriteLine($"[Error] Reading input registers failed → {ex.Message}");
|
|
PromptKey("Press any key to continue…");
|
|
}
|
|
}
|
|
|
|
private void Display(ushort[] registers)
|
|
{
|
|
WriteLine("Input Registers (ushort):");
|
|
for (int i = 0; i < registers.Length; i++)
|
|
{
|
|
WriteLine($" Register #{i + 1}: {registers[i]}");
|
|
}
|
|
}
|
|
|
|
private void Display(bool[] bits)
|
|
{
|
|
WriteLine("Flattened Bits:");
|
|
for (int i = 0; i < bits.Length; i++)
|
|
{
|
|
WriteLine($" Bit #{i + 1}: {(bits[i] ? "On" : "Off")}");
|
|
}
|
|
}
|
|
|
|
// Map a ushort's bits to bools using AND operator
|
|
private bool[] ConvertRegistersToBools(ushort[] registers)
|
|
{
|
|
|
|
return registers.SelectMany(r => Enumerable.Range(0, 16)
|
|
.Select(bit => ((r >> bit) & 1) == 1))
|
|
.ToArray();
|
|
}
|
|
|
|
private void PromptKey(string prompt)
|
|
{
|
|
WriteLine(prompt);
|
|
ReadKey(intercept: true);
|
|
}
|
|
}
|
|
} |