61 public PlcResult<PlcAddress>
Parse(
string text)
63 if (
string.IsNullOrWhiteSpace(text))
65 return PlcResult<PlcAddress>.Failure(
"The PLC address text must not be empty.");
68 var normalizedText = text.Trim().ToUpperInvariant();
71 if (devicePrefix is
null)
73 return PlcResult<PlcAddress>.Failure($
"Unsupported PLC device prefix. Address: {text}");
77 if (deviceType == PlcDeviceType.Unknown)
79 return PlcResult<PlcAddress>.Failure($
"Unknown PLC device type. Address: {text}");
82 var body = normalizedText[devicePrefix.Length..];
83 if (
string.IsNullOrWhiteSpace(body))
85 return PlcResult<PlcAddress>.Failure($
"PLC address offset is missing. Address: {text}");
88 var split = body.Split(
'.', StringSplitOptions.TrimEntries);
91 return PlcResult<PlcAddress>.Failure($
"Invalid PLC bit address format. Address: {text}");
94 if (!
int.
TryParse(split[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out var offset))
96 return PlcResult<PlcAddress>.Failure($
"Invalid PLC address offset. Address: {text}");
101 return PlcResult<PlcAddress>.Failure($
"PLC address offset must be greater than or equal to zero. Address: {text}");
104 int? bitOffset =
null;
106 if (split.Length == 2)
108 if (!
int.
TryParse(split[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsedBitOffset))
110 return PlcResult<PlcAddress>.Failure($
"Invalid PLC bit offset. Address: {text}");
113 if (parsedBitOffset is < 0 or > 15)
115 return PlcResult<PlcAddress>.Failure($
"PLC bit offset must be between 0 and 15. Address: {text}");
118 bitOffset = parsedBitOffset;
121 return PlcResult<PlcAddress>.Success(
new PlcAddress(deviceType, offset, bitOffset));