Добрый день.
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 на один.
-
- Лейтенант
- Сообщения: 338
- Зарегистрирован: 11 фев 2018, 13:07
- Имя: Сергей
- Благодарил (а): 5 раз
- Поблагодарили: 1 раз
Modbus TCP - самопроизвольное смещение адресов Input registers на один.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Лейтенант
- Сообщения: 338
- Зарегистрирован: 11 фев 2018, 13:07
- Имя: Сергей
- Благодарил (а): 5 раз
- Поблагодарили: 1 раз
Modbus TCP - самопроизвольное смещение адресов Input registers на один.
Господа, кто нибудь знает, будет эта проблема решаться? 

-
- Лейтенант
- Сообщения: 338
- Зарегистрирован: 11 фев 2018, 13:07
- Имя: Сергей
- Благодарил (а): 5 раз
- Поблагодарили: 1 раз
Modbus TCP - самопроизвольное смещение адресов Input registers на один.
Нашёл ещё один баг в модбасе - input registers (master TCP) не выводит отрицательные числа, хотя это должна быть переменная integer, на самом деле при отправке отрицательного числа, выводит число типа 65510 и т.д.
Проблему удалось решить созданием ПБ вот с таким кодом:
[scroll]
// x - входные данные (от переменной модбас), xq - выходные данные.
if (x > 32767)
{
xq = x - 65536;
}
else
{
xq = x;
}
[/scroll]
ПБ прикрепляю:
Проблему удалось решить созданием ПБ вот с таким кодом:
[scroll]
// x - входные данные (от переменной модбас), xq - выходные данные.
if (x > 32767)
{
xq = x - 65536;
}
else
{
xq = x;
}
[/scroll]
ПБ прикрепляю:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Modbus TCP - самопроизвольное смещение адресов Input registers на один.
Вопрос лишь в том, как Вы интерпретируете принятые байты.Serg_Grn писал(а): 08 дек 2020, 16:48 Нашёл ещё один баг в модбасе - input registers (master TCP) не выводит отрицательные числа, хотя это должна быть переменная integer, на самом деле при отправке отрицательного числа, выводит число типа 65510 и т.д.
При сборке из двух регистров в коде используется word - а это беззнаковое. Приведите к типу инт и будет счастье.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Лейтенант
- Сообщения: 338
- Зарегистрирован: 11 фев 2018, 13:07
- Имя: Сергей
- Благодарил (а): 5 раз
- Поблагодарили: 1 раз
Modbus TCP - самопроизвольное смещение адресов Input registers на один.
Я имею ввиду, что когда у Автора дойдут руки до модбаса, можно было бы указать в описании, что тип переменной word, а не int, тогда не будет неразберихи.
А так то по сути - это не проблема конечно.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость