using RobotNet10.RobotApp.Client.Shared.Devices;
namespace RobotNet10.RobotApp.Devices;
public enum ModbusRegisterType
{
Holding,
DiscreteInput,
Input,
Coil,
}
///
/// Interface cho thiết bị ModbusTCP
///
public interface IModbusTcpDevice
{
///
/// IP Address của ModbusTCP server
///
string IpAddress { get; }
///
/// Port của ModbusTCP server (mặc định: 502)
///
int Port { get; }
///
/// Slave ID (Unit Identifier)
///
byte SlaveId { get; }
///
/// Trạng thái kết nối
///
bool IsConnected { get; }
// Configuration Properties
event Action DataRegisterChanged;
///
/// Danh sách các vùng Holding Registers đã được cấu hình
///
IReadOnlyList HoldingRegisterRanges { get; }
///
/// Danh sách các vùng Input Registers đã được cấu hình
///
IReadOnlyList InputRegisterRanges { get; }
///
/// Danh sách các vùng Coils đã được cấu hình
///
IReadOnlyList CoilRanges { get; }
///
/// Danh sách các vùng Discrete Inputs đã được cấu hình
///
IReadOnlyList DiscreteInputRanges { get; }
// Holding Registers Methods
///
/// Đọc một holding register từ cache
///
/// Địa chỉ register
/// Giá trị register (16-bit unsigned)
/// Nếu địa chỉ không nằm trong vùng đã khai báo
ushort ReadHoldingRegister(ushort address);
///
/// Đọc nhiều holding registers từ cache
///
/// Địa chỉ bắt đầu
/// Số lượng registers cần đọc
/// Mảng giá trị registers
/// Nếu địa chỉ không nằm trong vùng đã khai báo
ushort[] ReadHoldingRegisters(ushort startAddress, ushort quantity);
///
/// Ghi một holding register vào cache (sẽ được đồng bộ bởi vòng lặp)
///
/// Địa chỉ register
/// Giá trị cần ghi
/// Nếu địa chỉ không nằm trong vùng đã khai báo
Task WriteHoldingRegisterAsync(ushort address, ushort value, CancellationToken cancellationToken = default);
///
/// Ghi nhiều holding registers vào cache (sẽ được đồng bộ bởi vòng lặp)
///
/// Địa chỉ bắt đầu
/// Mảng giá trị cần ghi
/// Nếu địa chỉ không nằm trong vùng đã khai báo
Task WriteHoldingRegistersAsync(ushort startAddress, ushort[] values, CancellationToken cancellationToken = default);
// Input Registers Methods
///
/// Đọc một input register từ cache
///
/// Địa chỉ register
/// Giá trị register (16-bit unsigned)
/// Nếu địa chỉ không nằm trong vùng đã khai báo
ushort ReadInputRegister(ushort address);
///
/// Đọc nhiều input registers từ cache
///
/// Địa chỉ bắt đầu
/// Số lượng registers cần đọc
/// Mảng giá trị registers
/// Nếu địa chỉ không nằm trong vùng đã khai báo
ushort[] ReadInputRegisters(ushort startAddress, ushort quantity);
// Coils Methods
///
/// Đọc một coil từ cache
///
/// Địa chỉ coil
/// Giá trị coil (true/false)
/// Nếu địa chỉ không nằm trong vùng đã khai báo
bool ReadCoil(ushort address);
///
/// Đọc nhiều coils từ cache
///
/// Địa chỉ bắt đầu
/// Số lượng coils cần đọc
/// Mảng giá trị coils
/// Nếu địa chỉ không nằm trong vùng đã khai báo
bool[] ReadCoils(ushort startAddress, ushort quantity);
///
/// Ghi một coil vào cache (sẽ được đồng bộ bởi vòng lặp)
///
/// Địa chỉ coil
/// Giá trị cần ghi
/// Nếu địa chỉ không nằm trong vùng đã khai báo
Task WriteCoilAsync(ushort address, bool value, CancellationToken cancellationToken = default);
///
/// Ghi nhiều coils vào cache (sẽ được đồng bộ bởi vòng lặp)
///
/// Địa chỉ bắt đầu
/// Mảng giá trị cần ghi
/// Nếu địa chỉ không nằm trong vùng đã khai báo
Task WriteCoilsAsync(ushort startAddress, bool[] values, CancellationToken cancellationToken = default);
///
/// Ghi một coil xuống PLC ngay lập tức (không qua queue). Dùng cho pulse (M815 alarm reset).
///
/// Địa chỉ coil
/// Giá trị cần ghi
/// Cancellation token
Task WriteCoilImmediateAsync(ushort address, bool value, CancellationToken cancellationToken = default);
// Discrete Inputs Methods
///
/// Đọc một discrete input từ cache
///
/// Địa chỉ input
/// Giá trị input (true/false)
/// Nếu địa chỉ không nằm trong vùng đã khai báo
bool ReadDiscreteInput(ushort address);
///
/// Đọc nhiều discrete inputs từ cache
///
/// Địa chỉ bắt đầu
/// Số lượng inputs cần đọc
/// Mảng giá trị inputs
/// Nếu địa chỉ không nằm trong vùng đã khai báo
bool[] ReadDiscreteInputs(ushort startAddress, ushort quantity);
}