PDA

Просмотр полной версии : ПЛК210 Опрос Discrete Inputs



SolitarY
22.07.2024, 12:04
Добрый день.
Опрашиваю slave устройство по ModbusRTU. Функции 04 и 03 работают корректно, Holding и Input регистры читаю. Но при использовании функции 02 в буфер опроса ответ 256, когда ожидается бит. При этом если сниферить линию, пакеты запроса и ответа корректны.

Евгений Кислов
22.07.2024, 12:16
Добрый день.


когда ожидается бит

Уточните, пожалуйста, что именно вы под этом понимаете.

capzap
22.07.2024, 12:32
при использовании функции 02 в буфер опроса ответ 256, когда ожидается бит. При этом если сниферить линию, пакеты запроса и ответа корректны.

на скрине у Вас в WORD значение 256, значит если слово сделать масссивом двух байт в первом (нулевом по индексу массива) байте единица стоит в нулевом разряде, всё как по стандарту

ЗЫ Вот только на скрине геркулеса у Вас в ответе ни чего не включено, поэтому не понятно что вообще лежит в DATA_RW[0]

SolitarY
22.07.2024, 12:35
Добрый день.



Уточните, пожалуйста, что именно вы под этом понимаете.

0 или 1, а не целочисленное типа 256

SolitarY
22.07.2024, 12:41
ЗЫ Вот только на скрине геркулеса у Вас в ответе ни чего не включено, поэтому не понятно что вообще лежит в DATA_RW[0]

почему непонятно? пакет - 01 02 01 00 А1 88
01 - slave id, 02 - функция чтения DI, 01 - кол-во байт ответа, 00 - ответ, А1 88 - CRC

Евгений Кислов
22.07.2024, 12:42
0 или 1, а не целочисленное типа 256

Предположу, что вы используете DATA_RW для всех запросов (в т. ч. "Функции 04 и 03").

Теперь предположение:

Считали в буфер, например, значение 345 (функцией 04 или 03). Т.е. DATA_RW[0] имеет значение 345 - оно же 2#0000_0001_0101_1001.

Теперь вызвали код с вашего скриншота - считываем один дискрет инпут с адресом 97.

В ответ получает байт со значением 00 - бит сброшен (01 02 01 00 ... ).

Соответственно, этот байт копируется в буфер, затирая младший байт в DATA_RW[0].

Получаем 2#0000_0001_0000_0000, оно же 256.

В рамках данного предположения - это совершенно закономерный результат.

capzap
22.07.2024, 12:43
0 или 1, а не целочисленное типа 256

77486 и что не так когда биты меняются, соответствующее целочисленное так же меняется

SolitarY
22.07.2024, 12:49
Предположу, что вы используете DATA_RW для всех запросов (в т. ч. "Функции 04 и 03").

Теперь предположение:

Считали в буфер, например, значение 345 (функцией 04 или 03). Т.е. DATA_RW[0] имеет значение 345 - оно же 2#0000_0001_0101_1001.

Теперь вызвали код с вашего скриншота - считываем один дискрет инпут с адресом 97.

В ответ получает байт со значением 00 - бит сброшен (01 02 01 00 ... ).

Соответственно, этот байт копируется в буфер, затирая младший байт в DATA_RW[0].

Получаем 2#0000_0001_0000_0000, оно же 256.

В рамках данного предположения - это совершенно закономерный результат.

Спасибо за наводку! Действительно один буфер для опроса, так что чистка буфера перед считыванием DI помогла.