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

Тема: Обработка отсутствия одного из приборов Modbus_Slave

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

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

    По умолчанию Обработка отсутствия одного из приборов Modbus_Slave

    Коллеги, подскажите пожалуйста, как решить вот такую задачу:
    СПК207 мастер над несколькими СИ30. Время от времени некоторые из них не в сети по разным причинам.
    При этом происходят недопустимые задержки в обработке данных. Задержка между счётом СИ30 и отображением на контроллере до 5 секунд. (если удалить из проекта отсутствующий прибор, то мгновенно).
    Как правильно обрабатывать счётчики не в сети, чтобы программа не ждала, но, чтобы, в то же время, при включении станка, данные начинали обрабатываться без перезагрузки?

  2. #2

    По умолчанию

    1. Правильно настроить таймауты в Modbus.
    Потому что ПЛК делает запрос, потом ждёт таймаут, и потом идёт дальше опрашивать. Если таймаут стоит на 1 секунду (так по умолчанию) - то ВЕСЬ опрос будет вставать на эту секунду.
    2. Сделать программное отключение устройств из опроса через xEnable (по имени слейва; если надо подробно - я распишу). Это позволит ВООБЩЕ выключить их из опроса. Но тогда надо и не забыть включить.

    В остальном вроде всё. Modbus - это протокол с последовательным опросом. И там всегда будет так, что проблемное устройство будет тормозить обмен.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  3. #3

    По умолчанию

    1. Сколько лучше поставить таймаут для линии из 32 СИ30? или где прочитать про расчёт этого?

    2. Буду очень признателен.

    как-то так:
    Код:
    IF NOT Modbus_Master_COM_Port.xAllSlavesOk THEN
    	Modbus_Slave_SI30_1.Enable := NOT Modbus_Slave_SI30_1.xError;
    	Modbus_Slave_SI30_2.Enable := NOT Modbus_Slave_SI30_2.xError;
    END_IF
    но тогда можно ли обращаться по типу (или вообще как то перечислить всё количество):
    Код:
    var1 := CONCAT('Modbus_Slave_SI30_', INT_TO_STR(i));
    ModbusSlaveComPort_Diag(var1).Enable...
    Последний раз редактировалось EgorL; 22.07.2025 в 15:41.

  4. #4
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,054

    По умолчанию

    1.Таймаут - время реального(самостоятельно засечь) опроса + 5..15мс
    2.Зачем выключать опросы непонятно. Для "мертвых" увеличить период опроса до 3...6 сек и исключить от них запросы друг за другом. Ответил - ставьте нужный период. Умирание - несколько битых запросов подряд, но в порядке общей очереди.
    И никаких торможений.

  5. #5

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    2.Зачем выключать опросы непонятно. Для "мертвых" увеличить период опроса до 3...6 сек и исключить от них запросы друг за другом. Ответил - ставьте нужный период. Умирание - несколько битых запросов подряд, но в порядке общей очереди.
    Как период изменить? У "Modbus_Slave" только "SetCommunicationState" со START STOP RESET.
    Как очерёдность опросов можно изменить?
    Как в цикле обращаться ко всем СЛЕЙВам?
    Мне бы принципы понять. Первый раз контроллер в руки взял.
    Последний раз редактировалось EgorL; 23.07.2025 в 08:22.

  6. #6

    По умолчанию

    Валенок Он через конфигурацию ПЛК рабоатет. Там период опроса не увеличишь.
    Если только делать опрос по триггеру из кода - но я не знаю, нужно ли такое советовать.

    EgorL Да я как раз и хотел сказать, что по именам слйевов можно через xEnable их выключать.
    Но как потом включать - хз.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  7. #7
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,054

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Он через конфигурацию ПЛК рабоатет. Там период опроса не увеличишь.
    Если только делать опрос по триггеру из кода - но я не знаю, нужно ли такое советовать.
    (Ну на безрыбье)
    Момент окончания запроса и его результат известен? Или тоже нет ничего?

  8. #8

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    (Ну на безрыбье) Момент окончания запроса и его результат известен? Или тоже нет ничего?
    Конкретно в 3.5 (как у него) всё от 2.3 отличается. В ТЕОРИИ известен, если программа успеет отловить xDone и xError
    Если запросы очень короткие - то не успеет отловить.

    Ну, в общем, если он напишет по твоему совету опрос по триггеру и будет дёргать его через условный BLINK вс разными периодами - то прокатит.
    ИМХО, если я верно понял, тут сама задача в корне не верна:
    * Если нужен быстрый опрос - то нефиг отключать устройства и создавать таймауты
    * Если устройства могут отключаться - то тогда это надо делать через какое-то меню станка, чтобы НЕ опрашивать их.
    А остальное - костыли.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  9. #9

    По умолчанию

    Сделал вот так. Формально оно работает, но... Наверное действительно это решение для периода аварийного отсутствия станка в сети, после чего оператору надо будет в меню СЛК отключать и включать станок.
    Код:
    MyTimer(IN:=TRUE, PT:=T#15S, Q=>xTimerFlag);   
    
    IF xTimerFlag = TRUE THEN
    	// Попробовать включить выключенные СЛЕЙВы
     	IF NOT Modbus_Slave_SI30_1.Enable THEN
     		Modbus_Slave_SI30_1.Enable := TRUE; 
     	END_IF
    	MyTimer(IN := FALSE);
    	MyTimer(IN := TRUE, PT:=T#15S, Q=>xTimerFlag);
    	xTimerFlag := FALSE;  
    END_IF
    .....
    
    IF NOT Modbus_Master_COM_Port.xAllSlavesOk THEN
    	Modbus_Slave_SI30_1.Enable := NOT Modbus_Slave_SI30_1.xError;
     	Modbus_Slave_SI30_2.Enable := NOT Modbus_Slave_SI30_2.xError;
    END_IF
    Подскажите, как всё таки можно в цикле перебирать все слейвы?

  10. #10

    По умолчанию

    Цитата Сообщение от EgorL Посмотреть сообщение
    в цикле перебирать все слейвы?
    Похоже нельзя.
    Даже попробовал при инициализации присвоить все слейвы в массив, чтобы потом в коде просто перебирать его, но не получилось: ModbusSlaveComPort_Diag не поддерживет присвоение.
    Грусть-печаль.

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

Похожие темы

  1. Ответов: 12
    Последнее сообщение: 29.07.2020, 21:13
  2. Обработка аналоговых входов в ОЛ
    от ВЗМП в разделе Среда программирования OWEN Logic
    Ответов: 47
    Последнее сообщение: 23.05.2019, 07:19
  3. Обработка ошибок ПВТ 100
    от JIexa21 в разделе Эксплуатация
    Ответов: 3
    Последнее сообщение: 09.04.2018, 16:37
  4. Modbus_slave
    от Alev в разделе ПЛК3xx (архив)
    Ответов: 8
    Последнее сообщение: 13.02.2014, 10:07
  5. Обработка исключений
    от const3 в разделе ПЛК1хх
    Ответов: 11
    Последнее сообщение: 26.06.2012, 05:43

Ваши права

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