Como percorrer todos os drivers de um Domínio pelo E3 Studio e exportar em CSV o endereço de rede configurado em cada um, sem alterar o projeto.
1. Introdução
Em aplicações com muitos drivers de comunicação, descobrir para onde cada um aponta significa abrir a configuração de driver em driver e anotar o endereço. Em uma auditoria de rede, uma migração de faixa de IP ou a documentação de uma planta herdada, isso consome horas.
O E3 Studio permite automatizar esse levantamento por script, gerando um CSV com uma linha por driver. O procedimento é somente de leitura: não cria Tags, não ativa a comunicação e não altera o projeto.
2. O que o script faz
O script executa quatro passos:
- Enumera o Domínio.
Application.ListFiles()retorna uma coleção com todos os objetos do Domínio. Esse método pertence ao objetoE3StudioApplicatione não está disponível em tempo de execução — o levantamento é feito em tempo de configuração. - Identifica os drivers por sondagem. Em vez de filtrar pelo nome da classe, o laço tenta ler
ExtraConfig,EndPointURLeServerMachineem cada objeto sobOn Error Resume Next. Telas, Viewers e Servidores de Dados não têm essas propriedades, geram erro 438 e são descartados. OOn Error Resume Nexté obrigatório: sem ele, o script para no primeiro objeto que não é driver. - Extrai IP e porta. No
IODriver, percorre o vetor deExtraConfigprocurando qualquer chave terminada emMainIPouMainPort— assim funciona mesmo quando o protocolo usa outro prefixo. NoUaDriver, quebra aEndPointURLem host e porta. NoOPCDriver, lê oServerMachinedireto. - Grava o CSV. Uma linha por driver, com ponto e vírgula como separador, em
C:\Temp\Drivers_IP_Porta.csv.
Atenção. No
IODrivero endereço não é uma propriedade nomeada: protocolo, meio físico, IP e porta ficam na janela Configuração…, aberta com o botão direito sobre o driver. O acesso por script é a propriedadeExtraConfig, do tipo variant e escondida — ela não aparece no AppBrowser nem na Lista de Propriedades do E3 Studio.
' Relatorio Driver;IP;Porta de todos os drivers do Dominio - Elipse E3
' Cole no CustomConfig de um XControl e execute com botao-direito -> "Configuracao...".
' Design-time, somente leitura: nao cria Tag, nao ativa driver, nao altera o projeto.
Const ARQ = "C:\Temp\Drivers_IP_Porta.csv"
Dim fso, f, col, obj, drv, cfg, j, sNome, sIP, sPorta, sChave, sRest, p, n
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(fso.GetParentFolderName(ARQ)) Then fso.CreateFolder fso.GetParentFolderName(ARQ)
Set f = fso.CreateTextFile(ARQ, True)
f.WriteLine "Driver;IP;Porta"
n = 0
' OERN obrigatorio: Telas/Viewers/DataServers nao tem as propriedades sondadas
' abaixo e dariam erro 438 (800A01B6). Aqui eles sao apenas ignorados.
On Error Resume Next
Set col = Application.ListFiles() ' todos os objetos do Dominio (so existe no Studio)
If Err.Number <> 0 Then MsgBox "ListFiles falhou: " & Err.Description : f.Close : Exit Sub
For Each obj In col
sIP = "" : sPorta = "" : Err.Clear
sNome = obj.PathName
If Err.Number <> 0 Then Err.Clear : sNome = obj.Name
Err.Clear
' IODriver: o IP nao e propriedade nomeada, mora na propriedade oculta
' ExtraConfig - array VARIANT de pares chave/valor da janela "Configuracao...".
cfg = obj.ExtraConfig
If Err.Number <> 0 Then ' fallback: re-obtem o objeto real pelo caminho
Err.Clear
Set drv = Application.GetObject(sNome)
If Err.Number = 0 Then cfg = drv.ExtraConfig
End If
If Err.Number = 0 And IsArray(cfg) Then
For j = 0 To UBound(cfg) - 1
sChave = CStr(cfg(j))
If Err.Number <> 0 Then Err.Clear : sChave = ""
If sIP = "" And Right(sChave, 6) = "MainIP" Then sIP = CStr(cfg(j + 1))
If sPorta = "" And Right(sChave, 8) = "MainPort" Then sPorta = CStr(cfg(j + 1))
If Err.Number <> 0 Then Err.Clear
Next
End If
Err.Clear
' UaDriver: quebra a EndPointURL (opc.tcp://host:porta/caminho) em host + porta
sRest = obj.EndPointURL
If Err.Number = 0 Then
p = InStr(sRest, "://") : If p > 0 Then sRest = Mid(sRest, p + 3)
p = InStr(sRest, "/") : If p > 0 Then sRest = Left(sRest, p - 1)
p = InStrRev(sRest, ":")
If p > 0 Then
sIP = Left(sRest, p - 1) : sPorta = Mid(sRest, p + 1)
Else
sIP = sRest
End If
End If
Err.Clear
' OPCDriver: DCOM nao usa porta fixa, so o nome/IP da maquina
sRest = obj.ServerMachine
If Err.Number = 0 Then sIP = sRest
Err.Clear
If sIP <> "" Or sPorta <> "" Then
f.WriteLine sNome & ";" & sIP & ";" & sPorta
n = n + 1
End If
Next
f.Close
MsgBox "Gerado: " & ARQ & vbCrLf & "Drivers no relatorio: " & n
3. Como executar e resultado
O script roda no contexto de configuração, hospedado no evento CustomConfig de um ElipseX:
- No E3 Studio, crie (ou abra) um XControl no projeto.
- Cole o código no evento
CustomConfig. O corpo doCustomConfigé escrito sem declararSubouFunction. - Salve o projeto.
- Na árvore do Studio, clique com o botão direito sobre o XControl e escolha Configuração….
Ao final, uma caixa de mensagem informa o caminho do CSV e quantos drivers entraram no relatório. O arquivo abre direto no Excel em configuração regional pt-BR:
Driver;IP;Porta Comunicacao.DrvModbus;192.168.0.10;502 Comunicacao.DrvCLP2;192.168.0.11;502 Comunicacao.DrvOpcUa;servidor-ua;4840 Comunicacao.DrvOpcDa;\\ESTACAO01;
A coluna Porta fica vazia nos drivers OPC DA: a comunicação é feita por DCOM, que não usa uma porta fixa configurada no objeto.
Drivers seriais não entram no relatório. A condição final do laço só grava a linha quando há IP ou porta, e um driver configurado para meio físico serial não tem
MainIP. Para listá-los mesmo assim, remova a condição e deixe as colunas em branco.
