Показано с 1 по 10 из 14

Тема: Надежность Modbus и регистры ошибок

Древовидный режим

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

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

    На шине RS-485/Modbus иногда случаются ошибки .

    Одна из причин - новые прошивки ПЛК (эта тема уже неоднократно поднималась). Похоже, выполнение советов по сокращению программы и увеличению времени цикла снижает их частоту, но не убирает полностью. Но сейчас не об этом. В конце концов, есть и другие причины. Например, слейв-устройство может притормозить и ответить с запозданием, дополнительно испортив ответ другого . При небольщой частоте ошибок с ними можно было бы жить, если научиться их отлавливать. Есть регистры last_address и last_error, только как ими воспользоваться?

    Вот простой пример. Имеются два слейва, например, МДВВ №1 с адресом 16 и МДВВ №2 с адресом 32. Отключим МДВВ №2 от 485 совсем и запустим такую программу (разумеется, назначив last_address и last_error на соответствующие %Q - а почему, кстати %Q, а не %I?)
    VAR
    mdvv1_fault: BOOL:=FALSE;
    mdvv2_fault: BOOL:=FALSE;
    mdvv1_ok: BOOL:=FALSE;
    mdvv2_ok: BOOL:=FALSE;
    END_VAR
    IF last_error<>0 AND last_address=16 THEN
    mdvv1_fault:=TRUE;
    END_IF
    IF last_error<>0 AND last_address=32 THEN
    mdvv2_fault:=TRUE;
    END_IF
    IF last_error=0 AND last_address=16 THEN
    mdvv1_ok:=TRUE;
    END_IF
    IF last_error=0 AND last_address=32 THEN
    mdvv2_ok:=TRUE;
    END_IF
    У меня обнаруживается, что через некоторое время все 4 переменные становятся TRUE! Ну ладно, допустим, mdvv1_fault ловит какие-то редкие ошибки исправного МДВВ, но как устанавливается mdvv2_ok?

    Может, не нужно углубляться в эти тонкости? Тогда ближе к практике - кто подскажет, как сделать такой ФБ:
    FUNCTION_BLOCK Reliable_Modbus_Input
    VAR_INPUT
    Input_Reg AT %I*: WORD;(* Регистр Modbus уст-ва *)
    END_VAR
    VAR OUTPUT
    Fault: BOOL;(* TRUE, если ни разу не удалось прочитать из устройства без ошибки за некоторое время, например,0.5 с *)
    Value: WORD;(* Значение, считанное при последнем удачом обмене *)
    END_VAR
    Т. е. единичные сбои нужно игнорировать, удерживая старое значение (Modbus-master при сбое выдает все нули, что во многих задачах совершенно недопустимо, даже если это случается раз в сутки!). А длительное прерывание обмена диагностировать как неисправность.
    Последний раз редактировалось alex1963; 30.01.2009 в 22:45.

Ваши права

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