Хранение типа данных с плавающей запятой в NModbus SlaveDataStore - InputRegisters - PullRequest
0 голосов
/ 20 июня 2019

Я пишу ведомый симулятор Modbus tcp / ip, используя NModbus, и наблюдаю, что хранилище данных, присутствующее для ведомого nmodbus, поддерживает только тип данных ushort.Есть ли способ записать значения с плавающей запятой или десятичные значения в хранилище данных, предоставляемое подчиненным nmodbus?

Я пытаюсь использовать это хранилище данных, чтобы использовать его для чтения данных из входных регистров в моей главной программе Modbus tcp / ip, которая написана отдельно.

Я посмотрел вИсходный код NModbus (https://github.com/NModbus/NModbus/blob/develop/NModbus/Data/DefaultSlaveDataStore.cs) специально для класса хранилищ данных. Однако я заметил, что он поддерживает только типы ushort.

Ниже приведен код, который я использую при записи данных в подчиненные регистры ввода Modbus вМой modbus tcp / ip slave.

public void WriteDefaultValuesToModbusSlave()
        {
            // create and start the TCP slave
            StartTcpListener();

            var factory = new ModbusFactory();
            var network = factory.CreateSlaveNetwork(_slaveTcpListener);
            IModbusSlave slave = factory.CreateSlave(_slaveId);

            // _floatValues =   0F, 2F, 4F, 6F, 8F, 10F
            byte[][] data = RegisterFunctions.FloatToByteValueArrays(_floatValues, 32);

            int i = 0;
            foreach (byte[] byteArray in data)
            {
                _littleEndianValues[i] = Endian.LittleEndian(byteArray);
                i++;
            }

            ushort[] ushortArray = RegisterFunctions.ByteValueArraysToUShorts(_littleEndianValues);
            slave.DataStore.InputRegisters.WritePoints(0, ushortArray);
            network.AddSlave(slave);

            // Start listening
            var listenTask = network.ListenAsync();
        }

Если у кого-то есть опыт работы с NModbus и создания хранилища данных для modbus tcp / ip slave, который можно использовать в качестве данных для чтения входных регистров. Пожалуйста, дайте мне знать, какэто может быть достигнуто?

1 Ответ

0 голосов
/ 26 июня 2019

Иногда то, что вы можете сделать, в зависимости от диапазона значений, которые вам нужны, это прочитать / записать значения, умноженные на степень 10, а затем разделить на ту же степень 10, когда вы ее отобразите. Вы можете комбинировать это с приведением к / от INT16, чтобы получить отрицательные значения. Кажется, что большинство систем автоматизации зданий, с которыми мы интегрируемся, поддерживают это, поэтому я считаю, что это обычная практика.

Например, если вам нужно вернуть значение температуры воды в градусах Цельсия с точностью до 2 цифр:

1) UINT16 имеет диапазон 0 ... 65535, поэтому вы можете получить значения температуры от 0,00 до 655,35, умножив значение на 100 для входного регистра и разделив его на 100, когда вы используете его в вычислениях или отображаете его.

2) INT16 имеет диапазон -32768 ... 32767, поэтому вы можете получить значения от -327.68 до 327.67, умножив значение на 100 и приведя его к UINT16 для входного регистра, а затем приведя обратно к INT16 и разделив на 100 при использовании или расчете.

...