PDA

Просмотр полной версии : Запись данных в БД



Sohatyi
30.04.2013, 13:03
Добрый день.
Есть проект реализованный на MasterSCADA 3.5 и и база данных на MS SQL. Замечено, что количество данных записанных в кэш существенно отличается от количества записанных в БД. Куда пропадают недостающие?
Если в процессе работы какое-то время сервер с БД был недоступен, то данные на него, после восстановления связи, не сбрасываются. На сервере все архивы доступны, видимо из кэша, а клиенты доступ к данным не получают. Каким образом происходит процесс передачи недостающих данных и происходит ли вообще?
Опрос архивов приборов происходит через OPC HDA, после восстановления связи с БД записываются только последние значения, изменяется время в столбце LastTime в таблице MasterSCADADataItems, соответственно старые значения не опрашиваются. Можно ли каким-нибудь образом восстановить целостность данных?

SCADAMaster
30.04.2013, 14:49
Пришлите отчет об ошибках и скриншот тренда на котором будет видно пропадание данных.
Если скаду не выключать, то все данные должны в итоге попасть в архив. Если переполнится очередь записи, то данные будут прореживаться, но они не пропадут совсем.

Для того чтобы сформировать отчет об ошибках:
В Режиме Разработки (DT):
"Проект"-> "Отчет об Ошибках"
Поставьте галочку "Включая конфигурацию текущего проекта".

Sohatyi
07.05.2013, 11:23
Выложил ссылку на отчет
http://files.mail.ru/A22B4929AED8476D85A96177550D8FDD
Каким образом очищается кэш?
Как заставить HDA-клиента считать данные заново, перезаписать те, что уже есть?

SCADAMaster
07.05.2013, 15:41
В логе последние записи от 15 апреля -
04-15 08:09:37.505. [Error] MSSQL 1, ЧМЗ.Цех 18.Корпус 403.ТП№2.Текущие.dT, 1, 11,8524894714355 Норма 15.04.2013 04:09:37.180,
System.Data.SqlClient.SqlException (0x80131904): Журнал транзакций для базы данных "CHMZ_Master_BASE" заполнен. Чтобы обнаружить причину, по которой место в журнале не может быть повторно использовано, обратитесь к столбцу log_reuse_wait_desc таблицы sys.databases

Это может быть если закончилось место на диске или в БД стоит ограничение на размер журнала транзакций. Нужно проверить настройку БД "Recovery model". Если она "Full" то журнал транзакций надо чистить вручную. Если поменять на Simple, то он расти не будет.

Мы также просили скриншот тренда, где видны пропуски данных.

Sohatyi
08.05.2013, 10:31
1-й тренд с клиента, 2-й - с сервера. Часовые архивы

SCADAMaster
08.05.2013, 15:45
Вы проверяли переполнение диска и журнала транзакций?
Сформируйте снова отчет об ошибках.

Sohatyi
08.05.2013, 16:48
На диске место есть, журнал транзакций очищается. Имеется частичное пропадание данных, можно как-то записать их в базу?

SCADAMaster
08.05.2013, 20:09
Сформируйте снова отчет об ошибках.

Sohatyi
13.05.2013, 15:14
Не получилось загрузить файл.
ссылка на новый отчет об ошибках
http://files.mail.ru/44CA88B261A6417C8EB9C435E4132193

SCADAMaster
14.05.2013, 08:06
Пришлите нам данные в табличном виде с 16 по 27 апреля (по тому параметру, что на графике). Это можно сделать средствами тренда - включить таблицу значений, скрывать в легенде все параметры кроме нужного, выбрать нужный диапазон и проэкспортировать в файл (csv).

Также вам нужно обновите версию до текущей - направьте запрос на scada(собака)insat.ru. Мы исправили ошибку которая может приводить к указанному вами поведению.

Sohatyi
14.05.2013, 13:55
Запрос на обновление отправил.
Все-таки объясните когда происходит сброс данных из кэша в БД, при остановке сервера БД, - в процессе работы или остановки?
Табличные данные смогу скинуть на следующей неделе, когда доберусь до объекта.
Спасибо.

Sohatyi
14.05.2013, 14:21
Обновлять нужно только серверную версию или клиентов тоже?

SCADAMaster
14.05.2013, 14:31
Лучше все обновить.

SCADAMaster
14.05.2013, 15:52
Все-таки объясните когда происходит сброс данных из кэша в БД, при остановке сервера БД, - в процессе работы или остановки?

Запись в БД идет непрерывно в процессе работы, на первом скриншоте видно, что растут оба показателя "Запись в БД", "Запись в кеш", другое дело, что "Запись в БД" может быть меньше, если некоторые данные не удалось записать. У вас была проблема в том, что при старте от HDA сервера частично приходят данные, которые уже есть в БД, А поскольку данные пишутся в БД групповым образом, то запись не проходит целиком.
При остановке идет ожидание, пока не будут сохранены все данные из очереди записи.

Sohatyi
15.05.2013, 09:17
А то, что в настройках БД в поле "Режим создания объектов БД" выбрано "Пересоздавать отличающиеся" не означает, что вновь пришедшие данные должны перезаписать существующие?

SCADAMaster
15.05.2013, 09:20
Нет, это настройка предназначена для другого - она предназначена для пересоздания таблиц и хранимых процедур.
MasterSCADA не перезаписывает старые данные - если пришло значение с меткой времени меньшей чем последнее значение в архиве, то оно просто отбрасывается.

Sohatyi
15.05.2013, 11:40
Понятно. Иногда в базе получаются недостоверные данные, скорее всего проблема в OPC HDA, хотелось бы иметь простой механизм для перезаписи данных, не совсем удобно искать соответствия между тегами расположенными в дереве объектов и системе, а потом искать соответствующий ID в базе данных.
Спасибо.

SCADAMaster
15.05.2013, 13:37
В скаде это сделать затруднительно и нецелесообразно. Вы можете написать хранимую процедуру которая будет удалять данные соответствие ID и можно найти в таблице MasterSCADADataItems.
Но вообще следует разобраться в OPC сервером - почему он передает недостоверные данные.

Sohatyi
15.05.2013, 14:56
С OPC разобраться не получится похоже, люди которые его делали уже не работают, а новая тех. поддержка не может ничего решить, по крайней мере так было в прошлом году.
Проблема такая: в базу данных с одной меткой времени записываются недостоверные значения (совсем непохожие на реальные), такое ощущение, что где-то происходит сдвиг в расшифровке ответа от теплосчетчика. До этого времени и после значения нормальные. Бывает такое что сдвигается запятая в нецелых значениях.
Во вложении данные в табличном виде по высланным ранее трендам

SCADAMaster
15.05.2013, 20:10
Пришлите еще отчет об ошибках с клиентов.
Вы пробовали перезапускать скаду на клиенте, когда замечали провалы?

Sohatyi
16.05.2013, 10:14
У нас клиенты не постоянно действующие. Пользователи запускают скаду, когда им нужны отчеты о потребленных ресурсах, так что имеет ли смысл делать отчет об ошибках с клиентов?

SCADAMaster
16.05.2013, 12:50
Да, сделайте.
Сделайте отчет с того клиента, с которого скриншот.
Вы пробовали перезапускать скаду на клиенте, когда замечали провалы?

Sohatyi
16.05.2013, 13:38
так я же говорю, что клиенты постоянно перезапускаются, скаду загружают только при необходимости просмотреть данные, в остальных случаях - это обычные компы, провал висит до сих пор. в БД этих значений нет, они есть только видимо в кэше сервера опроса, так что перезагрузка клиента в любом случае не приведет к появлению данных. Сколько времени хранится кэш и есть ли у него возможность перезаписи? опасаюсь того, что к тому моменту как я доберусь до объекта данные совсем потеряются

SCADAMaster
16.05.2013, 15:40
Кеш сбрасывается при остановке RT. Судя по логу последняя остановка была 25/04.
04-25 08:16:47.327. Stopped Project=CHMZ.vav
На скриншоте видно, что на клиенте есть провал за более ранний период, а на сервере нет. Точно в БД нет данных за интервал 16/04 - 25/04?

Sohatyi
16.05.2013, 16:45
точно нет, я ж с этого и начал, что на сервере данные отображаются, хотя их нет в БД.
Значит, получается, что после остановки сервера в базу попадут значения только с 25.04? или он все-таки скинет все данные?

SCADAMaster
17.05.2013, 14:18
Значит, получается, что после остановки сервера в базу попадут значения только с 25.04?
Да. За предыдущий период данные можно будет восстановить только из OPC HDA сервера, если они там есть. Но поскольку архив в скаде может быть только монотонным, то нужно будет предварительно удалить старые данные.
Для этого вам нужно в базе данных удалить данные из таблицы MasterSCADADataRaw за нужный интервал времени, а также подкорректировать поле LastTime в таблице MasterSCADADataItems