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

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

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

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

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

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

P.S.: до этого не сталкивался с WinCC на таком уровне
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.07.2018, 19:10
Ответы с готовыми решениями:

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

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

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

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

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

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

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

З.Ы.: "Держатели" данных считают, что крутить на сервере че-то и вообще дышать на него перегаром совершенно недопустимо. Поэтому я рассматриваю вариант копирования файлов mdf на другой сервер (посредством флэшки, например) и их обработку уже там. Еще раз на всякий случай поинтересуюсь - не описан ли где способ декомпрессии тэгов вручную? Ну что-то вроде: первые столько-то байт - данные такие-то, последующие 8 байт - данные другие-то, и т.д.
0
Модератор
 Аватар для vxg
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,429
06.07.2018, 07:43
Winney, однозначно такой способ есть и я думаю он достаточно прост, но официальной документации мне не встречалось, использовать догадки не стал - есть вероятность не увидеть какие-то исключительные ситуации или попасть на обновление распаковщика
1
471 / 234 / 73
Регистрация: 25.05.2012
Сообщений: 1,094
Записей в блоге: 1
06.07.2018, 15:21
Цитата Сообщение от Winney Посмотреть сообщение
Видимо нужно что-то вроде этого
Этот способ прекрасно работает. Используя поставщик данных WinCCOLEDBProvider можно получить доступ к архивным данным WinCC без самостоятельной распаковки и ковыряния стандарта компрессии. И если у вас уже есть лицензия на WinCC, то еще и бесплатно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.07.2018, 15:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер