OPC-DA-ALL-List-OPC-(四)-OPC Client Java调用之Utgard

Utgard是什么

官方网站http://openscada.org/projects/utgard/

utgard是一个开源的项目,基于j-interop做的,用于和OPC SERVER通讯。

j-interop是纯java封装的用于COM/DCOM通讯的开源项目,这样就不必使用JNI

Utgard使用

  • 依赖的jar包
j-interop.jar 与COM和DCOM通讯的开源项目
j-interopdeps.jar
jcifs-1.2.19.jar
org.openscada.opc.dcom-1.1.0-20141118.151415-27.jar Utgard dcom的jar包
org.openscada.opc.lib-1.1.0-20141118.151453-1.jar Utgard opc的jar包
slf4j-api-1.7.6.jar Log4j依赖的jar包
log4j-1.2.16.jar Log4j的jar包

Utgard与opc通讯分为两种方式

  • Utgard OPC的API
  • Utgard DCOM的API

示例代码参见

OPC_Client_Utgard项目

关键API示例

  • 列举某Server下的所有OPC连接
1
2
3
4
5
6
7
8
9
10
11
ServerList serverList = new ServerList("10.1.5.123", "freud",
"password", "");

Collection<ClassDetails> classDetails = serverList
.listServersWithDetails(new Category[] {
Categories.OPCDAServer10, Categories.OPCDAServer20,
Categories.OPCDAServer30 }, new Category[] {});

for (ClassDetails cds : classDetails) {
System.out.println(cds.getProgId() + "=" + cds.getDescription());
}
  • 列举连接下的所有Group和Item
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public static void main(String[] args) throws Exception {
ConnectionInformation ci = new ConnectionInformation();
ci.setHost("10.1.5.123");
ci.setDomain("");
ci.setUser("freud");
ci.setPassword("password");
ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305");

Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());

server.connect();

dumpTree(server.getTreeBrowser().browse(), 0);
dumpFlat(server.getFlatBrowser());

server.disconnect();
}

private static void dumpFlat(final FlatBrowser browser)
throws IllegalArgumentException, UnknownHostException, JIException {
for (String name : browser.browse()) {
System.out.println(name);
}
}

private static void dumpTree(final Branch branch, final int level) {

for (final Leaf leaf : branch.getLeaves()) {
dumpLeaf(leaf, level);
}
for (final Branch subBranch : branch.getBranches()) {
dumpBranch(subBranch, level);
dumpTree(subBranch, level + 1);
}
}

private static String printTab(int level) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < level; i++) {
sb.append("\t");
}
return sb.toString();
}

private static void dumpLeaf(final Leaf leaf, final int level) {
System.out.println(printTab(level) + "Leaf: " + leaf.getName() + ":"
+ leaf.getItemId());
}

private static void dumpBranch(final Branch branch, final int level) {
System.out.println(printTab(level) + "Branch: " + branch.getName());
}
  • Item的同步查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static void main(String[] args) throws Exception {

ConnectionInformation ci = new ConnectionInformation();
ci.setHost("10.1.5.123");
ci.setDomain("");
ci.setUser("freud");
ci.setPassword("password");
ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305");

Server server = new Server(ci,
Executors.newSingleThreadScheduledExecutor());

server.connect();

Group group = server.addGroup();
Item item = group.addItem("Random.Real5");

Map<String, Item> items = group.addItems("Random.Real1",
"Random.Real2", "Random.Real3", "Random.Real4");

dumpItem(item);

for (Entry<String, Item> temp : items.entrySet()) {
dumpItem(temp.getValue());
}

server.dispose();
}

private static void dumpItem(Item item) throws JIException {
System.out.println("[" + (++count) + "],ItemName:[" + item.getId()
+ "],value:" + item.read(false).getValue());
}

private static int count;
  • Item的异步查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private static final int PERIOD = 100;

private static final int SLEEP = 2000;

public static void main(String[] args) throws Exception {

ConnectionInformation ci = new ConnectionInformation();
ci.setHost("10.1.5.123");
ci.setDomain("");
ci.setUser("freud");
ci.setPassword("password");
ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305");

Server server = new Server(ci,
Executors.newSingleThreadScheduledExecutor());

server.connect();

AccessBase access = new SyncAccess(server, PERIOD);

access.addItem("Random.Real5", new DataCallback() {
private int i;

public void changed(Item item, ItemState itemstate) {
System.out.println("[" + (++i) + "],ItemName:[" + item.getId()
+ "],value:" + itemstate.getValue());
}
});

access.bind();
Thread.sleep(SLEEP);
access.unbind();
server.dispose();
}
  • Item的发布订阅查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private static final int PERIOD = 100;

private static final int SLEEP = 2000;

public static void main(String[] args) throws Exception {

ConnectionInformation ci = new ConnectionInformation();
ci.setHost("10.1.5.123");
ci.setDomain("");
ci.setUser("freud");
ci.setPassword("password");
ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305");

Server server = new Server(ci,
Executors.newSingleThreadScheduledExecutor());

server.connect();

AccessBase access = new Async20Access(server, PERIOD, false);

access.addItem("Random.Real5", new DataCallback() {

private int count;

public void changed(Item item, ItemState itemstate) {
System.out.println("[" + (++count) + "],ItemName:["
+ item.getId() + "],value:" + itemstate.getValue());
}
});

access.bind();
Thread.sleep(SLEEP);
access.unbind();
server.dispose();
}
  • 自动重连Item异步读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private static final int PERIOD = 100;

private static final int SLEEP = 2000;

public static void main(String[] args) throws Exception {

ConnectionInformation ci = new ConnectionInformation();
ci.setHost("10.1.5.123");
ci.setDomain("");
ci.setUser("freud");
ci.setPassword("password");
ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305");

Server server = new Server(ci,
Executors.newSingleThreadScheduledExecutor());

AutoReconnectController controller = new AutoReconnectController(server);

controller.connect();

AccessBase access = new SyncAccess(server, PERIOD);

access.addItem("Random.Real5", new DataCallback() {
private int i;

public void changed(Item item, ItemState itemstate) {
System.out.println("[" + (++i) + "],ItemName:[" + item.getId()
+ "],value:" + itemstate.getValue());
}
});

access.bind();
Thread.sleep(SLEEP);
access.unbind();
controller.disconnect();
}
  • Item同步写入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static void main(String[] args) throws Exception {

ConnectionInformation ci = new ConnectionInformation();
ci.setHost("10.1.5.123");
ci.setDomain("");
ci.setUser("freud");
ci.setPassword("password");
ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305");

Server server = new Server(ci,
Executors.newSingleThreadScheduledExecutor());

server.connect();

Group group = server.addGroup();
Item item = group.addItem("Square Waves.Real4");

final Float[] integerData = new Float[] { 1202f, 1203f, 1204f };
final JIArray array = new JIArray(integerData, false);
final JIVariant value = new JIVariant(array);

item.write(value);
Thread.sleep(2000);

dumpItem(item);

server.dispose();

}

private static void dumpItem(Item item) throws JIException {
System.out.println("[" + (++count) + "],ItemName:[" + item.getId()
+ "],value:" + item.read(true).getValue());
}

private static int count;
  • Item异步写入

OPC-DA-ALL-List-OPC-(三)-OPC主要功能

同步访问

OPC服务器把按照OPC应用程序的要求得到的数据访问结果作为方法的参数返回给OPC应用程序,OPC应用程序在结果被返回为止一直必须处于等待状态。

Synch Read

异步访问

OPC服务器接到OPC应用程序的要求后,几乎立即将方法返回。OPC应用程序随后可以进行其他处理。当OPC服务器完成数据访问时,触发OPC应用程序的异步访问完成事件,将数据访问结果传送给OPC应用程序。OPC应用程序在VB的事件处理程序中接受从OPC服务器传送来的数据。

Asynch Read

订阅方式数据采集

并不需要OPC应用程序向OPC服务器要求,就可以自动接到从OPC服务器送来的变化通知的订阅方式数据采集(Subscription)。服务器按一定的更新周期(UpdateRate)更新OPC服务器的数据缓冲器的数值时,如果发现数值有变化时,就会以数据变化事件(DataChange)通知OPC应用程序。如果OPC服务器支持不敏感带(DeadBand),而且OPC标签的数据类型是模拟量的情况,只有现在值与前次值的差的绝对值超过一定限度时,才更新缓冲器数据并通知OPC应用程序。由此可以无视模拟值的微小变化,从而减轻OPC服务器和OPC应用程序的负荷。

Publish and subscribe

上述的OPC功能可以总结为如下表:

Feature sumary

三种方式的性能总结:

Performance sumary

OPC-DA-ALL-List-OPC-(二)-什么是OPC

OPC

OPC(OLE for Process Control, 用于过程控制的OLE)是一个工业标准,管理这个标准国际组织是OPC基金会.

为什么需要OPC

OPC是为了不同供应厂商的设备和应用程序之间的软件接口标准化,使其间的数据交换更加简单化的目的而提出的。作为结果,从而可以向用户提供不依靠于特定开发语言和开发环境的可以自由组合使用的过程控制软件组件产品。

利用驱动器的系统连接:

Driver connection

利用OPC的控制系统构成:

OPC connection

Opc的分层结构

OPC Structure

OPC对象中的最上层的对象是OPC服务器。一个OPC服务器里可以设置一个以上的OPC组。OPC服务器经常对应于某种特定的控制设备。例如,某种DCS控制系统,或者某种PLC控制装置。

OPC组是可以进行某种目的数据访问的多个的OPC标签的集合,例如某监视画面里所有需要更新的位号变量。正因为有了OPC组,OPC应用程序就可以以同时需要的数据为一批的进行数据访问,也可以以OPC组为单位启动或停止数据访问。此外OPC组还提供组内任何OPC标签的数值变化时向OPC应用程序通知的数据变化事件

OPC-DA-ALL-List-OPC-(一)-安装Matrikon OPC Simulation Server

安装OPC Server模拟器

可以在此处下载
或者去官网下载

双击下载下来的MatrikonOPCSimulation.EXE安装文件

Collecting Information

接受并Next

Complete Setup

选择Complete Setup并Next

Select the install path

安装路径为c:\Program Files\Matrikon\OPC然后Next

Create quick start icon

默认,Next

Confirm password

默认密码是MatrikonOPC然后选择Next

Ready to start

然后选择Next进行安装

最后安装完成会出现如下图示

Install finished

选择第一个和第二个Checked,其他选项Uncheck 第一个的意思是打开MatrikonOPC Configuration Panel 第二个的意思是打开Quick
Start文档(有兴趣可以看一下,英文的)

本次安装包含三部分

  • Analyzer分析器
  • Explorer浏览器
  • Simulation模拟器

OPC-DA-ALL-List-转载

OPC

框架对比

img

*

1.PLC
和OPC
*

使用的PLC:西门子的S7-300,具体型号如下图

img

使用的OPC server软件:

项目使用KEPServer V6
(427M,中文):百度网盘 ,密码: ykj2

KEPServer的123网盘分享:https://www.123pan.com/s/Lwn8Vv-4qnx
提取码:pTA9

模拟仿真用的 MatrikonOPC
Simulation(50M),百度网盘,密码: mcur

2.连接测试

什么是OPC

OPC是工业控制和生产自动化领域中使用的硬件和软件的接口标准,以便有效地在应用和过程控制设备之间读写数据。O代表OLE(
对象链接和嵌入),P (process过程),C (control控制)。
OPC服务器包括3类对象(Object):服务器对象(Server)、项对象(Item)和组对象(Group)。
OPC标准采用
C/S模式
,OPC服务器负责向OPC客户端不断的提供数据。

img

来源:OPC-(二)-什么是OPC

img

OPC server软件使用

MatrikonOPC: 使用Matrikon OPC Server Simulation

Server和Client

要实现的是Client(Java)和Client(PLC)之间的通信
中间借助OPCServer,Server上设定好地址变量,不同的Client读写这些变量值实现通信。
示意图如下

img

配置Server和Client

OPC和DCOM配置:通信不成功都是配置的问题。。。
配置OPCserver
一般一个电脑(win10)同时安装Server(比如KEPServer)和Client(Java编写的),就配置这个电脑就行
如果是在两个电脑上,那就都需要配置。

3.通信实现

img

Utgard

源码:https://github.com/ctron/org.openscada.utgard

Github上的

最全面的测试(Utgard和JeasyOPC测试):OPC_Client

博客参考

Github上的:资料下载

4.实现过程

1.补充学习了一下OPC的概念:

2.使用MatrikonOPC,了解OPCserver是怎么用的

3.关于OPC UA

  • 支持的OPC UA的西门子PLC至少是s7-1500(2021年10月27日 14:58:00 现在不能确定,看到一个回答,s7-300如果有网口就能和OPCUA通信)
  • 我的s7-300是没法用的,所以就不需要搜集OPC UA的资料了
  • 更正(2021年9月16日11:13:32):最近看OPC UA的资料,发现使用UA是可以的。

4.关于用Java实现

  • C#和C++都不用配置DCOM,直接调用函数
  • 既然是非要用Java,那就别想太方便,需要配置DCOM。

5.关于Utgard

utgard是一个开源的项目,基于j-interop
做的,用于和OPC SERVER通讯。

  • j-interop是纯java封装的用于COM/DCOM通讯的开源项目,这样就不必使用JNI

6.关于JeasyOPC

  • JeasyOPC源码下载
  • 借助一个dll库来实现的和OPCServer的通信,但是JCustomOpc.dll,,太老了,而且支持只32位系统

7.最终实现

  • 当然选Utgard
  • 过程就是把需要的jar包找到,

然后复制编程指导
里的读写代码,读就是启动线程一直对相应地址变量读取数值,写就是对相应地址变量写入数值

8.测试

  • 参考OPC_Client里的例子
  • 关于配置文件的代码直接复制用了
  • 例子实际也用不到,试了试,,因为实际只需要对地址变量读写数值就可以了

9.关于订阅方式数据采集

参考:https://www.hifreud.com/2014/12/27/opc-3-main-feature-in-opc/#订阅方式数据采集

并不需要OPC应用程序向OPC服务器要求,就可以自动接到从OPC服务器送来的变化通知的订阅方式数据采集(Subscription)。服务器按一定的更新周期(UpdateRate)更新OPC服务器的数据缓冲器的数值时,如果发现数值有变化时,就会以数据变化事件(DataChange)通知OPC应用程序。

因为没有使用这种订阅方式,所以当时没试过,后来尝试使用Async20Access,会报错。参考上面文章,说是:还必须设置身份标识,,我没试成功。

img

10.问题:

  • 在虚拟机里用localhost一直报错,要写固定IP才行
  • 配置里的IP是安装OPCServer软件的电脑的IP,如果使用无线连接,请查看无线的IP地址
  • 能不能循环对一个组(group)监控?好像不可以,官方Demo里有两种数据读取方式:1.循环监控item;2.item添加到group,只读取一次
  • 如果Java写的client和安装OPCServer软件是两台电脑:那两个电脑都要配置相同DCOM,包括账号密码都要一样

win10家庭版是否可以?可以,有些麻烦,主要是用户管理部分配置,有人已经验证过可以,我就不试了。建议虚拟机装win10专业版,参考

  • 关于组态王,作为OPCSerever,我怎么尝试都没连接上,,有人能连上,我就不试了。
  • 关于异步:我使用的同步读取数据,,异步读取没试过,别问我异步的问题。
  • group是客户端维护还是服务端维护:服务端可以建自己的分组,但是客户端看到的还是一个个单独的item,group是客户端自己的分组。我是这样理解的。

客户端能不能读到服务端的所有item列表:当然可以,请参考

关于KEPServer的注册表ID

img

11.maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!--utgard -->
<dependency>
<groupId>org.openscada.external</groupId>
<artifactId>org.openscada.external.jcifs</artifactId>
<version>1.2.25</version>
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.openscada.jinterop</groupId>
<artifactId>org.openscada.jinterop.core</artifactId>
<version>2.1.8</version>
</dependency>
<dependency>
<groupId>org.openscada.jinterop</groupId>
<artifactId>org.openscada.jinterop.deps</artifactId>
<version>1.5.0</version>
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.openscada.utgard</groupId>
<artifactId>org.openscada.opc.dcom</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>org.openscada.utgard</groupId>
<artifactId>org.openscada.opc.lib</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.61</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>

Windows2016配置OPC DA DCOM通信-转载

https://www.claves.cn/archives/5838

一、进入DCOM配置程序

1.1 运行 dcomcnfg 进入 DCOM 配置程序

img

1.2 “组件服务” >“计算机” >“我的电脑” >“DCOM 配置”进入 CCOM 配置程序

img

二、服务端配置

2.1 服务端DCOM配置

步骤1:右击“我的电脑”进行属性设置

img

1)、设置“我的电脑”默认属性

img

2)、设置“我的电脑” COM 安全机制之访问权限 -“编辑限制”

img

img

img

img

步骤 4:选择用户:

1
2
3
4
5
6
7
8
9
Administrator 
Administrators
ANONYMOUS LOGON
Distributed COM Users
Everyone
Guests
INTERACTINE
NETWORK
SYSTEM

步骤 5:设置以上 9 个用户访问权限为:

img

本地访问:允许
远程访问:允许
3)、设置“我的电脑” COM 安全机制之访问权限 -“编辑默认值”

img

同 设置“我的电脑” COM 安全机制之访问权限 -“编辑限制”步骤 1 到步骤 5
4)、设置“我的电脑” COM 安全机制之启动和激活权限 -“编辑限制”

img

增加用户:

1
2
3
4
5
6
7
8
9
Administrator 
Administrators
ANONYMOUS LOGON
Distributed COM Users
Everyone
Guests
INTERACTINE
NETWORK
SYSTEM

配置每个用户权限为:

img

5)、设置“我的电脑” COM 安全机制之启动和激活权限 -“编辑限制”

img

增加用户:

1
2
3
4
5
6
7
8
9
Administrator 
Administrators
ANONYMOUS LOGON
Distributed COM Users
Everyone
Guests
INTERACTINE
NETWORK
SYSTEM

配置每个用户权限为:

img

2、配置 OpcEnum
1)、选择“ DCOM 配置”

img

2)、选择“ OpcEnum”

img

注:若此处未找到 OpcEnum 插件,需安装一个 OPC Core Components Redistributable (x64) ,
可以自行百度查找安装,并注意需安装对应操作系统的安装包。

img

3)、右击配置 OpcEnum 属性之常规为无

img

4)、配置 OpcEnum 属性之“安全”

img

5)、对“配置权限”之“自定义”进行“编辑”
增加用户:

1
2
3
4
5
6
7
8
9
Administrator 
Administrators
ANONYMOUS LOGON
Distributed COM Users
Everyone
Guests
INTERACTINE
NETWORK
SYSTEM

配置每个用户名权限为:

img

6)、配置 OpcEnum 属性之“标识”

img

注:若此处交互式运用为灰色不能选择,按以下步骤进行操作。

①、在 C 盘中找 OpcEnum.exe 的安装位置
②、把安装位置拉到运行中: OpcEnum.exe 安装位置+空格+ //regserver 回车确定

img

3、配置 opc server

1)、选择 OPC Server 组件服务名称,本例 OPC Server 为 KEP Server

img

2)、配置 KEP Server 属性之“常规”为“无”

img

3)、配置 KEP Server 属性之“安全”

img

4)、对“配置权限”之“自定义”进行“编辑”

增加用户:

1
2
3
4
5
6
7
8
9
Administrator 
Administrators
ANONYMOUS LOGON
Distributed COM Users
Everyone
Guests
INTERACTINE
NETWORK
SYSTEM

配置每个用户名权限为:

img

二 服务端安全策略配置

1、进入安全策略程序
控制面板 >管理工具 >本地安全策略

img

2、配置安全策略之安全

img

网络访问:本地账户的共享和安全模式设置为“经典”

img

3、配置安全策略之匿名用户

img

网络访问:将 Everyong 权限应用于匿名用户设置为“已启用

img

三 服务端防火墙配置

1、进行防火墙“例外” (允许程序通过 Windows 防火墙通讯)

控制面板 >所有控制面板项 >Windows 防火墙 >允许的程序

img

2、添加 DCOM 端口

控制面板 >所有控制面板项 >Windows 防火墙 >高级设置

img

img

img

img

img

img

img

出站规则同入站规则设置

3、添加例外程序 OpcEnum

OpcEnum 路径程序在 C:\Windows\System32\OpcEnum.exe

img

4、添加例外程序 OPC Serve(本例为 KEP SERVE)

KEP SERVE 的路径程序在 C:\Program Files (x86)\KEPServerEx\servermain.exe

img

5、添加 MMC 控制台程序

img

6、打开文件和共享

img

最后确保下列所有项都在防火墙例外程序中

img

img

img

第三节 客户端配置

一 客户端 DCOM 配置

1、配置“我的电脑”
所有配置与服务端配置“我的电脑”相同

一 客户端防火墙配置

1、添加 DCOM 端口
所有配置与服务端配置“我的电脑”相同

Siemens wincc opc da 数据断流问题探索-转载

https://www.claves.cn/archives/6181

一、问题

项目场景

某行业DCS控制系统通过西门子WinCC系统实现,为了实现智能集控功能,需要从WinCC OA采集产线数据。

技术问题

频繁出现OPC DA Client采集连接断开问题,导致工业互联网平台数据断流,检查DCOM等配置后无果,无法直接排除原因。

分析过程

客户端 190.182.183.15 Administrator/Apef123456
服务端 190.182.57.71/72 Administrator/Apef123456!

1、客户端与服务端登录的用户名与密码不一致,新增了一个用户OpcUser/Apef123456

2、客户端可以ping通服务端IP、服务端不能ping通客户端IP

——————–服务端与客户端测试——————————————

3、190.182.183.15服务器仅远程服务端(190.182.57.71)时,190.182.183.15服务器上的客户端才能正常访问服务端(190.182.57.71)
的OPC服务
4、190.182.183.15服务器仅远程服务端(190.182.57.72)时,190.182.183.15服务器上的客户端才能正常访问服务端(190.182.57.72)
的OPC服务

——————–服务端与服务端测试——————————————

5、190.182.183.15服务器远程服务端(190.182.57.71/72)
时,两服务端的客户端都能正常访问各自的OPC服务,一旦190.182.183.15服务器断开其中一个远程,未断开远程的客户端不能访问已断开远程的OPC服务

初步分析结果

比较明显断流与远程桌面存在关系。

问题深入探究

咨询西门子业内专家后,转发提供URL资料。

1
https://support.industry.siemens.com/cs/mdm/109792613?c=133562653835&dl=zh&t=1&s=RDP&lc=en-DE

下面是上述URL链接的内容。

远程访问和远程桌面协议 (RDP)

远程访问 WinCC 站

有关远程访问的最新操作说明,请参见以下常见问题解答:

有关远程组态的详细信息,另请参见 WinCC 信息系统的“组态 > 多用户系统 > 远程组态”部分。

允许方案

以下方案已经过测试:

  • WinCC 作为单用户系统
  • WinCC 作为分布式系统
  • WinCC 在冗余模式下
  • WinCC/WebUX 服务器

也可以在允许方案中通过 OPC 进行通信。

使用 RealVNC

有关“RealVNC”使用方面信息,请访问 Internet 上的客户支持页面:

RealVNC 不支持键盘锁

请注意“RealVNC”不支持键盘锁。仅在使用远程桌面协议连接时,键盘锁才有效。

通过 RDP 对 WinCC 系统进行远程维护

仅当 WinCC 服务器或单用户系统运行在 WinCC ServiceMode 模式时,才允许使用远程桌面协议 (RDP)。

使用 RDP 时的限制

遵循下列限制:

  • 以本地“SIMATIC HMI”用户组成员的用户身份启动 WinCC
    项目。这意味着通过远程控制台操作时,可启动所有服务。详细信息请参见“组态 > WinCC ServiceMode”
  • 尚未允许在 SIMATIC 管理器中用于集成操作。
注意中断远程桌面连接后数据丢失当远程桌面连接中断(例如,由于从运行远程桌面客户端的计算机上拆下网络电缆)时,归档和 OPC 服务器等将不再从数据管理器接收值。该状态将维持到连接恢复或大约 35 秒的超时时间到时。

启动远程桌面

可利用“远程桌面”客户端通过控制台会话来访问 WinCC 系统。

只有同一用户通过控制台接管或初次登录,才可实现通过“远程桌面协议”访问。

用户组和访问权限

所有“远程桌面”用户都必须是目标 PC 上“SIMATIC HMI”用户组的成员。

操作步骤

  1. 要启动控制台会话,打开“运行”(Run) 对话框,例如使用 <Windows 按钮 + R>。

  2. 输入以下命令:

    • - mstsc /v: /admin

    输入计算机名称或 IP 地址作为服务器。

有关附加参数的详细信息,输入以下命令:

  • - mstsc /?

移植:仅通过 UNC 路径远程移植 WinCC 项目

仅使用 UNC 路径远程移植 WinCC 项目。

发布该项目的项目路径或文件夹。

在 WinCC 项目移植器中,将此 UNC 路径作为项目目录。

二、解决方法

解决方法:

  • WinCC 服务器配置成WinCC ServiceMode 模式;
  • 关闭RDP远程桌面服务;

OPC的DCOM配置-转载

源网址:https://www.cnblogs.com/tqianly/p/3749357.html

OPC的DCOM配置

关于OPC通讯做的比较多了。但是OPC的DCOM配置一直没认真去查资料,专心去整。这可能是因为我在测试程序的时候都是把服务器跟客户端在同一台电脑上运行,这样就不要配置DCOM。现在来记录一下下个人在网上查找的资料吧。

http://blog.csdn.net/jinzhili/article/details/970233

http://www.cnblogs.com/johnpher/archive/2012/10/27/2742207.html

我首先是根据第一个博客提供的方法配置了一下,然后用OPC客户端连接的时候,没有成功。提示

“ 对 COM 组件的调用返回了错误 HRESULT E_FAIL。 ”

然后我又按照第二个博客的办法配置了一下,OPC客户端就可以连的上远程的OPC服务器了。所以只能说我这次成功了,但不知道我有没有多余的配置。

下面来说说我做的吧。

(1)服务器的配置

a)安装 NWLink IPX/SPX/NetBIOS Compatible Transport Protocol 协议

在“网络连接”里面找到你用的那个网络端口,比如说我用的是无线上网,选择“无线网络连接”,右击“属性”。

img

在以上页面中点击“安装” —— “协议”——找到那个协议安装。(我的那个协议已经装过了,所以在列表中可以看到)。

b)关闭防火墙跟杀毒软件。在服务器机跟客户端机都需要。

c) 运行dcomcnfg

img

在如下图的“我的电脑”的属性页中配置:

img

在以下的选项卡里面设置:

img img

在“COM安全”选项添加Administrator、ANONYMOUS、LOGON Guest、everyone、Eason(这个是我电脑的登陆名,这里也设置了)

然后每一个都把权限给勾上。

img

d)在OPC服务器上,还要回到“组件服务”界面,打开”DCOM配置”,找到注册的OPC服务器的名称选项,打开它的属性。

img

img img img

(注:有时做好dcom配置后,需要重新启动电脑才起作用。所以为了安全起见,建议最好重新启动一下电脑,再做下一步)。

e)本地安全策略配置**
**

1、OPC服务器和OPCClient服务器都要设置:打开“控制面版”——“管理工具”——打开“本地安全策略” 安全选项——”网络访问:本地帐户的共享和安全模式”——属性

img

注:如果不配置这个,那么在连接OPC服务器的时候,就会出现拒绝访问的现象。

(2)客户端的配置

**
**客户端按照以上服务器的

a)、b)、c)、e)配置,然后就可以连接的上了。

附一些可能的配置方法:

一、在装有某OPC SERVER的机器上。DCOM配置如下
\1. 运行服务器上的dcomcnfg程序,进行DCOM配置。
\2. 进入DCOM的总体默认属性页面,将“在这台计算机上启用分布式COM”打上勾,将默认身份级别改为“无”。
\3. 进入DCOM的总体默认安全机制页面,确认默认访问权限和默认启动权限中的默认值无EveryOne,
如果不去掉EveryOne,应用服务器不能正常启动。
4.在常规页面中,双击你的应用服务器,打开你的应用服务器DCOM属性设置。
5.将常规页面中的身份验证级别改为“无”。
6.位置页面中选上“在这台计算机上运行应用程序”。
7.将安全性页面设置中,均选择“使用自定义访问权限”,编辑每一个权限,将EveryOne加入用户列表中。
8.身份标识页面中,选择“交互式用户”。
注意NT的GUEST用户不能禁用。
二、在客户端机器上DCOM配置如下:
1后点”开始”->”运行”,输入”dcomcnfg”,然后回车,启动dcom配 置。
2. 常规页面中,双击你的应用服务器,打开你的应用服务器DCOM属性设置。
3. 将常规页面中的身份验证级别改为“无”。
4. 身份标识页面中,选择“交互式用户”。
5. 位置页面中,选择“在这台计算机上运行应用程序”。
进入DCOM的总体默认属性页面,将“在这台计算机上启用分布式COM”打上勾,将默认身份级别改为“无”。
两端配置好后,客户端机器就可以访问远方机器的OPCSERVER了