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

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

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

Sergey_Em

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #660 : 19 Июня 2018, 15:01:32 »
Добрый день, помогите решить проблему: есть плк работающее в режиме modbus slave и HMI в режиме modbus slave, которых опрашивает simple scada через OPC в режиме master. Вопрос: как с помощью скриптов сделать обработку, чтобы при изменении значения, либо в ПЛК, либо в HMI они менялись в зависимости от последнего измененного значения. Например, в плк температура уставка =  27 С и в HMI это же значения 27С, при изменении в ПЛК на 25С изменилось и в HMI и наоборот. Просьба не задавать вопросы зачем это нужно, можно же напрямую сделать и тому подобное. Заранее спасибо.

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #661 : 19 Июня 2018, 16:05:59 »
Sergey_Em, я придумал 2 варианта:

1. делаем 2 скрипта на изменение переменных, один на PLCtemp, другой на HMItemp
в скрипте на PLCtemp делаем HMItemp := PLCtemp, в скрипте на HMItemp наоборот PLCtemp := HMItemp
при этом будет лишнее присвоение из-за срабатывания скрипта после присвоения и не совсем понятно что делать, если оба события произойдут вместе

2. делаем 1 скрипт на изменение обеих переменных и создаем 2 доп. переменные psPLCtemp и psHMItemp
дальше так:
Код: (delphi)
if (PLCtemp.value <> psPLCtemp.value) and (HMItemp.value <> psHMItemp.value) then
begin
    // что-то делаем, если обе переменные изменились вместе (присваиваем значения с нужным приоритетом);
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

if (PLCtemp.value <> psPLCtemp.value) then
begin
    HMItemp.value := PLCtemp.value;
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

if (HMItemp.value <> psHMItemp.value) then
begin
    PLCtemp.value := HMItemp.value;
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

как то так, может и не очень красиво, но работать должно
« Изменён: 20 Июня 2018, 22:12:09 от Simple-Scada »

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #662 : 21 Июня 2018, 07:27:55 »
Здравствуйте ребята.Прошу помощи. Ну ни как не могу понять в чем проблема.
На сервере в S-S_2.2.9.1 Pro есть скрипт который прекрасно работает, но правда данные ячейки забираются из автозаполненной(SQL) таблицы


Так вот поставил себе на ноут демо тайм 2.2.9.2 для тестов проекта. Но в этой версии категорически не хочет забирать данные из ячейки.
Причем на ноуте к ячейкам привязаны переменные.
Подскажите может проблема не только в моей криворукости?
У меня просто нет 2.2.9.1 демо тайм для тестов.


Код: (delphi)
var // Упрощенный вид, но даже он не работает.
  aCell_ID:TM_TableCell;
begin
  aCell_ID := Table1.GetCell(2,2);
  if aCell_ID <> nil then
      vID_recept.Value := StrToInt(aCell_ID.Text);
end.                                     


Так же на сервере выходит необработанная ошибка.
         
« Изменён: 21 Июня 2018, 11:18:11 от deldemo »

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #663 : 21 Июня 2018, 11:32:12 »
Так же на сервере выходит необработанная ошибка.
ИМХО, что-то не так с данными в выбранной ячейке,- или текст из ячейки не удается преобразовать в число
или при преобразовании получается не совсем число

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #664 : 21 Июня 2018, 11:42:38 »
Причем на ноуте к ячейкам привязаны переменные.
Здравствуйте. Если к ячейке привязана переменная, то нужно работать со значением переменной, а не с текстом ячейки, например:
Код: (delphi)
var
  aCell:TM_TableCell;
begin
  aCell := Table1.GetCell(1, 1);
  if aCell <> nil then
    if aCell.Variable <> nil then
      vID_recept.Value := aCell.Variable.AsInt;
end.

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #665 : 21 Июня 2018, 14:04:28 »
Спасибо!!! Что-то, если честно, даже не думал в этом направлении :(.
Цитировать
Подскажите может проблема не только в моей криворукости?
Все таки только в криворукости(
« Изменён: 21 Июня 2018, 14:06:13 от deldemo »

maks48

  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #666 : 23 Июня 2018, 11:08:30 »
ТаймДемо, настроил отправку e-mail, тестовое письмо пришло.
Пишу скрипт:
Код: (delphi)
mailString: string; 
mailString := 'Пост№1 = '+ QuotedStr(f1.AsStr) +', Пост 2 = '+ QuotedStr(f2.AsStr)+ ' ';
SendMail('test', 'Отчет', mailString, 'адрес_получателя@mail.ru');
Ошибка access violatation at address xxxx in module server.exe
Не подскажете, в чем ошибка?
« Изменён: 21 Августа 2018, 09:43:55 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #667 : 23 Июня 2018, 12:03:40 »
Здравствуйте.

Попробуйте открыть в Options.exe настройки E-Mail, удалить пароль и ввести его снова и сделать тест отправки. Затем закройте Options.exe, перезапустите сервер скады и попробуйте выполнить отправку из скады. Что-то меняется?

maks48

  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #668 : 23 Июня 2018, 15:49:26 »
Здравствуйте! Спасибо, ваш метод отправки помог  :)

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #669 : 25 Июня 2018, 12:26:24 »
Добрый день, подскажите как реализовать отсрочку по выдаче аварийных и предупредительных сообщение при перезапуске проекта. Секунд 30 нужно, а далее пусть выводятся штатно

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #670 : 25 Июня 2018, 14:04:42 »
Здравствуйте!

Если требуется при перезапуске проекта пропустить выдачу сообщений по первому изменению переменных (например, если OPC-сервер долго запускается), то снимите флажок "Показывать сообщения по первому изменению" в настройках "Options.exe" -> вкладка "Simple-Scada Server"(см. скрин во вложении). Другой возможности отсрочить выдачу сообщений нет.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #671 : 25 Июня 2018, 14:21:41 »
Если галка стоит, то сообщения по первому изменению будут выводиться. Чтобы они не выводились ее нужно снять.

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #672 : 25 Июня 2018, 14:34:11 »
Если галка стоит, то сообщения по первому изменению будут выводиться. Чтобы они не выводились ее нужно снять.
эффект есть, но не большой) хотел избавиться от пиликанья алармов во время тестирования ( часто приходиться перезагружать проект). Очень жду когда реализуется редактор/runtime client в одном флаконе) Чтобы удобнее переходить из режима редактора в рантайм)

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #673 : 27 Июня 2018, 21:34:12 »
Здравствуйте.
Уважаемые, подскажите как в таблице сбросить цвет измененных ячеек таблицы на стандартный?
Немного распишу:
Допустим есть некая таблица с автозаполнением посредствам SQL запроса
В этой таблицы ребята (операторы поста) делают отметки. В последнем столбце таблицы ставится отметка "Добавлено"
В последнем обновлении S-S появилась возможность работы с цветом ячейки, сразу же захотелось исполнить давнюю мечту по выделению целой строки цветом.

Код: (delphi)
var
  aIndex:integer;
begin
  aIndex := tblTEST.RowIndex;
  if aCell.Variable <> nil then
    begin
      tblTEST.GetCell(1,aIndex).Color := RGB(217,255,255);
      tblTEST.GetCell(2,aIndex).Color := RGB(217,255,255);
      tblTEST.GetCell(3,aIndex).Color := RGB(217,255,255);
    end;
end.
                                           
Но есть одно но.....как вернуть цвет ячейки в исходное состояние, причем все сразу?
В таблицы с каждым обновлением всегда разное кол-во строк.
« Изменён: 27 Июня 2018, 21:35:52 от deldemo »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #674 : 28 Июня 2018, 09:24:11 »
Здравствуйте.

Для возврата ячейки к обычному состоянию (без заполнения цветом) нужно присвоить цвету константу clNone.
Код: (delphi)
var
  aIndex: integer;
begin
  aIndex := tblTEST.RowIndex;
  if aCell.Variable <> nil then
    begin
      tblTEST.GetCell(1,aIndex).Color := clNone;
      tblTEST.GetCell(2,aIndex).Color := clNone;
      tblTEST.GetCell(3,aIndex).Color := clNone;
    end;
end.

Цитировать
..причем все сразу?
Аналогично для всех ячеек, только придется в цикле пройти по всем ячейкам. Это не очень хороший вариант, т.к. если таблица очень большая, то цикл может быть относительно долгим, плюс к этому каждое изменение цвета по каждой ячейке будет отправлено клиентам и если ячеек очень много, то и изменений придется отправить много.
Код: (delphi)
var
  I, J: Integer;
  aCell: TM_TableCell;
begin
  if (Table1.ColumnsCount > 0) and (Table1.RowCount > 0) then
    for I := 0 to Table1.RowCount - 1 do
      for J := 0 to Table1.ColumnsCount - 1 do
      begin
        aCell := Table1.GetCell(J, I);
        if aCell <> nil then
          if aCell.Color <> clNone then
            aCell.Color := clNone;
      end;
end.