Также не совсем понятно как в этот список добавляются локальные переменные. Я объявил переменную, а в списке ее нет. Скомпилировал - нет, сохранился - нет. Открыл проект заново - нет. Перезапустил редактор - нет. Забил и забыл, как-то посмотрел, а она появилась в списке. Так то удобно, но нестабильно работает.Компилятор не сможет получить локальные переменные в том случае, если код содержит ошибки. Если у Вас есть пример кода без ошибок (т.е. который успешно компилируется), но в котором локальные переменные все равно не видны, то покажите такой пример, мы внесем исправления.
Компилятор не сможет получить локальные переменные в том случае, если код содержит ошибки. Если у Вас есть пример кода без ошибок (т.е. который успешно компилируется), но в котором локальные переменные все равно не видны, то покажите такой пример, мы внесем исправления.На самом деле это не совсем удобно. Я правлю код и пока он не завершен, там могут быть ошибки. Зачем это должно мешать добавлять корректно объявленные переменные в список.
На самом деле это не совсем удобно. Я правлю код и пока он не завершен, там могут быть ошибки.Сейчас локальные переменные/константы/типы берутся из токенов компилятора (https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D0%BA%D0%B5%D0%BD_(%D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7)) после лексического анализа (https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7) кода. Поэтому в коде до курсора (после курсора ошибки допускаются) ошибок быть не должно, иначе полного разбора не произойдет. В будущем возможно добавим выделение локальных переменных отдельным проходом, или изменим способ прохода.
Пример кода без ошибок. В трех случаях в списке есть объявленные переменные, в одном случае список пуст.Как выяснилось, причина в том, что предыдущая стока заканчивается точкой. Исправим в ближайшем обновлении.
aReportName := 'Отчет по КПДС-' + aX +
DateTimeToFileName(aVvrTRM_StartIn.Value, '') +
' по ' +
DateTimeToFileName(aVvrTRM_EndAt.Value, '');
//Формирую отчет
ReportExportAll('Отчет по КПДС-' + aX, aReportName, rfPDF);
Но почему вообще СКАДа туда обращается?Видимо Вы указали эту папку как "Папка для принятых файлов" в Options.exe (https://simple-scada.com/help/manual/settings-simple-client.html).
1. В редакторе переменных есть иконка - Импорт в CSV-файл. Но в меню "Действия" пункта экспорт в CSV-файл нет. Видимо забыли добавить.
3. При экспорте/импорте не переносятся настройки визуальной шкалы переменных.Да, действительно, добавим. Спасибо.
но при импорте видимо отслеживаются только имена переменных. И добавить мои изменения оказалось невозможным, т.к. СКАДа считает что переменные те же и в том же объеме.Прочитайте внимательнее текст в окне импорта. Там описано что нужно удерживать SHIFT чтобы обновить свойства существующих переменных.
Есть еще одна вещь с которой я пока разбираюсь. У меня на столе 2 прибора. На объекте их 6. Я добавил в конфигурацию OPC-сервера недостающие приборы, внес изменения в проект и запустил. Пусть 4х приборов нет, ну и ладно, поработаю с 2мя, а на остальных пусть висят ошибки по связи. Но. Работать то работает, но СКАДа стала ощутимо тормозить при отработке изменений во временных трендах, да и отклик от приборов приходит с запозданием до 15 секунд. Это точно не реакция на изменившийся код проекта. И не на увеличившееся кол-во приборов в обмене. Я проверил на объекте. Там задержки от 1-5 секунд максимум. Возможно это реакция OPC-сервера на ошибки в обмене, но команды на прибор со СКАДы проходят без задержек. Я это наблюдаю визуально. Получается что это реакция СКАДы на ошибки в обмене. И тогда надо разбираться почему так происходит. 15 секундные лаги это много. Добавил запись. Между командой Стоп и подтверждением Останов прошло 20 секунд. Между командой Пуск и подтверждением Работа прошло 24 секунды. Хотя прибор реагирует мгновенно.Скада не имеет никакого отношения к приборам и их количеству и взаимодействует только с OPC-сервером получая от него данные и отправляя ему запросы на присвоение. И если после отправки команды Стоп переменная подтверждения меняется через 20 секунд, значит OPC-сервер вернул подтверждённое значение именно через 20 секунд. Скада не будет просто так простаивать 20 секунд перед отображением значения (да и это было бы странно), т.к. это слишком простая операция. С большой долей вероятности можем предположить, что проблема именно в неподключенных устройствах, т.к. OPC-сервер будет пытаться установить с ними связь и на обработку неудачной попытки подключения потребуется время, т.к. всегда есть какой-то таймаут который выделяется на попытку подключения. На объекте задержки по 1-5 секунд, как мы понимаем, как раз из-за того, что с устройствами есть связь. Если OPC-сервер который Вы используете поддерживает разделение на каналы (например как KepServerEx), то можно добавить каждый прибор в отдельный канал. Тогда OPC-сервер будет опрашивать каждое устройство в отдельном потоке и будет быстро отвечать скаде по подключенным устройствам и медленно только по неподключенным.
Прочитайте внимательнее текст в окне импорта. Там описано что нужно удерживать SHIFT чтобы обновить свойства существующих переменных.Попробую, спасибо. Посмотрел, да есть такое. Но я бы перенес это описание в всплывающее окошко в которое выводится сводная информация, сколько переменных будет перенесено(обновлено) и тд. Это окошко просматривают тщательно, в то время как текст на вкладке не выглядит важным, чтобы его прочитать до конца. Хотя это только мое мнение.
С большой долей вероятности можем предположить, что проблема именно в неподключенных устройствах, т.к. OPC-сервер будет пытаться установить с ними связь и на обработку неудачной попытки подключения потребуется время, т.к. всегда есть какой-то таймаут который выделяется на попытку подключения.Я думал так же, но меня смутило, что прибор реагирует на команды от СКАДы без задержек. OPC-сервер ОВЕНа, старая версия.
...в каком коде вы вызываете список методов?...Вот:
Кстати, кто знает из-за чего Win10x64 может вылетать BSOD при попытке PrintScreen на SimpleScada2. Когда-то нормально все было, а щас вылетает.Возможно из-за драйверов на видеокарту. Можно попробовать скачать последнюю версию драйвера с официального сайта производителя видеокарты Вашего ПК. Также возможно из-за стороннего ПО которое выполняет захват экрана и т.п.
...ошибка в Украинской локализации...Понятно.
а потом у клиента он будет исполняться на украинской, там будет все переведено, не останется каких-нибудть рудиментов на английском?С системными надписями проблем не возникнет, просто подставится набор фраз на том языке, который задан в Options.exe.
var
aText: TM_Text;
aName: string;
halfTag: integer;
TagText: UTF8string;
begin
if Sender is TM_Text then
begin
aText := Sender as TM_Text;
halftag := Trunc(aText.Tag div 10);
case halftag of
0: TagText := "Error";
1: TagText := "Колонка 1 ";
2: TagText := "Колонка 2 ";
3: TagText := "Колонка 3 ";
end;
Window1.Title := TagText + aText.Text;
end;
end.
Window1.Title := aText.Text;
0: TagText := 'Error';
1: TagText := 'Колонка 1 ';
2: TagText := 'Колонка 2 ';
3: TagText := 'Колонка 3 ';
0: TagText := UTF8Encode('Error');
1: TagText := UTF8Encode('Колонка 1 ');
2: TagText := UTF8Encode('Колонка 2 ');
3: TagText := UTF8Encode('Колонка 3 ');
var
aText: TM_Text;
halfTag: integer;
aName, TagText: string;
begin
if not (Sender is TM_Text) then Exit;
aText := Sender as TM_Text;
halftag := Trunc(aText.Tag div 10);
case halftag of
0: TagText := 'Error';
1: TagText := 'Колонка 1 ';
2: TagText := 'Колонка 2 ';
3: TagText := 'Колонка 3 ';
end;
Window1.Title := UTF8Encode(TagText) + aText.Text;
end.
Внесли исправления. Скачайте повторно версию 2.2.8.2, ошибка не должна возникать.Проблема устранена. Спасибо! Очень оперативно!
При разработке проекта столкнулся с проблемой Web-клиента.Nikso, ответили Вам по e-mail.
Выставьте переменной тип DateTime в редакторе скады. И выведите его в компонент Календарь с форматом времени "чч:мм:сс". Как в этом случае отображается время? 00:00:00?Да, часы отображают 00:00:00
Восклицательный знак говорит о том, что значение переменной по данному адресу либо не удалось считать, либо оно считалось с качеством BAD (судя по всему всё же значение не считалось и вы видите стандартное значение, которым переменная инициализировалась).Да, есть ошибка по этому тегу (см. скрин).
Видите ли Вы в журнале сервера скады (https://simple-scada.com/help/manual/server-journal.html) ошибки добавления тегов?
Вы уверены, что при создании переменной (https://simple-scada.com/help/manual/variable-new.html) указали соответствующий OPC-сервер?Переменная была добавлена с помощью импорта. Это как раз та, переменная, которая считалась с управляющим символом переноса строки.
заново импортировал переменную и не стал удалять управляющий символ переноса строки - всё заработало. Значит не нужно добавлять автоматическое удаление управляющих символов при импорте переменных.Да, верно, спасибо за тест. Значит сделаем удаление управляющих символов только при отображении в таблице переменных.
"А, Б, В" с другим форматом и данными, но после попытки создания проблемного отчета "Г", также перестают генерироваться отчеты "А, Б, В". При этом в журнале сервера нет никаких следов. Работоспособность отчетов восстанавливается только после перезагрузки сервера.Такое было в старых версиях системы отчетов, какую версию скады Вы используете?
Данная функция не работает при вызове из события "OnDataChange", а также при вызове из системных типов событий "Запуск проекта", "Остановка проекта", "Выполнен SQL-запрос", "Прошла секунда", "Прошел час", "Отчет построен".Предполагаем, что Вы используете эту функцию в скриптах которые вызываются сервером (а не клиентом), например OnDataChange (изменились переменные). В них нет информации о клиенте, ведь скрипт вызывается сервером, поэтому вместо GetClientName нужно указывать какое-то конкретное имя клиента:
Здравствуйте. См. описание функции GetClientName в руководстве (https://simple-scada.com/help/script/getclientname.html).Спасибо за ответ.
Предполагаем, что Вы используете эту функцию в скриптах которые вызываются сервером (а не клиентом), например OnDataChange (изменились переменные). В них нет информации о клиенте, ведь скрипт вызывается сервером, поэтому вместо GetClientName нужно указывать какое-то конкретное имя клиента:
ShowMessageClient('мой_клиент', 'Ошибка!', 'Параметр вне диапазона');
GetClientName можно использовать в скриптах например на событие OnClick, ведь кликает по кнопке именно клиент. Тогда сервер будет знать информацию о клиенте и GetClientName будет работать.
Добрый день! Обновил программу до версии 2.3.6.0 (Time-Demo, Demo64). Заметил, что в редакторе переменных полностью обнулился счетчик переменных (как для моего проекта, так и для демонстрационного). В версии 2.3.5.3 счетчик отображался корректно. Повторная установка не помогла.Здравствуйте. Спасибо за информацию. Исправили. Для обновления можете скачать повторно и установить поверх текущей версии. Других действий не требуется.
Есть две группы переменных с одинаковым именем.При экспорте активной группы в файл, структура вложенности не сохраняется, поэтому при последующем импорте происходит поиск первой попавшейся группы с соответствующим именем и импорт выполняется в неё. Если бы группы имели уникальные имена, то такая проблема не могла бы возникнуть.
При экспорте подгруппы CIP# из группы Виртуальных переменных и последующем импорте переменные
попадают в группу с тем же именем, но на уровень выше.
var
shI: ShortInt;
smI: SmallInt;
int: Integer;
begin
shI := 1;
smI := 1;
int := 1;
for i := 1 to 4 do
begin
shI := shI - i;
smI := smI - i;
int := int - i;
end;
end;
ShortInt <> SmallInt <> Integer
IntToStr : FloatToStr
1 <> 1 <> 1 : 1.00 <> 1.00 <> 1
0 <> 0 <> 0 : 0.00 <> 0.00 <> 0
254 <> 65534 <> -2 : -2.00 <> -2.00 <> -2
251 <> 65531 <> -5 : -5.00 <> -5.00 <> -5
...
Если из окна трендом (Alt+T) при развёрнутом списке выбора переменных нажать Alt+S для перехода в скрипты, список переменных не уходит с экрана. Скрин приложен.Спасибо за информацию о проблеме, в ближайшем обновлении исправим.
правильно ли работает следующий код с разными типами данных:Есть ряд особенностей связанных с работой с типами ShortInt и SmallInt в текущей версии компилятора. К сожалению, в ближайшем будущем мы скорее всего не сможем изменить это. Поэтому для целых чисел лучше всего использовать тип Integer. Он всегда правильно будет реагировать на уход в отрицательный диапазон.
В редакторе, в окне выбора цвета пользовательской цветовой схемы (Проект/Цветовая схема/Пользовательская/Цвет или Цвет текста) не работают поля ввода Red, Green, Blue (значения вводятся, но после нажатия OK цвет не меняется).Исправлено. Исправление включено в версию 2.3.6.9.