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

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

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Серега

Страницы: 1 ... 12 13 [14] 15 16 ... 20
196
Добрый день!
Ситуация следующая.
Сняли ПЛК для проверки на пару недель. Но ОРС-сервер был в самом ПЛК настроен (нынче фишка у производителей ПЛК).
СКАДА настроена на данный ОРС и получала данные с него. И после отключения ПЛК сервер СКАДА засыпан ошибками типа:
"Имя ОРС сервера: не удалось подключиться. статус кода: {блаблабла}". Удалять переменные скрипты и т.д. с данного ОРС не хочется.

Рассматриваете ли Вы введение функции останова опроса ОРС-серверов на сервере скады через меню редактора (например еще один выпадающий список со строками "Включить в работу ОРС" и "Выключить из работы ОРС") с последующей перегрузкой сервера?

Жду вопросов и ответов.

197
Добрый день!
Все разобрался все работает как Вы и говорили.
На всякий пожарный проверьте справку и подсказку. Возможно ошибаюсь, но по моему перепутано право с левым.
Или Вы сдвигаете не запятую, а полностью число относительно фиксированной запятой?
Жду ответов и вопросов!

198
Возможно не полностью раскрыл тему.
В таблицу записываем результат запроса к базе данных. В ячейке отображается значение 56.7. Данное значение не привязано к какой то переменной. Это DateSet.
Для упрощения передачи из скады в плк умножаем значение на 10 (как бы отбрасываем дробную часть) и присваиваем его переменной. Далее значение 567 считывает контролер и у себя делит на 10. Как бы добавляем дробную часть и получаем 56.7. ПЛК получил нужное ему значение.
Так же для упрощения контроля выбора значения думали вывести данную переменную для визуализации со сдвигом, 56.7. Но оператор видит 567. Поэтому и решили использовать сдвиг.
Цитировать
...Например при чтении значения 123 с контроллера, смещает знак и отображает 12.3, а при записи 12.3 отправит на контроллер 123....
Да переменная взятая из контролера без проблем работает со сдвигом.
Возможно этот вариант не подходит и придется делать либо 2 переменных (одна для ПЛК, вторая для СКАДЫ) либо скриптами.
Наверное опять не понятно написал. НО все равно жду вопросов.

199
Добрый день!
Не нашел похожей темы. Поэтому сначала вводная.
При переходе на субстраницу скриптом заполняем таблицу из DateSet.
В таблице юзер выбирает нужную строчку и жмет кнопку.
На кнопке висит универсальгый скрипт с процедурой из глобального модуля по присвоению переменной значения ячейки.
Код
TU4XXXMXX_XXXXRCS001_iPositionStop_Set.Value := 10 * StrToFloat(UTF8ToString(tblRoutes_U4XXXMXX_XXX.Columns(4).Cells(tblRoutes_U4XXXMXX_XXX.RowIndex).Text));
В поле отображается значение переменной TU4XXXMXX_XXXXRCS001_iPositionStop_Set, в доп.настройках которой стоит сдвиг на минус один(-1).
По сути получается следующее:
В таблице отображается 56.7, переменной присваивается значение 567 и в поле должно отобразиться 56.7.
Но в поле отображается 567.
Читая по данной теме менял тип переменной. Менял число сдвига. Менял шкалы. Но что то пошло не так. Нужного результата нет.
Подскажите что не так?
Жду вопросов и предложений!

200
Добрый день!
Ждем и успехов в реализации

201
Ваши вопросы / Re: Тренды. Отрисовка
« : 12 Марта 2020, 10:37:00 »
Добрый день!
Ждем

202
Ваши вопросы / Re: Тренды. Отрисовка
« : 11 Марта 2020, 17:22:02 »
Еще раз добрый день!
У меня тут опять непонятки. На принскринах видно как от масштаба периода появляются данные на тренде.
Решил посмотреть в базе данных. И вообще не понял ни чего. Период рассматриваем сегодня (2020.03.11) с 10.00 до 16.00
В trends_data данные только с определенного времени как на рисунке Начало.
В trends_day и trends_hour данные есть, но мало.
В trends_minute большего всего.
Понимая, что процесс формирования тренда несколько завуалированный процесс, можете направить куда копать?
При этом лог сервера в норме. Стандартный. Перезапустили с утра. Подключились такие орс, клиенты, база. Все отключились.
Вроде Вы уже где то писали на форуме по поводу формирования тренда. Но этой темы не нашел. Скиньте ссылку.
P.S. Тут еще коллега говорит. В 15.20 мы применили новую функцию Другие действия:Создать таблицу переменных.
Могу подозревать, что как то промазали мимо и нажали очистить базу. Но после создания таблицы у нас пропали данные походу. Но опять как то не все а выборочно.
Жду вопросов и предложений

203
Добрый день!
Согласно руководству у нас есть скрипт типа "Ошибка SQL запроса". Логика создания понятна. Есть ошибка есть сообщение в Msg.
Но так же у нас есть (можно сказать ID запроса, DataSet) в  RunSQL свой ATag. И в скрипте типа "Выполнен SQL запрос" все замечательно работает.
Теперь к ситуации.
В универсальном скрипте, привязанном к кнопке по нажатию, формируем RunSQL(aQuery, nil, 100), где
Код: (delphi)
 aQuery := 'CREATE TABLE ' + NameNewTable.AsStr + ' LIKE TemplateTable'.
Далее в скрипте типа "Ошибка SQL запроса" добавляем
Код: (delphi)
TextSQLError.Value := Msg;
if TextSQLError.Value <> '' then
    AddMessage(Now, mkWarning, 'Таблица не добавлена', True, True);
и все прекрасно работает если мы пытаемся имитировать именно ошибку добавления таблицы с таким же именем.
Но вот вопрос, не будет ли путать оператора сообщение о создании таблицы при других ошибках SQL запросов. По логике событие будет формироваться при любых ошибках SQL запросов. Честно пока не подтвердилось опасение. Возможно ошибки Таблица. RunSQL к типу "Ошибка SQL запроса"  не относятся.
Можете у себя это проверить или опровергнуть опасения.

И теперь маленькое предложение-вопрос.
Если в скрипте типа "Ошибка SQL запроса" использовать следующую конструкцию:
Код: (delphi)
begin
case DataSet.Tag of
  100  :begin
          TextSQLError.Value := Msg;
          if TextSQLError.Value <> '' then
              AddMessage(Now, mkWarning, 'Таблица не добавлена', True, True);
        end;
end;
end.
У меня не заработала. Всего скорее, потому что номер 100 относиться к  DataSet, а не к ошибке. И обработка идет в типе скрипта "Ошибка SQL запроса".
Или все таки он может заработать? Потому что я делаю не правильно? или потому что это скоро "... появиться в ближайших обновлениях ..."  :D
Жду вопросов и предожений

204
Ясно. Будем думать.

205
Ваши вопросы / Клиент подключен или нет
« : 28 Февраля 2020, 09:32:41 »
Добрый день!
Новенькая головоломка прилетела от заказчика. Суть:
Есть сигнал HeartBit (не меняется - нет связи,  меняется - есть связь) для каждого важного объекта.
3 клиента 1 сервер. Каждый клиент управляет своим привязанным объектом.
Если отвалился клиент/завис/случайно выключили остановить изменение HeartBit .
Далее объект видя, что HeartBit не меняется, подразумевает, что типа им никто не может управлять дает команду на останов сам себе.
В руководстве по скриптам в разделе "Работа с клиентами" как токовой функции о состоянии соответствующего клиента нет.
Да есть функция StartPing. Но с ее помощью можно отслеживать работу сети или сетевой карты компьютера на котором открыт клиент.
С компом может быть все в порядке, но клиент закрыт.
В общем можете подсказать:
1. Будете ли внедрять в будущем функцию о состоянии клиента, например состояния выключен/загружается=перегрузка/работа? Или она уже есть? Сервер же как то понимает кто подключен и когда отключается.
2. Как на данный момент можно решить задачку? Или только контролем через  StartPing. Или опять не дочитал справку?
Жду Ваших вопросов и предложений.

206
Ваши вопросы / Re: Список он же ComboBox
« : 26 Февраля 2020, 12:03:37 »
Добрый день!
Блин извиняюсь. Завел всех в заблуждение.
С показом сообщения и в универсальном и в секундном скриптах разобрались и поняли. И читать надо хэлп ВНИМАТЕЛЬНО!
Цитировать
"... Важно! Данная функция не работает ... а также при вызове из системных типов событий ... , "Прошла секунда", ..."
Ну а поводу Списка вопросы остаются.

207
Ваши вопросы / Список он же ComboBox
« : 25 Февраля 2020, 18:04:48 »
Добрый день!
Задачу поставили но столкнулся с непоняткой.
Есть таблица. Скрипт на полный запуск проекта заполняет через Таблица_в_СКАДЕ.RunSQL('SELECT * FROM `Таблица_в_БД`', tsSaveFixRow) данными Таблица_в_СКАДЕ.
Иногда значения в таблице нужно перезаписать полностью и по принципу заполнения рецептов это в ручную можно долго и нудно сделать.
Но если использовать элемент список вроде все просто. Без привязки к внутренней/внешней переменной.
Согласно индексу выбранной строки делаем соответствующий SQL запрос через IF. Пусть это будет универсальный скрипт.
Код: (delphi)
var
  I: Integer;
  aQuery: string;
begin
  I := ComboBox1.ItemIndex; // получить индекс выбранной строки списка
  if I = 0  then
    tblWaysLimits_f.RunSQL('SELECT * FROM '+ Chr(96) + UpdateInfoLimits_f.AsStr + Chr(96), tsSaveFixRow);

  if I = 1 then
    tblWaysLimits_f.RunSQL('SELECT * FROM '+ Chr(96) + UpdateInfoLimits_f.AsStr + '_1' + Chr(96), tsSaveFixRow);

  if I = 2  then
    ShowMessageClient(GetClientName, 'Alarm!', '2');

  if I = 3  then
    ShowMessageClient(GetClientName, 'Alarm!', '3');
end.

И вот тут начинаются вопросы.
1. данный универсальный скрипт нужно вешать на какую реакцию? по нажатию, но тогда индекс строки будет равен той которая выбрана именно  сейчас. Если выбираем 2 строку, то только со второго нажатия получиться. Правда не получилось на тест-серваке (клон боевого) повторить.
2. если текст скрипта перенести в секундный, то вроде работает. Но
2.1. если у клиента нет имени работает
2.2. если установить имя в настройках не работает на половину. Скрипт вверху запросы делает, а вот вывод сообщений нет.
Правда еще "игрался" с пользователями. Но вроде они ни на что не влияют.
Да версия у нас сейчас 2.3.6.8.
3. Пытался с привязкой к внутренней переменной повторить, но запутался.
Резюме. В целом задача сводиться к следующему:
На одном конкретном клиенте (имя известно и только на нем) конкретный пользователь (имя известно и только он) через список (конкретный и автоматически формирующейся в зависимости от условий выбора, проверено работает так как надо) может изменить через SQL-запрос значения в массиве данных (таблицы), если надо и загрузить начальный массив или модернизированный куда надо. Вот. Надеюсь понятно написал.
Пока просто проверьте у себя с сообщениями.
И может как работать со списком более подробно опишите.
Жду вопросов и предложений.

208
Ваши вопросы / Re: Отчет за месяц
« : 20 Февраля 2020, 13:26:51 »
Добрый день!
Да пример на который Вы указали помог в реализации.
Теперь другая проблема!   :D
Финальная версия запроса в отчете такая:
Код: (sql)
SELECT ID, MIN(Value) AS min_v, MAX(Value) AS max_v FROM trends_data
WHERE ID IN (3621, 5208)
AND (timestamp >= @PeriodStart)
AND (timestamp <= @PeriodFinish)
AND Value <> 0
    AND Quality = 1
GROUP BY ID;
и после его выполнения мы получаем следующую таблицу:

ID         min_v     max_v
3621      6547       7564
5208      454,6      546,9
Теперь вопросы.
1. Подскажите можно ли в полученной таблице заменить подстановкой ID на текст по условию? Это можно сделать с помощью функции отчетов IIF? Может есть опять где то справка?
2. В этой теме (https://simple-scada.com/forum/index.php?topic=843.msg7226#msg7226) при наличии наверное можно было бы вытянуть. По поводу таблицы не думали?

209
Ваши вопросы / Re: Отчет за месяц
« : 10 Февраля 2020, 15:22:58 »
Добрый день!
Цитировать
Также получить значения из архива можно через скаду, до построения отчета, используя процедуру ArchiveValueByTime, она извлекает значение из архива за указанное время.
Хороший метод. Но... На данный момент времени заранее время не известно. Почему.
Вот запрос в базу данных:
Код: (sql)
SELECT min(Value) as min_name, max(Value) as max_name FROM etp_tc_insat.trends_data 
WHERE ID = 3621 - нужная нам для отчета переменнная
        AND Value <> 0  - фильтр на нулевые значения
        AND Quality = 1 - фильтр на достоверность данных
        AND Timestamp - это для работы BETWEEN
BETWEEN CAST('2020-01-01' As date) AND CAST('2020-01-26' As date);
Результат тот который нужен.
Этот же запрос работает при формировании отчета, когда источником данных выбран MySQL сервер, а не скада.
При этом время фиксации минимального значения или максимального ни как не совпадает с началом периода или его окончанием после фильтрации.
Поэтому вопрос как вместо заданного значения времени поставить выбранное в скаде все еще актуален.
Жду вопросов и предложений.

210
Добрый день!
Могу Вас уверить ни один из разработчиков (двое я и мой коллега) переменные-массив ни в локальных ни в глобальных переменных не используем.

Страницы: 1 ... 12 13 [14] 15 16 ... 20