Как получить доступ к адресу 5xxxx Modbus - PullRequest
2 голосов
/ 25 мая 2011

Я пытаюсь получить доступ к адресам, таким как 50526 на Socomec Diris A40, используя nmodbus.В отличие от других примеров, которые я видел, которые начинаются с 3 или 4, все эти адреса начинаются с 5. 50544, 50550, 50556 - это всего лишь несколько других интересов.

Насколько я понимаю, на данный моментпервое число представляет функцию Modbus и фактически не относится к реальному адресу, т. е. 30000 адресов используют функцию 04, 40000 функций адреса 03 (?).Я видел, как первая цифра опущена, а остальные используются в качестве адреса.Если я попробую это с моими 50000 адресами, я получу некоторый успех, но не со всеми значениями, и результаты не кажутся правильными.MODPOLL возвращает те же результаты, что и мой код.

Я действительно мог бы использовать некоторую помощь!Если кто-нибудь может посоветовать мне, как получить доступ к этим регистрам 5xxxx, я был бы очень признателен.

Код метода:

    public static void ModbusSerialRtuMasterReadRegisters()
    {
        using (SerialPort port = new SerialPort("COM1"))
        {
            // configure serial port

            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;

            try
            {
                port.Open();
                Console.WriteLine("port " + port.PortName + " open: " + port.IsOpen + "\n");
            }
            catch(Exception ex)
            {
                Console.WriteLine("Unable to open port: " + ex);
            }

            // create modbus master
            IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);

            byte slaveId = 1;
            ushort startAddress = 1;
            ushort numRegisters = 5;
            ushort[] registers = new ushort[numRegisters];;

            // read registers
            try
            {
                registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
                for (int i = 0; i < numRegisters; i++)
                    Console.WriteLine("Register {0}={1}", startAddress + i, registers[i]);
            }
            catch (Modbus.SlaveException se)
            {
                Console.WriteLine("Could not find register... \n \n" + se);
            }

            try
            {
                port.Close();
                Console.WriteLine("\nport " + port.PortName + " open: " + port.IsOpen + "\n");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to close port: " + ex);
            }
        }

Ответы [ 2 ]

2 голосов
/ 26 мая 2011

Попробуйте вычесть 40001 или 40000 из адреса 5xxxx (адреса начинаются с 1 или 0).

0 голосов
/ 09 апреля 2014

Регистры с адресом 5xxxx содержат регистры.(Диапазон от 40001 до 5xxxx) Таким образом, чтобы найти адрес регистра Modbus, вычтите его адрес из 40001. Например, 50512 - 40001 = 10511 (290F H)

удачи

...