Форум программистов, компьютерный форум, киберфорум
Наши страницы
SCADA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Winney
301 / 242 / 40
Регистрация: 28.09.2013
Сообщений: 573
Завершенные тесты: 1
#1

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

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

Доброго времени суток, коллеги!

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

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

P.S.: до этого не сталкивался с WinCC на таком уровне
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2018, 19:10
Ответы с готовыми решениями:

Скрипт WinCC на си
Помогите сделать скрипт быстрее. long F_status_device(char* screenName,...

SIMATIC WINCC V7.0
Всем привет. Осталось в зипе такое ПО как: 1-Symatic WinCC v7.0 SP3 Runtime...

WinCC и GlobalScript
Добрый день. имеется вэб-морда у кондиционеров с текущими параметрами,...

WINCC Object
Разбираюсь с проектом WINCC и в скрипте на "C" нашёл вот такую строку #define ...

Литература и документация по WinCC
Кстати а VBS учебничек или что то вроде этого может есть у кого? Перешарил пол...

10
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
04.07.2018, 18:47 #2
Winney, например через db bridge или если бесплатно - руками делать выборку и скидывать результат в нужной форме
0
Winney
301 / 242 / 40
Регистрация: 28.09.2013
Сообщений: 573
Завершенные тесты: 1
04.07.2018, 20:05  [ТС] #3
Цитата Сообщение от vxg Посмотреть сообщение
или если бесплатно
интересует именно такой вариант)

выборку сделать я смогу. Наиболее животрепещущий вопрос - как трансформировать BinData в нормальные числа. То есть по сути меня интересует спецификация сжатия данных - как развернуть Bin в человеческие значения.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
04.07.2018, 20:33 #4
Winney, как вы получили «сжатые» и что за диво пишет их?
0
Winney
301 / 242 / 40
Регистрация: 28.09.2013
Сообщений: 573
Завершенные тесты: 1
04.07.2018, 20:57  [ТС] #5
vxg, пишет их приложение, собирающее данные с семёновских PLC
Сохранение идет в базу данных. Там есть несколько таблиц, в частности TagCompressed и TagDecompressed, причем декомпрессированная пустая. Почитав на просторах шайтан-тырнета я пришел к выводу, что запись в виде TagCompressed является стандартной для ПЛК Сименса на комп через WinCC. Ссыль на общий вид таблицы БД в первом посте. Очевидно, данные каким-то образом сжимаются, вот никак не могу найти спецификацию, чтобы руками распарсить BinData.

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

Добавлено через 3 минуты
Видимо нужно что-то вроде этого
Ну, или спецификация формата сжатия)))
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
05.07.2018, 08:43 #6
Winney, кто и как пишет я понял - а кто их читает в таком диком виде? Или вы просто руками полезли в таблицу MSSQL и удивились?
0
Winney
301 / 242 / 40
Регистрация: 28.09.2013
Сообщений: 573
Завершенные тесты: 1
05.07.2018, 18:45  [ТС] #7
Цитата Сообщение от vxg Посмотреть сообщение
просто руками полезли в таблицу MSSQL и удивились?
Именно так и было)))
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
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
Winney
301 / 242 / 40
Регистрация: 28.09.2013
Сообщений: 573
Завершенные тесты: 1
05.07.2018, 22:57  [ТС] #9
vxg, спасибо большое! Постараюсь это раскурить.

З.Ы.: "Держатели" данных считают, что крутить на сервере че-то и вообще дышать на него перегаром совершенно недопустимо. Поэтому я рассматриваю вариант копирования файлов mdf на другой сервер (посредством флэшки, например) и их обработку уже там. Еще раз на всякий случай поинтересуюсь - не описан ли где способ декомпрессии тэгов вручную? Ну что-то вроде: первые столько-то байт - данные такие-то, последующие 8 байт - данные другие-то, и т.д.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
06.07.2018, 07:43 #10
Winney, однозначно такой способ есть и я думаю он достаточно прост, но официальной документации мне не встречалось, использовать догадки не стал - есть вероятность не увидеть какие-то исключительные ситуации или попасть на обновление распаковщика
1
NewOrdered
401 / 178 / 63
Регистрация: 25.05.2012
Сообщений: 806
Записей в блоге: 1
06.07.2018, 15:21 #11
Цитата Сообщение от Winney Посмотреть сообщение
Видимо нужно что-то вроде этого
Этот способ прекрасно работает. Используя поставщик данных WinCCOLEDBProvider можно получить доступ к архивным данным WinCC без самостоятельной распаковки и ковыряния стандарта компрессии. И если у вас уже есть лицензия на WinCC, то еще и бесплатно.
1
06.07.2018, 15:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2018, 15:21

WinCC вызов процедуры
Подскажите пожалуйста можно ли узнать где в проекте вызывается определенная...

WinCC и Visual C++ 2008
Извините за глупый вопрос, но темы я такой не видел, вопрос собственно можно...

WinCC Structure tag
Есть в проекте WinCC структурный тэг, изменить его структуру не получается...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru