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

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

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

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1065 : 15 Июля 2020, 20:58:41 »
   Здравствуйте!

lipvasko, по-видимому компилятор не привел тип строки, нужно явно указать тип функцией UTF8Encode(' Создан новый файл ').

Миханик, очень похоже на отсутствие переменной привязанной к ячейке.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1066 : 15 Июля 2020, 22:34:27 »
lipvasko, вот правильный вариант:
Код: (delphi)
TextFileWriteLn(UTF8ToString(DateTimeToStr(Now)) +' Создан новый файл ');

Цитировать
ещё подскажите , можно ли читать текстовые файлы по сери , в расшаренных папках и как это сделать , пример пожалуйста.
Можно, также как и в обычных папках, только в пути нужно указывать сетевой адрес. Но нужно учитывать, что при сбоях в сети обращения к файлам по сети могут выполняться значительно дольше, что может отразиться на скорости работы скады.

Миханик, как отметил pan2000, у Вас какая-то ячейка таблицы не связана с переменной. Т.е. "aCell.Variable" равно nil. В результате Вы пытаетесь получить свойство ".AsSingle" из несуществующей переменной, что недопустимо. Нужно либо связать ячейку с переменной, либо исправить код и добавить в него проверку на nil, вот так:
 
Код: (delphi)
...
  aCell := Table_term.GetCell(iCol, iRow);       // Получим нужную ячейку
  if aCell <> nil then
    if aCell.Variable <> nil then
    begin
      ...
« Изменён: 16 Июля 2020, 12:48:01 от Simple-Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1067 : 16 Июля 2020, 12:10:56 »
lipvasko, вот правильный вариант:
Код: (delphi)
TextFileWriteLn(UTF8ToString(DateTimeToStr(Now)) +' Создан новый файл ');
Выражение:
Код: (delphi)
UTF8ToString(DateTimeToStr(ADateTime: TDateTime): String)
подразумевает две конвертации: неявную String->UTF8 и явную UTF8->String, на мой взгляд проще явно указать тип компилятору:
Код: (delphi)
String(DateTimeToStr(Now)) + ' Создан новый файл ';

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1068 : 16 Июля 2020, 12:43:33 »
pan2000, в руководстве и скаде устаревшее описание функции DateTimeToStr. Она возвращает UTF8String. Поэтому конвертация на самом деле одна. В ближайшее время исправим описание.

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1069 : 21 Июля 2020, 11:23:06 »
Добрый день, можно ли читать текстовые файлы в одной  подсетисети , в расшареных папках и как это сделать , если можно пример скрипта, пожалуйста.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1070 : 21 Июля 2020, 11:27:22 »
Здравствуйте, мы отвечали на этот вопрос в этой теме выше, цитата:
Цитировать
Можно, также как и в обычных папках, только в пути нужно указывать сетевой адрес. Но нужно учитывать, что при сбоях в сети обращения к файлам по сети могут выполняться значительно дольше, что может отразиться на скорости работы скады.
для скады чтение по сети не отличается от чтения по локальному пути. Разница только в том, что вместо локального пути указывается сетевой.

Saurin

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1071 : 24 Июля 2020, 13:28:51 »
Цитировать
Saurin, отправлять через разных ботов нельзя (через несколько токенов). Обычно создают одного бота (и один токен) и через него рассылают множеству получателей в чаты. Или в группу, на которую подписаны получатели. Можно используя Telegram API реализовать и свою отправку через GET-запросы, но это будет сложно.

У меня есть ключ отправки сообщения телеграмм боту через GET запрос, он работает в браузере. Что нужно , что бы он работал из скады?
« Изменён: 24 Июля 2020, 13:30:18 от Saurin »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1407
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1072 : 28 Июля 2020, 10:35:19 »
Здравствуйте.

Для отправки сообщений через Telegram необходимо произвести предварительную настройку следуя инструкции. После этого можно отправлять Telegram-сообщения из скриптов используя процедуру SendTelegram. Если требуется рассылать сообщения разным наборам пользователей, то для этого можно создать группы, на которые будут подписаны нужные пользователи. Далее можно отправлять сообщения в требуемую группу используя ID группы(узнать ID группы можно на этом этапе настройки Telegram-сообщений). Сообщения отправленные в группу получат все пользователи подписанные на эту группу. Можно отправить сообщение как в одну группу,  так и сразу в несколько групп, например:
Код: (delphi)
begin
  { отправить Telegram-сообщение в одну группу }
  SendTelegram('Авария котла!', '258579674');
 
  { отправить Telegram-сообщение в две группы }
  SendTelegram('Авария котла!', '258579674, 568479675');                   
end.

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1073 : 11 Августа 2020, 17:16:37 »
Здравствуйте, мы отвечали на этот вопрос в этой теме выше, цитата:
Цитировать
Можно, также как и в обычных папках, только в пути нужно указывать сетевой адрес. Но нужно учитывать, что при сбоях в сети обращения к файлам по сети могут выполняться значительно дольше, что может отразиться на скорости работы скады.
для скады чтение по сети не отличается от чтения по локальному пути. Разница только в том, что вместо локального пути указывается сетевой.

Вопрос, а учетные данные возможно вводить(логин и пароль), и если да то как?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1074 : 11 Августа 2020, 17:43:16 »
Нет. Учетные записи пользователей в Windows относятся к операционной системе. Скада на них не влияет, она только читает и записывает файлы в те папки, которые Вы укажете ей. Если Windows не позволит скаде писать/читать данные из указанной папки, то скада ничего сделать не сможет. Чтобы скада могла считать файл, Вы должны запустить её под тем пользователем Windows, который имеет права на доступ к папке. Тогда ОС не будет препятствовать скаде и всё будет работать.

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1075 : 12 Августа 2020, 14:53:46 »
Как разобрать такую строку, что бы получить   "Мука карусель В2"  из  строки вида "14.07.2020    15:07:44      Мука карусель В2             35831,82      711           50            2120320 "    пробовал использовать команду  копи и ютф8копи, результат в первом случае "1", во втором   вместо букв "?" и в конце "1"
« Изменён: 12 Августа 2020, 15:17:19 от Simple_Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1076 : 12 Августа 2020, 20:22:21 »
Цитировать
Как разобрать такую строку, что бы получить   "Мука карусель В2"  из  строки вида
Если заранее известно, что искомый текст всегда начинается (например) с 28 символа, то можно сначала через UTF8Copy удалить лишние символы в начале строки, скопировав символы с 28 символа до конца строки. Далее можно в цикле проходить по символам и копировать их в отдельную строку до тех пор, пока не дойдём до места с двумя пробелами подряд. В результате останется искомая строка. Пример цикла по символам строки:
Код: (delphi)
var
  I: Integer;
  aStr: string;
begin
  aStr := 'Моя строка';
  for I := 1 to Length(aStr) do
  begin
    if aStr[I] = ' ' then
    begin
      // текущий перебираемый символ является пробелом
    end;
  end;
end.

Цитировать
пробовал использовать команду  копи и ютф8копи, результат в первом случае "1", во втором   вместо букв "?" и в конце "1"
Это значит, что в ходе преобразований строк Вы смешали строки разных типов (например UTF8String + String). Это разные типы поэтому строка при таком сложении испортится. При сложении строк их всегда нужно приводить к какому-то одному типу.

azrael454

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1077 : 13 Августа 2020, 16:22:48 »
Добрый день.

Возможно ли реализация вот такого паттерна.

Есть обьект - кнопка настроек. Есть два пользователя: 1 и 2.

Может ли объект кнопка выполнять разные функции, в зависимости от того, какой пользователь сейчас авторизован?

При нажатии пользователем 1 открывается доп.окно настроек.
При нажатии пользователем 2, кнопка является своего рода выпадающим списком, который показывает другие кнопки, каждая из которых вызывает свое доп.окно настроек.

Можно конечно не усложнять и просто завязать через доступ к кнопкам настроек, но получается перегруженный интерфейс.

Как подобное можно в скриптах реализовать?

Спасибо.

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1078 : 15 Августа 2020, 01:56:13 »
Может ли объект кнопка выполнять разные функции, в зависимости от того, какой пользователь сейчас авторизован?

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

Можно при выполнении скрипта "Авторизация пользователя" каждому пользователю присвоить идентификатор (пример для двух пользователей). "Разделяемая" кнопка Button1 с основной переменной iButton:
Код: (delphi)
begin
  if auLogin = 'user1' then Button1.Tag := 1 else Button1.Tag := 0;  // идентификатор пользователя 1 или неизвестного пользователя
  if auLogin = 'user2' then Button1.Tag := 2;                        // идентификатор пользователя 2 - при необходимости использования
                                                                     //   в нескольких скриптах можно объявить внутренней переменной
  iButton.Value := 0;    // установить в исходное состояние кнопку, разделяемую двумя пользователями (и все прочие объекты и переменные)
end.
Группу объектов пользователя 2 можно скрыть посредством непрозрачного объекта (Text1) с управлением видимостью и расположенного "выше" экранируемых объектов или индивидуальным управлением видимостью каждого объекта.
Скрипт для кнопки по событию "Изменилось значение переменной iButton связанной с объектом":
Код: (delphi)
begin
  Text1.Visible := not ((Button1.Tag = 2) and (iButton.AsInt <> 0)); // экранировка группы объектов
  if (Button1.Tag = 1) and (iButton.AsInt <> 0) then Window1.ShowAll;
  if iButton.AsInt = 0 then Window1.CloseAll;
end.
« Изменён: 15 Августа 2020, 01:57:59 от pan2000 »

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1079 : 18 Августа 2020, 09:15:34 »
Добрый день, подскажите , а глобальный скрипт , может выводить только 1 переменную- результат, или их может быть несколько? просто от скрипта с  одной переменной на выходе, толку мало , когда сложный алгоритм надо рассчитать , со множеством переменных , на выходе, и когда этот алгоритм применяется несколько раз в разных местах.
« Изменён: 18 Августа 2020, 09:22:21 от lipvasko »