Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 15 из 15

Тема: Как ускорить процесс опроса для мастера ModBus

  1. #11

    По умолчанию

    Цитата Сообщение от AWA1971 Посмотреть сообщение
    Постараюсь по-другому сформулировать вопрос...
    хочу сделать так, чтобы период опроса в 1000ms (при отключенном слэйве) менялся при подаче на него питания (изменении переменной на TRUE) на 10 ms?
    By command вам в руки, и смотрим last address & last error. Если при опросе устройства master возвращает ошибку, то период посылок в командный канал устанавливаем большим, при появлении ответов устройства начинаем опрашивать быстрее.

  2. #12

    По умолчанию

    Это что то типа (как шаблон):
    IF Last address=1 AND Last error=0
    THEN Command:=16#FF;
    ELSE Command:=16#FE;
    END_IF
    Если не так, то можно небольшой пример по изменению времени опроса?

  3. #13

    По умолчанию

    Для одного устройства будет примерно так:

    pollTime: TIME:=t#10ms;
    del: TON;
    DevAddress: WORD;
    (* Объявляем в конфигурации *)
    DevStart:BYTE;
    LastAddress: DWORD;
    LastError: WORD;


    del( in:=DevStart=0 , pt:=pollTime);(* Новая посылка после обнуления командного канала *)
    IF del.q THEN
    del(in:=FALSE);
    DevStart:=255;
    END_IF
    IF LastAddress=DevAddress THEN
    IF LastError=0 THEN pollTime:=t#10ms;
    ELSE pollTime:=t#1s; END_IF
    END_IF
    Последний раз редактировалось Логвиненко Андрей; 13.10.2010 в 10:54.

  4. #14

    По умолчанию

    спасибо, андрей, за пример. придут плк, соберу всю схему - буду пробывать.

  5. #15

    По умолчанию

    Вот, сподобился на следующий шедевр. Вроде пока работает...Может кому пригодится, а, может, кто и поизящней нарисует - так скиньте, я на "спасибо" не поскуплюсь 8).
    Суть: несколько слэйвов (для примера - два). Мастером опрашивается только тот(те), который(е) "в работе", т.е. подключены и связь с ними установлена.
    С остальными раз в секунду проверяется "контакт".

    (*Конфигурация*)
    LastAddress: DWORD;
    LastError: WORD;
    Command1:BYTE; (*1-ый девайс, Address1, Work mode:By command*)
    Command2:BYTE; (*2-ой девайс, Address2, Work mode:By command*)

    (*POU*)
    VAR
    LastError1, LastError2: WORD;
    Timer1, Timer2:TON;
    Pause:TIME:=t#1s;
    END_VAR

    CASE LastAddress OF
    1: LastError1:=LastError;
    2: LastError2:=LastError;
    END_CASE

    IF LastError1=0 THEN Command1:=255;
    ELSIF LasrError1<>0 THEN Timer1(IN:=Command1=0,PT:=Pause);
    IF Timer1.Q THEN Timer1(IN:=FALSE); Command1:=255; END_IF
    IF LastAddress=1 THEN
    IF LastError=0 THEN LastError1:=0; END_IF
    END_IF
    ELSE Command1:=254;
    END_IF

    IF LastError2=0 THEN Command2:=255;
    ELSIF LasrError2<>0 THEN Timer2(IN:=Command2=0,PT:=Pause);
    IF Timer2.Q THEN Timer2(IN:=FALSE); Command2:=255; END_IF
    IF LastAddress=2 THEN
    IF LastError=0 THEN LastError2:=0; END_IF
    END_IF
    ELSE Command2:=254;
    END_IF

    P.S. Даже в 2 ночи не проходит ощущение, что тут лишнего понагорожено...Но - работает же.
    Последний раз редактировалось AWA1971; 15.10.2010 в 02:01.

Страница 2 из 2 ПерваяПервая 12

Ваши права

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