С Новым годом! Форум программистов, компьютерный форум, киберфорум
SCADA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
1

Декомпрессия тэгов WinCC

02.07.2018, 19:10. Показов 3047. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, коллеги!

Подскажите пожалуйста, как можно провести декомпрессию тэгов из БД WinCC в человеческий вид.
Вопрос аналогичен этому, однако в той теме ссыли в ответе почему-то не работают(((

Глобальная задача заключается в записи "расжатых" данных на другой сервер для объединения с большим количеством других переменных с целью совместного анализа.

P.S.: до этого не сталкивался с WinCC на таком уровне
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2018, 19:10
Ответы с готовыми решениями:

[WinCC] Возможен перенос WinCC на другой компьютер простым копированием?
Здравствуйте, уважаемые специалисты. Имею опыт программирования ПЛК некоторых производителей, но...

Замена тэгов в шаблоне Word на данные из Excel (поиск всех однотипных тэгов)
Прошу помощи по следующей проблеме: есть шаблон договора Word, в данном шаблоне расставлены тэги...

Декомпрессия текста
Дана строка, состоящая из букв латинского алфавита. В целях ее компрессии разрешается любые ее...

Декомпрессия данных
Здравствуйте, уважаемые форумчане! Есть ли у кого работающие примеры декомпрессии данных с помощью...

10
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,415
04.07.2018, 18:47 2
Winney, например через db bridge или если бесплатно - руками делать выборку и скидывать результат в нужной форме
0
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
04.07.2018, 20:05  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
или если бесплатно
интересует именно такой вариант)

выборку сделать я смогу. Наиболее животрепещущий вопрос - как трансформировать BinData в нормальные числа. То есть по сути меня интересует спецификация сжатия данных - как развернуть Bin в человеческие значения.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,415
04.07.2018, 20:33 4
Winney, как вы получили «сжатые» и что за диво пишет их?
0
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
04.07.2018, 20:57  [ТС] 5
vxg, пишет их приложение, собирающее данные с семёновских PLC
Сохранение идет в базу данных. Там есть несколько таблиц, в частности TagCompressed и TagDecompressed, причем декомпрессированная пустая. Почитав на просторах шайтан-тырнета я пришел к выводу, что запись в виде TagCompressed является стандартной для ПЛК Сименса на комп через WinCC. Ссыль на общий вид таблицы БД в первом посте. Очевидно, данные каким-то образом сжимаются, вот никак не могу найти спецификацию, чтобы руками распарсить BinData.

P.S.: Прогу писали наши китайские друзья, след которых простыл давным-давно, документации и описания само-собой не осталось, даже на китайском. Программа забирает около 200 датчиков через кучу ПЛК и пишет их на сервер в виде файлов mdf с определенным периодом (или объемом, ХЗ).

Добавлено через 3 минуты
Видимо нужно что-то вроде этого
Ну, или спецификация формата сжатия)))
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,415
05.07.2018, 08:43 6
Winney, кто и как пишет я понял - а кто их читает в таком диком виде? Или вы просто руками полезли в таблицу MSSQL и удивились?
0
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
05.07.2018, 18:45  [ТС] 7
Цитата Сообщение от vxg Посмотреть сообщение
просто руками полезли в таблицу MSSQL и удивились?
Именно так и было)))
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,415
05.07.2018, 21:13 8
Лучший ответ Сообщение было отмечено Winney как решение

Решение

Winney, можно вытаскивать их средствами WinCC и сохранять в удобной форме
что то вроде этого (достал из чулана, точно не уверен)
на листе Excel пишем
catalog CC_svr_09_05_06_12_37_42R
ds STATION1\WinCC
tag_name SystemArchive\02EKG10CP002/main.value
beg_t 0000-00-00 00:01:00.000
end_t 0000-00-00 00:00:00.000
в редакторе VBA пишем
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Option Explicit
 
Public Sub export()
 
Dim r As Integer
r = 1
 
Dim catalog As String
catalog = Cells(r, 2)
r = r + 1
 
Dim ds As String
ds = Cells(r, 2)
r = r + 1
 
Dim tag_name As String
tag_name = Cells(r, 2)
r = r + 1
 
Dim beg_t As String
beg_t = Cells(r, 2)
r = r + 1
 
Dim end_t As String
end_t = Cells(r, 2)
r = r + 1
 
Dim c As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
 
Set c = CreateObject("ADODB.Connection")
c.ConnectionString = "Provider=WinCCOLEDBProvider.1;Catalog=" + catalog + ";Data Source=" + ds + ";"
c.CursorLocation = 3
c.Open
 
Set cmd = CreateObject("ADODB.Command")
cmd.CommandType = 1
Set cmd.ActiveConnection = c
cmd.CommandText = "TAG:R,'" + tag_name + "','" + beg_t + "','" + end_t + "'"
 
r = r + 1
Cells(r, 1).Value = "timestamps"
Cells(r, 2).Value = "values"
r = r + 1
 
Set rs = CreateObject("ADODB.Recordset")
Set rs = cmd.Execute
 
If rs.EOF Then
  rs.MoveFirst
  Do While Not rs.EOF
    Cells(r, 1).Value = rs.Fields(1).Value
    Cells(r, 2).Value = rs.Fields(2).Value
    r = r + 1
  
    rs.MoveNext
  Loop
End If
 
rs.Close
Set rs = Nothing
Set cmd = Nothing
c.Close
Set c = Nothing
 
End Sub
либо где-то в недрах скриптов WinCC
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
Sub OnClick(Byval Item)                                                                                                                             
  HMIRuntime.ActiveScreen.ScreenItems.Item("StaticTextBusy").Visible = True
 
  Dim s
  Set s = GetObject("script:C:\utc.wsc")
 
  Dim tag_name_field
  Dim folder_name_field
  Dim start_t_field
  Dim end_t_field
  Dim utc_field
 
  Set tag_name_field = HMIRuntime.ActiveScreen.ScreenItems.Item("tag_name")
  Set folder_name_field = HMIRuntime.ActiveScreen.ScreenItems.Item("folder_name")
  Set start_t_field = HMIRuntime.ActiveScreen.ScreenItems.Item("start_t")
  Set end_t_field = HMIRuntime.ActiveScreen.ScreenItems.Item("end_t")
  Set utc_field = HMIRuntime.ActiveScreen.ScreenItems.Item("utc")
  
  Dim tag_name
  tag_name = tag_name_field.Text
 
  Dim folder_name
  folder_name = folder_name_field.Text
  
  Dim utc
  utc = utc_field.Process
 
  Dim original_start_t 
  original_start_t = CDate(start_t_field.Text)
  Dim start_t 
  start_t = original_start_t
  If utc = 0 Then
    start_t = s.local_time_to_utc(Year(start_t), Month(start_t), Day(start_t), Hour(start_t), Minute(start_t), Second(start_t))
  End If
  
  Dim start_t_str
  start_t_str = CStr(Year(start_t)) + "-" + CStr(Month(start_t)) + "-" + CStr(Day(start_t)) + " " + CStr(Hour(start_t)) + ":" + CStr(Minute(start_t)) + ":" + CStr(Second(start_t))
 
  Dim original_end_t
  original_end_t = CDate(end_t_field.Text)
  Dim end_t
  end_t = original_end_t
  If utc = 0 Then
    end_t = s.local_time_to_utc(Year(end_t), Month(end_t), Day(end_t), Hour(end_t), Minute(end_t), Second(end_t))
  End If
  
  Dim end_t_str
  end_t_str = CStr(Year(end_t)) + "-" + CStr(Month(end_t)) + "-" + CStr(Day(end_t)) + " " + CStr(Hour(end_t)) + ":" + CStr(Minute(end_t)) + ":" + CStr(Second(end_t))
 
  If start_t >= end_t Then
    HMIRuntime.ActiveScreen.ScreenItems.Item("StaticTextBusy").Visible = False
    Call MsgBox("Недопустимый период. Начало периода должно быть меньше конца периода.", vbOKOnly, "Ошибка")
    Exit Sub
  End If
  
  Dim db_catalog
  db_catalog = HMIRuntime.Tags.Item("@DatasourceNameRT").Read
 
  Dim db_host
  db_host = HMIRuntime.Tags.Item("@ServerName").Read
 
  Dim connection
  Dim rs
  Dim cmd
 
  Set connection = CreateObject("ADODB.Connection")
  connection.ConnectionString = "Provider=WinCCOLEDBProvider.1;Catalog=" + db_catalog + ";Data Source=" + db_host + "\WinCC;"
  connection.CursorLocation = 3
  connection.Open
 
  Set cmd = CreateObject("ADODB.Command")
  cmd.CommandType = 1
  Set cmd.ActiveConnection = connection
  cmd.CommandText = "TAG:R,'" + tag_name + "','" + start_t_str + "','" + end_t_str + "'"
 
  Set rs = CreateObject("ADODB.Recordset")
  Set rs = cmd.Execute
  
  If rs.EOF Then
    HMIRuntime.ActiveScreen.ScreenItems.Item("StaticTextBusy").Visible = False
    Call MsgBox("Не обнаружено архивных записей за заданный период.", vbOKOnly, "Сообщение")
    Exit Sub
  End If
 
  Dim cur_t
  cur_t = Now
  
  Dim t_res
 
  Dim fso
  Set fso = CreateObject("Scripting.FileSystemObject")
  
  Dim f
  Set f = fso.CreateTextFile(folder_name + "data-" + CStr(Year(cur_t)) + "-" + CStr(Month(cur_t)) + "-" + CStr(Day(cur_t)) + "-" + CStr(Hour(cur_t)) + "-" + CStr(Minute(cur_t)) + "-" + CStr(Second(cur_t)) + "-" + Replace(Replace(tag_name, "/", "_"), "\", "-") + ".csv", True)
 
  f.WriteLine("Данные")
  f.WriteLine("Дата создания;" + CStr(cur_t))
  f.WriteLine("Тэг;" + tag_name)
  f.WriteLine("Начало периода;" + CStr(original_start_t))
  f.WriteLine("Конец периода;" + CStr(original_end_t))
  If utc <> 0 Then
    f.WriteLine("UTC;Разрешено")
  Else
    f.WriteLine("UTC;Неразрешено")
  End If
  f.WriteLine("Время;Значение")
 
  rs.MoveFirst
 
  Do While Not rs.EOF
    t_res = rs.Fields(1).value
    If utc = 0 Then
      t_res = s.utc_to_local_time(Year(t_res), Month(t_res), Day(t_res), Hour(t_res), Minute(t_res), Second(t_res))
    End If
    f.WriteLine(CStr(t_res) + ";" + CStr(rs.Fields(2).value))
    rs.MoveNext
  Loop
  
  rs.Close
  connection.Close
  
  f.Close
 
  HMIRuntime.ActiveScreen.ScreenItems.Item("StaticTextBusy").Visible = False
  Call MsgBox("Экспорт прошел успешно.", vbOKOnly, "Сообщение")
End Sub
1
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
05.07.2018, 22:57  [ТС] 9
vxg, спасибо большое! Постараюсь это раскурить.

З.Ы.: "Держатели" данных считают, что крутить на сервере че-то и вообще дышать на него перегаром совершенно недопустимо. Поэтому я рассматриваю вариант копирования файлов mdf на другой сервер (посредством флэшки, например) и их обработку уже там. Еще раз на всякий случай поинтересуюсь - не описан ли где способ декомпрессии тэгов вручную? Ну что-то вроде: первые столько-то байт - данные такие-то, последующие 8 байт - данные другие-то, и т.д.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,415
06.07.2018, 07:43 10
Winney, однозначно такой способ есть и я думаю он достаточно прост, но официальной документации мне не встречалось, использовать догадки не стал - есть вероятность не увидеть какие-то исключительные ситуации или попасть на обновление распаковщика
1
471 / 234 / 73
Регистрация: 25.05.2012
Сообщений: 1,076
Записей в блоге: 1
06.07.2018, 15:21 11
Цитата Сообщение от Winney Посмотреть сообщение
Видимо нужно что-то вроде этого
Этот способ прекрасно работает. Используя поставщик данных WinCCOLEDBProvider можно получить доступ к архивным данным WinCC без самостоятельной распаковки и ковыряния стандарта компрессии. И если у вас уже есть лицензия на WinCC, то еще и бесплатно.
1
06.07.2018, 15:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2018, 15:21
Помогаю со студенческими работами здесь

Декомпрессия GZIP ответа
Здравствуйте. Суть вопроса такова: Отправляю запрос на сайт, который присылает ответ в...

Компрессия и декомпрессия RLE
Всем привет. Ребята подскажите пожалуйста, что нужно изменить в этом коде, чтобы он расшифровывал...

httpwebrequest cookies и декомпрессия
Здравствуйте! Помогите, плиз private CookieContainer getCookieHttpGet(String url) ...

Компрессия и декомпрессия RLE
Всем привет. Ребята подскажите пожалуйста, что нужно изменить в этом коде, чтобы он расшифровывал...

Декомпрессия принятой страницы
допустим в StringList содержится скачанная с нета страница. но, если сервер дает нам ее в сжатом...

Компрессия / декомпрессия файлов
Нужно реализовать компрессию/декомпресию файлов. Судя по всему без готового компонента не...

Не работает декомпрессия в алгоритме LZW
Здравствуйте! Пишу алгоритм LZW на C++ компрессия работает хорошо, однако декомпрессия почему-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru