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

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

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

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #450 : 02 Августа 2017, 11:32:40 »
Примерно следующая ситуация:
Контроллер генерирует DWORD. При импорте с Codesys OPC определяется как LongWord
Забираю LondWord с OPC в скаду нормально:
Создаю поле ввода-вывода и завязываю на него на эту переменную. Показывает как положено 4294967295 при всех "1" в DWORD'e.
Завожу 32 текстовых поля. На них в свойстве Тэг прописываю 0-31.
Функция читает тэг и у подвязанной переменной смотрит GetBit[text.variable.value,Тэг] и вываливает в текст aBOOL = GetBit.
Если кладу в переменную максимальное значение 4294967295 скрипт умирает при чтении true из старшего бита..
Если кладу в переменную в контроллере любое другое число где старший бит = false, например 2147483647 - скрипт нормально отрабатывает и читает false из старшего бита. Всё остальные биты также правильно считываются.
Видимо что-то с приведением типов данных (знаковое беззнаковое).
Комментирование строки case aTag (aTag integer) of 31: не помогает. То есть вообще обращаться функцией GetBit нельзя если старший бит = true. А в поле ввода вывода при этом всё нормально.
При работе с обычным Word'ом чтение 16-бита (саse aTag of 15:) тем же самым кодом проходит совершенно нормально.
« Изменён: 02 Августа 2017, 11:43:57 от GEW »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #451 : 02 Августа 2017, 11:52:00 »
GEW, да, дело в преобразовании типов. Просто указывайте тип явно, например так:

Вариант 1:
GetBit(text.variable.AsInt64, Тэг);

Вариант 2:
GetBit(text.AsInt64, Тэг);

Так все работает?

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #452 : 02 Августа 2017, 11:59:42 »
Да, работает. Спасибо)👍🏻
Сразу вопрос: что делать если захочется использовать 64 бита переменную?)
« Изменён: 02 Августа 2017, 12:18:58 от GEW »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #453 : 02 Августа 2017, 15:52:57 »
Цитировать
Сразу вопрос: что делать если захочется использовать 64 бита переменную?)
Сейчас GetBit работает с 32-битными переменными, поэтому нужно сначала получить последние 32 бита из 64-битной переменной и уже из них извлекать конкретные биты. Сделать это можно следующим образом:

Код
var
  aOriginal: Int64;   // здесь будем хранить оригинальное значение 64-битной переменной
  aLast32: Integer;   // переменная для последних 32 битов из 64-битной переменной
begin
  aOriginal := myVariable.AsInt64;  // получаем оригинальное значение 64-битной переменной
  aLast32 := aOriginal shr 32;      // смещаем биты вправо на 32 бита, оставляя только старшие 32 бита
 
  { теперь 0 бит переменной aLast32 соответствует 33 биту оригинальной переменной,
     а 31 бит переменной aLast32 соответствует 64 биту оригинальной переменной }
  if GetBit(aLast32, 0) = TRUE then
    Text1.Text := 'бит номер 33 равен 1';
end.

В ближайших обновлениях добавим поддержку 64-битных переменных в функциях GetBit и SetBit.

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #454 : 14 Августа 2017, 11:29:30 »
Добрый день.
Нужна универсальная функция для формирования отчёта по событию или по клику кнопки на автоэкспорт в пдф отчёта. Существуют две проблемы:
1) Есть ограничение на GetClientName, который нельзя вызывать из OnDataChange. Функция "ReportExportClient(GetClientName..." работать не будет.
2) Вызывая "ReportExportClient(GetClientName..." из OnClick тоже не удаётся сформировать файл, хотя другие функции ReportExportAll и ReportView с теми же самыми параметрами работают корректно. "ReportExportClient(GetClientName..." Не крашится, проверял через AddMessage.
Подскажите решение проблемы)
Права доступа на папки (полный всем), общий доступ к папке, другие диски и папки, запуск от админа сервера и клиента попробовал. Не помогло.
Настройка в Options "Папка для принятых файлов" не помогло - ReportAll кладёт к себе по-умолчанию.
P.S.: Прописал путь в скрипте в папку: Projects\"имя проекта"\Reports\ (туда ReportAll писал по-умолчанию) - файл успешно создался.
« Изменён: 14 Августа 2017, 13:53:16 от GEW »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #455 : 14 Августа 2017, 17:42:52 »
GetClientName а вам точно надо отдавать кажому клиенту, а не "себе"? Тогда можно имя прописать статической строкой и отдаст оно только определенному клиенту. По той-же причине может быть и кака с папками. Они должны быть настроенны синхронно на сервере и на том клиенте, с которого запускаете. ИМХО!

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #456 : 14 Августа 2017, 19:31:05 »
Пока в проекте не можем определиться с топологией сети, количеством серверов и клиентов и кто к кому и как будет подключен. Поэтому пока приходится делать единый проект для всех и всё на универсальных скриптах (набиваю библиотеку реализаций). Поэтому имя клиента - вообще не задаётся в настройках - да и так тиражировать проект на компьютеры проще, и выполнять требование по снятию контрольных сумм с одного единого проекта - тоже.
А что касается места хранения архивов и отчётов - то оно будет регламентировано стандартом организации (диск, пусть) и едино для всех систем.
Была мысль в диалоге авторизации пользователя прописать запрос на имя клиента и сохранять его во внутреннюю переменную. Но мне кажется это больше костылём.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #457 : 14 Августа 2017, 21:39:27 »
GEW, сегодня нашли возможную причину данной проблемы с отчетами. Завтра вечером опубликуем обновление с исправлением.

Цитировать
Они должны быть настроенны синхронно на сервере и на том клиенте, с которого запускаете. ИМХО!
По расположению папок ограничений нет, синхронность не нужна, можно на каждом ПК выбирать своё расположение.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #458 : 15 Августа 2017, 17:00:13 »
GEW, сегодня нашли возможную причину данной проблемы с отчетами. Завтра вечером опубликуем обновление с исправлением.

Цитировать
Они должны быть настроенны синхронно на сервере и на том клиенте, с которого запускаете. ИМХО!
По расположению папок ограничений нет, синхронность не нужна, можно на каждом ПК выбирать своё расположение.
я имею в виду, внутри проекта. А сам проект хай лежит себе где хочет... Или я могу создать проект, указать папку проекта, скопировать, создать в одном подпапку 1 и сохранять туда файл. Потом с другого клиента, указав куда сохранить у меня эта подпапка сама появится?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1179
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #459 : 15 Августа 2017, 23:46:27 »
Разговор был про "Папку для принятых файлов", которую можно задать в Options.exe на вкладке Simple-Client. Если она не задана, то принятые файлы на клиенте будут сохраняться по-умолчанию в папку "\Simple-Scada\Received\Имя_Проекта". На каждом клиенте можно задать свою "Папку для принятых файлов" для процедуры ReportExportAll.
« Изменён: 16 Августа 2017, 00:11:07 от Simple-Scada »

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #460 : 21 Августа 2017, 14:08:09 »
Здравствуйте!
Столкнулся с проблемой при редактировании настроек аварийных и предупредительных пределов внешней переменной: по скрипту считываю настройки в контроллере и включаю скриптом LimitType у переменной скады. Все сообщения (алармы) нормально и корректно работают со значениями из контроллера. Параллельно 4 поля ввода-вывода, смотрящие в настройки алармов переменной - в них значение  не обновляется вообще. При перезаписи значения с поля алармы также корректно работают с новым значением. В общем проблема только с отображением значения аларма в поле.
P.S.: по-умолчанию в настройках переменной - сообщения о нарушении границ - для любых, а вот сами границы - не выбрано (для того чтобы не грузить оператора некорректной информацией пока правильные настройки алармов из контроллера не будут считаны скриптом). Скрипт после настройки границ меняет limittype на ltAlarmsAndWarnings. Возможно причина в этом.
P.P.S.: возможно ли в будущем добавление возможности работы с пределами алармов переменной в ячейке таблицы?
« Изменён: 21 Августа 2017, 14:41:54 от GEW »

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #461 : 22 Августа 2017, 08:59:10 »
Небольшое предложение: вижу что довольно часто пользователи сталкиваются с проблемами при работе с кнопкой. Ввиду того что в моём случае кнопки используются только для подачи управляющих команд "true" в контроллер, а сброс в "false" организует сам контроллер, постоянно пустует слот под главную переменную (действия прописываются в универсальный скрипт с VariableEx по OnClick). При этом довольно часто нужно знать (например для цветовой индикации кнопки) или писать состояние двух переменных. А в слот Variable вставить переменную уже нельзя. Всвязи с этим предложение: для управляющих кнопок и флажков ввести свойство "не управлять переменной". Это избавило бы от множества проблем.
Отмечу что реализация управлениея контроллером посредством только команд "true" или только команд "false" - не такая уж и редкость. Только в моём случае - такая реализация (частично или полностью) на 9 крупных и средних проектах ПТК.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1179
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #462 : 22 Августа 2017, 10:44:27 »
Здравствуйте!

Цитировать
Столкнулся с проблемой при редактировании настроек аварийных и предупредительных пределов внешней переменной...
Пришлите папку с проектом (\Simple-Scada\Projects\Имя проекта) на support@simple-scada.com и укажите в каких полях не обновляются границы переменной - проверим.

Цитировать
Ввиду того что в моём случае кнопки используются только для подачи управляющих команд "true" в контроллер, а сброс в "false" организует сам контроллер, постоянно пустует слот под главную переменную (действия прописываются в универсальный скрипт с VariableEx по OnClick). При этом довольно часто нужно знать (например для цветовой индикации кнопки) или писать состояние двух переменных. А в слот Variable вставить переменную уже нельзя.
Если нужно, чтобы кнопка записывала в переменную только "true"(1), то у кнопки в свойстве "Переменная" необходимо указать переменную, в которую необходимо записывать "true", затем выбрать тип кнопки "С фиксацией" и оставить одно состояние(остальные удалить) со свойством "Значение" = 1. В таком случае, при нажатии на кнопку она всегда будет записывать в основную переменную "true".  Для цветовой индикации кнопки по второй переменной используйте доп. переменную кнопки - пример можно найти здесь.
« Изменён: 22 Августа 2017, 10:47:06 от Simple_Scada »

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #463 : 22 Августа 2017, 11:37:02 »
По поводу кнопки - да, понимаю что так можно. Но не всегда нужно писать в саму переменную. Переменная в данном случае аналоговая,  нужна для считывания качества, связи, а также для работы с её настройками (границы сообщений и т.д.) по имени.
Суть такая:
Подвязываю на VariableEX кнопки переменную AI_001.
Загружается проект клиента, после полной загрузки производится считывание структуры в контролере всех связанных с AI сигналом значений - настроек аварийных и предупредительных границ. Связанные переменные - AI_001_HH, AI_001_H .. L LL. - Их имена склеиваются в универсальном скрипте и по GetWariableByName, читаются значения, контролируя качество.
Затем производится передача этих значений в допсвойства переменной AI_001 (LimitType и т.д.).
Если всё хорошо - тушу цвет кнопки на серый, если значения в контроллере и в настройках переменной отличаются - подсвечиваю зелёным, если ошибка (например качество) - подсвечиваю красным.
В переменную AI_001 писать самой кнопкой ничего нельзя. Поэтому и подвязываю на VariableEX AI_001. Однако события по переменной VariableEX срабатывают только по изменении значения в AI_001, а это в реальной системе происходит не всегда. Я решал эту проблему внутренней переменной GlobalEvent_1s, которая инвертировала себя раз в секунду и вызывала срабатывание события. Мне бы хотелось подвязать GlobalEvent_1s и завести скрипт на цвет в событие - но Слот второй переменной занят. На основную - тоже нельзя. Ввести AI_001 в виде текста в тэг - не могу (разве что собирать из цифр имя переменной в скрипте, но это уже перебор). Думал ввести в свойство кнопки - подсказка - но для чтения оно из скрипта не доступно.
В общем тут больше дело в том что не хватает слота под переменную, или тэга текстового. Можно взять вместо кнопки текст конечно - но жаль анимации нажатия тогда не будет.
 P.S.: проект пришлю в конце рабочего дня.
« Изменён: 22 Августа 2017, 18:36:41 от GEW »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #464 : 23 Августа 2017, 11:48:14 »
Думал ввести в свойство кнопки - подсказка - но для чтения оно из скрипта не доступно.
Почему недоступно? Подсказку можно использовать для Вашей задачи. Например так:

Код
var
  s: string;
begin
  s := Button1.Hint;  // получаем текст подсказки кнопки Button1 в переменную s
end.

Аналогично для поиска переменной:
Код
var
  aVariable: TM_Variable;
begin
  aVariable := GetVariableByName(Button1.Hint); 
  if aVariable <> nil then
    aVariable.Value := 10;
end.