Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

deldemo

Спасибо за помощь!!!!!!!!!!
Цитата: Simple-Scada от 28 июня 2018, 09:24:11то и изменений придется отправить много.
Может у Вас есть возможность добавить функцию сброса выделенных цветом ячеек таблицы, хотя бы через массив столбцов? Типа- Table1.Columns[1..3].Color := clNone;(Это как образный пример)

Simple-Scada

Цитата: deldemo от 28 июня 2018, 10:11:36Может у Вас есть возможность добавить функцию сброса выделенных цветом ячеек таблицы
Рассмотрим этот вариант.

serg

#677
Есть 3 кнопки с фиксацией с переменными ( a1 , a2 , a3 ) , как сделать , чтобы при нажатии любых двух - третья исчезала ( или становилась не доступной ) . Т.е из 3-х кнопок оператор мог нажать  одну или две . Допустим , нажал 1-ю и 2-ю , а 3-ю мог нажать , только отключив 1-ю или 2-ю .

Victor_P.

#678
serg, я б сделал скрипт на изменение переменных а1, а2, а3:
Код: pascal
begin
  if (a1.AsInt + a2.AsInt + a3.AsInt) >= 2 then
    begin
      if not a1.AsBool then Bt_a1.Visible := false;
      if not a2.AsBool then Bt_a2.Visible := false;
      if not a3.AsBool then Bt_a3.Visible := false;
    end
  else
    begin
      Bt_a1.Visible := true;
      Bt_a2.Visible := true;
      Bt_a3.Visible := true;
    end;
end.
И свойство Visible таки заменил бы на Enable, а то оно как-то не очень эстетично, когда вместо кнопки пустое место.

serg

#679
Не получается по вашему скрипту .

Сделал по другому . Скрипт по событию - прошла секунда .

Код: pascal
begin
  if (Button1.AsInt + Button3.AsInt) > 1 then
    Button2.Visible := False
  else
    Button2.Visible := True ;
end.  

Три скрипта с соответствующими названиями кнопок . Скрипты работают , но кажется так не совсем правильно .

Victor_P.

Цитата: serg от 07 июля 2018, 12:37:39Не получается по вашему скрипту .
Я перед публикацией ответа этот способ сам проверял.

Victor_P.

Вопрос к пользователю Simple_Scada
как Вы делаете код делфи в сообщениях?
в редакторе есть просто код, но это не то, а тега для кода делфи или нет или я его в упор не вижу.

Simple_Scada

Здравствуйте!

ЦитироватьНе получается по вашему скрипту. Сделал по другому. Скрипты работают , но кажется так не совсем правильно.
Victor_P предложил Вам правильный, рабочий вариант. Откройте редактор скриптов, создайте новый скрипт с типом события "Изменились переменные", добавьте в него свои переменные(а1, а2, а3), скопируйте предложенный код и замените в нем имена кнопок, если у Вас они названы по другому. Пример создания скрипта с типом события "Изменились переменные" можно найти здесь.

ЦитироватьВопрос к пользователю Simple_Scada. Как Вы делаете код делфи в сообщениях?
Нужно выбрать обычный код и затем дописать [code=delphi]. Можете для примера открыть Ваше отредактированное сообщение выше.

serg

#683
Спасибо за помощь . У меня , наверное древняя демо версия . Нет возможности создать скрипт ( по изменению переменных ) . Скачал новую демо версию - всё получилось . И с Enable тоже . Только не Enable , а с Enabled .

Sergey_Em

Цитата: Victor_P. от 19 июня 2018, 16:05:59Sergey_Em, я придумал 2 варианта:

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

2. делаем 1 скрипт на изменение обеих переменных и создаем 2 доп. переменные psPLCtemp и psHMItemp
дальше так:
Код: pascal
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;

как то так, может и не очень красиво, но работать должно

1 вариант я сам уже пробовал, но меняются значения только в одну сторону. 2 вариант просто не компилируется, ошибку выдает.

pan2000

Sergey_Em,
Цитировать1 вариант я сам уже пробовал, но меняются значения только в одну сторону.

Вариант 1 аналогичен задаче обмена значениями двух переменных, т.е. необходима промежуточная переменная.

Скрипт по событию "Изменилось значение переменной связанной ..." для переменных PLCtemp и HMItemp:
Код: pascal
var i, j: integer;
begin
  with Sender as TM_Field do j := Value;  // запомнить изменившуюся переменную
  PLCtemp.Value := j;                             // изменить переменные 
  HMItemp.Value := j;

  i := i + 1;          // счетчик вызовов этого скрипта
  Text1.Text := 'Событий = ' + IntToStr(i);
end.

Пример во вложении.

Victor_P.

Цитата: pan2000 от 10 июля 2018, 20:09:08i := i + 1;          // счетчик вызовов этого скрипта
а можно подробнее?
как это счетчик вызовов?
это ж локальная переменная функции, она даже не static,
она ж сбросится в 0 при вызове этой функции.
Или я что-то пропустил?

pan2000

Счетчик вызовов показывает число прохождений этого участка программы с момента запуска проекта.
В данном примере - иллюстрация парных вызовов при изменении одной переменной, включая два вызова при инициализации переменных.

По поводу локальных переменных - нельзя, но если очень хочется (не в рабочем проекте)...
Цитата: « Сообщение от Simple-Scada  21 Июль 2017, 15:02:58 »Локальные переменные в Pascal, Delphi, C, C++, C# и т.п. языках не инициализируются компилятором и это забота программиста. При каждом очередном вызове скрипта переменной выделяется область памяти и её структура может быть любой (зависит от того, что в ней хранилось ранее), соответственно и значение переменных после выделения памяти может быть каким угодно. Компилятор в Simple-Scada работает аналогично, но при первой инициализации все-таки обнуляет переменную, а при последующих выделяет ту же самую область памяти, что и в первый раз. Поэтому в переменной значение сохраняется (не касается динамических типов данных, например строк). При этом мы рекомендовали бы работать с локальными переменными как и в других языках, т.е. сначала инициализировать, а затем использовать, чтобы значение переменной всегда было очевидным.

Victor_P.

Цитата: pan2000 от 11 июля 2018, 08:33:11По поводу локальных переменных ...
Т.е. она все-таки static.
Понял, спасибо.

lipvasko

подскажите пожалуйста , как можно разобрать строку  и потом собрать её снова , но только без не нужных символов , т.е у меня есть строка - это тэг с плк в формате  дата и время DT  в скаду он передаётся как строка вида он такого  DT#2018-09-03-12:01:03.569   а мне нужно получить
2018-09-03-12:01:03  - заранее благодарен.