Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 3
.NET 4.x

Программа по передаче данных с OPC сервера на SQL сервер

25.12.2014, 02:13. Показов 4695. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу программу по передачи данных с OPC сервера на SQL сервер. В качестве OPC сервера использую симулятор от Matrikon. В программе есть два цикла, которые активно нагружают процессор на 8-16%. В коде я их выделил соответствующим комментарием (модуль OPCCommand). Сама программа, пока что состоит из двух элементов: форма и модуль OPCCommand. Процесс опроса OPC сервера идет в фоне отдельным потоком (через BackgroundWorker). По профессии я программист промышленных контроллеров (инженер АСУТП), поэтому опыта в разработке приложений по Windows у меня мало. Хотелось бы получить помощь от опытных программистов по поводу того как мне снизить нагрузку на процессор. Код программы и исходник ниже.

Код формы:
VB.NET
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
Imports System.ComponentModel
 
Public Class frmMain
 
    Dim OPCServerName As String = "Matrikon.OPC.Simulation.1"
    Dim OPCServerIP As String = "localhost"
    Dim TagArr(200) As String
 
    'Кнопка Connect
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        OPCCommand.OPC_Connect(OPCServerName, OPCServerIP)
        For i = 0 To 200
            TagArr(i) = "Random.Int" & i
        Next i
    End Sub
    'Кнопка Start
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        If BGExample.IsBusy <> True Then
            BGExample.RunWorkerAsync()
        End If
    End Sub
    'Тело потока
    Private Sub BGExample_DoWork(sender As Object, e As DoWorkEventArgs) Handles BGExample.DoWork
        Do
            Threading.Thread.Sleep(1000)
            OPCCommand.OPC_AddItems(TagArr)
            Threading.Thread.Sleep(1000)
            OPCCommand.OPC_SyncRead()
        Loop
    End Sub
 
    Private Sub BGExample_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BGExample.RunWorkerCompleted
        MsgBox("Закончен")
    End Sub
 
End Class
Код модуля OPCCommand:
VB.NET
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
Imports OPCAutomation
 
Module OPCCommand
    Dim WithEvents ConnectedOPCServer As OPCServer
    Dim WithEvents ConnectedGroup As OPCGroup
    Dim ClientHandles As Array = Array.CreateInstance(GetType(Int32), 201)
    Dim ServerHandles As Array = Array.CreateInstance(GetType(Int32), 201)
    Dim Values As Array = Array.CreateInstance(GetType(Object), 201)
    Dim Errors As Array = Array.CreateInstance(GetType(Int32), 201)
 
    Public TagTable As DataTable = New DataTable("TagTable")
    Dim row As DataRow
    Dim counterOKAdd As Integer = 0
 
    Private Sub CreateTagTableColumn()
        Dim column As DataColumn
 
        column = New DataColumn
        column.DataType = System.Type.GetType("System.String")
        column.ColumnName = "TagID"
        column.ReadOnly = False
        column.Unique = False
 
        TagTable.Columns.Add(column)
 
        column = New DataColumn
        column.DataType = System.Type.GetType("System.Object")
        column.ColumnName = "Value"
        column.ReadOnly = False
        column.Unique = False
 
        TagTable.Columns.Add(column)
 
        column = New DataColumn
        column.DataType = System.Type.GetType("System.String")
        column.ColumnName = "Errors"
        column.ReadOnly = False
        column.Unique = False
 
        TagTable.Columns.Add(column)
 
        column = New DataColumn
        column.DataType = System.Type.GetType("System.Object")
        column.ColumnName = "TimeValue"
        column.ReadOnly = False
        column.Unique = False
 
        TagTable.Columns.Add(column)
 
        column = Nothing
    End Sub
 
    Private Sub CreateTagTableRow(ByVal TagID As String, _
                                    ByVal TagValue As Object, _
                                        ByVal TagError As Object)
        row = TagTable.NewRow()
        row("TagID") = TagID
        row("Value") = TagValue
        row("Errors") = ConnectedOPCServer.GetErrorString(TagError)
        row("TimeValue") = Now
        TagTable.Rows.Add(row)
        TagTable.AcceptChanges()
        row = Nothing
    End Sub
 
 
    Public Sub OPC_Connect(ByVal ServerName As String, ByVal ServerIP As String)
        ConnectedOPCServer = New OPCServer
        Try
            ConnectedOPCServer.Connect(ServerName, ServerIP)
            ConnectedGroup = ConnectedOPCServer.OPCGroups.Add("Group_1")
            ConnectedGroup.IsActive = True
            For i = 1 To 199
                ClientHandles(i) = i
            Next i
            CreateTagTableColumn()
        Catch ex As Exception
            ConnectedOPCServer = Nothing
            MessageBox.Show("OPC server connect failed : " + ex.Message, "OPCSample", MessageBoxButtons.OK)
        End Try
    End Sub
 
    Public Sub OPC_Disconnect()
        If Not (ConnectedOPCServer Is Nothing) Then
            Try
                ConnectedOPCServer.OPCGroups.RemoveAll()
                ConnectedOPCServer.Disconnect()
            Catch ex As Exception
                MessageBox.Show("OPC server disconnect failed: " + ex.Message, "OPCSample", MessageBoxButtons.OK)
            Finally
                ConnectedOPCServer = Nothing
                ConnectedGroup = Nothing
                TagTable = Nothing
            End Try
        End If
    End Sub
 
 
    Public Function OPC_AddItems(ByVal TagID() As String) As Boolean
        If Not (ConnectedOPCServer Is Nothing) Then
            Try
                TagTable.Clear()
                TagTable.AcceptChanges()
                counterOKAdd = 0
                ConnectedGroup.OPCItems.AddItems(TagID.Count - 1, TagID, ClientHandles, ServerHandles, Errors)
 
                'Этот цикл нагружает процессор
                '===========================================
                For i = 1 To TagID.Count - 1
                    If Errors(i) = 0 Then
                        counterOKAdd += 1
                        ServerHandles(counterOKAdd) = ConnectedGroup.OPCItems.Item(i).ServerHandle
                    Else
                        CreateTagTableRow(TagID(i), "ПЛОХО", Errors(i))
                    End If
                Next i
                '===========================================
 
            Catch ex As Exception
                MessageBox.Show("OPC server add failed: " + ex.Message, "OPCSample", MessageBoxButtons.OK)
                Return False
            End Try
        End If
 
        Return True
    End Function
 
    Public Function OPC_SyncRead() As Boolean
        If Not (ConnectedOPCServer Is Nothing) Then
            Try
                ConnectedGroup.SyncRead(OPCDataSource.OPCDevice, ConnectedGroup.OPCItems.Count, ServerHandles, Values, Errors)
 
                'Этот цикл нагружает процессор
                '===========================================
                For i = 1 To ConnectedGroup.OPCItems.Count
                    CreateTagTableRow(ConnectedGroup.OPCItems.Item(i).ItemID, Values(i), Errors(i))
                Next i
                '===========================================
 
                ConnectedGroup.OPCItems.Remove(ConnectedGroup.OPCItems.Count, ServerHandles, Errors)
            Catch ex As Exception
                MessageBox.Show("OPC server syncread failed: " + ex.Message, "OPCSample", MessageBoxButtons.OK)
                Return False
            End Try
        End If
        Return True
    End Function
End Module
Вложения
Тип файла: zip OPCSQLbyMurin.zip (860.3 Кб, 53 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2014, 02:13
Ответы с готовыми решениями:

При передаче данных по локальной сети на сервер в базу sql передается только часть данных
Всем доброго времени суток! У меня ситуация такая – есть своя программа на Delphi 2010 для перегонки данных из html-файлов в базу на sql...

Использование OPC-сервера от OPC Foundation (.NET)
Всем привет, возникла необходимость в разработке OPC DA 2.05a сервера под .NET, среди бесплатных вариантов ничего не нашел, писать...

Запись данных в OPC сервер
Доброго времени суток, форумчане. Передо мной стоит проблема: есть OPC сервер, работает стабильно, в нем завели 10 тегов, данные в которые...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2014, 02:13
Помогаю со студенческими работами здесь

Шифрование данных при передаче на сервер
Есть задача передать данные на сервер. Получать и отправлять данные будет экзешник, а принимать и обрабатывать PHP файл на хостинге. В...

Некорректное отображение кириллицы при передаче данных от сервера клиенту
Здравствуйте. ПИшу проект, в котором нужно передавать текст от сервера к клиенту и наоборот. возникла проблема... кодировка в...

При передаче post запроса через прокси сервер в ответ приходят ошибки с прокси сервера
При передаче post запроса через прокси сервер в ответ прилетают ошибки с прокси сервера: &lt;p&gt;&lt;b&gt;Invalid Request&lt;/b&gt;...

При первой передаче данных на сервер отправляются нулевые данные
Не могу никак реализовать конечный результат, когда нужно получить все данные после редактированного изображение. Сразу скажу что этот...

Построить быстрый эхо сервер при приёме и передаче различных по объёму данных от 10 байт до 100 кбайт
Как построить быстрый эхо сервер.при приёме и передаче различных по объёму данных от 10 байт до 100 кбайт.


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru