hrg-hgzy / OPC_DA

OPC DA client library which is forked from http://sourceforge.net/projects/opcclient/
GNU Lesser General Public License v2.1
0 stars 0 forks source link

远程读取class ID访问拒绝 #1

Closed Tibalt closed 3 years ago

Tibalt commented 3 years ago

问题描述 使用CLIENT功能块读取OPC DA server数据时出错,无法正常获取数据。

重现方法 1.首先确定使用opc expert连接远程服务器,读取数据成功,确认OPC da相关配置没有问题; 2.运行可执行文件forte; 3.使用4diac打开opc client项目; 4.配置ID:opc[192.168.103.211:Matrikon.OPC.Simulation:2000:0.0:Random.Int2:Random.Int1]; 5.使用IDE deploy并watch数据变化和报错信息;

预期结果 可以正常读取到ID中配置的Random.Int1的数据,这个数据是随机变化的。

环境 (请填写以下资料):

其他 debug时可以看到出错打印信息如下:

INFO:T#21925089358: Cwin32SocketInterface: Opening UDP receiving connection at: 225.0.0.1:61498
INFO:T#21925420158: CMin32SocketInterface: Opening UDP receiving connection at: 225.0.0.1:61497
Loaded 'c: \windows \SysWOW64imsv1_e.dll'.
Loaded 'C: lwindows\SysWOw64\bcrypt.dll'.
Loaded "c: \windows ilSysWOw64\NtlmShared.dll".Loaded 'c: \windows \SyswOw64\cryptdll.dll".
Loaded "C: lwindowslSysWOW64\clbcatq.dll'.
onecore(comNcombase ldcomrem(resolver .cxx(2279)/combase.d11!7A805EF: (caller:77AFDC)ReturmHr(1) tid(2a5c)84154 没有注册类
onecorelcom (combase ldcomremresolver.cxx(2483)(combase.d1!77A7FOFD: (caller:77A813E1)ReturmHr(2) tid(2a5c) 804154没有注册类
Exception thrown at x76E546D2 in forte.exe: Nicrosoft CH exception:OPCException at memory location 0xe2DFF450.
DEBUG: T#21955178958: copcComLayer: :closeConnection()
INFO: T#21977752958: Connection established by client
Tibalt commented 3 years ago

能确定同一款软件,在任何windows(win 10, window server 等)操作系统的注册表中的clsid都一样么?

Tibalt commented 3 years ago

regconnectregistry,regopenkeyex这两个函数后边有可能加w和a,具体参考 https://stackoverflow.com/questions/49073941/how-to-read-windows-registry-data-on-remote-machine-using-java

其实简单说,不要加a也不要加w,让api自己选择字符集。

Tibalt commented 3 years ago

能确定同一款软件,在任何windows(win 10, window server 等)操作系统的注册表中的clsid都一样么?

@rockysroll 可以在官方文档中了解一下注册表clsid是什么意思,然后推断一下是不是clsid不会变。如果我们推断不会变,要将clsid做成动态可配的。

Tibalt commented 3 years ago

能确定同一款软件,在任何windows(win 10, window server 等)操作系统的注册表中的clsid都一样么?

@rockysroll 可以在官方文档中了解一下注册表clsid是什么意思,然后推断一下是不是clsid不会变。如果我们推断不会变,要将clsid做成动态可配的。

clsid动态可配不需要在1.01中做。

Tibalt commented 3 years ago

我没有找到一个明确的说法,说progid对应的clsid唯一,不过基本上,这是个伪命题。比如,以下链接,就讲了如何修改progid

另外,progid的定义,简单一句话The format of a ProgID is <Program>.<Component>.<Version>

最后,一个帖子说明了如何拿到opc server的clsid。我感觉其中比较靠谱的方式是通过opc enum,也就是说当opc server 和local machine都有opc enum的时候,这种方式是可以的。我感觉opc expert就是这种方式。可以试一下。

rockysroll commented 3 years ago

添加逻辑读取本地配置文件获取classid,fix in http://192.168.103.237/iiot/opc-client.git 2ae69823