Как использовать Javascript DataView и ArrayBuffer для правильной установки байтовых данных MODBUS для многобайтовых типов данных
Я использую библиотеку jsmodbus npm для получения 16-битных регистров, используя readHoldingRegisters()
функция.
// array of values returned by jsmodbus readHoldingRegisters for two 16 bit registers
data = [ 17008, 28672 ]
Я использую ArrayBuffer и DataView, чтобы установить и получить данные в требуемом формате:
const buffer = new ArrayBuffer(4)
const view = new DataView(buffer)
Я понимаю, что данные, возвращаемые из регистров, всегда представляют собой 16-разрядные целые числа, разделенные на два 8-разрядных значения байтов, поэтому я должен установить два байта для представления в виде двух последовательных целочисленных значений, даже если их впоследствии можно будет извлечь из представления в виде Int16 или float32. Это правильно?
Во-вторых, если я ожидаю получить данные как со знаком Int16 или Float32, необходимо ли установить старший байт как подписанный и младший байт как беззнаковый, например так:
view.setInt16(0, data[0])
view.setUint16(0, data[1])
И третье: несмотря на необходимость установки правильного порядка байтов, имеет ли значение, какой метод вы используете при установке данных для представления, поскольку порядок байтов и битов в представлении не зависит от того, какой метод вы устанавливаете, только когда вы получаете эти данные обратно?
Конечно, это не похоже на:
view.setInt16(0, data[0])
view.setInt16(1, data[1]) // notice: setInt16
val = view.getFloat32(0)
// val = 122.880859375
view.setInt16(0, data[0])
view.setUint16(1, data[1]) // notice: set*U*int16
val = view.getFloat32(0)
// val = 122.880859375
Проверка работоспособности приветствуется!