Страница 1 из 1

Modbus TCP - самопроизвольное смещение адресов Input registers на один.

Добавлено: 05 сен 2020, 16:54
Serg_Grn
Добрый день.
FLProg версия 6.3.1, не портативная.
Контроллер NodeMCU, работает как ModBus TCP Master, читает Input registers, в качестве слейва я пробовал использовать разные контроллеры - результат везде один, соответственно проблема точно в Master.
Суть проблемы: после включения контроллера данные по Modbus прилетают правильно в течение примерно 1-2 минут. Потом происходит смещение значений переменных на один адрес вниз, т.е. то, что передаётся слейвом в адресе 0, приходит мастеру в адресе 1, то что передаётся в адресе 1, приходит в адресе 2 и т.д. А то, что передаётся в последнем адресе (у меня он 21), приходит мастеру в адресе 0, т.е. смещение происходит по кругу.
Смотрел блоком "последняя ошибка" - ошибок нет, т.е. данные поступают от слейва правильные, а потом происходит их смещение и в таком виде я читаю значения переменных.
В приложении проект, там нет ничего кроме ModBus, я специально всё убрал, чтоб убедиться что проблема именно в этом.

Modbus TCP - самопроизвольное смещение адресов Input registers на один.

Добавлено: 03 дек 2020, 16:29
Serg_Grn
Господа, кто нибудь знает, будет эта проблема решаться? :smile37:

Modbus TCP - самопроизвольное смещение адресов Input registers на один.

Добавлено: 08 дек 2020, 16:48
Serg_Grn
Нашёл ещё один баг в модбасе - input registers (master TCP) не выводит отрицательные числа, хотя это должна быть переменная integer, на самом деле при отправке отрицательного числа, выводит число типа 65510 и т.д.
Проблему удалось решить созданием ПБ вот с таким кодом:
[scroll]
// x - входные данные (от переменной модбас), xq - выходные данные.
if (x > 32767)
{
xq = x - 65536;
}
else
{
xq = x;
}
[/scroll]
ПБ прикрепляю:
modbus-integer_(Code_-_Basic).ubi

Modbus TCP - самопроизвольное смещение адресов Input registers на один.

Добавлено: 08 дек 2020, 17:45
Sancho
Serg_Grn писал(а): 08 дек 2020, 16:48 Нашёл ещё один баг в модбасе - input registers (master TCP) не выводит отрицательные числа, хотя это должна быть переменная integer, на самом деле при отправке отрицательного числа, выводит число типа 65510 и т.д.
Вопрос лишь в том, как Вы интерпретируете принятые байты.
При сборке из двух регистров в коде используется word - а это беззнаковое. Приведите к типу инт и будет счастье.

Modbus TCP - самопроизвольное смещение адресов Input registers на один.

Добавлено: 13 дек 2020, 20:19
Serg_Grn
Serg_Grn писал(а): 05 сен 2020, 16:54 Приведите к типу инт и будет счастье.
Я имею ввиду, что когда у Автора дойдут руки до модбаса, можно было бы указать в описании, что тип переменной word, а не int, тогда не будет неразберихи.
А так то по сути - это не проблема конечно.