Показано с 1 по 5 из 5

Тема: ПЛК 110, NModBus

  1. #1

    По умолчанию ПЛК 110, NModBus

    Добрый день.
    По форуму искал, но именно такого вопроса не нашел.

    Есть 110ый, планирую его опрашивать с использованием приложения, написанного на шарпе с использованием библиотеки NModbus.
    Пока играюсь с эмулятором Modbus slave - устройства: задаю разные значения и считываю их из своего приложения. Например, так:
    System.String ipAddress = "127.0.0.1";
    System.Int32 tcpPort = 502;
    TcpClient tcpClient = new TcpClient();
    tcpClient.Connect(ipAddress, tcpPort);
    Modbus.Device.ModbusIpMaster master = Modbus.Device.ModbusIpMaster.CreateIp(tcpClient);

    System.Byte slaveID = 1;
    System.UInt16 startAddress = 0;
    System.UInt16 numOfPoints = 2;

    System.UInt16[] holdingRegister = master.ReadHoldingRegisters(slaveID, startAddress, numOfPoints);

    Вот описание функции ReadHoldingRegisters: ushort[] ReadHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints)

    Откуда видим тип возвращаемого значения - ushort. А если у меня в этот регистр пишется дробное отрицательное число? Как быть?

  2. #2
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Modbus.Utility.ModbusUtility:
    Код:
    /// <summary>
    /// Converts two UInt16 values into a IEEE 32 floating point format
    /// </summary>
    /// <param name="highOrderValue">High order ushort value</param>
    /// <param name="lowOrderValue">Low order ushort value</param>
    /// <returns>IEEE 32 floating point value</returns>
    public static float GetSingle(ushort highOrderValue, ushort lowOrderValue)
    {
    	return BitConverter.ToSingle(BitConverter.GetBytes(lowOrderValue).Concat(BitConverter.GetBytes(highOrderValue)).ToArray(), 0);
    }
    Ну и вообще BitConverter.

  3. #3

    По умолчанию

    Yegor, огромное спасибо за указание на готовую функцию!
    Про BitConverter знаю, уже хотел писать свой велосипед, используя его.

    Остался следующий вопрос: по спецификации ModBus каждый HoldingRegister содержит 2 байта. Зачем тогда в Modbus.Utility.ModbusUtility.GetSingle нужно 2 ushort параметра (highOrderValue, lowOrderValue)? На случай особо больших значений, которые мне может понадобиться размещать в двух HoldingRegister?

  4. #4
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Потому что «дробные» это 4 байта, а не 2, если речь о тех дробных, что используются повсеместно (real в кодесисе, float в шарпе).

  5. #5

    По умолчанию

    пример из
    ftp://ftp.icpdas.com/pub/cd/8000cd/n.../nmodbus/demo/
    Вложения Вложения

Похожие темы

  1. Пример проекта WPF/XAML + NModbus
    от Yegor в разделе Трёп (Курилка)
    Ответов: 2
    Последнее сообщение: 22.06.2021, 20:04
  2. Ответов: 13
    Последнее сообщение: 30.11.2016, 13:11
  3. СПК 110 + ПЛК 110.32
    от oweron в разделе СПК1хх
    Ответов: 2
    Последнее сообщение: 29.01.2014, 16:36
  4. Продам ПЛК 150, БП04-24, МБ 110, МК 110
    от dll в разделе Трёп (Курилка)
    Ответов: 1
    Последнее сообщение: 14.08.2013, 08:54
  5. Плк 63 + МУ 110-8И + МВ 110-8АС HELP
    от KIPiA_Krg в разделе ПЛК63/73
    Ответов: 15
    Последнее сообщение: 11.01.2012, 12:26

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •