Private Sub LoadTreeView()
Dim EnterpriseNode As Node
Dim i As Long
tvwEnterprise.nodes.Clear
tvwEnterprise.Sorted = False
Set EnterpriseNode = tvwEnterprise.nodes.Add(, , “Enterprise”, “Enterprise”)
LoadTreeViewNodes Enterprise.PIModules, EnterpriseNode, i
EnterpriseNode.Expanded = True
End Sub
Private Sub LoadTreeViewNodes(Modules As PIModules, ParentNode As Node, i As Long)
Dim Module As PIModule
Dim SubNode As Node
DimstrKeyAsString
‘ свойство “Key” узла должно быть уникальным. Поскольку модули могут одновременно присутствовать в нескольких разных местах,
‘ нельзя полагаться на уникальный идентификатор модуля. По этой причине мы добавим целое число к уникальному ID
For Each Module In Modules
i = i + 1
strKey = Module.UniqueID & “-“ & i
Set SubNode = tvwEnterprise.nodes.Add(ParentNode, tvwChild, strKey, Module.Name)
LoadTreeViewNodes Module.PIModules, SubNode, i ‘ рекурсивныйвызовметодовявляетсянаилучшимспособомобработкииерархий
NextModule
EndSub
Большую часть работы выполняет код, обрабатывающий выбор узла. Этот код должен найти модуль, связанный с данным узлом, и затем обновить экран, если это контроллер.
Значение node.text совпадает с именем модуля. Используемый метод заключается в том, чтобы пройти вверх по иерархии к родителям узла, создавая массив узлов, а затем пройти вниз по массиву, используя свойство node.text, чтобы получить элемент модуля. Другой способ, который можно было бы здесь применить, состоит в том, чтобы хранить каждый модуль в этом дереве. Однако, этот подход не очень хорошо масштабируется.
Вот код, который это выполняет:
Private Sub tvwEnterprise_NodeClick(ByVal Node As MSComctlLib.Node)
Dim Module As PIModule
Dim i As Long
Dim ParentNodes(20) As Node
i = 1
Set ParentNodes(i) = Node.Parent
On Error GoTo Done
WhileTrue
i = i + 1
‘ следующая строка приведет к ошибке после нахождения последнего родителя, после чего произойдет переход к метке “Done”
Set ParentNodes(i) = ParentNodes(i - 1).Parent
Wend
Done:
i = i - 3 ‘ спускаемсявнизот enterprise
Set Module = Enterprise
While i >= 1
‘ Используем массив узлов, чтобы пройти вниз по иерархии
Set Module = Module.PIModules.Item(ParentNodes(i).Text)
i = i - 1
Wend
Set Module = Module.PIModules.Item(Node.Text)
If Module.PIHeading.Name = “Controller” Then
Set Controller = Module
LoadMfgData
LoadInstallationData
LoadAliasesIntoDisplay
EndIf
EndSub
Разработанный в данном курсовом проекте модуль для контура управления “tic-104” позволяет быстро и безопасно устранить расхождение между технологическим параметром и ставкой, однако установление в контроллере необходимого баланса между скоростью выхода на задание и мягкостью работы требует определенного умения и опыта. Функции «самонастройки» по запросу повторяют операции, выполняемые квалифицированным инженером для настройки контура регулирования во время запуска системы. К тому же регуляторы с самонастройкой «на лету» могут продолжать обновлять константы настройки контуров уже после запуска системы в эксплуатацию.
Модуль “tic-104” разработан с помощью Visual Basic для контура управления температурой в резервуаре. В модуле учтены масштабируемость и иерархичность. Это означает, что для остальных контроллеров, участвующих в процессе, не нужно разрабатывать аналогичные модули, достаточно ввести их параметры в существующий модуль. Этот факт подчеркивает практическую ценность разработки.
Данный модуль используется в составе системы PI System. Эта система широко применяется в крупных мировых компаниях, таких как Лукойл, Газпром, Юкос, Сибур и многие другие. PI System разработан фирмой OSI Software GmbH (Германия), в России с 2000 года.
Наконец, говоря о финансовом вопросе, достаточно привести несколько цифр. Стоимость внедрения проекта PI в среднем составляет $ 100000 – 500 000. А экономия складывается из совокупности различных факторов. Допустим, если ранее состав нефти определялся только в лаборатории с помощью длительного анализа, то благодаря PI System удается оперативно, с помощью виртуального анализа показать поставщику реальное качество сырья. Было подсчитано, что за счет этого удалось сэкономить около $200000. Общая экономия от автоматизации отчетов составила $ 44 000 в год. Общая экономия на обслуживании насосов позволяет экономить в сумме $ 100000.
В целом экономисты компании посчитали, что однократная экономия составила $ 1 500 000, а регулярная экономия (задокументированная) составляет около $ 300 000 в год.