Все же решил попробывать написать собственный скрипт.
Заметил такую деталь: TrendWorX Server пишет каждый параметр только в 36 колонок, а затем переходит на следующую строку и снова заполняет 36 колонок для каждого параметра. Т.е., формат примерно следующий:
V1 T1 M1 Q1 V2 T2 M2 Q2 ... V36 T36 M36 Q36
V37 T37 M37 Q37 V38 T38 M38 Q38 ... V72 T72 M72 Q72
где Vi - значение тега, Ti - дата и время, Mi - миллисекунды, Qi - качество
Описал я приблизительно, там, конечно, еще куча информации, но в качестве примера сойдет.
Код следующий:
Const kol_column_TWX = 36
Const kol_element = 9000
Dim adoConnection As ADODB.Connection 'имя подключения
Dim rsInitData As ADODB.Recordset 'имя набора данных (здесь хранятся все значения из БД)
Dim qryText As String 'строка SQL-запроса
Dim values(1 To kol_elements) 'массив значений измеряемого параметра
Dim tDates(1 To kol_elements) 'массив дат
Dim mSecs(1 To kol_elements) 'массив миллисекунд (не учитывается, поэтому все значения = 0)
Dim qual(1 To kol_elements) 'массив качества значений (качество всегда хорошее)
Dim kol_str 'количество строк в БД (TrendWorX Server довольно специфично архивирует
'данные: сначала он записывает 36 значений в одну строку, затем переходит на
'следующую строку. Затем снова 36 значений в одной строке и снова на
'следующую строку. Параметр kol_str содержит в себе количество таких строк и
'используется при заполнении массивов значениями)
Set adoConnection = New ADODB.Connection 'создаем подключение
Set rsInitData = New ADODB.Recordset 'выделяем переменную для хранения архивных данных
kol_str = 0 'инициализация
adoConnection.Provider = "Microsoft.Jet.OLEDB.4.0" 'устанавливаем параметры соединения
'имя используемой БД
adoConnection.ConnectionString = "DataSource=D:\work\genesis\databases\sme1_seria1_DBTwxData.mdb"
adoConnection.Open "D:\work\genesis\databases\my_DBTwxData.mdb" 'открываем базу
If Not (adoConnection.State = adStateOpen) Then 'обработка ошибок
MsgBox "Извините, не могу подключиться, проверьте путь к БД", vbCritical, "Ошибка"
End If
'формируем SQL-запрос для получения данных из БД
qryText = "SELECT Sample_TDate_1,Sample_TDate_2,Sample_TDate_3,Sample_TDate_4,Sample_TDate_5,Sample_TDate_6,Sample_TDate_7,"
qryText = qryText & "Sample_TDate_8,Sample_TDate_9,Sample_TDate_10,Sample_TDate_11,Sample_TDate_12,Sample_TDate_13,Sample_TDate_14,"
qryText = qryText & "Sample_TDate_15,Sample_TDate_16,Sample_TDate_17,Sample_TDate_18,Sample_TDate_19,Sample_TDate_20,Sample_TDate_21,"
qryText = qryText & "Sample_TDate_22,Sample_TDate_23,Sample_TDate_24,Sample_TDate_25,Sample_TDate_26,Sample_TDate_27,Sample_TDate_28,"
qryText = qryText & "Sample_TDate_29,Sample_TDate_30,Sample_TDate_31,Sample_TDate_32,Sample_TDate_33,Sample_TDate_34,Sample_TDate_35,"
qryText = qryText & "Sample_TDate_36,Sample_Value_1,Sample_Value_2,Sample_Value_3,Sample_Value_4,Sample_Value_5,Sample_Value_6,"
qryText = qryText & "Sample_Value_7,Sample_Value_8,Sample_Value_9,Sample_Value_10,Sample_Value_11,Sample_Value_12,Sample_Value_13,"
qryText = qryText & "Sample_Value_14,Sample_Value_15,Sample_Value_16,Sample_Value_17,Sample_Value_18,Sample_Value_19,Sample_Value_20,"
qryText = qryText & "Sample_Value_21,Sample_Value_22,Sample_Value_23,Sample_Value_24,Sample_Value_25,Sample_Value_26,Sample_Value_27,"
qryText = qryText & "Sample_Value_28,Sample_Value_29,Sample_Value_30,Sample_Value_31,Sample_Value_32,Sample_Value_33,Sample_Value_34,"
qryText = qryText & "Sample_Value_35,Sample_Value_36 "
qryText = qryText & "FROM seria1 WHERE seria1.Signal_Index = 1 ORDER BY "
qryText = qryText & "seria1.Sample_TDate_1 ASC,seria1.Sample_TDate_2 ASC,seria1.Sample_TDate_3 ASC,seria1.Sample_TDate_4 Asc"
'выполняем запрос
rsInitData.Open qryText, adoConnection, adOpenForwardOnly, adLockReadOnly, adCmdText
If rsInitData.EOF And rsInitData.BOF Then
MsgBox "Извините, не могу инициализировать объект", vbCritical, "Ошибка"
End If
rsInitData.MoveFirst 'переходим к первой строке полученной таблицы с данными
While (Not rsInitData.EOF) 'заполняем массивы полученными данными
For i = 1 To kol_column_TWX
arr_index = i + kol_str * kol_column_TWX 'формула для вычисления индекса массива
values(arr_index) = rsInitData.Fields(i + (kol_column_TWX - 1)) 'формат хранения данных в переменной
'rsInitData после выполнения SQl-запроса следующий:
'в первых 36 столбцах хранятся даты значений '
'в столбцах с 37 по 72 хранятся сами значения
'индексация начинается не с 1, а с 0, поэтому и используется формула:
'i + (kol_column_TWX - 1)
tDates(arr_index) = rsInitData.Fields(i - 1) ' индексация с 0
mSecs(arr_index) = 0 'не учитываем миллисекунды, поэтому равны 0
qual(arr_index) = 192 'значение 192 соответствует хорошему качеству тега
Next i
rsInitData.MoveNext 'переходим к следующей строке полученной таблицы с данными
kol_str = kol_str + 1 'счетчик строк тоже увеличиваем
Wend
Можете пользоваться, если кому-то пригодится. Правда там могут всплыть проблемы с подключением библиотек (ADODB, к примеру) и т.д., но это уже другой вопрос.
Но вот если формат в 36 колонок не является постоянным, то этот кусок кода оказывается абсолютно бесполезным.
Вопрос: действительно ли TrendWorX Server придерживается этого формата (36 колонок) или через пару месяцев их станет 72, затем 144 и т.д. (у меня база накопила пока данных чуть больше чем за неделю)?
Если формат все же изменяется, то есть ли функцая которая вычисляет количество колонок в таблице, чтобы можно было отслеживать это в программе?