Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 22

Тема: Modbus.lib портиться команда при таймауте

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию Modbus.lib портиться команда при таймауте

    Здравствуйте! Помогите, пожалуйста, разобраться в проблеме.
    ПЛК150-220.У.М
    Версия таргета: 2.12
    Использую библиотеку Modbus.lib для организации Modbus мастера на порту RS-485. Набросал программу на основе примеров с форума. Столкнулся с такой непонятной проблемой: если устройство не успело ответить до таймаута, то следующая Modbus-посылка от мастера будет испорчена: вместо команды от мастера будет выслана часть ответа слейв устройства с прикрепленной к ней чек суммой.
    И даже не важно какой ФБ будет вызываться дальше, например: таймаут вышел на блоке MB_RD_HOLD_REGS, а следующим в программе будет запускаться блок MB_WR_REGS, все равно его посылка будет представлять часть предыдущего ответа.
    Прикладываю тестовую программу, скриншот программы, скриншот Serial Port Monitor когда проблема возникает и когда нет (если увеличить размер таймаута). В высланной программе проблема проявляется, но вырезано все лишнее и используется только один MB блок.
    И еще вопрос, нужно ли делать блоку Enable := FALSE после выполнения? Его наличие или отсутствие никак не влияет на проблему.
    Изображения Изображения
    Вложения Вложения
    Последний раз редактировалось Ovtia; 01.12.2021 в 07:41.

  2. #2
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Не вдавался в детали обсуждения, но может быть проблема в этом:
    https://owen.ru/forum/showthread.php...l=1#post219033 ?
    В части 2 данного поста.

  3. #3

    По умолчанию

    Цитата Сообщение от Спорягин Кирилл Посмотреть сообщение
    Не вдавался в детали обсуждения, но может быть проблема в этом:
    https://owen.ru/forum/showthread.php...l=1#post219033 ?
    В части 2 данного поста.
    В моем примере проблема воспроизводится и с MB_RD_HOLD_REGS и с MB_WR_REGS, в общем с любым ФБ использующим буфер. Для чтения не нужно даже готовить буфер, его готовит ФБ чтения (если я все правильно понимаю), но и он портится как я описал. Но спасибо за ссылку, узнал еще кое-что нового об этой библиотеке.

  4. #4

    По умолчанию

    Второй раз можете попробовать вызывать ФБ MB_RD_HOLD_REGS2 без указания выходных и INPUT_OUTPUT параметров, например:
    MB_RD_HOLD_REGS2(Enable:= FALSE);
    Создается ощущение, что пишите в эти переменные(в том числе и буфер) по нескольку раз в коде программы.
    Может быть проверить работу кода, ниже:

    IF NOT rs485_opened THEN
    rs485_settings.Port := 0;
    rs485_settings.dwBaudRate := 115200;
    rs485_settings.byStopBits := 1;
    rs485_settings.byParity := 0;
    rs485_settings.dwTimeout := 0;
    rs485_settings.dwBufferSize := 0;
    rs485_settings.dwScan := 0;
    rs485_COM_SERVICE(Enable:= NOT(rs485_opened), Settings:= rs485_settings, Task:= OPEN_TSK, Ready=> rs485_opened);
    END_IF

    IF rs485_opened THEN
    CASE step OF
    0:
    IF mb_complete AND mb_exception = 0 THEN
    step:=1;
    END_IF
    IF mb_complete AND mb_exception <> 0 THEN
    step:=2;
    END_IF
    1:
    (* &#240;&#224;&#231;&#225;&#238;&#240; &#228;&#224;&#237;&#237;&#251;&#245; *)
    dp1MVA8 := SHL(BYTE_TO_WORD(mb_buffer[0]), 8) OR BYTE_TO_WORD(mb_buffer[1]);
    int1MVA8 := SHL(BYTE_TO_WORD(mb_buffer[2]), 8) OR BYTE_TO_WORD(mb_buffer[3]);
    step:=2;
    2:
    IF TONDelay.Q THEN
    step := 0;
    END_IF
    END_CASE

    MB_RD_HOLD_REGS2(
    Enable:= (step=0), (* &#194;&#251;&#239;&#238;&#235;&#237;&#229;&#237;&# 232;&#229; &#239;&#240;&#232; 0 &#248;&#224;&#227;&#229; *)
    Mode:= MB_RTU,
    DevAddr:= 2,
    FirstAddr:= 0,
    Quantity:= 48,
    ComHandle:= rs485_settings.Port,
    TimeOut:= response_timeout,
    Buffer:= mb_buffer,
    Complete=> mb_complete,
    Exception=> mb_exception,
    ByteCnt=> mb_bytesReturn);
    TONDelay(IN:= (step=2), PT:= PollDelay);
    END_IF

  5. #5

    По умолчанию

    Цитата Сообщение от ferret_maybe Посмотреть сообщение
    Второй раз можете попробовать вызывать ФБ MB_RD_HOLD_REGS2 без указания выходных и INPUT_OUTPUT параметров, например:
    MB_RD_HOLD_REGS2(Enable:= FALSE);
    Создается ощущение, что пишите в эти переменные(в том числе и буфер) по нескольку раз в коде программы.
    Может быть проверить работу кода, ниже:
    Да, я пробовал вызывать его и без параметров и вообще не вызывать его с Enable:= FALSE.
    В данном примере в параметры передаю только константы, в буфер вообще не пишу, только читаю, да и если даже убрать чтение из буфера, поведение блока (то что он шлет в порт) не поменяется.
    Мне нравится ваше решение, но к сожалению, результат в порте тот же.

  6. #6

    По умолчанию

    Начнем сначала... Волновое сопротивление в линии передачи стоит?
    Если что без обид все пытаются помочь со своего взгляда, себе вы можете помочь только сами. Форумчане не видят полной картины, что у вас там происходит.

    Немного лирики из личного опыта: коллега занимался настройкой передачи данных "в поле" и на верхнем уровне(настраивал конфигурацию ПЛК) сидел другой человек. При договоре о параметрах передачи по телефону:
    - Параметры передачи как обычно?
    - Да.
    Затем долго нет возможности подключиться к ведомому со стороны мастера, хотя с использованием ноутбука все по шлейфу от ведущего и ведомого работает, данные о правильности формирования запроса формируются при прослушивании канала. В общем непонятно, мастер шлет... слейв отвечает, но мастер не получает. Проблема была в том, что при настройке параметров передачи на мастере было указано EVEN - контроль четности, а на ведомом отключен контроль четности. Работа двух человек...

  7. #7

    По умолчанию

    Работаю с библиотекой давно и проблем (у меня) с ней не было.

    Код:
    VAR
       SendModbus : MB_WR_REGS;
       ES : BOOL := FALSE;
       DataReady : BOOL;
       MBTimeOut : TIME := T#150ms; //например
       Buffer : ARRAY[0..255] OF BYTE;
    END_VAR
    
    IF NOT DataReady THEN
       ...//кладем в Buffer данные
       DataReady := TRUE;
       ES := TRUE;
    END_IF
    
    //настраиваем и открываем порт
    
    //по готовности порта, "работаем" с ним
    SendModbus(
       Enable := ES,
       Mode := MB_RTU,
       DevAddr := 1, //например
       FirstAddr := 1, //например
       Quantity := 2, //например
       ComHandle := Settings.Port,
       TimeOut := MBTimeOut,
       Buffer := Buffer);
    ES := FALSE;
    
    IF SendModbus.Complete THEN //можно еще добавить проверку на Exception
       ...//тут Ваши условия/инструкции по необходимости
       ES := TRUE;
       DataReady := FALSE;
    END_IF
    Пользуюсь кодом (когда-то позаимствованным из поста ASo и немного измененным по совету Валенка), указанным выше (пример записи в устройство, чтение аналогичное с небольшими изменениями). Полет нормальный.
    Последний раз редактировалось Spawn; 04.12.2021 в 03:57.

  8. #8

    По умолчанию

    Цитата Сообщение от Spawn Посмотреть сообщение
    Работаю с библиотекой давно и проблем (у меня) с ней не было.
    Спасибо за Ваш вариант. К сожалению он работает так же.
    Вообще, почитав исходники библиотеки, прихожу к выводу, что никакими манипуляциями вызова FB библиотеки поменять это поведение не получится. Т. к. в FB MB_UNI_IO (вызывается любым FB чтения/записи Modbus.lib) первым делом читается порт, и если там что-то есть, оно попадает в, подготовленный вами или другим FB библиотеки, буфер. Модифицировать библиотеку ни времени ни желания нет, отладка изменений займет слишком много времени, которого уже не хватает на проект в целом.
    Альтернатив выставлению таймингов с большим запасом я не вижу, но имхо такое поведение - это баг.

  9. #9

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    50ms
    Это не опечатка, это сделано, чтобы сымитировать таймаут на короткой линии на тестовом стенде. В реальности в сети будет 4 ПЛК-слейвов и 1 ПР, расстояние м/у каждым метров по сто, читаться с каждого пара десятков регистров и писаться по несколько. В то же время очень важно иметь минимальный таймаут, т.к. часть оборудования может быть выключена. Хотя на объекте я его конечно подниму. Скорее всего на объекте и 15 мс будет мало и тогда я получу ту же проблему? Может быть я как-то неправильно использую Modbus.lib?

    нет
    Спасибо понял.

  10. #10

    По умолчанию

    Цитата Сообщение от Ovtia Посмотреть сообщение
    Это не опечатка, это сделано, чтобы сымитировать таймаут на короткой линии на тестовом стенде. В реальности в сети будет 4 ПЛК-слейвов и 1 ПР, расстояние м/у каждым метров по сто, читаться с каждого пара десятков регистров и писаться по несколько. В то же время очень важно иметь минимальный таймаут, т.к. часть оборудования может быть выключена. Хотя на объекте я его конечно подниму. Скорее всего на объекте и 15 мс будет мало и тогда я получу ту же проблему? Может быть я как-то неправильно использую Modbus.lib?
    Вы думаете от 100 метров или 5 метров что-то зависит? Во всех примерах стоит 50 мс, и всё работает даже с тысячами переменных. Тут всё от программиста зависит.

    Вот вы пишите 4 ПЛК слейвы и 1 ПР. ПР мастером будет? И какой ПР вы хотите мастером сделать?
    Последний раз редактировалось kondor3000; 01.12.2021 в 11:37.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Широковещательная команда записи MODBUS RTU на СМИ2
    от Юрий_М в разделе Панели оператора (HMI)
    Ответов: 5
    Последнее сообщение: 20.01.2021, 11:45
  2. Команда APLY
    от Тоха в разделе Сетевые технологии
    Ответов: 0
    Последнее сообщение: 15.05.2015, 06:51
  3. СМИ1, modbus-rtu, мастер. Команда 4. КАК?
    от Matysik в разделе Панели оператора (HMI)
    Ответов: 2
    Последнее сообщение: 26.05.2011, 15:32
  4. ТРМ - 138 и команда 'Aply'
    от alexei73p в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 24.04.2009, 20:10
  5. групповая команда для мдвв
    от Радик в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 27.12.2007, 07:48

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •