Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Связь с ПЛК  (Прочитано 2743 раз)

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Связь с ПЛК
« : 28 Мая 2020, 14:06:37 »
Здравствуйте.

Пишем свой скрипт определения связи с ПЛК. К сожалению скрипт в примерах Simaple-Scada не подошёл из-за проблем нижнего уровня по этому было решено постоянно менять значение переменной в самом ПЛК.

Был написан вот такой скрипт:

Код: (delphi)
begin
  if InterfaceModule_disconnect_flag.Value = FALSE then
  begin
    InterfaceModule_disconnect_flag.Value := TRUE;
  end else begin if InterfaceModule_disconnect_flag.Value = FALSE then
  begin
    InterfaceModuleTimerCheckState.Value := 0;
    vrMsgDisconnect.Value := TRUE;
    if vrMsgConnect.Value = TRUE then
    begin
      AddMessage(Now, mkMessage, 'Установлена связь с ПКЛ', true, false);
      vrMsgConnect.Value := FALSE;
    end;
  end else
  begin
    InterfaceModuleTimerCheckState.Value := InterfaceModuleTimerCheckState.Value + 1; //Накопление 10-ти секунд
    if InterfaceModuleTimerCheckState.Value >= 10 then
    begin
    vrMsgConnect.Value := TRUE;
    if vrMsgDisconnect.Value = TRUE then
    begin
      AddMessage(Now, mkAlarm, 'Связь с ПЛК утеряна', true, true);
      vrMsgDisconnect.Value := FALSE;
    end;
    end;
    end;
  end;
end.

Суть задачи такова, что постоянно нужно менять значение в теге InterfaceModule_disconnect_flag с TRUE на FALSE. То-есть по дефолту тег имеет значение TRUE, скада должна менять значение на FALSE, но если по истечению 10-ти секунд значение с FALSE не сменится на TRUE значит ПЛК не на связи.

Скрипт к сожалению отрабатывает не совсем так как хотелось. Подскажите пожалуйста в чём может быть проблема, какое может быть решение?

Neskad

  • Новичок
  • *
  • Сообщений: 31
    • Просмотр профиля
Re: Связь с ПЛК
« Ответ #1 : 29 Мая 2020, 12:02:58 »
Естественно скрипт не работает. Потому-как в самом первом условии он противоречит вашему описанию.
Да и оформить можно было получше.

Код: ("delphi")
begin
  if InterfaceModule_disconnect_flag.Value = TRUE then
    begin
      InterfaceModule_disconnect_flag.Value := FALSE;
      InterfaceModuleTimerCheckState.Value := 0;
      if vrMsgDisconnect.Value = TRUE then
        begin
          AddMessage(Now, mkMessage, 'Установлена связь с ПЛК', true, false);
          vrMsgDisconnect.Value:= False;
        end;
    end
  else
    begin
      InterfaceModuleTimerCheckState.inc(1); //Накопление 10-ти секунд
      if InterfaceModuleTimerCheckState.Value >= 10 then
        begin
          if vrMsgDisconnect.Value = False then
            begin
              AddMessage(Now, mkAlarm, 'Связь с ПЛК утеряна', true, true);
              vrMsgDisconnect.Value := TRUE;
            end;
        end;
    end;
end.

pan2000

  • Постоялец
  • ***
  • Сообщений: 225
    • Просмотр профиля
Re: Связь с ПЛК
« Ответ #2 : 30 Мая 2020, 02:39:00 »
   Здравствуйте!

  Во вложении примеры контроля связи (с эмулируемым ПЛК) по тайм-аутам нахождения флага InterfaceModule_disconnect_flag в одном из состояний (T, F)
для автомата состояний или по предыстории флага в сдвиг-регистре.
Правила контроля:
 - "связь установлена" после первого перехода флага T->F;
 - "связь утеряна" после 10 секунд состояния флага F или 2 секунд состояния T.

  При наличии в ПЛК тега с режимом "эхо" (запись в тег - запись в ПЛК - чтение из ПЛК - чтение в тег) можно контролировать связь записью различных значений с последующим тайм-аутом совпадения со считанным.
Пример с использованием автомата состояний во вложении.