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

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

Автор Тема: Вопросы по скриптам в Simple-Scada 2  (Прочитано 1221883 раз)

Дмитрий_021

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1395 : 20 Сентября 2022, 13:36:28 »
Использую в проекте следующие конструкции из универсальных скриптов и процедур, размещенных в  глобальных модулях. Нужно ли в этом случаи что-то использовать, чтобы не допустить утечки памяти?
Код: (delphi)
//Универсальное событие 
var
  aObject: TM_Object;
begin
  if Sender is TM_Object then
  begin
    aObject := Sender as TM_Object;
    if aObject.variable.AsBool then
       begin
         alarmMode(aObject);
       end
    else
      begin
        sleepMode(aObject);
      end;
  end;
end.                   

Код: (delphi)
//Глобальный модуль
interface
  procedure sleepMode(out AResult: TM_Object);
implementation
  procedure sleepMode(out AResult: TM_Object);
  begin
    if AResult is TM_Text then
      with AResult as TM_Text do
        AResult.FontColor := RGB(146,146,146);
   if AResult is TM_Image then
   .....
  end;
end.       
« Изменён: 20 Сентября 2022, 14:07:13 от Simple Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1396 : 20 Сентября 2022, 22:15:42 »
Здравствуйте.

Т.к. в коде Вы не создаёте новые объекты, а только работаете с уже существующими, то и очищать ничего не требуется. Все объекты, которые создала скада (например: объекты мнемосхем, окна, переменные, сообщения, тренды и т.п.) скада удалит автоматически, исключая утечки памяти.

asutpfoma

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1397 : 21 Сентября 2022, 14:25:57 »
Здравствуйте.
При необходимости, можно скрыть штатную панель сообщений и создать свою(для этого лучше всего использовать шаблон). Вместо панели сообщений можно использовать компонент "Список сообщений".

Заметил следующее. На форму вывел объект "Список сообщений". Выглядит он так:

В третьей строке, столбец "Подтвердил" пуст.
Перехожу в окно "Сообщения". Там, в "Неподтвержденных", те же самые сообщения выглядят так:

Тут же, в столбце "Подтвердил", в третьей строке информация есть.
Все нормализуется, когда приходит новое событие.
Это я накосячил?)

asutpfoma

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1398 : 22 Сентября 2022, 08:14:37 »
В дополнение к сообщению выше. Также заметил случай, когда после перехода с формы на окно авторизации и обратно, объект "Список сообщений пустой", причем оба (у меня их 2 созданные группы). После еще одного перехода туда обратно, все отображается.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1399 : 25 Сентября 2022, 12:53:38 »
Здравствуйте.

asutpfoma, Вы используете версию Simple-Scada 2.6.3.0 или более старую? Если старую, то обновитесь до актуальной версии 2.6.3.0. Если после обновления проблема будет повторяться, то пришлите нам на support@simple-scada.com для проверки текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\".

Дмитрий_021

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1400 : 28 Сентября 2022, 13:25:52 »
Добрый день.
Не могу понять, как здесь реализована работа с массивами. Например, функция Length() должна работать как со строками, так и с массивами согласно спецификации языка.
https://delphisources.ru/pages/faq/faq_delphi_basics/Length.php.html
Но компилятор пишет несовместимые типы, а в справке скада-системы "Возвращает количество символов строки" и не слова о длине массива. Или тут в комиляторе вообще обрезана работа с массивами или как это делается? 

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1401 : 28 Сентября 2022, 16:38:37 »
Здравствуйте.

Функция Length работает для динамических массивов.
Для определения границ статических массивов используйте функции High и Low:
Код: (delphi)
var
  I: Integer;
  aArray: array[1..17] of integer;
begin
  // это просто пример, здесь можно обойтись без Low и High,
  // т.к. размер статического массива известен
  for I := Low(aArray) to High(aArray) do
  begin
    // ...
  end;
end.

Если Вы хотите пройти по элементам внешней переменной (читаемой с OPC-сервера), то нужно использовать следующий код:
Код: (delphi)
var
  I: Integer;
begin
  // проходим в цикле по каждому элементу массива
  for I := Variable.LowBound to Variable.HighBound do
    Text1.Text := Text1.Text + ', ' + Variable.ValuesStr[I];
end.

Если разобраться не получится, то пришлите на support@simple-scada.com пример проекта, или предоставьте полный код скрипта.
« Изменён: 28 Сентября 2022, 17:35:52 от Simple-Scada »

Дмитрий_021

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1402 : 03 Октября 2022, 03:35:45 »
Добрый день.
На данный момент с массивами не стал заморачиваться. Использую строку для булевских значений.
Не могу вызвать функцию, объявленную в одном юните в другом.

Код
unit uIsCorrectLevel;

interface
  function isCorrctLevel(sensorArray: String): Boolean;
implementation
  function isCorrctLevel(sensorArray: String): Boolean;
  ...
  end.         

Данную функцию нужно использовать в глобальной процедуре
Код
unit mLevel;
interface
  uses
    uIsCorrectLevel;
  procedure mLevel(Lvl: TM_Level; sensor: TM_Variable);
implementation
  procedure mLevel(Lvl: TM_Level; sensor: TM_Variable);
  var
    str: String;
  begin
    if isCorrctLevel(TM_Variable.AsStr ) then Lvl.FlashColor := clNone else Lvl.FlashColor := clRed;
  end;
end.                               
Компилятор выдает ошибку Property  "AsStr" inaccessible.
ПС У нас лицензия с расширенной тех поддержкой, но не нашел куда ее к аккаунту привязать.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1403 : 04 Октября 2022, 18:11:06 »
Здравствуйте.

В условии "if isCorrctLevel(TM_Variable.AsStr) then" нужно указать переменную, значение которой Вы хотите использовать, а не просто тип TM_Variable. Судя по Вашему коду, необходимо указать переменную sensor: "if isCorrctLevel(sensor.AsStr) then".

Также, если Вы вызываете в глобальном модуле функцию из другого глобального модуля, то для этого нужно подключить глобальный модуль через uses в секции implementation:
Код: (delphi)
interface
  procedure mLevel(Lvl: TM_Level; sensor: TM_Variable);

implementation
  uses
    uIsCorrectLevel;

  procedure mLevel(Lvl: TM_Level; sensor: TM_Variable);
  var
    str: String;
  begin
    if isCorrctLevel(sensor.AsStr ) then Lvl.FlashColor := clNone else Lvl.FlashColor := clRed;
  end;
end. 

Если разобраться не получится, то пришлите нам для проверки на support@simple-scada.com текущую версию проекта и укажите, какой скрипт нужно проверить.

уйбуй Копыто

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1404 : 06 Октября 2022, 11:37:52 »
Здравствуйте!
Наша компания планирует вплотную переключиться на Вашу скада, посему я сейчас занимаюсь ее изучением.
Вы пользуетесь определенной удобной конвенцией именования переменных. Можно ли с ней ознакомиться, чтобы все наши разработчики ее придерживались без разночтений?
Спасибо.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1405 : 07 Октября 2022, 13:30:58 »
Здравствуйте.

В этом разделе можно ознакомиться с рекомендациями по именованию объектов. Также, там описан используемый в Simple-Scada принцип именования стандартных перечисляемых типов и констант. Подобный метод можно использовать и при именовании переменных.
« Изменён: 07 Октября 2022, 13:47:11 от Simple-Scada »

ACHE

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1406 : 24 Октября 2022, 18:50:59 »
Здравствуйте. Создали такой скрипт для проверки связи с подключенными приборами учета:
Код: (delphi)
procedure CheckMerk(Link230: TM_Variable; Kotelnaya: string);
//проверка связи с Меркурий
begin
  if Link230.AsInt = 0 then
  begin
    vrTimer_Gagarina.Value := vrTimer_Gagarina.Value + 1;
      if vrTimer_Gagarina.AsInt = 600 then
        begin
          AddMessage(Now, mkAlarm, Kotelnaya, TRUE, TRUE);
          SendTelegram(Kotelnaya);
        end
  end
    else
      vrTimer_Gagarina.Value := 0;
end;

//Проверка связи с СПТ
procedure CheckSPT(variable: TM_Variable; Kotelnaya: string);

begin
    if variable.IsGoodQuality = False then
      begin
        vrTimer2_Gagarina.Value := vrTimer2_Gagarina.Value + 1;
          if vrTimer2_Gagarina.AsInt = 600 then
            begin
              SendTelegram(Kotelnaya);
              AddMessage(Now, mkAlarm, Kotelnaya, TRUE, TRUE);
            end
      end
          else
            vrTimer2_Gagarina.Value := 0;
end;

//Проверка связи с СПГ
procedure CheckSPG(variable2: TM_Variable; Kotelnaya: string);

begin
  if variable2.IsGoodQuality = False then
    begin
      vrTimer3_Gagarina.Value := vrTimer3_Gagarina.Value + 1;
        if vrTimer3_Gagarina.AsInt = 600 then
          begin
            SendTelegram(Kotelnaya);
            AddMessage(Now, mkAlarm, Kotelnaya, TRUE, TRUE);
          end
    end
        else
          vrTimer3_Gagarina.Value := 0;
end;

//Проверка связи с ПЛК
procedure CheckPLC(variable3: TM_Variable; Kotelnaya: string; picture: TM_Variable);

begin
  if variable3.IsGoodQuality = False then
    begin
      vrTimer4_Gagarina.Value := vrTimer4_Gagarina.Value + 1;
        if vrTimer4_Gagarina.AsInt = 600 then
          begin
            SendTelegram(Kotelnaya);
            AddMessage(Now, mkAlarm, Kotelnaya, TRUE, TRUE);
            picture.Value := True;
          end
    end
        else
          begin
            vrTimer4_Gagarina.Value := 0;
            picture.Value := False;
          end
end;

begin
//проверка меркурий
  CheckMerk(Link_230_Gagarina, 'Гагарина: Нет связи с электросчетчиком');
  ....
  CheckMerk(Link230_VES, 'ВЭС: Нет связи с электросчетчиком');
  CheckMerk(Link230_PMK, 'ПМК-16: Нет связи с электросчетчиком');
//проверка спт
  CheckSPT(_171_Qo_g_, 'Гагарина: Нет связи с тепловычислителем');
  CheckSPT(Q_Podacha_TS_171, 'Дружба: Нет связи с тепловычислителем');
 ...
  CheckSPT(Q_PodachaTS, 'ХДСУ: Нет связи с тепловычислителем');
//проверка спг
  CheckSPG(spg_Q1, 'Гагарина: Нет связи с корректором газа');
  CheckSPG(Q1_2, 'Дружба: Нет связи с корректором газа');
...
  CheckSPG(Q1_11, 'ПУ-24: Нет связи с корректором газа');
//проверка плк
  CheckPLC(Tnv_4, 'Гагарина: Нет связи с ПЛК', LinkPLC_Gagarina);
  CheckPLC(Tnv_6, 'Нефтебаза: Нет связи с ПЛК', LinkPLC_Neftebaza);
 ...
  CheckPLC(Tnv_15, 'ПУ-24: Нет связи с ПЛК', LinkPLC_PU24);

end.

До того, как код был оптимизирован, без процедур (и с меньшим количеством оборудования) все работало. На каждую группу приборов был отдельный скрипт, в каждом скрипте на каждый прибор повторялся код для проверки.
При использовании процедур приходит сообщение только из последней строки "CheckPLC(Tnv_15, 'ПУ-24: Нет связи с ПЛК', LinkPLC_PU24)", несмотря на то, что связь на самом деле есть. А с оборудованием, с которым связи нет, сообщение не приходит. Подскажите пожалуйста, что делаем неправильно?
« Изменён: 24 Октября 2022, 19:06:23 от Simple_Scada »

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1407 : 25 Октября 2022, 08:50:08 »
До того, как код был оптимизирован, без процедур (и с меньшим количеством оборудования) все работало. На каждую группу приборов был отдельный скрипт, в каждом скрипте на каждый прибор повторялся код для проверки.
При использовании процедур приходит сообщение только из последней строки "CheckPLC(Tnv_15, 'ПУ-24: Нет связи с ПЛК', LinkPLC_PU24)", несмотря на то, что связь на самом деле есть. А с оборудованием, с которым связи нет, сообщение не приходит. Подскажите пожалуйста, что делаем неправильно?
Добрый день, подскажите а как работало раньше и сейчас в плане организации вызова? Был отдельный скрипт "По-изменению" для каждой переменной, а теперь вызываются по времени процедуры?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1408 : 25 Октября 2022, 10:47:45 »
Здравствуйте.

Цитировать
До того, как код был оптимизирован, без процедур (и с меньшим количеством оборудования) все работало. Подскажите пожалуйста, что делаем неправильно?
В каждой процедуре Вы используете всего одну переменную для таймера, но вызываете процедуру для множества устройств. Из-за этого, при наличии связи хотя бы с одним устройством, таймер будет постоянно сбрасываться на 0.

Если требуется отслеживать каждое устройство отдельно, то нужно добавить отдельные переменные-таймеры для каждого устройства, тогда всё будет работать корректно. Например, для устройства Link_230_Gagarina создать переменную Link_230_Gagarina_Timer, для Link230_VES создать переменную Link230_VES_Timer и т.д. Пример кода:
Код: (delphi)
procedure CheckMerk(aVar, aTimer: TM_Variable; aAlarm: string; aPicture: TM_Variable);
begin
  if aVar.IsGoodQuality = False then
    begin
      aTimer.Value := aTimer.Value + 1;
      if aTimer.AsInt = 600 then
        begin
          SendTelegram(aAlarm);
          AddMessage(Now, mkAlarm, aAlarm, TRUE, TRUE);
          aPicture.Value := True;
        end;
    end else
      begin
        aTimer.Value := 0;
        aPicture.Value := False;
      end;
end;
 
begin
  CheckMerk(Link_230_Gagarina, Link_230_Gagarina_Timer, 'Гагарина: Нет связи с электросчетчиком');
  CheckMerk(Link230_VES, Link230_VES_Timer, 'ВЭС: Нет связи с электросчетчиком');
  CheckMerk(Link230_PMK, Link230_PMK_Timer, 'ПМК-16: Нет связи с электросчетчиком');
  // ...
end.

ACHE

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1409 : 25 Октября 2022, 16:51:09 »
Добрый день, подскажите а как работало раньше и сейчас в плане организации вызова? Был отдельный скрипт "По-изменению" для каждой переменной, а теперь вызываются по времени процедуры?

Здравствуйте.
Раньше был такой скрипт.
Однако по мере добавления устройств (их порядка 70 шт.) было решено что как-то надо это дело оптимизировать :)
Код
  // проверка связи с СПГ742 Гагарина
  {if spg_Q1.IsGoodQuality = False then
  begin
  vrTimer3_Gagarina.Value := vrTimer3_Gagarina.Value + 1;
    if vrTimer3_Gagarina.AsInt = 600 then
    begin
      SendTelegram('Гагарина: Нет связи с корректором газа СПГ742!');
      AddMessage(Now, mkAlarm, 'Гагарина: Нет связи с корректором газа СПГ742!', TRUE, TRUE);
    end
  end
    else
      vrTimer3_Gagarina.Value := 0;}

  // проверка связи с ПЛК Гагарина
  {if Tps_4.IsGoodQuality = False then
  begin
  vrTimer4_Gagarina.Value := vrTimer4_Gagarina.Value + 1;
    if vrTimer4_Gagarina.AsInt = 600 then
      begin
      SendTelegram('Гагарина: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'Гагарина: Нет связи с ПЛК', TRUE, TRUE);
      LinkPLC_Gagarina.Value := True;
      end
    end
  else
  begin
      vrTimer4_Gagarina.Value := 0;
      LinkPLC_Gagarina.Value := False;
  end;}

                                                            //Дружба
  //Проверка связи с счетчиком Меркурий  Дружба
  {if Link_230_Druzhba.AsInt = 0 then
  begin
    vrTimer_Druzhba.Value := vrTimer_Druzhba.Value + 1;
    if vrTimer_Druzhba.AsInt = 600 then
    begin
      AddMessage(Now, mkAlarm, 'Дружба: Нет связи с электросчетчиком (NPort 5130)!', TRUE, TRUE);
      SendTelegram('Дружба: Нет связи с электросчетчиком (NPort 5130)!');
      end
    end
  else
    vrTimer_Druzhba.Value := 0;}

  // проверка связи с СПГ742 Дружба
  {if Q1_2.IsGoodQuality = False then
  begin
  vrTimer3_Druzhba.Value := vrTimer3_Druzhba.Value + 1;
    if vrTimer3_Druzhba.AsInt = 600 then
    begin
      SendTelegram('Дружба: Нет связи с корректором газа СПГ742!');
      AddMessage(Now, mkAlarm, 'Дружба: Нет связи с корректором газа СПГ742!', TRUE, TRUE);
    end
  end
    else
      vrTimer3_Druzhba.Value := 0;}

  // проверка связи с СПТ963 Дружба
  {if SostoyanieSPT.IsGoodQuality = False then
  begin
  vrTimer4_Druzhba.Value := vrTimer4_Druzhba.Value + 1;
    if vrTimer4_Druzhba.AsInt = 600 then
    begin
      SendTelegram('Дружба: Нет связи с тепловычислителем СПТ963!');
      AddMessage(Now, mkAlarm, 'Дружба: Нет связи с тепловычислителем СПТ963!', TRUE, TRUE);
    end
  end
    else
      vrTimer4_Druzhba.Value := 0;}

    // проверка связи с ПЛК Дружба
  {if Tnv_7.IsGoodQuality = False then
  begin
  vrTimer2_Druzhba.Value := vrTimer2_Druzhba.Value + 1;
    if vrTimer2_Druzhba.AsInt = 600 then
    begin
      SendTelegram('Дружба: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'Дружба: Нет связи с ПЛК', TRUE, TRUE);
    end
  end
  else
  begin
      vrTimer2_Druzhba.Value := 0;
      LinkPLC_Druzhba.Value := False;
  end;
                                                            //Нефтебаза
                                                 
    // проверка связи с ПЛК Нефтебаза
  if Tps_6.IsGoodQuality = False then
  begin
  vrTimer_Neftebaza.Value := vrTimer_Neftebaza.Value + 1;
    if vrTimer_Neftebaza.AsInt = 600 then
      begin
      SendTelegram('Нефтебаза: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'Нефтебаза: Нет связи с ПЛК', TRUE, TRUE);
      end
  end
  else
  begin
      vrTimer_Neftebaza.Value := 0;
      LinkPLC_Neftebaza.Value := False;
  end;
                                                            //Центральная

    // проверка связи с ПЛК Центральная
  if Tnv_8.IsGoodQuality = False then
  begin
  vrTimer_Centr.Value := vrTimer_Centr.Value + 1;
    if vrTimer_Centr.AsInt = 600 then
    begin
      SendTelegram('Центральная: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'Центральная: Нет связи с ПЛК', TRUE, TRUE);
      LinkPLC_Centr.Value := True;
    end
  end
  else
  begin
      vrTimer_Centr.Value := 0;
      LinkPLC_Centr.Value := False;
  end;

   // проверка связи с СПТ963 Центральная
  {if NS_SPT_Centralnaya.IsGoodQuality = False then
  begin
  vrTimer_Centr2.Value := vrTimer_Centr2.Value + 1;
    if vrTimer_Centr2.AsInt = 600 then
    begin
      SendTelegram('Центральная: Нет связи с тепловычислителем СПТ963!');
      AddMessage(Now, mkAlarm, 'Центральная: Нет связи с тепловычислителем СПТ963!', TRUE, TRUE);
    end
  end
    else
      vrTimer_Centr2.Value := 0;}

  // проверка связи с СПГ742 Центральная
  {if Q1_4.IsGoodQuality = False then
  begin
  vrTimer_Centr3.Value := vrTimer_Centr3.Value + 1;
    if vrTimer_Centr3.AsInt = 600 then
    begin
      SendTelegram('Центральная: Нет связи с корректором газа СПГ742!');
      AddMessage(Now, mkAlarm, 'Центральная: Нет связи с корректором газа СПГ742!', TRUE, TRUE);
    end
  end
    else
      vrTimer_Centr3.Value := 0;}

  //Проверка связи с счетчиком Меркурий Центральная
  {if Link_230_Centr.AsInt = 0 then
  begin
    vrTimer_Centr4.Value := vrTimer_Centr4.Value + 1;
    if vrTimer_Centr4.AsInt = 600 then
    begin
      AddMessage(Now, mkAlarm, 'Центральная: Нет связи с электросчетчиком (NPort 5130)!', TRUE, TRUE);
      SendTelegram('Центральная: Нет связи с электросчетчиком (NPort 5130)!');
      end
    end
  else
    vrTimer_Centr4.Value := 0;}

                                                      //ПМК-16

    // проверка связи с ПЛК ПМК-16
  {if Tnv_9.IsGoodQuality = False then
  begin
  vrTimer_PMK1.Value := vrTimer_PMK1.Value + 1;
    if vrTimer_PMK1.AsInt = 600 then
    begin
      SendTelegram('ПМК-16: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'ПМК-16: Нет связи с ПЛК', TRUE, TRUE);
      vrTimer_PMK1.Value := True;
    end
  end
  else
  begin
      vrTimer_PMK1.Value := 0;
      LinkPLC_PMK16.Value := False;
  end;}


//ХДСУ

    // проверка связи с ПЛК ХДСУ
  {if Tnv_3.IsGoodQuality = False then
  begin
  vrTimer_XDSU1.Value := vrTimer_XDSU1.Value + 1;
    if vrTimer_XDSU1.AsInt = 600 then
    begin
      SendTelegram('ХДСУ: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'ХДСУ: Нет связи с ПЛК', TRUE, TRUE);
      vrTimer_XDSU1.Value := True;
    end
  end
  else
  begin
      vrTimer_XDSU1.Value := 0;
      LinkPLC_XDSU.Value := False;
  end;}


  //Иконка связи Центральная
  //if Tnv_8.IsGoodQuality = False then
  //Image1453.Visible := True
  //else
  //Image1453.Visible := False

//end.