private static bool TryParseAddressFmt2(string src, out ModbusRegion region, out ushort addr) { // very old offset format region = ModbusRegion.HoldingRegisters; addr = 1; if (!int.TryParse(src.Trim().Replace("_", ""), out int num)) { return(false); } if (num < 10_000) { region = ModbusRegion.Coils; num -= 1; } if ((num > 10_000) && (num < 30_000)) { region = ModbusRegion.DiscreteInputs; num -= 100_001; } if ((num > 30_000) && (num < 40_000)) { region = ModbusRegion.InputRegisters; num -= 300_001; } if ((num > 40_000) && (num < 50_000)) { region = ModbusRegion.HoldingRegisters; num -= 400_001; } if ((num < 0) || num > ushort.MaxValue) { return(false); } addr = (ushort)num; return(true); }
private static bool TryParseAddressFmtCoDeSys(string src, out ModbusRegion region, out ushort addr) { // CoDeSys addr format ex.: %MW32768 %MW32768.16 %MW32768.16 region = ModbusRegion.HoldingRegisters; addr = 1; bool isNum(char c) => c >= 0x30 && c <= 0x39; var a = src.Trim().Replace("%", "").ToUpper(); var r = new Regex(@"^[MIQ0]+[A-Z]*[\.0-9]+$"); if ((!r.IsMatch(a)) || (a.Length > 11) || (a.Length < 2)) { return(false); } var i = 1; for (; i < 5; i++) { if (isNum(a[i])) { break; } } var regSrc = a.Substring(0, i); var aSrc = a.Substring(i).Split('.'); // получим адрес if (aSrc.Length > 1) { aSrc[0] += aSrc[1].PadLeft(2, '0'); } if (!ushort.TryParse(aSrc[0], out addr)) { return(false); } var isInput = regSrc.StartsWith("I"); // получим регион if (regSrc.Length > 1) { region = isInput ? ModbusRegion.InputRegisters : ModbusRegion.HoldingRegisters; // Корректировка адреса по флагу размера switch (regSrc[1]) { case 'D': addr *= 2; break; case 'L': addr *= 4; break; } } else { region = isInput ? ModbusRegion.DiscreteInputs : ModbusRegion.Coils; } return(true); }
private static bool TryParseAddress(string src, out ModbusRegion region, out ushort addr) => TryParseAddressFmtCoDeSys(src, out region, out addr) || TryParseAddressFmt1(src, out region, out addr) || TryParseAddressFmt2(src, out region, out addr);