Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: h71 от 09 Сентября 2018, 15:39:33

Название: Работа с файлами
Отправлено: h71 от 09 Сентября 2018, 15:39:33
Здравствуйте,
Есть проблема, которую никак не могу победить:
Код: (delphi)
if (TextFileOpen('report.txt', 'c:\', fomRewrite, fcpUTF8) = False) then
  ShowMessageClient(GetClientName, 'Внимание!', 'Ошибка открытия файла', clGray, clBlack)
else
  // Тут пишем в файл и т.д.
Если указываю полный путь (например, как в коде выше 'c:\') получаю ошибку открытия файла. Если путь пустой (''), файл открывается и записывается в папке проекта на сервере, но тогда каким образом открыть его на клиенте внешней программой типа notepad?         
Название: Re: Работа с файлами
Отправлено: h71 от 09 Сентября 2018, 17:16:43
Разбираясь в работе с файлами и директориями, обнаружил вот что:
1) Для записи файла нужно иметь соответствующие права для той папки куда пишем. Вроде очевидно, но в справке надо бы отразить. Скажем, у меня скрипт  в D:\ записывал без проблем, а в C:\ уже нет, пока права доступа для пользователей явно не поменял.
2) Самое главное, не нашел способ создавать файл на том клиенте, который вызвал скрипт. GetProgramPathClient выдает путь к папке на клиенте, но файл с таким путем создается на сервере.

Собственно, задача простая как hello world: по клику на кнопке в клиенте создать текстовый файл и открыть его при помощи notepad тут же в клиенте. Полдня убил, но не смог этого сделать. Ткните носом, куда смотреть  :(
Название: Re: Работа с файлами
Отправлено: Simple-Scada от 10 Сентября 2018, 09:23:14
Здравствуйте.

Цитировать
Если путь пустой (''), файл открывается и записывается в папке проекта на сервере, но тогда каким образом открыть его на клиенте внешней программой типа notepad?
Все процедуры для работы с файлами (https://simple-scada.com/help/script/workfile.html) работают только на серверном ПК. Для запуска программ (например блокнота) на клиентах нужно использовать процедуру RunApplication (https://simple-scada.com/help/script/runapp.html), например можно разместить на мнемосхеме кнопку и на событие OnClick этой кнопки написать следующий код:
Код: (delphi)
begin
  { запускаем блокнот и открываем файл "File.txt" на клиенте который нажал кнопку }
  RunApplication(GetClientName, 'notepad.exe', 'D:\File.txt');
end.

Цитировать
2) Самое главное, не нашел способ создавать файл на том клиенте, который вызвал скрипт. GetProgramPathClient выдает путь к папке на клиенте, но файл с таким путем создается на сервере.
Создавать файлы на клиентах через процедуры для работы с файлами (https://simple-scada.com/help/script/workfile.html) нельзя. Они работают только на сервере.
Название: Re: Работа с файлами
Отправлено: h71 от 11 Сентября 2018, 14:02:09
Спасибо за ответ, хотя непонятно, зачем ограничивать клиента в возможностях по созданию локальных файлов. Кмк, это элементарнейший функционал который должен быть.
Сейчас же пришлось применить солдатскую смекалку, и запускать на сервере простенький http сервер и туда записывать файл, а на клиенте запускать браузер для просмотра :)

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

P.S: Удалось сделать таким образом: раз функция GetClientName не работает из под секундных скриптов или скриптов по изменению значения переменных, то по нажатию кнопки имя клиента пишем в переменную, запускаем таймер и по таймеру запускаем на клиенте приложение через RunApplication, имя клиента берем из переменной, где мы его перед этим сохранили
Название: Re: Работа с файлами
Отправлено: Simple-Scada от 12 Сентября 2018, 11:03:37
Цитировать
Спасибо за ответ, хотя непонятно, зачем ограничивать клиента в возможностях по созданию локальных файлов.
Мы ничего не ограничивали. В Simple-Scada никогда не было функций для работы с файлами на клиентах, т.к. клиенты не имеют отношения к выполнению скриптов, все скрипты выполняются на сервере.

Цитировать
P.S: Удалось сделать таким образом: раз функция GetClientName не работает из под секундных скриптов или скриптов по изменению значения переменных, то по нажатию кнопки имя клиента пишем в переменную, запускаем таймер и по таймеру запускаем на клиенте приложение через RunApplication, имя клиента берем из переменной, где мы его перед этим сохранили
Сейчас можно использовать только описанный Вами способ. В будущих версиях постараемся упростить массовое выполнение архивных функций. Возможно добавим отдельный тип события для скриптов, с привязкой к имени клиента, который будет срабатывать когда указанные пользователем архивные функции полностью выполнились. Тогда не придется делать свою систему для определения момента, когда все архивные функции выполнились.
Название: Re: Работа с файлами
Отправлено: MaxHari от 18 Декабря 2019, 20:22:10
Здравствуйте!

Подскажите, пожалуйста, решение по работе с файлами на системном диске.
Необходимо считывать информацию из файла 'C:\Program Files\...'.
Скада его не видит, хотя в других случаях всё работает нормально.
Название: Re: Работа с файлами
Отправлено: Simple-Scada от 19 Декабря 2019, 10:03:51
Здравствуйте. Что значит "не видит"? При попытке доступа к файлу в журнале сервера (https://simple-scada.com/help/manual/server-journal.html) выводится сообщение о том, что файл не найден? Или просто скада не может его прочитать? На это могут быть только две причины. Первая: в скаде был указан неправильный путь к файлу (убедитесь что путь и имя файла указаны правильно). Вторая: у файла ограничены права на чтение, поэтому его не сможет прочитать никакое приложение, включая скаду (тогда измените права на доступ к файлу в Windows).
Название: Re: Работа с файлами
Отправлено: MaxHari от 19 Декабря 2019, 14:59:43
Скада выходит на этапе проверки на существование файла - File not exitst. Журнал перегружен сообщениями об ошибках другого плана, на эту тему ничего не нашёл.

Путь к файлу формирую следующим образом (положив его предварительно в корень 'D:\'):
Код
aPath := 'D:\' + objectId + '_mconst.ini';

Если убрать начало 'D:\', то Скада будет искать его в файлах проекта, что успешно проходит. А в данном случае просто не видит, права на файл сделал для всех Full access.
Система - Windows 10 Home.
Название: Re: Работа с файлами
Отправлено: Simple-Scada от 19 Декабря 2019, 15:26:47
Вы открываете файл через TextFileOpen? Если да, то у неё есть два отдельных параметра, первый - имя файла, второй - путь к файлу, см. руководство (https://simple-scada.com/help/script/textfileopen.html). Возможно Вы передаёте всё одним параметром? Если да, то это неправильно. Пример:
Код: (delphi)
TextFileOpen(objectId + '_mconst.ini', 'D:\', fomReset, fcpUTF8);

Цитировать
Если убрать начало 'D:\', то Скада будет искать его в файлах проекта
Это не потому что Вы убрали 'D:\', а потому что не указали параметр-путь к файлу и оставили его пустым. Прочтите описание параметра APath в руководстве (https://simple-scada.com/help/script/textfileopen.html).

Цитировать
Журнал перегружен сообщениями об ошибках другого плана, на эту тему ничего не нашёл.
Ошибки лучше исправить, чтобы не возникало других проблем.
Название: Re: Работа с файлами
Отправлено: MaxHari от 23 Декабря 2019, 00:34:56
Цитировать
Вы открываете файл через TextFileOpen? Если да, то у неё есть два отдельных параметра, первый - имя файла, второй - путь к файлу, см. руководство (https://simple-scada.com/help/script/textfileopen.html). Возможно Вы передаёте всё одним параметром? Если да, то это неправильно. Пример:
Код: (delphi)
TextFileOpen(objectId + '_mconst.ini', 'D:\', fomReset, fcpUTF8);

Да, так и есть. Исправил, всё заработало :-)
С ошибками будем что-то делать по мере освобождения от сверх срочных задач. Система стабильно работает, но в логи они почему-то сыпятся, нужно вникать.
Cпасибо за помощь.