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); }