Как использовать 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

Проверка работоспособности приветствуется!

0 ответов

Другие вопросы по тегам