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

Тема: Modbus контроль ошибок соединения

  1. #1

    По умолчанию Modbus контроль ошибок соединения

    Допустим к ПЛК подключен МВА8. Связь сконфигурирована в CoDeSys PLC-configuration как Modbus(master) RS-485 - MVA8

    Вот ПЛК отправляет запрос, а ответа, допустим, нет. Нет секунду, нет минуту, нет час. И чего будет?
    Если ничего не будет, так будет совсем плохо. Не уж то всё писать через SysLibCom?

  2. #2

    По умолчанию

    Почитать описание. Есть в подмодуле ModBus Master соответствующие параметры, отвечающие за ошибку обмена.

  3. #3

    Angry

    Цитата Сообщение от aven Посмотреть сообщение
    Допустим к ПЛК подключен МВА8. Связь сконфигурирована в CoDeSys PLC-configuration как Modbus(master) RS-485 - MVA8

    Вот ПЛК отправляет запрос, а ответа, допустим, нет. Нет секунду, нет минуту, нет час. И чего будет?
    Если ничего не будет, так будет совсем плохо. Не уж то всё писать через SysLibCom?
    Велосипед в миллионный раз изобретать интересно, но!
    Открываем РП и читаем главу Modbus Master из которой мы узнаем, что есть два регистра

    last adres и last error.
    Дальше дело техники, но в подсказку, ставите оператор case, а в качестве его статуса задаете last adres. Если он совпадает с адресом вашего устройства, то в переменную ошибки пишите last error.

  4. #4
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    Примерно так:
    В сети устройство с адресом 16 (*Last address*), Priznak_KacH-Это(*Last error*)

    IF Adres=16 AND Priznak_KacH=81 THEN
    M_KacH:=TRUE;
    ELSIF Adres=16 AND Priznak_KacH=0 THEN
    M_KacH:=FALSE;
    END_IF

    Затем поставьте переменную M_KacH, к примеру на вход таймера "Задержка включения".
    Если по истечении какого-то времени не было удачных сеансов связи, то поднимайте тревогу.

    N_KacH(IN:=M_KacH , PT:=T#5s , Q=> , ET=> );
    M_KacH_p:=TON_KacH.Q;
    Последний раз редактировалось lara197a; 23.06.2011 в 20:04.

  5. #5

    По умолчанию

    Вопрос 1,
    зачем Last address типа DWORD ?

    Вопрос 2,
    зачем всё это имеет идентификатор %Q типа выход?

    Вопрос 3,
    выловить ошибку на конкретном устройстве... вот их 16 будет. На одном подкоротило шину, гвоздиком прибили провод но не насмерть. Получилось, что кто-то ловить пакеты, а кто-то нет. Допустим 5 адресов нормально, а с остальных мы имеем только Last address. Как не пропустить его оперативные изменения?

  6. #6
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    1,2- Вам это принципиально?
    3-а в чем трудность? Какая разница 1 устройство или 16.

  7. #7

    Thumbs up Готовое решение. Бери и используй. Анализ ошибок на RS-485.

    Берем мою разработку за основу. Я ее успешно внедрил уже на нескольких объектах, в том числе и на котельной.
    1) Делаем ФБ

    Область объявления:
    Код:
    FUNCTION_BLOCK Get_Modules_Errors
    VAR_INPUT
    	err:WORD;
    END_VAR
    VAR_OUTPUT
    	stat:BOOL:=0;
    END_VAR
    VAR
    	rt: R_TRIG;
    	tim_err: TIME := T#5s;
    	t: TON;
    END_VAR
    Тело ФБ:

    Код:
    (*Тригер прихода ошибки*)
    rt(CLK:=WORD_TO_BOOL(err));
    (*Если пришла ошибка, запускаем таймер*)
    IF rt.Q THEN
    	t(IN:=TRUE , PT:=tim_err);
    END_IF
    (*Вызываем таймер*)
    t;
    (*Если таймер не запущен и ошибки нет, то аварии нет*)
    IF t.IN=FALSE AND err=0 THEN
    	stat:=FALSE;
    END_IF
    (*Если таймер запущен, а ошибка ушла, то была помеха, отключаем аварию и таймер*)
    IF t.IN AND err=0 THEN
    	t(IN:=FALSE , PT:=tim_err);
    	stat:=FALSE;
    END_IF
    (*Если таймер отработал, а ошибка не ушла - беда, ищем ваши гвозди ))) *)
    IF t.Q THEN
    	stat:=TRUE;
    	t(IN:=FALSE , PT:=tim_err);
    END_IF
    
    RETURN;

    В основной программе делаем следующее:

    Область объявления:

    Код:
    PROGRAM PLC_PRG
    VAR
    (*Обработка гвоздей, грызунов, монтажников, и солнечного затмения*)
    	er_32: Get_Modules_Errors;
    	er_48: Get_Modules_Errors;
    	er_64: Get_Modules_Errors;
    	er_80: Get_Modules_Errors;
    	er_112:Get_Modules_Errors;
    (*Каждому модулю даем свою ошибку*)
    	mod_32:BOOL:=0;
    	mod_48:BOOL:=0;
    	mod_64:BOOL:=0;
    	mod_80:BOOL:=0;
    	mod_112:BOOL:=0;
    END_VAR
    В теле пишем следующее:
    Код:
    CASE Last_adr OF
    	32:
    		er_32(err:=Last_err , stat=> mod_32);
    	48:
    		er_48(err:=Last_err , stat=> mod_48);
    	64:
    		er_64(err:=Last_err , stat=> mod_64);
    	80:
    		er_80(err:=Last_err , stat=> mod_80);
    	112:
    		er_112(err:=Last_err , stat=> mod_112);
    END_CASE;
    Все гениальное просто.

  8. #8
    Пользователь
    Регистрация
    14.01.2010
    Адрес
    Камбарка
    Сообщений
    91

    По умолчанию

    Спасибо, хорошая программка!

    В конфигурации ПЛК надо создать еще 2-е переменные:
    в модбас мастере- Last_adr и Last_err

    На тревогу подключаем переменные: mod_32, mod48...

  9. #9

    По умолчанию

    Возможно ли эту программку использовать, если помимо 485 сети имеется сеть на 232 порту через интерфейс АС3_М?

  10. #10

    По умолчанию

    Цитата Сообщение от Александр Приходько Посмотреть сообщение
    Берем мою разработку за основу. Я ее успешно внедрил уже на нескольких объектах, в том числе и на котельной.
    Все гениальное просто.
    Александр растолкуйте назначение триггера rt(CLK:=WORD_TO_BOOL(err)); И почему нельзя просто обойтись TON?

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

Ваши права

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