Ubuntu系统初始化后配置清单ToDoList

ToDoList清单

配置时区 sudo timedatectl set-timezone Asia/Shanghai && sudo cat /etc/timezone

配置时区

1
2
sudo timedatectl set-timezone Asia/Shanghai
sudo cat /etc/timezone

配置Limit

编辑/etc/security/limits.conf文件,添加或修改相应的行来增加限制。例如:

1
2
3
4
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535

确保 IP 转发已启用

确保内核启用了 IP 转发功能。可以通过以下命令启用:

1
sudo sysctl -w net.ipv4.ip_forward=1

为了使设置永久生效,可以编辑 /etc/sysctl.conf 文件,添加以下内容:

1
net.ipv4.ip_forward = 1

然后运行以下命令应用配置:

1
sudo sysctl -p

增加sudo权限

sudo vim /etc/sudoers

1
user ALL=(ALL:ALL) NOPASSWD: ALL

配置高并发服务器调小TCP协议的time_wait时间

查看网络节点的tcp连接状态,如果发现系统存在大量的TIME_WAIT状态的连接,通过调整内核参数解决:
然后执行以下命令让参数生效: sudo /sbin/sysctl -p

limits.conf 和sysctl.conf区别在于limits.conf是针对用户,而sysctl.conf是针对整个系统参数配置

linux下ulimit参数调整

sudo vim /etc/security/limits.conf

1
2
3
4
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535

临时配置

1
2
ulimit -SHn 65536
ulimit -n

limits.conf 和sysctl.conf区别在于limits.conf是针对用户,而sysctl.conf是针对整个系统参数配置

改变系统最大打开文件数,需要修改 /etc/sysctl.conf 文件

sudo vim /etc/sysctl.conf

1
fs.file-max = 1048576

设置服务最大文件句柄数:

sudo vim /etc/systemd/system.conf

1
DefaultLimitNOFILE=1048576

配置网络参数修改

sudo vim /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service

1
2
[Service]
TimeoutStartSec=5sec

Linux 操作系统参数

系统全局允许分配的最大文件句柄数:
2 millions system-wide

1
2
3
sudo sysctl -w fs.file-max=2097152
sudo sysctl -w fs.nr_open=2097152
sudo echo 2097152 > /proc/sys/fs/nr_open

TCP 协议栈网络参数

1
2
3
sudo sysctl -w net.core.somaxconn=32768
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=16384
sudo sysctl -w net.core.netdev_max_backlog=16384

可用知名端口范围:

1
sudo sysctl -w net.ipv4.ip_local_port_range='1000 65535'

TCP Socket 读写 Buffer 设置:

1
2
3
4
5
6
7
8
9
sudo sysctl -w net.core.rmem_default=262144
sudo sysctl -w net.core.wmem_default=262144
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216
sudo sysctl -w net.core.optmem_max=16777216

#sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216'
sudo sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216'
sudo sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'

TCP 连接追踪设置

1
2
3
sudo sysctl -w net.nf_conntrack_max=1000000
sudo sysctl -w net.netfilter.nf_conntrack_max=1000000
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

Failed to allocate directory watch: Too many open files

解决办法:
vim /etc/sysctl.conf
sudo vim /etc/sysctl.conf


1
2
3
fs.file-max = 1048576
fs.inotify.max_user_instances=25120
fs.inotify.max_user_watches=262144

生效

sudo sysctl -p

Ubuntu Date-CST-UTC > CST修改时区时间的最好方法 timedatectl set-timezone Asia/Shanghai

UTC > CST

查看 /etc/timezome 的內容

1
2
sudo cat /etc/timezone

用timedatectl set-timezone Asia/Shanghai 可以快速地更新时区和时间

1
2
sudo timedatectl set-timezone Asia/Shanghai
sudo timedatectl set-timezone Asia/Shanghai

使用 timedatectl 命令顯示當前的系統時區。

1
timedatectl

輸出畫面

1
2
3
4
5
6
7
 Local time: Fri 2021-01-07 22:45:47 UTC
Universal time: Fri 2021-01-07 22:45:47 UTC
RTC time: Fri 2021-01-07 22:45:48
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no

250605-AngularJS-Button防止重复点击解决办法

范式

1
2
3
4
5
6
7
8
9
10
11
12
13
let isProcessing = false;


if (isProcessing) {
return false; // 防止重复点击
}
isProcessing = true;


// 模拟异步操作完成后恢复按钮状态
setTimeout(function() {
isProcessing = false;
}, 2000);

方案一

angularjs 能不能实现一个组件,放到所有的按钮上面,控制ng-click防重复提交策略

在 AngularJS 中,可以通过创建一个自定义指令来实现一个通用的防重复点击组件,这个指令可以附加到任何按钮上,以控制 ng-click
的防重复提交策略。

以下是一个完整的示例:

1. 创建防重复点击指令

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
// 增加按钮防重复点击组件
app.directive('preventRepeatedClick', function ($parse, $timeout) {
return {
restrict: 'A',
priority: 1000, // 确保指令在ngClick之后执行
scope: {
clickDelay: '@'
},
link: function (scope, element, attrs) {
var isProcessing = false;

var delay = parseInt(attrs.clickDelay) || 2000; // 默认延迟 2000 毫秒
delay = (delay >= 2000) ? delay : 2000;

element.on('click', function (event) {
// 如果正在处理事件,直接返回,防止重复点击
if (isProcessing) {
event.preventDefault();
event.stopPropagation();
return;
}

// 禁用按钮,防止重复点击
isProcessing = true;
element.attr('disabled', 'disabled');

// 延迟后启用按钮
$timeout(function () {
isProcessing = false;
element.removeAttr('disabled');
}, delay);
});
}
};
});

2. 使用自定义指令

在 HTML 中,将 prevent-repeated-click 指令附加到按钮上,并可选地指定 click-delay 属性来设置按钮禁用的时间(以毫秒为单位)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<title>AngularJS 防重复点击指令</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<script src="app.js"></script>
</head>
<body>
<div ng-controller="myCtrl">
<button prevent-repeated-click click-delay="2000" ng-click="buttonClick()">点击我</button>
<p>{{message}}</p>
</div>
</body>
</html>

3. 控制器逻辑

在控制器中定义按钮的点击处理函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
app.controller('myCtrl', function ($scope) {
$scope.message = '';

$scope.buttonClick = function () {
console.log('按钮被点击了');
$scope.message = '按钮被点击,正在处理...';
// 模拟处理逻辑
setTimeout(function () {
$scope.message = '处理完成';
$scope.$apply(); // 触发 AngularJS 的 digest 循环
}, 2000);
};
});

解释

  1. **自定义指令 preventRepeatedClick**:
    • **restrict: 'A'**:指定该指令为属性类型。
    • **scope**:定义指令的隔离作用域,ngClick 用于绑定按钮的点击事件,clickDelay 用于设置按钮禁用的时间。
    • link 函数:在指令的链接函数中,监听按钮的点击事件。
      • **isProcessing**:标记按钮是否正在处理事件。
      • **delay**:从 click-delay 属性获取按钮禁用的时间,如果没有指定则使用默认值 2000 毫秒。
      • 禁用按钮:在点击事件发生时,如果 isProcessingtrue,阻止事件的默认行为并返回,防止重复点击。否则,将
        isProcessing 设置为 true 并禁用按钮。
      • **触发 ng-click**:调用绑定的 ngClick 函数。
      • 延迟启用按钮:使用 $timeout 在指定的延迟时间后将 isProcessing 设置为 false 并启用按钮。
  2. 使用指令
    • 在按钮上添加 prevent-repeated-click 指令,并可选地使用 click-delay 属性来指定按钮禁用的时间。
    • 绑定 ng-click 到按钮的点击处理函数。
  3. 控制器逻辑
    • 定义按钮的点击处理函数 buttonClick,在其中执行相关的业务逻辑。

通过这种方式,你可以将 prevent-repeated-click 指令附加到任何按钮上,以实现防重复点击的功能,而无需在每个按钮的控制器中重复编写相同的逻辑。

方案二

AngularJS 的双向数据绑定来实现。以下是一个示例:

  1. HTML 部分:使用 ng-disabled 指令来绑定按钮的禁用状态。
  2. JavaScript 部分:在控制器中定义一个变量来控制按钮的禁用状态,并在事件处理函数中修改这个变量。

HTML

1
2
3
4
5
<div ng-app="myApp">
<div ng-controller="myCtrl">
<button ng-click="buttonClick($event)" ng-disabled="isDisabled">点击我</button>
</div>
</div>

JavaScript

1
2
3
4
5
6
7
8
9
10
11
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
// 初始化按钮禁用状态为 false
$scope.isDisabled = false;

$scope.buttonClick = function($event) {
console.log('按钮被点击了');
// 修改按钮的禁用状态
$scope.isDisabled = !$scope.isDisabled;
};
});

在这个示例中,我们使用了 ng-disabled 指令来绑定按钮的禁用状态到 $scope.isDisabled 变量。当点击按钮时,buttonClick
函数会被调用,它会切换 $scope.isDisabled 的值,从而改变按钮的禁用状态。

  • 初始状态下,$scope.isDisabledfalse,按钮是启用状态。
  • 当按钮被点击时,buttonClick 函数将 $scope.isDisabled 设置为 true,按钮变为禁用状态。
  • 再次点击按钮时,buttonClick 函数将 $scope.isDisabled 设置为 false,按钮恢复启用状态。

Ubuntu-性能服务器参数优化

确保 IP 转发已启用

确保内核启用了 IP 转发功能。可以通过以下命令启用:

1
sudo sysctl -w net.ipv4.ip_forward=1

为了使设置永久生效,可以编辑 /etc/sysctl.conf 文件,添加以下内容:

1
2
3
4
5
net.ipv4.ip_forward = 1
fs.file-max = 1048576

fs.inotify.max_user_instances=25120
fs.inotify.max_user_watches=262144

然后运行以下命令应用配置:

1
sudo sysctl -p

增加sudo权限

sudo vim /etc/sudoers

1
user ALL=(ALL:ALL) NOPASSWD: ALL

配置高并发服务器调小TCP协议的time_wait时间

查看网络节点的tcp连接状态,如果发现系统存在大量的TIME_WAIT状态的连接,通过调整内核参数解决:
然后执行以下命令让参数生效: sudo /sbin/sysctl -p

limits.conf 和sysctl.conf区别在于limits.conf是针对用户,而sysctl.conf是针对整个系统参数配置

linux下ulimit参数调整

sudo vim /etc/security/limits.conf

1
2
3
4
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535

临时配置

1
2
ulimit -SHn 65536
ulimit -n

limits.conf 和sysctl.conf区别在于limits.conf是针对用户,而sysctl.conf是针对整个系统参数配置

改变系统最大打开文件数,需要修改 /etc/sysctl.conf 文件

sudo vim /etc/sysctl.conf

1
fs.file-max = 1048576

设置服务最大文件句柄数:

sudo vim /etc/systemd/system.conf

1
DefaultLimitNOFILE=1048576

配置网络参数修改

sudo vim /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service

1
2
[Service]
TimeoutStartSec=5sec

Linux 操作系统参数

系统全局允许分配的最大文件句柄数:
2 millions system-wide

1
2
3
sudo sysctl -w fs.file-max=2097152
sudo sysctl -w fs.nr_open=2097152
sudo echo 2097152 > /proc/sys/fs/nr_open

TCP 协议栈网络参数

1
2
3
sudo sysctl -w net.core.somaxconn=32768
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=16384
sudo sysctl -w net.core.netdev_max_backlog=16384

可用知名端口范围:

1
sudo sysctl -w net.ipv4.ip_local_port_range='1000 65535'

TCP Socket 读写 Buffer 设置:

1
2
3
4
5
6
7
8
9
sudo sysctl -w net.core.rmem_default=262144
sudo sysctl -w net.core.wmem_default=262144
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216
sudo sysctl -w net.core.optmem_max=16777216

#sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216'
sudo sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216'
sudo sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'

TCP 连接追踪设置

1
2
3
sudo sysctl -w net.nf_conntrack_max=1000000
sudo sysctl -w net.netfilter.nf_conntrack_max=1000000
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

Failed to allocate directory watch: Too many open files

解决办法:
vim /etc/sysctl.conf
sudo vim /etc/sysctl.conf


1
2
3
fs.file-max = 1048576
fs.inotify.max_user_instances=25120
fs.inotify.max_user_watches=262144

生效

sudo sysctl -p

系统启用了 SELinux 或 AppArmor,限制 MongoDB 的访问权限。导致服务 mongod.service 启动失败

当系统启用了 SELinux 或 AppArmor 限制 MongoDB 的访问权限导致服务启动失败时,可以按照以下方法解决:

1. 检查日志文件

  • 查看 MongoDB 的日志文件,通常位于 /var/log/mongodb/mongod.log,日志中会记录具体的错误信息。
  • 检查系统日志,使用命令 journalctl -u mongod.service 查看服务启动时的详细日志。

2. 检查权限设置

  • 检查数据目录权限:确保 MongoDB 数据目录(如 /var/lib/mongodb)的所有者和组为 mongodb 用户,并且具有读写权限。可以使用以下命令修改权限:

    1
    2
    sudo chown -R mongodb:mongodb /var/lib/mongodb
    sudo chmod -R 755 /var/lib/mongodb
  • 检查日志目录权限:确保日志文件路径(如 /var/log/mongodb)也具有正确的权限。

3. 检查 SELinux 和 AppArmor 配置

  • 临时禁用 SELinux:可以临时禁用 SELinux 来测试是否是 SELinux 导致的问题。使用命令 sudo setenforce 0 将 SELinux
    设置为宽容模式。如果禁用后服务可以正常启动,说明是 SELinux 配置问题。
  • 检查 SELinux 策略:查看 SELinux 的日志文件(如 /var/log/audit/audit.log),查找与 MongoDB 相关的拒绝访问记录。
  • 配置 SELinux 策略:根据日志中的拒绝记录,可以使用 audit2allow 工具生成相应的 SELinux 策略模块,并将其加载到系统中。
  • 检查 AppArmor 配置:如果系统使用 AppArmor,检查 MongoDB 的 AppArmor 配置文件(通常位于
    /etc/apparmor.d/usr.sbin.mongod),确保配置文件中允许 MongoDB 访问必要的文件和目录。

4. 检查其他常见问题

  • 检查端口占用:确保 MongoDB 默认端口(27017)没有被其他进程占用。可以使用命令 netstat -tuln | grep 27017 检查端口占用情况。
  • 检查配置文件:检查 MongoDB 的配置文件(如 /etc/mongod.conf),确保配置文件中的路径和参数设置正确。

5. 重新启动服务

完成上述检查和修改后,重新启动 MongoDB 服务:

1
sudo systemctl restart mongod

然后检查服务状态:

1
sudo systemctl status mongod

如果服务仍然无法启动,可以继续查看日志文件和系统日志,进一步排查问题

ubuntu中文乱码问题解决

安装字体命令(中文字体)

1
2
3
4
5
6
7
sudo apt update && sudo apt upgrade -y

sudo apt install language-pack-zh-hans -y

sudo apt install fonts-wqy-zenhei fonts-wqy-microhei fonts-noto-cjk -y
sudo apt install fonts-wqy-zenhei fonts-wqy-microhei -y -y
sudo apt install fonts-wqy-zenhei fonts-wqy-microhei fonts-noto-cjk fonts-arphic-ukai fonts-arphic-uming fonts-droid-fallback -y

环境变量设置

Ubuntu默认的中文字符编码为zh_CN.UTF-8

输入命令:sudo vim /etcenvironment
修改内容如下:

1
2
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
LANG="zh_CN.UTF-8"

设置环境变量

1
2
3
sudo locale-gen zh_CN.UTF-8   # 生成中文 locale
sudo update-locale LANG=zh_CN.UTF-8 # 设置系统默认语言
export LANG=zh_CN.UTF-8

Ubuntu系统配置中文显示

(CPU)arm vs AArch64 vs amd64 vs x86_64 vs x86

(CPU) arm vs AArch64 vs amd64 vs x86_64 vs x86

Linux不全是用x86_64的说法,Fedora RHEL 等用x86_64,Debian、Ubuntu 中用amd64。

以下的表将为你总结每个字符串所代表的意义:

CPU 架构 描述
x86_64 /x86/amd64 64 位 AMD/英特尔 CPU 的别称
AArch64 /arm64/ARMv8/ARMv9 64 位 ARM CPU 的别称
i386 32 位 AMD/英特尔 CPU
AArch32 /arm/ARMv1 到 ARMv7 32 位 ARM CPU 的别称
rv64gc /rv64g 64 位 RISC-V CPU 的别称
ppc64le 64 位 PowerPC CPU,小端字节序存储

目前市场上主流的芯片架构有 X86、ARM、RISC-V和MIPS四种:

序号 架构 特点 代表性的厂商 运营机构 发明时间
1 X86 性能高,速度快,兼容性好 英特尔,AMD 英特尔 1978年
2 ARM 成本低,低功耗 苹果,谷歌,IBM,华为 英国ARM公司 1983年
3 RISC-V 模块化,极简,可拓展 三星,英伟达,西部数据 RISC-V基金会 2014年
4 MIPS 简洁,优化方便,高拓展性 龙芯 MIPS科技公司 1981年

服务器基础知识:aarch64 arm64 arm x86有什么区别

aarch64和arm64是指基于ARM架构的64位处理器,而arm是指基于ARM架构的32位处理器。x86则是指基于x86架构的处理器。

  • 架构: aarch64、arm64和arm都属于ARM架构,而x86属于x86架构。
  • 位数: aarch64和arm64是64位处理器架构,能够使用64位的寄存器和指令集。arm是32位处理器架构,使用32位的寄存器和指令集。x86可以是32位或64位处理器架构,具体取决于处理器型号。
  • 应用领域: ARM架构在移动设备(如智能手机、平板电脑)和嵌入式系统中非常常见,而x86架构主要用于桌面和服务器领域。
  • 软件兼容性: 由于架构的不同,软件在不同的架构上可能不兼容。一些软件和操作系统可能需要专门编译或适配到特定的架构上才能运行。
  • 性能和功耗: 不同的架构在性能和功耗方面可能有所差异。具体的性能和功耗特征取决于处理器的设计和实现。

CPU芯片架构(X86、ARM、RISC-V和MIPS)

CPU芯片架构(X86、ARM、RISC-V和MIPS)

目前市场上主流的芯片架构有 X86、ARM、RISC-V和MIPS四种:

序号 架构 特点 代表性的厂商 运营机构 发明时间
1 X86 性能高,速度快,兼容性好 英特尔,AMD 英特尔 1978年
2 ARM 成本低,低功耗 苹果,谷歌,IBM,华为 英国ARM公司 1983年
3 RISC-V 模块化,极简,可拓展 三星,英伟达,西部数据 RISC-V基金会 2014年
4 MIPS 简洁,优化方便,高拓展性 龙芯 MIPS科技公司 1981年
CPU 架构 描述
x86_64 /x86/amd64 64 位 AMD/英特尔 CPU 的别称
AArch64 /arm64/ARMv8/ARMv9 64 位 ARM CPU 的别称
i386 32 位 AMD/英特尔 CPU
AArch32 /arm/ARMv1 到 ARMv7 32 位 ARM CPU 的别称
rv64gc /rv64g 64 位 RISC-V CPU 的别称
ppc64le 64 位 PowerPC CPU,小端字节序存储

1、X86架构

X86是微处理器执行的计算机语言指令集,指一个Intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合。1978年6月8日,Intel
发布了新款16位微处理器 8086,也同时开创了一个新时代:X86架构诞生了。
X86指令集是美国Intel公司为其第一块16位CPU(i8086)专门开发的,美国IBM公司1981年推出的世界第一台PC机中的CPU–i8088(i8086简化版)使用的也是X86指令。

随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到今天的 Pentium
4系列,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集。

2、ARM架构

ARM架构是一个32位精简指令集处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。

如今,ARM家族占了所有32位嵌入式处理器75%的比例,使它成为占全世界最多数的32位架构之一。ARM处理器可以在很多消费性电子产品上看到,从可携式装置到电脑外设甚至在导弹的弹载计算机等军用设施中都有它的存在。

ARM和X86架构最显著的差别是使用的指令集不同。

序号 架构 特点
1 ARM 主要是面向移动低功耗领域,因此在设计上更偏重节能能效方面
2 X86 主要面向家用商用领域,在性能兼容性方面做得更好

3、RISC-V架构

RISC-V 架构是基于精简指令集计算(RISC)原理建立的开放指令集架构(ISA),RISC-V是在指令集不断发展和成熟的基础上建立的全新指令。RISC-V
指令集完全开源,设计简单,易于移植Unix系统,模块化设计,完整工具链,同时有大量的开源实现和流片案例,得到很多芯片公司的认可。

RISC-V 架构的起步相对较晚,但发展很快。它可以根据具体场景选择适合指令集的指令集架构。基于RISC-V
指令集架构可以设计服务器CPU,家用电器CPU,工控CPU和用在比指头小的传感器中的CPU。

4、MIPS架构

MIPS架构是一种采取精简指令集(RISC)的处理器架构,1981年出现,由MIPS科技公司开发并授权,它是基于一种固定长度的定期编码指令集,并采用
导入/存储(Load/Store)数据模型。经改进,这种架构可支持高级语言的优化执行。其算术和逻辑运算采用三个操作数的形式,允许编译器优化复杂的表达式。

如今基于该架构的芯片广泛被使用在许多电子产品、网络设备、个人娱乐装置与商业装置上。最早的MIPS架构是32位,最新的版本已经变成64位。

序号 架构 特点
1 X86 英特尔和AMD的“专属”,在PC市场上独霸多年,地位不可撼动
2 ARM 移动端便捷设备上有着不可替代的优势
3 MIPS 网关机顶盒等市场上非常受欢迎
4 RISC-V 虽然出来不久,但在智能穿戴产品上的应用广泛,前景广阔

OPC数据采集DCOM配置指南-转载

OPC数据采集DCOM配置指南

https://rtcloud.ipcsun.com/cms/docs/reader/OPC数据采集DCOM配置指南(500)#Bmc1Q-PGbk

开放平台通信Open Platform Communications)简称OPC
,旧称“用于过程控制OLE
”,是用于工业自动化
的一种通信标准。设备制造商(特别是PLC)如果遵从这一标准,则实时数据可提供给OPC
Server,上位机的软件(称为OPC Client)直接访问OPC Server就可以获取到设备数据,从而对不同的设备的差异透明化。

1996年首次发布后,由OPC基金会
维护这一标准。[1]
2011年名字从“用于过程控制的OLE”改为“开放平台通信”,[2]
以反映OPC已经从过程控制领域推广到智能建筑离散制造
等。OPC也超出了传统的OLE技术
,采用了.NET FrameworkXML
、OPC基金会的二进制编码TCP格式。

起源与使用

开放平台通信(OPC)规范是以微软
所开发,针对Microsoft Windows
操作系统下的对象链接与嵌入
(DDE)、组件对象模型
(COM)及Distributed COM
(DCOM)技术为基础。规格定义了过程控制及工厂自动化需要的对象接口
方法,目的是为了达到互操作性
。最常见的OPC规范是读写实时资料用的OPC资料存取
(OPC DA)。许多制造商提到OPC时,所指的其实就是OPC Data Access。OPC DA在初版发行起,已有三个主要的版本,所有版本都向后兼容。第一版OPC
DA的客户端仍可以存取第三版OPC DA的服务器,各版本会增加机能,但原有的机能仍然要支持。不过若客户端允许资料写入,就不支持旧版的服务器,例如DA
3 相同的客户端不一定支持DA 1.0的服务器。

除了OPC
DA规范外,OPC基金会也维护OPC Historical Data Access
(OPC HDA)的规范。OPC DA存取的是实时的资料,OPC HDA允许存取及检索已存档的历史资料。

OPC基金会还维护OPC Alarms and
Events的规范,定义警告及事件型式的消息信息,类似变量状态及状态管理的消息[3]

设计

开放平台通信的设计目的是提供Windows-based软件应用程序以及程序控制硬件共同的桥梁。规范中定义从车间楼层设备存取现场设备的一致性方法。不论资料的来源及类型如何,方法都是不变的。某一硬件设备的OPC服务器提供OPC
Client存取资料的方式,和其他设备的OPC服务器提供的方式都是一样的。目的是为了减少硬件设计者、软件合作厂商、SCADA
HMI
厂商花在处理这类问题,创建相关接口上的心力。只要硬件制造商针对其硬件设备开发了OPC服务器,他们的工作就已经完成,任何设备都可以存取其信息,只要SCADA制造商开发了OPC
client,就可以存取OPC相同的硬件。

OPC服务器提供方法给许多不同的软件包(前提是这些软件要是OPC
client),让程序控制设备(例如PLCDCS
)来存取资料。传统上,若软件需要从一个设备存取资料,需要撰写客制的界面(驱动程序)。OPC的目的就是定义共同的接口,只要开发一次,任何SCADA、人机界面或是电脑软件都可以用此接口存取资料。

OPC规格没有限制服务器提供哪些资料给程序控制设备。OPC服务器可以发送MCU的内部温度,也可以发送某一地区目前的温度。

只要某个设备已经有了OPC服务器,其他可以作为OPC
client的软件就可以存取此一设备。OPC服务器使用微软的OLE技术(也称为组件对象模型,COM)来和client通信。COM技术提供在软件应用程序以及程序硬件之间即时的资料交换。

OPC规范中有一些已经出版发行,其他一部分只开放给OPC协会的成员,没有一家公司拥有OPC规范,任何一家公司就算不是OPC协会的成员,也可以开发OPC服务器,非成员不一定要使用到最新的规范。任何人都可以集成OPC产品,系统集成商也不需要属于任何组织。每家需要OPC产品的公司可以自行决定其产品是否要经过认证,其系统集成商是否有需要接受必要的训练。

未来

OPC UA(OPC Unified Architecture)已经有对应的规范,并且其早期Adopters版本已经部署并且进行测试。OPC
UA可以用JavaMicrosoft .NETC语言
实现,避免了早期OPC版本需要用Microsoft Windows
为基础的系统才能实现的问题。UA结合了现有OPC接口的功能,又加入了像XML
Web Services
等技术,来支持高阶的制造执行系统
(MES)及企业资源计划(ERP)等应用。

OPC组织和MTConnect
组织在2010年9月16日宣布会彼此合作,让两个标准之间有一致性及互操作性[4]

分布式COM(DCOM)

是一项Microsoft技术,可为Windows应用程序提供在LAN(局域网),WAN(广域网)或Internet(互联网)
连接上从一台计算机连接到另一台计算机的能力。例如,DCOM允许OPC客户端应用程序从一台计算机与另一台计算机上的OPC服务器通信。

img

DCOM

DCOM作为上世纪主流分布式应用技术占据了企业应用的巨大市场份额,导致了目前自动控制领域设备(DCS,PLC等)普遍支持OPC数据采集标准,但由于DCOM基于微软Windows操作系统的二进制标准,底层实现技术封闭,与Windows操作系统安全机制紧密耦合,DCOM配置繁琐,且过程极易失败等诸多问题也普遍为业界所诟病。

OPC DOM 配置方案

RtCloud(实时云平台)总结出一套行之有效的OPC DCOM配置解决方案。

如何顺利的配置OPC相关的DCOM?首先需要了解OPC DA的工作模式及相关程序(组件、服务)以及Windows的DCOM组件工作机制,然后才能正确的配置OPC
DCOM。

OPC DCOM 的工作机制

Client和Server在同一台计算机

当Client和Server在同一台计算机时,首先,Client向OpeEnum组件(CLSID:
{13486D51-4821-11D2-A494-3CB306C10000})发起查询本机已注册的所有OPC服务器(包括2.0标准(GUID :
{63D5F431-CFE4-11D1-B2C8-0060083BA1FB})的及1.0标准(GUID : {63D5F430-CFE4-11d1-B2C8-0060083BA1FB})
的服务器。OpcEnum组件负责返回所有已注册的OPC服务器信息。

第二步,OPC Client获取已注册OPC服务器信息后,确定需要连接的OPC服务器,并通过ConnectionPoint接口及AdviseSink接口获取服务器的各种配置信息、数据项(Tag)实时数据及其它通知(如服务器关闭)。

img

OPC Clientt/Server安装在同一台计算机

Client和Server在不同的计算机

img

OPC Client/Server安装在不同的计算机

首先,OPC客户端软件访问OPC服务器所在计算机上注册的OPCEnum.exe,查询服务器所在计算机上已注册的所有OPC服务器。OpcEnum组件负责返回所有已注册的OPC服务器信息。

第二步,OPC Client获取已注册OPC服务器信息后,确定需要连接的OPC服务器,并通过ConnectionPoint接口及AdviseSink接口获取服务器的各种配置信息、数据项(Tag)实时数据及其它通知(如服务器关闭)。

在简单了解OPC客户端与服务器的通讯过程后,可以得出一个结论,无论是在同一台计算机还是不同的计算机,OPC客户端和服务器之间的通讯主要涉及三个部分:
OPC ClientOPCEnumOPC Server

步骤1 配置访问账号

配置方案要求在采集侧(OPC客户端)和OPC服务端同时配置一个就有相同账号名称和密码的具有DCOM访问权限的账号,这里假设配置的账号名称为OPCUser,密码为OPCUser*。

调用Windows账号管理器,控制台命令:lusrmgr.msc

img

特别提示

账号要在OPC服务计算机和OPC客户端计算机同样配置

步骤2 设置系统和默认DCOM访问权限

调用DCOM配置管理器,控制台命令:dcomcnfg

img

img

img

img

确认 SystemOPCUser两个账号具有本地和远程访问的权限。

img

img

同样确认 SystemOPCUser两个账号具有本地和远程访问的权限。

img

img

确认 SystemOPCUser两个账号具有本地和远程访问的启动和激活的权限。

img

img

同样确认 SystemOPCUser两个账号具有本地和远程访问的启动和激活的权限

特别提示

上述设置系统和默认DCOM访问权限需要在OPC服务计算机和OPC客户端采集计算机同样进行。

步骤3 OPC服务器设置 OPCEnum 的DCOM访问权限

在OPC服务计算机调用DCOM配置管理器,控制台命令:dcomcnfg

img

img

img

img

img

img

步骤4 OPC服务器设置 OPCDA服务 的DCOM访问权限

在OPC服务计算机调用DCOM配置管理器,控制台命令:dcomcnfg

img

img

img

提示

上述DCOM设置完成后,应重启OPCEnum和OPC服务,使配置生效

步骤5 重启OPCEnum 和OPC服务

在OPC服务计算机调用服务配置管理器,控制台命令:services.msc

img

img

步骤6 设置网络访问安全策略

调用服务配置管理器,控制台命令:secpol.msc

img

img

img

img

特别提示

上述安全策略设置需要在OPC服务计算机和OPC客户端采集计算机同样进行。

步骤7 OPC服务计算机网络防火墙设置

调用防火墙管理器,控制台命令:firewall.cpl

img

配置DCOM 135端口的入站规则

img

img

img

img

配置OPCEnum 的入站规则

img

img

img

img

img

配置OPC 服务的入站规则

img

img

img

img

img

配置OPC 服务的出站规则

img

步骤8 OPC客户端采集计算机网络防火墙设置

配置DCOM 135端口的入站规则

同上述OPC服务计算机135端口的入账规则配置流程。

配置OPC 客户端(采集程序)的入站规则

img

img

img

img

img

img

配置OPC 客户端(采集程序)的出站规则

img

完成