Приветствую.
Возможно, кто-то сталкивался с подобной проблемой.
Выдача во внешние системы из АСУТП на предприятии организована через OPC DA2.
К этому OPC-серверу без проблем цепляются сторонние клиенты, получают теги, значения.
А вот мои попытки достучаться до него своими скриптами терпят неудачу.
Попытка на Python# -*- coding: utf-8 -*-
import OpenOPC
opc = OpenOPC.client()
print opc.servers()
print "="*20
opc.connect("K89_Arm1")
print opc.list()
Вывод
[u'IOServer', u'Graybox.Simulator.1', u'Matrikon.OPC.Sniffer.1', u'InSAT.Multi-ProtocolMasterOPCServer.DA', u'opclogger.Instance.1', u'Matrikon.OPC.Simulation.1', u'dOPC.Simulation.Server', u'IEC_104_server.OPCServer', u'K125_Arm10', u'K67_Arm10', u'K89_Arm1', u'OSO_TC_Arm1']
====================
Traceback (most recent call last):
File "C:\Python27\sargon.py", line 7, in
Connect: Интерфейс не поддерживается
opc.connect("K89_Arm1")
File "C:\Python27\lib\site-packages\OpenOPC.py", line 231, in connect
raise OPCError, error_msg
OpenOPC.OPCError:
На сервере можно заметить клиента, который подцепился и сразу же отвалился. Этот же самый код на питоне цепляется к тестовым OPC-серверам.
Попытка на GO
К другим тестовым OPC серверам коннект успешен.
package main
import (
"fmt"
"github.com/konimarti/opc"
)
func main() {
client := opc.NewConnection(
"K89_Arm1", // ProgId
[]string{"127.0.0.1"}, // OPC servers nodes
// []string{"Переменные К2_Fсп_р"}, // slice of OPC tags
[]string{"Переменные А8_Tдг_заЗУУ_т.А-Б_р2"}, // slice of OPC tags
)
defer client.Close()
// read single tag: value, quality, timestamp
// fmt.Println(client.ReadItem("Random.Int4"))
// read all added tags
fmt.Println(client.Read())
Вывод
c:\Go\projects>projects
map[Переменные А8_Tдг_заЗУУ_т.А-Б_р2:]
Exception 0xc0000005 0x8 0x1f538af8 0x1f538af8
PC=0x1f538af8
syscall.Syscall(0x1f538af8, 0x1, 0x4270be8, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Go/src/runtime/syscall_windows.go:184 +0xea
github.com/go-ole/go-ole.release(0x4270be8, 0xc000000000)
C:/Users/bukhval/go/src/github.com/go-ole/go-ole/iunknown_windows.go:51 +0x5a
github.com/go-ole/go-ole.(*IUnknown).Release(...)
C:/Users/bukhval/go/src/github.com/go-ole/go-ole/iunknown.go:56
github.com/konimarti/opc.(*AutomationObject).Close(0xc000043260)
C:/Users/bukhval/go/src/github.com/konimarti/opc/connection_windows.go:112 +0x39
github.com/konimarti/opc.(*opcConnectionImpl).Close(0xc0000ce600)
C:/Users/bukhval/go/src/github.com/konimarti/opc/connection_windows.go:326 +0x97
main.main()
C:/Go/projects/hello.go:22 +0x18a
rax 0x1f538af8
rbx 0xb70030
rcx 0x4270be8
rdi 0x208000
rsi 0xc00007fe78
rbp 0xc00007fe28
rsp 0x103fe38
r8 0x0
r9 0x0
r10 0x0
r11 0xc00001e5d0
r12 0x1c7e05
r13 0x7ed620
r14 0x0
r15 0x0
rip 0x1f538af8
rflags 0x10293
cs 0x33
fs 0x53
gs 0x2b
Данная ситуация абсолютно идентичная на физической Win10 x64 и на виртуалке WinXP 32.
Как вариант я рассматривал промежуточный клиент-сервер, который бы тянул данные из АСУТП, а я уже забирал с него. Но ничего вменяемого и бесплатного не нашел.