Files
Shi.Ji e31d3560bb 添加 MX-PD-盘古 项目文件
将 MX-PD-盘古 - new 目录下的所有文件添加到主仓库
2026-05-18 11:43:09 +08:00

207 lines
7.8 KiB
C#

using System;
namespace MainShell.Hardware.Acs
{
/// <summary>
/// Represents one ACS controller address definition.
/// Used to describe read/write address, data type, length, and note.
/// </summary>
public sealed class AcsAddressDefinition
{
public AcsAddressDefinition(string name, int address, Type dataType, int length = 1, string description = "")
: this(name, dataType, length, description, address, null)
{
}
public AcsAddressDefinition(string name, string symbolicAddress, Type dataType, int length = 1, string description = "")
: this(name, dataType, length, description, null, symbolicAddress)
{
}
private AcsAddressDefinition(string name, Type dataType, int length, string description, int? address, string symbolicAddress)
{
if (string.IsNullOrWhiteSpace(name))
{
throw new ArgumentException("ACS address name cannot be empty.", nameof(name));
}
if (dataType == null)
{
throw new ArgumentNullException(nameof(dataType));
}
if (length <= 0)
{
throw new ArgumentOutOfRangeException(nameof(length), length, "ACS address length must be greater than 0.");
}
if (address.HasValue && address.Value < 0)
{
throw new ArgumentOutOfRangeException(nameof(address), address, "ACS address cannot be less than 0.");
}
if (!address.HasValue && string.IsNullOrWhiteSpace(symbolicAddress))
{
throw new ArgumentException("ACS address cannot be empty.", nameof(symbolicAddress));
}
Name = name;
Address = address;
SymbolicAddress = symbolicAddress ?? string.Empty;
DataType = dataType;
Length = length;
Description = description ?? string.Empty;
}
/// <summary>
/// Semantic name, for example ServoOn or ActualPosition.
/// </summary>
public string Name { get; }
/// <summary>
/// Numeric address in the ACS controller.
/// </summary>
public int? Address { get; }
/// <summary>
/// Symbolic address in the ACS controller, for example AP_SAPos1.
/// </summary>
public string SymbolicAddress { get; }
/// <summary>
/// Data type mapped to this address.
/// </summary>
public Type DataType { get; }
/// <summary>
/// Continuous address length. Default is 1.
/// </summary>
public int Length { get; }
/// <summary>
/// Address description for maintenance and diagnostics.
/// </summary>
public string Description { get; }
public bool HasNumericAddress
{
get { return Address.HasValue; }
}
public bool HasSymbolicAddress
{
get { return !string.IsNullOrWhiteSpace(SymbolicAddress); }
}
public bool IsBoolean
{
get { return DataType == typeof(bool); }
}
public bool IsInteger
{
get { return DataType == typeof(short) || DataType == typeof(ushort) || DataType == typeof(int) || DataType == typeof(uint) || DataType == typeof(long) || DataType == typeof(ulong); }
}
public bool IsFloatingPoint
{
get { return DataType == typeof(float) || DataType == typeof(double) || DataType == typeof(decimal); }
}
public override string ToString()
{
if (HasNumericAddress)
{
return $"{Name} [Address={Address.Value}, Type={DataType.Name}, Length={Length}]";
}
return $"{Name} [Symbol={SymbolicAddress}, Type={DataType.Name}, Length={Length}]";
}
public static AcsAddressDefinition CreateBool(string name, int address, string description = "")
{
return new AcsAddressDefinition(name, address, typeof(bool), 1, description);
}
public static AcsAddressDefinition CreateBool(string name, int address, int length, string description = "")
{
return new AcsAddressDefinition(name, address, typeof(bool), length, description);
}
public static AcsAddressDefinition CreateInt32(string name, int address, string description = "")
{
return new AcsAddressDefinition(name, address, typeof(int), 1, description);
}
public static AcsAddressDefinition CreateInt32(string name, int address, int length, string description = "")
{
return new AcsAddressDefinition(name, address, typeof(int), length, description);
}
public static AcsAddressDefinition CreateDouble(string name, int address, string description = "")
{
return new AcsAddressDefinition(name, address, typeof(double), 1, description);
}
public static AcsAddressDefinition CreateDouble(string name, int address, int length, string description = "")
{
return new AcsAddressDefinition(name, address, typeof(double), length, description);
}
public static AcsAddressDefinition CreateSymbol(string name, string symbolicAddress, Type dataType, int length = 1, string description = "")
{
return new AcsAddressDefinition(name, symbolicAddress, dataType, length, description);
}
public static AcsAddressDefinition CreateSymbol(string name, Type dataType, int length = 1, string description = "")
{
return new AcsAddressDefinition(name, name, dataType, length, description);
}
public static AcsAddressDefinition CreateBoolSymbol(string name, string symbolicAddress, int length = 1, string description = "")
{
return new AcsAddressDefinition(name, symbolicAddress, typeof(bool), length, description);
}
public static AcsAddressDefinition CreateBoolSymbol(string name, int length = 1, string description = "")
{
return new AcsAddressDefinition(name, name, typeof(bool), length, description);
}
public static AcsAddressDefinition CreateInt32Symbol(string name, string symbolicAddress, int length = 1, string description = "")
{
return new AcsAddressDefinition(name, symbolicAddress, typeof(int), length, description);
}
public static AcsAddressDefinition CreateInt32Symbol(string name, int length = 1, string description = "")
{
return new AcsAddressDefinition(name, name, typeof(int), length, description);
}
public static AcsAddressDefinition CreateDoubleSymbol(string name, string symbolicAddress, int length = 1, string description = "")
{
return new AcsAddressDefinition(name, symbolicAddress, typeof(double), length, description);
}
public static AcsAddressDefinition CreateDoubleSymbol(string name, int length = 1, string description = "")
{
return new AcsAddressDefinition(name, name, typeof(double), length, description);
}
public static AcsAddressDefinition CreateString(string name, int address, int length, string description = "")
{
return new AcsAddressDefinition(name, address, typeof(string), length, description);
}
public static AcsAddressDefinition CreateStringSymbol(string name, string symbolicAddress, int length, string description = "")
{
return new AcsAddressDefinition(name, symbolicAddress, typeof(string), length, description);
}
public static AcsAddressDefinition CreateStringSymbol(string name, int length, string description = "")
{
return new AcsAddressDefinition(name, name, typeof(string), length, description);
}
}
}