Страница 1 из 4 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 40

Тема: Modbus.lib - часто отваливается порт по ошибке EXC_HW в блоке MB_UNI_IO

  1. #1

    По умолчанию Modbus.lib - часто отваливается порт по ошибке EXC_HW в блоке MB_UNI_IO

    Всем здравствуйте!

    Почти год назад у меня была проблема, запостил здесь, ответа тогда не получил:
    https://owen.ru/forum/showthread.php...l=1#post421411

    На тот момент конфигурация была такова - две линии RS-485 ПЛК110, на одной сидят 9 драйверов SMSD Modbus, все двигатели работают параллельно, все команды драйверам в реалтайме поступают по MODBUS RTU на скорости 115200. На второй линии СП307, и частотник, который ограничивает скорость до 19200. При этом ошибка EXC_HW вылетала в среднем 1 раз в 45 минут, что не влияло на рабочий процесс и было в целом малозаметно.
    Первая линия работает на библиотеке Modbus.lib, вторая настроена через конфигуратор в Codesys 2.3.

    Затем в конфигурации второй линии была увеличена скорость до 115200 (убрали частотник), и добавлена пара сотен регистров, половина на запись, половина на чтение. Читаются регистры СП307 со временем опроса 150 мс, запись по изменению параметра. После данных изменений ошибка EXC_HW стала вылетать раз в 5 минут в среднем, что теперь является существенной проблемой.

    Если посмотреть код блока MB_UNI_IO, то видно что ошибка EXC_HW вылетает в случае неудачной записи в порт, то есть в первой части транзакции MODBUS, посылке от мастера к слейву.

    Просьба помочь разобраться, может кто-нибудь сталкивался с данной ошибкой?

  2. #2

    По умолчанию

    Добрый. Тоже столкнулся с ошибка EXC_HW в библиотеке Modbus.lib.
    Код:
    Read := SysComWrite(ComHandle, ADR(DataBuf), DataSize, 0) = DataSize;
    IF Read = FALSE THEN				(* передача кадра не состоялась*)
    	Exception := EXC_HW;			(* аппаратная ошибка *)
    	Complete := TRUE;				(* установить признак готовности результата *)
    	Active := FALSE;				(* снять признак активности цикла обмена *)
    	RETURN;						(* завершение по ошибке *)
    END_IF
    Т.е. проблема с записью через SysComWrite.
    Может есть решение данной проблемы?

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

    По умолчанию

    Обычно такие решения начинаются с самого проекта.
    Ну вот почему не ушло просто в буфер? Порт закрыт, не настроен, буфер забит.. Ещё есть варианты?

  4. #4

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Порт закрыт, не настроен, буфер забит.. Ещё есть варианты?
    1. Сообщения в в линию уходят - могу предположить что порт открыт и настроен.
    2. При остановке опроса или изменении периода опроса - на линии тишина. Т.е. буфер пустой.

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

    По умолчанию

    Цитата Сообщение от Samel Посмотреть сообщение
    ..Сообщения в в линию уходят
    Вы это чем то видели?


    ---
    тупо проверил
    Порт закрыт, не настроен..
    Из *Write* возвращается 0 и => EXC_HW
    .. буфер забит
    Из *Write* возвращается размер того что смогло впихнутся, а если меньше чем хотели (но необязательно 0) и => EXC_HW


    2. При остановке опроса или изменении периода опроса - на линии тишина. Т.е. буфер пустой.
    Из этого можно еще сделать вывод что толпа на входе* упорядочилась и всем стало хватать времени.
    *а это вполне возможно при не связанных между собой вызовах ФБ из modbus.lib. Проект же вы не выложили.
    Последний раз редактировалось Валенок; 25.04.2025 в 10:42.

  6. #6

    По умолчанию

    На линии RS485-2 весит 1 устройство, снимается 1 параметр раз 100мс(время можно менять - не на что не влияет)
    Цитата Сообщение от Валенок Посмотреть сообщение
    Вы это чем то видели?
    Только косвенно, по лампочкам на устройстве. Но если после RX идет индикация на TX - устройство получает пакет и на него отвечает.
    Период RX/TX соответствует периоду опроса устройства. Если бы буфер был забит - была бы дискотека на индикаторе RX.

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

    По умолчанию

    Если бы буфер был забит - была бы дискотека на индикаторе RX.
    так забитый буфер это один из вариантов. а модбас.lib не рулит портом, а пользуется им как дыркой куда не глядя пихает/берет данные. Рулите дыркой - Вы. И как - никто не знает. Проекта - нет.

    Что касается забитости буфера, да и вообще, раз уж влезли в модбас.lib, то никто же не мешает поставить программную ловушку ошибки типа:
    Код:
    ...
    X:= SysComWrite(ComHandle, ADR(DataBuf), DataSize, 0); (*X - DINT*)
    
    if X <> DataSize then
      какой-то флажок поднять; (*а в основном коде по этому флажку посмотреть X.  Если <= 0 проблемы с портом. Его кто-то закрыл? Если <> 0 - забит буфер*)
    end_if
    
    Read := (*SysComWrite(ComHandle, ADR(DataBuf), DataSize, 0)*)
      X = DataSize;
    ...
    Последний раз редактировалось Валенок; 25.04.2025 в 17:20.

  8. #8

    По умолчанию

    Продолжим.
    На объекте 3 шкафа с ПЛК110-30/60[М2]; используются оба 485; в основном подключены модули расширения и преобразователи частоты, в среднем от 3 до 10 устройств. Все это замечательно работает уже больше 3 мес. На один из шкафов 2 недели назад подключили нонэйм устройство(период опроса 100мс, $01 $03 $00 $00 $00 $08 $44 $0C) - после 2-6 часов работы вываливается EXC_HW в библиотеке Modbus.lib, на втором интерфейсе 5 ПЧ - полет нормальный.
    До объекта пока так и не доехал. Так что пока все со слов наладчиков.
    На столе поставил 2 ПЛК: один просто опрашивает "тишину", второй - эмулирует устройство через "modbus slave.exe". За неделю проблему так и не словил.
    Помехи или "нонэйм" устройство?
    Сегодня на столе решил "пошуметь в линию" (подкинулся в линию 485преобразователем и циклически кидаю байты). Через несколько минут пакеты начинают уходить с задержкой между байтами, потом только 1 байт пакета и ловим EXC_HW(SysComWrite возвращает 1, т.е. забит буфер передачи).
    Возникает вопрос, почему SysComWrite(Операционка/ядро плк) не выплевывает содержимое буфера? У ПЛК на это достаточно времени.
    Последний раз редактировалось Samel; 02.05.2025 в 12:59.

  9. #9

    По умолчанию

    Продолжил экспериментировать.
    Код:
    	IF (COM_READY = TRUE )THEN
    
    		IF RxUse THEN
    			WHILE SysComRead(comPort, ADR(rxDataBuf[0]), 200 , 0) <> 0 DO;
    			END_WHILE
    		END_IF
    
    		TxCheck(IN := TRUE, PT := TxPeriod);
    		IF TxCheck.Q AND TxUse THEN
    			FOR i := 1 TO DWORD_TO_INT(TxSizeSend) BY 1 DO
    				TxDataBuf[i-1] := TxInd;
    				IF TxIndUse THEN
    					TxInd := TxInd + 1;
    				END_IF
    			END_FOR;
    			TxDataSize := DWORD_TO_BYTE(SysComWrite(comPort, ADR(TxDataBuf), TxSizeSend, 0));
    			IF TxDataSize <> TxSizeSend THEN
    				outDO2 := TRUE;
    			ELSE
    				outDO2 := FALSE;
    			END_IF
    			TxCheck(IN := FALSE);
    		END_IF
    
    	END_IF
    Цикл ПЛК - 5 мс. Настройки порта - 19200,8,N,1.
    Работа с "мусором на линии" от 30 - 60 мин.
    Результат:Тест RS485.png

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

    По умолчанию

    Буфер забивается. Кто бы мог подумать
    Проекта нет (2)

Страница 1 из 4 123 ... ПоследняяПоследняя

Похожие темы

  1. Ответов: 5
    Последнее сообщение: 04.04.2023, 17:19
  2. Ответов: 4
    Последнее сообщение: 11.09.2020, 14:33
  3. MasterOPC Universal Modbus server - повторы при ошибке
    от ALEXSP в разделе Master SCADA 3
    Ответов: 3
    Последнее сообщение: 04.05.2016, 16:42
  4. RS-485 Связь отваливается по ModBus
    от Пьер в разделе ПЛК1хх
    Ответов: 18
    Последнее сообщение: 22.04.2016, 15:03
  5. Отваливается COM порт в СПК110
    от жекон в разделе СПК1xx (архив)
    Ответов: 50
    Последнее сообщение: 06.01.2016, 18:46

Ваши права

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