Edit Connections... и кирилица в путях и названии OPC тегов

Обсуждение SCADA-систем ICONICS GENESIS32 и ICONICS GENESIS64.
Петр
Сообщений в теме: 3
Сообщения: 9
Зарегистрирован: 06 окт 2014, 08:01

Edit Connections... и кирилица в путях и названии OPC тегов

#1

Сообщение Петр » 06 окт 2014, 08:20

Столкнулся с такой проблемой... В рамках одного проекта необходимо подключиться по OPC к системе диспетчеризации в которой все папки, подпапки и теги набраны кириллицей. В принципе при подключении все работает, несмотря на это, значения тегов отображается, но при попытки выгрузить подключения тегов к объектам на графическом странице в файл CSV (кнопка "Export CVS...") через контекстное меню Edit Connections... GraphWorX32, получаю в файле пустые пути и теги. Аналогичное действие с путями и именами тегов латиницей проходит успешно.

Вносить изменения поэлементно нет никакого желания. Используется версия Genesis32 9.13. Может быть есть какой-либо хотфикс или сервиспак, который решает эту проблему? Может быть есть другой способ массово редактировать подключения к граф. объектам?



Аватара пользователя
alex
Администратор
Сообщений в теме: 2
Сообщения: 1745
Зарегистрирован: 05 апр 2010, 21:58
Откуда: Москва
Благодарил (а): 47 раз
Поблагодарили: 102 раза
Контактная информация:

Re: Edit Connections... и кирилица в путях и названии OPC тегов

#2

Сообщение alex » 06 окт 2014, 11:51

Вот
здесь
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
хот фиксы для Genesis32 9.13 одним архивом. Пароль на архив:
Скрытая информация. Чтобы ее увидеть зарегистрируйтесь или войдите под своим логином.
Может быть поможет.



Петр
Сообщений в теме: 3
Сообщения: 9
Зарегистрирован: 06 окт 2014, 08:01

Re: Edit Connections... и кирилица в путях и названии OPC тегов

#3

Сообщение Петр » 07 окт 2014, 07:26

Нет, не помогло, глюк сохраняется. Есть идея попробовать написать VBA-скрипт для выгрузки в CVS-файл привязки к тегам, может быть так получится.



Аватара пользователя
alex
Администратор
Сообщений в теме: 2
Сообщения: 1745
Зарегистрирован: 05 апр 2010, 21:58
Откуда: Москва
Благодарил (а): 47 раз
Поблагодарили: 102 раза
Контактная информация:

Re: Edit Connections... и кирилица в путях и названии OPC тегов

#4

Сообщение alex » 07 окт 2014, 09:34

Можно конечно попробовать, встраиваемый VBA-движок от Microsoft в Genesis32 должен по идее корректно работать с кириллицей.



Петр
Сообщений в теме: 3
Сообщения: 9
Зарегистрирован: 06 окт 2014, 08:01

Re: Edit Connections... и кирилица в путях и названии OPC тегов

#5

Сообщение Петр » 07 окт 2014, 19:40

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

Attribute VB_Name = "AppendOrReplaceHostInDataSource"

Const HOST_ATTRIBUTE = "\\"
Const HOST_DELIMITER = "\"
Const NOT_OPC_TAG_ATTRIBUTE = ":"

'
' Function Keys
'

' Script FunctionKeyScript0 (пример использования скрипта через GraphWorkX32->Tools->Function Keys...)

Sub FunctionKeyScript0()
    ReplaceOrAppendHostNameOrIPInDataSource "", False
End Sub

' Процедура заменяет или добавляет (bIsAppend = True) имя или IP адрес хоста в имени OPC-тега

Sub ReplaceOrAppendHostNameOrIPInDataSource(ByVal sNewHost As String, ByVal bIsAppend As Boolean)

    Dim oObject As Object
    Dim dDynObject As Object
    Dim dSubDynObject As Object
    Dim sDataSource As String
    Dim sNewDataSource As String
    Dim i As Long
    Dim j As Long
    Dim l As Long
    Dim l2 As Long
    Dim i2 As Long

    j = 0
   
    Set oObject = ThisDisplay.GetVisibleObjectFromIndex(j)

    While Not (oObject Is Nothing)
       
        l = oObject.GetNumberOfDynamics()
       
        If l > 0 Then
       
            l = l - 1
       
            For i = 0 To l
       
                Set dDynObject = oObject.GetDynamicObjectFromIndex(i)
               
                Select Case dDynObject.GetObjectTypeName
               
                    Case "GwxDigitalColor", "GwxDigitalSelector":
                       
                        l2 = dDynObject.GetNumberOfSubDynamics

                        If l2 > 0 Then
                       
                            l2 = l2 - 1
                       
                            For i2 = 0 To l2
                           
                                Set dSubDynObject = dDynObject.GetSubDynamicObjectFromIndex(i2)
                           
                                sDataSource = dSubDynObject.dataSource
                           
                                If sDataSource <> "" Then
                                    If IsInDataSourceStringOPCTag(sDataSource) Then
                                        If ReplaceOrAppendHostNameOrIPInDataSourceString(sDataSource, sNewHost, bIsAppend, sNewDataSource) Then
                                            dSubDynObject.dataSource = sNewDataSource
                                        End If
                                    End If
                                End If
                               
                                Set dSubDynObject = Nothing
                           
                            Next
                                               
                        End If
                                               
                    Case Else
                   
                        sDataSource = dDynObject.dataSource
                       
                        If sDataSource <> "" Then
                            If IsInDataSourceStringOPCTag(sDataSource) Then
                                If ReplaceOrAppendHostNameOrIPInDataSourceString(sDataSource, sNewHost, bIsAppend, sNewDataSource) Then
                                    dDynObject.dataSource = sNewDataSource
                                End If
                            End If
                        End If
               
                End Select
               
                Set dDynObject = Nothing
               
            Next
       
        End If
       
        Set oObject = Nothing
       
        j = j + 1
       
        Set oObject = ThisDisplay.GetVisibleObjectFromIndex(j)
       
    Wend
   
End Sub

' Функция детектирует что прописано в DataSource, OPC-тег или другое (например, выражение и т.д.)
' Если OPC-тег, возвращает True, иначе False.

Function IsInDataSourceStringOPCTag(ByVal sDataSourceString As String) As Boolean

    If InStr(sDataSourceString, NOT_OPC_TAG_ATTRIBUTE) = 0 Then
        IsInDataSourceStringOPCTag = True
    Else
        IsInDataSourceStringOPCTag = False
    End If
   
End Function

' Функция заменяет или добавляет (bIsAppend = True) имя хоста или его IP-адрес (sHost) в строке OPC-тега (sDataSourceString),
' сформированное значение возвращает в sNewDataSourceString. Если замена произошла функция возвращает True, иначе False.

Function ReplaceOrAppendHostNameOrIPInDataSourceString(ByVal sDataSourceString As String, ByVal sHost As String, _
                                   ByVal bIsAppend As Boolean, ByRef sNewDataSourceString As String) As Boolean

    Dim b As Long
    Dim e As Long
    Dim s As String
   
    ' Поиск признака наличия имени или IP адреса хоста
   b = InStr(sDataSourceString, HOST_ATTRIBUTE)
   
    Select Case (b)
   
    Case 0: ' В имени тега нет хоста, поэтому добавляем его если это необходимо
       
        If bIsAppend Then
            sNewDataSourceString = HOST_ATTRIBUTE & sHost & HOST_DELIMITER & sDataSourceString
        End If
       
        ReplaceOrAppendHostNameOrIPInDataSourceString = True
       
    Case 1: ' В имени тега есть хост, поэтому заменяем его
       
        e = InStr(Len(HOST_ATTRIBUTE) + 1, sDataSourceString, HOST_DELIMITER)
        s = Right(sDataSourceString, Len(sDataSourceString) - e)
        If sHost = "" Then
            sNewDataSourceString = s
        Else
            sNewDataSourceString = HOST_ATTRIBUTE & sHost & HOST_DELIMITER & s
        End If
       
        ReplaceOrAppendHostNameOrIPInDataSourceString = True
       
    Case Else
   
        ReplaceOrAppendHostNameOrIPInDataSourceString = False
   
    End Select
   
End Function

p.s. На скрипт никаких гарантий не даю, т.к. писался "на коленках", пользуйтесь на свой страх и риск :D, если найдете ошибки пишите.

update. Кое что дописал, т.к. столкнулся с тем, что с некоторыми объектами скрипт не работает.




Если эта тема может быть полезна другим, поделитесь ссылкой:

Вернуться в «ICONICS GENESIS»