コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 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);