0%

HPP头文件

.hpp,其实质就是将 .cpp 的实现代码混入 .h 头文件当中,定义与实现都包含在同一文件,则该类的使用只需要调用 #include<xxx.hpp> 以引用该文件即可,无需再将 .cpp 加入到project中进行编译。

而实现代码将直接编译到调用者的 .obj 文件中,不再生成单独的 .obj,采用 .hpp 将大幅度减少调用 project中的 .cpp 文件数与编译次数,也不用再发布烦人的 .lib.dll 文件,因此非常适合用来编写公用的开源库。

使用注意

.hpp 头文件的优点不少,但是编写中有以下几点要注意:

  1. .h 类似,但 .hppHeader Plus Plus 的简写,是 C++程序头文件 。

  2. VCL专用的头文件,已预编译。

  3. 是一般 模板类 的头文件。

  4. 一般来说,.h 里面只有声明,没有实现,而 .hpp 里声明实现都有,后者可以减少 .cpp 的数量。

  5. .h 里面可以有 using namespace std;,而 .hpp 里则无。

  6. 不可包含 全局对象全局函数 。由于 .hpp 本质上是作为 .h 被调用者所include,所以当 .hpp 文件中存在全局对象或者全局函数,而该 .hpp 被多个调用者include时,将在链接时导致符号重定义错误要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法

  7. 类之间不可循环调用

在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可,如下:

1
2
3
4
5
6
7
8
9
10
11
class B;

class A{
public:
void someMethod(B b);
};

class B{
public :
void someMethod(A a);
};

.hpp 场景中,由于定义与实现都已经存在于一个文件,调用者必需明确知道被调用者的所有定义,而不能等到 .cpp 中去编译。因此hpp中必须整理类之间调用关系,不可产生循环调用。同理,对于当两个类A和B分别定义在各自的 .hpp 文件中,形如以下的循环调用也将导致编译错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
//a.hpp
#include "b.hpp"
class A{
public :
void someMethod(B b);
};

//b.hpp
#include "a.hpp"
class B{
public :
void someMethod(A a);
};
  1. 不可使用静态成员

静态成员的使用限制在于如果类含有静态成员,则在 .hpp 中必需加入静态成员初始化代码,当该 .hpp 被多个文档include时,将产生符号重定义错误。唯一的例外是 const static 整型成员,因为在vs2003中,该类型允许在定义时初始化,如:

1
2
3
4
class A{
public:
const static int intValue = 123;
};

由于静态成员的使用是很常见的场景,无法强制清除,因此可以考虑以下几种方式(以下示例均为同一类中方法)

  1. 类中仅有一个静态成员时,且仅有一个调用者时,可以通过 局域静态变量模拟
1
2
3
4
5
//方法模拟获取静态成员
someType getMember(){
static someType value(xxx);//作用域内静态变量
return value;
}
  1. 类中有多个方法需要调用静态成员,而且可能存在多个静态成员时,可以将每个静态成员封装一个模拟方法,供其他方法调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
someType getMemberA() {
static someType value(xxx);//作用域内静态变量
return value;
}

someType getMemberB(){
static someType value(xxx);//作用域内静态变量
return value;
}

void accessMemberA(){
someType member = getMemberA();//获取静态成员
};

//获取两个静态成员
void accessStaticMember(){
someType a = getMemberA();//获取静态成员
someType b = getMemberB();
};

  1. 第二种方法对于大部分情况是通用的,但是当所需的静态成员过多时,编写封装方法的工作量将非常巨大,在此种情况下,建议使用 Singleton模式,将被调用类定义成普通类,然后使用Singleton将其变为全局唯一的对象进行调用。

如原 .h.cpp 中的定义如下:

1
2
3
4
5
6
7
class A{
public :
type getMember(){
return member;
}
static type member;//静态成员
}

采用singleton方式,实现代码可能如下(singleton实现请自行查阅相关文档)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//实际实现类
class Aprovider{
public :
type getMember(){
return member;
}
type member;//变为普通成员
}

//提供给调用者的接口类
class A{
public :
type getMember(){
return Singleton<AProvider >::getInstance()->getMember();
}
}

分离式编译

在介绍分离式编译之前需要先介绍一下 分离式代码,在C++代码中,声明和定义是可以分开写在多个文件中,当然也可以写在同一个文件里面的,如 .hpp

往往是为了逻辑条理的清晰而分开书写,但使用 g++ 和 Terminal 直接编译 main.cpp 时,都是使用的 g++ main.cpp -o main 的命令,也就是只能编译该 main.cpp 一个文件,以生成 main 为名的二进制可运行文件,实际上,书写在其他 .cpp 文件中的代码也需要一同编译,这些书写在其他 .cpp 文件中的代码被称为 分离式代码,只编译 main.cpp 就会出现 undefined reference 之类的错误。

命令行G++

在 Windows / Linux / Mac 的 Terminal 下都可以使用 g++ 命令进行编译,格式如下:

1
g++ -c main.cpp xxx1.cpp xxx2.cpp

使用 -c 选项,将包含 main()main.cpp 与 其他分离式代码文件 xxx1.cppxxx2.cpp 一同编译,然后生成一个个对象文件( .o.obj )。上面这种方法会生成三个文件 main.oxxx1.oxxx2.o ,每个 .o 都是一个对象文件,但不一定可执行(因为缺少 main() 函数),仍需要通过进一步 链接 成可执行文件:

1
g++ -o main main.o xxx1.o xxx2.o

通过上面这一行代码可以生成名为 main 的可执行二进制文件。

以上两句命令也可以通过下面这句命令替代:

1
g++ -o main main.cpp xxx1.cpp xxx2.cpp

Makefile

Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目。一旦写编写好 Makefile 文件,只需要一个 make 命令,整个工程就开始自动编译,不再需要手动执行 GCC 命令。

一个中大型 C/C++ 工程的源文件有成百上千个,它们按照功能、模块、类型分别放在不同的目录中,Makefile 文件定义了一系列规则,指明了源文件的编译顺序、依赖关系、是否需要重新编译等。

如果是在 Windows 下作开发的话不需要去考虑这个问题,因为 Windows 下的集成开发环境(IDE)。当然,Windows 下的 Visual Studio Code如果没配置好,也只是个编辑器而已,不算是个IDE。一般的MVS(Microsoft Visual Studio)都已经内置了 Makefile,或者说会自动生成 Makefile,不用去手动编写。

Linux 中却不能这样,需要去手动的完成这项工作。Linux 下可以学习的开发语言有很多,常见的有 C/C++语言、python、java 等等。在 Linux(Unix) 下做开发的话,不了解 Makefile 是一件非常失败的事情。不懂 Makefile,就操作不了多文件编程,就完成不了相对于大的工程项目的操作。Makefile 可以说是必须掌握的一项技能。

Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的 编译链接 等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要 先编译,那些文件需要 后编译,那些文件需要 重建 等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。

Makefile 可以彻底简化编译的操作。把要链接的库文件放在 Makefile 中,制定相应的规则和对应的链接顺序。这样只需要执行 make 命令,工程就会自动编译。每次想要编译工程的时候就执行 make 命令,省略掉手动编译中的参数选项和命令,非常的方便。

Makefile 支持多线程并发操作,会极大的缩短编译时间,并且当修改了源文件之后,编译整个工程的时候,make 命令只会编译修改过的文件,没有修改的文件不用重新编译,也极大的解决了耗费时间的问题。

Makefile 格式

image-20211012134610578
  • targets:规则的目标,可以是 Object File(一般称它为中间文件),也可以是可执行文件,还可以是一个标签;
  • prerequisites:是我们的依赖文件,要生成 targets 需要的文件或者是目标。可以是多个,也可以是没有;
  • command:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。

注意:我们的 目标(target) 和 依赖文件(prerequisite) 之间要使用 冒号 : 分隔开,命令的开始(before the command) 一定要使用 Tab 键。

Reference

  1. hpp.h与.h的区别
  2. Makefile教程:Makefile文件编写1天入门 (biancheng.net)

PART 1 THE BASICS

WHY TEMPLATES?

C++ 要求我们使用指定的类型来声明变量、函数 和 大部分其他实体。然而,很多代码对于不同的类型看起来都是一样的。比如,对于不同的数据结构,如 int 数组或 string 字符串向量,只要包含的类型可以相互比较,快速排序算法的实现在结构上看起来是一样的。

如果使用的编程语言不支持 通用性(genericity)的 特殊语言功能(special language feature),将不得不面临如下选择,坏的选择(bad alternatives):

  • 你可以为不同的数据类型一遍又一遍地进行着相同的行为声明;
  • 你可以为常见的基本类型(common base type)编写一段代码,例如 objectvoid*
  • 你可以使用特殊的预处理器。

如果使用其他语言,可能以前就做过一些或者所有上方所述的内容了。然而,这些方法的每一种都有其缺点:

  • 如果你一遍又一遍地实现着这些行为,毫无疑问是叠矩重规(reinvent the wheel)。你犯了相同的错误,并且你试图寻找避免复杂但能更好的算法,因为它们会制造出更多的错误。
  • 如果你为常见基本类编写代码,你会失去类型检查的好处。另外,类可能要求继承于(be derived from)能够使代码更加难以维护的特殊基础类。
  • 如果你使用特殊的预处理器,代码会被一些没有 作用范围(scope)和类型且能够造成 奇怪语义错误(strange semantic errors)的 ”愚蠢的文本替换机制“ 替代掉。

模板是能够解决重复代码编写问题且不会造成上述这些短板的方案。模板是为一种或更多尚未声明类型的函数或者类。当使用模板时,可以隐式或显式地将类型当做参数传递过去。因为模板是语言的特点,可以拥有全部的类型检查和作用范围的支持(full support of type checking and scope)。

在C++标准库中,几乎所有的代码都是模板代码。该库提供排序算法以对 对象、指定类型的值、数据结构(也叫做 容器类(Container Classes)) 进行排序,以管理指定类型的元素 和 字符串(被参数化的字符串类型)等等。

然而,以上仅是模板的使用入门,模板还允许 参数化行为(parameterize behavior) 以 优化代码(optimize code) 和 参数化信息(parameterize infomation)。

FUNCTION TEMPLATES

函数模板(function templates),即 参数化的函数(functions that are parameterized),因此代表了 一个函数系列(a family of functions)。

函数模板为不同的数据类型提供了相同的功能行为调用,或换句话说,代表了一个函数系列。该函数系列看起来就像个普通函数,除了函数的某些元素未被确定,因为这些元素被参数化了。

TEMPLATES DELARATION AND DEFINITION

EXAMPLE

以下样例 声明 了一个函数系列,且下面参数的类型被空置(is left open),如参数 T

1
2
3
4
5
template<typename T>
T max(T a, T b){
// if b < a then yield a else yield b
return b < a ? a : b;
}

在上述样例中,模板参数必须使用 template <comma-separated-list-of-parameters> 的格式进行声明。

此处的关键字 typename 代表着类型参数,这是迄今为止C++程序中最常见的一种模板参数,当然其他参数也可以,后续介绍。此处的类型参数是 T ,可以使用任意标识符当做参数名称,但使用 T 就是惯例而已。类型参数代表着 任意类型(arbitrary type),当函数调用时,由调用的函数决定具体数据类型。开发者可以调用任何类型,只要其提供模板使用的操作。

在上述样例中,类型 T 必须支持 操作符(operator) < ,因为 ab 使用该操作符进行比较,也许在 max() 的定义中很难发现,但要说明的是,T 类型必须是可复制的才能够被返回(T must be copyable in order to be returned)。

由于历史遗留原因,仍可以使用关键词 class 来定义类型参数。typename 关键字是在 C++98 标准之后才出现的,在那之前,class 是引入类型参数的唯一方法,至今仍可以使用。因此,上述模板也可以用下面的代码平替(在语义上没有区别)。

1
2
3
4
temelate<class T>
T max(T a, T b){
return b<a?a:b;
}

但因为 class 也是 的关键字,可能导致二义性,最好在声明模板时使用关键字 typename 。需要注意的是,与类声明不同,当声明类型参数时,关键字 struct 不能用来代替 typename

在C++17之前,类型 T 也必须是可复制的,以确保能够传递参数。但C++17之后,可以传递临时数(temporary),即使没有一个备份或者一个构造器可用(even if neither a copy nor a move constructor is valid)。

如何编写多个函数模板,需要注意什么?

同一个文件内可以编写多个不同的模板函数,如下:

1
2
3
4
5
6
7
8
template<typename T>
T Max(T a, T b){
return b<a?a:b;
}

template<typename t2>
t2 foo(t2*){
}

上面两个模板函数就在同一个文件下,typename 关键字后面的 T 或者 t2 需要具有唯一性。

USING TEMPLATES

需要注意的是,在使用该函数模板时,要在该函数前加上双冒号 :: ,以确保函数模板能够在全局命名空间中被查找到。如果出现下方的 call to ’sth.’ is ambiguous 错误, 即是说需要调用的函数模糊不清,因为标准库中也有一个 std::max(),编译器查找不到该函数具体是在哪个函数文件中。

image-20211005171952999

当然,以上错误也可以通过写不同的函数名称来避免。

模板并不是被编译成一个可以处理所有数据类型的实体,而是被编译成了所有不同数据类型的实体。 即,int max()short max()string max() 等等。单实体多适应 的模板虽然好像可行,但是实际上并不存在。所有的语言规则都遵循 ” 不同的模板参数生成不同的实体“ 的原则。

上面这种用具体类型取代模板参数的过程被称为 实体化(instantiation)。需要注意的是,仅仅是对函数模板的使用就可以触发该实体化过程,因此开发者就没有必要要求实体化过程单独进行(request the instantiation separately)。

另外,只要产生的代码是有效的,void 型也是可用的模板参数,例如:

1
2
3
4
template<typename T>
T foo(T*){

}

1
2
void* vp = nullptr;  // 引出 void foo(void*)
void(vp);

TWO-PHASE TRANSLATION

两段式编译,即Two-phase translation。

如果试图为一个不支持所有操作的模板进行实例化,将会导致编译时错误。

1
2
3
std::complex<float> c1, c2;  //doesn't provide operator <

::max(c1, c2); //ERROR at compile time

因此,模板在被编译时会经过如下两个阶段:

  1. 在定义且没有实例化时,忽略模板参数来检查自身代码的正确性:
    • 标点符号错误被发现,例如缺少分号 ;
    • 使用不依赖已知模板参数的未知命名(类型名,函数名等);
    • 不依赖于已检查模板参数的 静态断言(static assertions)
  2. 在实例化时,模板代码会被再次检查以确保可用,特别是依赖于模板参数的都会被二次检查(double-checked),例如:
1
2
3
4
5
6
7
template<typename T>
void foo(T t){
undeclared();
undeclared(t);
static_assert(sizeof(int>10, "int too small");
static_assert(sizeof(T>10, "T too small");
}

注意到某些编译器在第一阶段没有进行全面检查(don’t perform the full checks),所以直到在最后一阶段的模板代码实例化之前都没办法看到问题。

COMPILE AND LINK

在实际处理模板时,两段式编译会导致很多重要的问题:当函数模板被用于触发其实例化时,编译器(在某些点)需要查看模板定义。当一个函数的声明足以编译它时,就打破了普通函数通常的编译和连接的区别。

TEMPLATE ARGUMENT DEDUCTION

模板实参推断,即 Template argument deduction。

当给函数模板传递实参时,模板参数由我们传递过去的实参决定。如果传递的是两个 int 型实参给 参数类型 T ,则C++编译器就能推断出此时的 T 一定是 int

然而 T 可能只是该参数类型的一部分。例如,声明 max() 可以使用 常参(constant references)。

1
2
3
4
template<typename T>
T max(T const& a, T const& b){
return b<a?a:b;
}

如上方代码所示,传递 整型 int 参数,T 又会被推断为 int ,因为函数参数和 int const& 匹配。

类型推导过程中的类型转换

注意,自动类型转换被限制在类型推导期间:

  • 引用传递:当通过引用声明来调用参数(declaring call parameters by reference)时,即使是 微不足道的转换(trivial conersion) 也不适用于类型推导。用同一个模板参数 T 声明的两个参数类型必须完全匹配。
  • 按值传递:当按数值声明调用参数时,只支持 decay 的琐碎转换。带有const或volatile的限定被忽略,引用转换为被引用的类型,而原始数组或函数转换为相应的指针类型。对于用同一模板参数T声明的两个参数,decayed 的类型必须匹配。

错误提示:对int类型的非恒定值引用不能与int类型的临时值绑定

image-20211007035818560

前方已经说了,类型的自动转换相关注意事项,同一模板参数的两个参数类型必须完全匹配。如果在同一个 .cpp 文件中书写下面下面代码,则会出现下方报错提示 “推导类型冲突(deduced conflicting types for parameter ’T’)”。

1
2
Max(4, 7.2);
Max("Hello",s);

错误提示如下:

image-20211007040416472

但是如果非要使用不一样的数据类型的两个参数来套用同一模板,以下有三种解决方法:

  1. .cpp 文件中进行参数传递时,使用参数类型强制转换。如 Max(static_cast<double>(4), 7.2);

TERMINOLOGY

  1. 按值传递 passing by value
  2. 引用传递 passing by reference

REFERENCE

  1. <C++ Templates> David Vandecoorde

计算机网络体系结构

计算机网络是计算机技术和通信技术相结合的技术领域。由若干计算机用通信信道连接至一起,互相交换信息共享资源,形成计算机网络。

OSI 五层模型

在国际标准化组织(ISO)提出 开放系统互联(OSI,Open System Interconnection)参考模型中,网络系统结构划分为7层。

该OSI模型由上至下分别是 应用层表示层会话层传输层网络层数据链路层物理层

img

在本模型中,物理层数据链路层网络层面向网络通信 的层级;会话层表示层应用层面向信息处理 的层级。

应用层

应用层,即Application Layer。OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。

实际公司A的老板就是我们所述的用户,而他要发送的商业报价单,就是应用层提供的一种网络服务,当然,老板也可以选择其他服务,比如说,发一份商业合同,发一份询价单,等等。

OSI七层模型中,除了应用层以外,其他功能层级都与用户实际应用没有什么直接联系,能够直接为用户提供各种应用服务的是应用层。应用层可以包含各种应用程序,有些由于使用普遍而实行了标准化,进而形成了应用层上的各种应用协议,诸如SMTP、POP3、WWW、TELNET、FTP、HTTP、HTTPS等。

表示层

表示层,即 Presentation Layer。其提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。

由于公司A和公司B是不同国家的公司,他们之间的商定统一用英语作为交流的语言,所以此时表示层(公司的文秘),就是将应用层的传递信息转翻译成英语。同时为了防止别的公司看到,公司A的人也会对这份报价单做一些加密的处理。这就是表示的作用,将应用层的数据转换翻译等。

会话层

会话层,即 Section Layer。负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。

会话层的同事拿到表示层的同事转换后资料,(会话层的同事类似公司的外联部),会话层的同事那里可能会掌握本公司与其他好多公司的联系方式,这里公司就是实际传递过程中的实体。他们要管理本公司与外界好多公司的联系会话。当接收到表示层的数据后,会话层将会建立并记录本次会话,他首先要找到公司B的地址信息,然后将整份资料放进信封,并写上地址和联系方式。准备将资料寄出。等到确定公司B接收到此份报价单后,此次会话就算结束了,外联部的同事就会终止此次会话。

传输层

传输层,即 Transport Layer。负责建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括 处理差错控制流量控制 等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP/UDP就是在这一层。端口号既是这里的“端”。

传输层就相当于公司中的负责快递邮件收发的人,公司自己的投递员,他们负责将上一层的要寄出的资料投递到快递公司或邮局。

传输层位于第三层和高三层之间,也是 面向网路通信面向信息处理 之间的重要层级,是整个协议层次的核心。

传输层的任务是为高层从源端机到目的机提供可靠、经济的数据传输服务,而与具体网络无关。

为了向用户提供经济有效的服务,传输层还提供多路复用和分流的功能。

网络层

网络层,即 Network Layer。负责通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层。IP协议是Internet的基础。

网络层就相当于快递公司庞大的快递网络,全国不同的集散中心,比如说,从深圳发往北京的顺丰快递(陆运为例啊,空运好像直接就飞到北京了),首先要到顺丰的深圳集散中心,从深圳集散中心再送到武汉集散中心,从武汉集散中心再寄到北京顺义集散中心。这个每个集散中心,就相当于网络中的一个IP节点。

数据链路层

数据链路层,即 Data Linker Layer。负责将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。MAC子层处理CSMA/CD算法、数据出错校验、成帧等;LLC子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC子层并非必需的。

这个没找到合适的例子

在物理线路上,由于噪声干扰、信号衰减畸变等原因,传输过程中常常出现差错,物理层只负责透明传输无结构的原始比特流,不能进行任何差错控制。

因此,在一条线路上传输数据时,除了必须有一条物理线路外,还需要必要规程来控制数据传输。把这些规程的软件/硬件加到链路上,就构成了数据链路层(Data Linker Layer)。

作用:通过一系列数据链路层协议,在不可靠的物理链路上实现可靠的数据传输。

为此,通常将原始数据分割成一定长度的数据单元(帧),一帧内包含 同步信号差错控制流量控制控制信息数据信息寻址 等。

差错控制

差错控制涉及两方面的问题,即 如何检测错误如何纠正错误

检查错误:要判断一个数据块是否存在错误,发送端必须在数据块中加入冗余信息,使得数据块和冗余信息间存在某种关联,接收端通过验证其关联性来判断数据是否出错。在数据块中加入冗余信息的过程称为 差错编码

差错编码有两种策略,即 仅带有检错能力的检错码带有纠错能力的检错码/纠错码。但任何一种检/纠错码的能力都是有限的,即 不能检/纠出所有的错误。一般检错码的能力越强,所需的冗余信息就会越多,编码效率会随之降低。

常见的差错编码有:

  1. 海明码,即 Hamming Code。由 Richard Hamming 于1950年提出,可纠正一个 bit 错误的编码。
  2. 循环冗余码,即 Cyclic Redundancy Code,又名 多项式码。最广泛使用的编码,但 漏检率很低,只需要简单电路即可实现。
  3. 奇偶校验码,即 Parity Check Code。 最常见也最简单的编码,只需要一个比特,但只能检出奇数个错误,漏检率达50%
  4. 校验和码,即 Checksum Code。也是最常见的检错方式,是传输的数据块中 各字节累加 后得到的 一个字节 或 按字“异或”运算 的结果。

物理层

物理层,即 Physical Layer。实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。

快递寄送过程中的交通工具,就相当于我们的物理层,例如汽车,火车,飞机,船。

其中物理层有几个概念需要了解和区分,包括 传输速率信道容量传输媒体调制解调交换技术网络拓扑多路复用

传输速率

比特率:每秒传输的二进制位数。

波特率:每秒传输的码元率。

码元:单位携带的比特信息量。

如果码元率为1比特,则波特率和比特率数值上相等。

信道容量

信道容量,即信道能支持的最大数据传输速率,由信道带宽和信噪比决定。

传输媒体

传输媒体,即传输电信号的物理介质。可以是有线、无线、双绞线、同轴电缆 或 光纤 等。

调制解调

调制解调,即一种数据转换成适合在信道上传输的某种电信号形式。

数字信号转换为模拟信号有 调幅调频调相 等方式。

数字信号的信道编码方式有 单极型脉冲双极性脉冲编码 (有归零码 和 不归零码 之分)及 曼彻斯特编码 等(信道编码)。

交换技术

物理层的交换技术有三种:电路交换报文交换分组交换

TYPE PRINCIPLE ADVANTAGES DISADVANTAGES
电路交换 要求通信双方之间建立一条实际的物理通道,并在整个通信过程中 通路独占 数据在中间环节无停留,传输可靠,实时效应好; 电路不共享,资源浪费大,同时电路的建立和撤出的时间较长。
报文交换 一个 大报文(长度无限制的数据块)在通过从源站到目的站之间的中间站时采用 存储-转发 方式(有缓冲区)。 提高线路利用率 大报文延迟时间长,出错率高。
分组交换 将一个大报文分割成一定长度的信息单元(分组),各单元以此编号,以分组为单位进行 存储-转发 除了线路共享外,要求中间环节的缓存区减少,也减少了分组在网络中的延迟时间。
由于各分组在网络中可以走不同路径,该并行传输降低了报文的传输时间。分组长度变短同时降低了出错率(发现出错时重发数据所需时间也缩短)。

网络拓扑

网络拓扑(Network Topology)即网络中节点的互联结构形式,主要分为 星型结构总线型结构树型结构环型结构网型结构。(网络上很多文章都有 混合型结构 这一拓扑类型)

1002_1

TYPE PRINCIPLE SWITCHING ADVANTAGES DISADVANTAGES
星型结构 通过点对点连接至中央节点,任意两点的通信都依赖中央节点。 电路交换 任意节点故障都只会影响本站,而不影响全网。 极大以来中央节点,对中央节点的可靠性和容量要求很高,同时因为需要中央节点连接,耗费大量电缆。
总线型结构 采用单一信道作为传输介质,所有站点通过相应硬件结构接到公共信道(总线)上,任意站点发送的信息,所有其他站都能收到。 分组交换 所需电缆长度短,布线容易。
且总线仅仅是传输信道,无任何处理功能,属于无源器件,可靠性高,增加或减少站点都相对方便。
由于所有节点共享一条公共信道,当多点同时发送信号时,信号会因相互碰撞而造成传输失败,称之为 冲突
系统范围受到限制(传输速率和传输距离相互制约)。一个站点的故障可能影响整个网络,故障检测需要在各站点上进行。(待考究)
树形结构 由总线型结构演化而来,从树根开始,每一个节点向下都可以由许多分支。 故障比较容易隔离和检查。
环型结构 站点和连接站点的点-点链路组成一个闭合环路,每个站点从一条链路上接受数据,然后以相同的速率从另一条链路上发送出去。
链路大多数是单方向的,即数据沿一个方向在网上环行。
所需介质长度较短,由于链路单方向性,可以用光纤作为传输介质; 与总线型结构一样存在冲突问题,一个站点故障会引起全网故障。
网型结构 每个站点都有一条或几条链路同其他站点连接。 由于站点间存在多条路径,数据传输时可以选择空闲站点或绕开故障点,因而 网络资源利用较为充分
但站点或线路故障对网络整体影响较小,可靠性较高
结构较为复杂,成本较高。

多路复用技术

传输媒体的能力(频带宽)往往很强,对传输资源能力的应用(复用)是指将多路信号组合在一条物理信道上进行传输,然后接收端再将各路信号分离开。常见的多路复用技术如 频分多路复用(FDM)、时分多路复用(TDM) 和 码分多址(CDMA)等。

TYPE PRINCIPLE ADVANTAGES DISADVANTAGES
频分多路复用 将信道带宽按频率分割为若干子信道,每个子信道用来传输一路信号。
时分多路复用 将使用信道的时间分成一个个时间片,按一定规律将时间片分配给各路信号,每路信号只能在自己的时间片内独占信道进行传输。
码分多址 允许所有站点在同一时间使用整个信道进行数据传输。

以上三类多路复用技术可以形象地比喻为多个人要发言讨论不同问题时,如何使用同一个会议厅(信道)。

  • 可以把会议厅分成几个小厅(好比频分多路复用),各小厅同时进行各自不同的发言,互不干扰;

  • 可以在一个厅内让各议题在固定的时间片内轮流发言(好比时分多路复用);

  • 可以在一个厅内让各自议题同时发言,但是要用不同的语言(好比码分多址),对某个议题的人来说只能听懂自己的语言,而其他语言被视为随机噪音,可以排除。

TCP/IP 五层模型

实际TCP/IP使用的是5层模型,其中OSI模型中的 应用层、表示层 和 会话层 都用一层 应用层 进行表示,如下图。在每一层都工作着不同的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的。

img

在每一层实现的协议也各不同,即每一层的服务也不同,下图列出了每层主要的协议。

img

现场总线

在工业数据通信领域,总线 是指由导线组成的传输线束,连接多个传感器和执行器,实现各部件之间传送信息的公共通信干线。

然后再来看国际电工技术委员会(IEC)在IEC 61158中对现场总线的标准定义:现场总线 是安装在制造或过程区域的现场装置与控制室内的自动控制装置之间的数字式、串行、多点通信的数据总线。

从定义中可以看到,现场总线是一种数据总线技术,是一种通信协议,且该通信是数字式、串行、多节点的。

目前,在工控领域,车间现场应用最广泛的是 工业以太网 技术和 工业现场总线 技术,为工厂实现自动化带来有力推动。

现场总线应当是应用在生产最底层的一种总线型拓扑网络,即该总线是用于现场控制系统,直接与所有受控(设备)节点串行相连的通信网络。

工业自动化控制的现场一般可以从一台家电设备到一个车间、一个工厂。控制设备和网络所处的环境以及报文结构都有其特殊性,对信号的干扰往往是多方面的,而要求控制必须实时性很强。

现场总线技术

现场总线(Fieldbus)是电气工程及其自动化领域发展起来的一种工业数据总线,它主要解决工业现场的智能化仪器仪表、控制器、执行机构等现场设备间的数字通信以及这些现场控制设备和高级控制系统之间的信息传递问题。由于现场总线简单、可靠、经济实用等一系列突出的优点,因而受到了许多标准团体和计算机厂商的高度重视

传统控制系统难以实现设备之间 以及 系统与外界之间的信息交换,是一个“信息孤岛”。要满足自动化控制技术现代化的要求,同时实现整个企业的信息集成,实施综合自动化,就必须设计出一种能在工业设备之间的多点数字通信,实现底层现场设备之间以及生产现场与外界的信息交换。

现场总线控制系统(Field Control System,FCS)既是一个开放通信网络,又是一种全分布控制系统。作为智能设备的联系纽带,把挂接在总线上、作为网络节点的智能设备连接为网络系统,并进一步构成合成系统,实现基本控制、补偿计算、参数修改、报警、显示、监控、优化 及 管控一体化的综合自动化功能。

现场总线技术是一项集嵌入式系统、控制、计算机、数字通信、网络为一体的综合技术。

局限性

也可以说现场总线是工业控制和计算机网络两者的边缘产物。从纯理论的角度看,它应属于网络范畴。但是现有的网络技术不能完全适应工业现场控制系统的要求,无论是从网络的结构、协议、实时性,还是从适应性、灵活性、可靠性 乃至 成本 上进行考虑,工业控制的底层都有它的特殊性。

现场总线其规模应属于局域网、总线型结构,简单但能满足现场使用需求,所传输信息短小且实时性很强、可靠性高(网络结构层次少,信息帧短小有利于提高实时性和降低受干扰的概率)。然而现场的环境干扰因数众多,有些很强烈且带突发性。

现场总线发展

一般把50年代前的气动信号控制系统PCS称作 第一代,把4~20mA等电动模拟信号控制系统称为 第二代,把数字计算机集中式控制系统称为 第三代,而把70年代中期以来的集散式分布控制系统DCS称作 第四代

现场总线控制系统FCS作为新一代控制系统,一方面,突破了DCS系统采用通信专用网络的局限,采用了基于公开化、标准化的解决方案,克服了封闭系统所造成的缺陷;另一方面把DCS的集中与分散相结合的集散系统结构,变成了新型全分布式结构,把控制功能彻底下放到现场。可以说,开放性、分散性与数字通讯是现场总线系统最显著的特征。

  • 1984年美国Intel公司提出一种 计算机分布式控制系统-位总线(BITBUS),它主要是将低速的面向过程的 输入输出通道与高速的计算机多总线(MULTIBUS)分离,形成了现场总线的最初概念。
  • 80年代中期,美国Rosemount 公司开发了一种可寻址的远程传感器(HART)通信协议。采用在4~20mA模拟量叠加了一种频率信号,用双绞线实现数字信号传输。HART协议已是现场总线的雏形。
  • 1985年由Honeywell和Bailey等大公司发起,成立了World FIP制定了FIP协议。
  • 1987年,以Siemens,Rosemount,横河等几家著名公司为首也成立了一个专门委员会互操作系统协议(ISP)并制定了PROFIBUS协议。后来美国仪器仪表学会也制定了现场总线标准IEC/ISA SP50。
  • 随着时间的推移,世界逐渐形成了两个针锋相对的互相竞争的现场总线集团:一个是以Siemens、Rosemount,横河为首的ISP集团;另一个是由Honeywell、Bailey等公司牵头的WorldFIP集团。1994年,两大集团宣布合并,融合成现场总线基金会(Fieldbus Foundation)简称FF。对于现场总线的技术发展和制定标准,基金委员会取得以下共识:共同制定遵循IEC/ISA SP50协议标准;商定现场总线技术发展阶段时间表。

现场总线能力

部分应用场景或产品开发时,会对现场总线的能力提出如下要求:

本质安全防爆本质安全 是指通过设计等手段使生产设备或生产系统本身具有安全性,即使在误操作或发生故障的情况下也不会造成事故的功能。具体包括 失误—安全(误操作不会导致事故发生或自动阻止误操作)和 故障—安全 功能(设备、工艺发生故障时还能暂时正常工作或自动转变安全状态)。

本质安全型电气设备的防爆原理:通过限制电气设备电路的各种参数,或采取保护措施来限制电路的火花放电能量和热能,使其在正常工作和规定的故障状态下产生的电火花和热效应均不能点燃周围环境的爆炸性混合物,从而实现了电气防爆,这种电气设备的电路本身就具有防爆性能,也就是从“本质”上就是安全的。

现场总线分类

国际上有40多种现场总线,但没有任何一种现场总线能覆盖所有的应用面,按其传输数据的大小可分为3类:

  1. 传感器总线(sensor bus),属于位传输;
  2. 设备总线(device bus),属于字节传输;
  3. 现场总线,属于数据流传输。

FF

FF,即 Foundation Field bus,基金会现场总线。

是以美国Fisher-Rouse mount公司为首的联合了横河、ABB、西门子、英维斯等80家公司制定的ISP协议和以Honeywell公司为首的联合欧洲等地150余家公司制定的World FIP协议于1994年9月合并的。该总线在过程自动化领域得到了广泛的应用,具有良好的发展前景。

FF 总线采用国际标准化组织ISO的开放化系统互联OSI的简化模型(1,2,7层),即物理层、数据链路层、应用层,另外增加了用户层。

FF 分低速H1和高速H2两种通信速率,前者传输速率为31.25Kbit/秒,通信距离可达1900m,可支持总线供电和本质安全防爆环境。后者传输速率为1Mbit/秒和2.5Mbit/秒,通信距离为750m和500m,支持双绞线、光缆和无线发射,协议符号IEC1158-2标准。

FF 的物理媒介的传输信号采用曼切斯特编码。

CAN

CAN,即Controller Area Network,控制器局域网络。

最早由德国BOSCH公司推出,它广泛用于离散控制领域,其总线规范已被ISO国际标准组织制定为国际标准,得到了Intel、Motorola、NEC等公司的支持。CAN协议分为二层:物理层和数据链路层。CAN的信号传输采用短帧结构,传输时间短,具有自动关闭功能,具有较强的抗干扰能力。CAN支持多主工作方式,并采用了非破坏性总线仲裁技术,通过设置优先级来避免冲突,通讯距离最远可达10KM/5Kbps/s,通讯速率最高可达40M/1Mbp/s,网络节点数实际可达110个。目前已有多家公司开发了符合CAN协议的通信芯片。

LonWorks

由美国Echelon公司推出,并由Motorola、Toshiba公司共同倡导。它采用ISO/OSI模型的全部7层通讯协议,采用面向对象的设计方法,通过网络变量把网络通信设计简化为参数设置。支持双绞线、同轴电缆、光缆和红外线等多种通信介质,通讯速率从300bit/s至1.5M/s不等,直接通信距离可达2700m(78Kbit/s),被誉为通用控制网络。Lonworks技术采用的Lon Talk协议被封装到Neuron(神经元)的芯片中,并得以实现。采用LonWorks技术和神经元芯片的产品,被广泛应用在楼宇自动化、家庭自动化、保安系统、办公设备、交通运输、工业过程控制等行业。

Device Net

Device Net是一种低成本的通信连接也是一种简单的网络解决方案,有着开放的网络标准。Device Net具有的直接互联性不仅改善了设备间的通信而且提供了相当重要的设备级阵地功能。Device Net基于CAN技术,传输率为125Kbit/s至500Kbit/s,每个网络的最大节点为64个,其通信模式为:生产者/客户(Producer/Consumer),采用多信道广播信息发送方式。位于Device Net网络上的设备可以自由连接或断开,不影响网上的其他设备,而且其设备的安装布线成本也较低。Device Net总线的组织结构是Open Device Net Vendor Association(开放式设备网络供应商协会,简称“ODVA”)。

PROFIBUS

PROFIBUS是德国标准(DIN19245)和欧洲标准(EN50170)的现场总线标准。由PROFIBUS--DP、PROFIBUS-FMS、PROFIBUS-PA系列组成。DP用于分散外设间高速数据传输,适用于加工自动化领域。FMS适用于纺织、楼宇自动化、可编程控制器、低压开关等。PA用于过程自动化的总线类型,服从IEC1158-2标准。PROFIBUS支持主-从系统、纯主站系统、多主多从混合系统等几种传输方式。PROFIBUS的传输速率为9.6Kbit/s至12Mbit/s,最大传输距离在9.6Kbit/s下为1200m,在12Mbit/s小为200m,可采用中继器延长至10km,传输介质为双绞线或者光缆,最多可挂接127个站点。

HART

HART,即 Highway Addressable Remote Transducer,高速可寻址远程传感器。

最早由Rosemount公司开发。其特点是在现有模拟信号传输线上实现数字信号通信,属于模拟系统向数字系统转变的过渡产品。其通信模型采用物理层、数据链路层和应用层三层,支持点对点主从应答方式和多点广播方式。由于它采用模拟数字信号混和,难以开发通用的通信接口芯片。

HART能利用总线供电,可满足本质安全防爆的要求,并可用于由手持编程器与管理系统主机作为主设备的双主设备系统。

CC-Link是Control&Communication Link(控制与通信链路系统)的缩写,在1996年11月,由三菱电机为主导的多家公司推出,其增长势头迅猛,在亚洲占有较大份额。在其系统中,可以将控制和信息数据同是以10Mbit/s高速传送至现场网络,具有性能卓越、使用简单、应用广泛、节省成本等优点。其不仅解决了工业现场配线复杂的问题,同时具有优异的抗噪性能和兼容性。CC-Link是一个以设备层为主的网络,同时也可覆盖较高层次的控制层和较低层次的传感层。2005年7月CC-Link被中国国家标准委员会批准为中国国家标准指导性技术文件。

World FIP

World FIP的北美部分与ISP合并为FF以后,World FIP的欧洲部分仍保持独立,总部设在法国。其在欧洲市场占有重要地位,特别是在法国占有率大约为60%。World FIP的特点是具有单一的总线结构来适用不同的应用领域的需求,而且没有任何网关或网桥,用软件的办法来解决高速和低速的衔接。World FIP与FFHSE可以实现“透明联接”,并对FF的H1进行了技术拓展,如速率等。在与IEC61158第一类型的连接方面,World FIP做得最好,走在世界前列。

此外较有影响的现场总线还有丹麦公司Process-Data A/S提出的P-Net,该总线主要应用于农业、林业、水利、食品等行业;Swift Net现场总线主要使用在航空航天等领域,还有一些其他的现场总线这里就不再赘述了。

INTERBUS

INTERBUS是德国Phoenix公司推出的较早的现场总线,2000年2月成为国际标准IEC61158。INTERBUS采用国际标准化组织ISO的开放化系统互联OSI的简化模型(1,2,7层),即物理层、数据链路层、应用层,具有强大的可靠性、可诊断性和易维护性。其采用集总帧型的数据环通信,具有低速度、高效率的特点,并严格保证了数据传输的同步性和周期性;该总线的实时性、抗干扰性和可维护性也非常出色。INTERBUS广泛地应用到汽车、烟草、仓储、造纸、包装、食品等工业,成为国际现场总线的领先者。

其他

RS-485和现场总线同属于总线;ModBus和现场总线同属于通信协议;

严格来讲,RS-485≠现场总线,ModBus≠现场总线,RS-485+ModBus(还有其他什么的)才构成现场总线,其中RS-485工作在现场总线的物理层,ModBus工作在现场总线的应用层;

参考

  1. 《现场总线CAN原理与技术应用》第二版,北京航空航天大学出版社,饶运涛、邹继军、王进宏、郑勇芸 编著
  2. 现场总线
  3. OSI网络模型
  4. 本质安全
  5. 本质安全型电气设备防爆原理

前置知识

  • 带宽及传输速率转换
  • TCP/IP网络协议
  • 硬件功耗计算和测量

概述

将从通信速率、通信距离、通信功耗、组网能力/网路容量、 应用场景 及 安全性 等各方面来区分无线通信各种技术。

通信距离和通信速率

超近距离
10公分以内
近距离
1米以内
近距离
20米以内
中距离
20至100米
远距离
1公里以内
超远距离
1公里以上
超高速率
> 100Mbps
RFID WiFi 5G
高速率
< 100Mbps
RFID WiFi 3G/4G
中速率
< 10Mbps
WiFi
Bluethooth
Bluethooth CMDA2K1X
2G
低速率
< 1Mbps
NFC ZigBee
Z-Ware
《IEEE 802.11 ah》 Lora
NB-IOT(基于MTC)
GPRS
超低速率
< 1Kbps
Sigfox

还有很多躺在历史垃圾堆角落里,没有得到使用和普及的通信协议,如 WiMax(IEEE 802.16),

通信功耗

超高功耗:> 100mA

高功耗:30~100mA

中功耗:< 30mA

低功耗:< 20mA

超低功耗:< 10mA

超低功耗 低功耗 中功耗 高功耗

组网能力/网路容量

应用场景

LPWAN/LPWA

LPWAN, Low Power Wide Area Network,低功耗广域网络,也可以缩写为LPWA。

LPWAN 不是指任何一种特定技术,而是作为任何网络的通用术语,这些网络旨在以比其他网络(如蜂窝、卫星或 WiFi)更低的功率进行无线通信。此外,与其他使用蓝牙或 NFC 的低功耗网络相比,LPWAN 的通信距离更远。

LPWA 网络非常有限的带宽不适合大多数消费者和商业应用,例如语音、视频、音频甚至文本消息。因此,LPWA 网络几乎完全由物联网 (IoT) 和 M2M(机器对机器)通信中的设备使用。

虽然冰箱、灯泡或 Nest 温度计等家用或商用设备都可以轻松搭载家庭或办公室 WiFi 连接,但某些设备不能依赖这种连接。

LoRa、SigFox、NB-IoT 都属于 LPWA 的范畴,LoRa 不需要 SIM 卡,NB-IoT 需要 SIM 卡。

image-20210920171429124

LoRa

LoRa是美国Semtech公司的专有技术,实际是一种采用扩频方案的无线调制解调技术。Semtech在2012年通过并购法国Cycleo公司获得LoRa的IP产权,以此设计制造射频芯片并进行市场销售,是一家纯半导体公司,垄断LoRa芯片的供货。目前Semtech虽然也进行少量LoRa的IP授权,如国内的阿里,但IP是Semtech专有,没有授权任何公司无法设计制造LoRa芯片,所以客户的选择余地很小。

LoRa使用的也是公共频段进行射频信号传输,上层协议及规范由LoRaWan定义,LoRa联盟负责发布和维护。任何人可以购买LoRa芯片或者模块来设计LoRa终端和网关设备,也可以设计或者购买设备来搭建LoRa网络,所以目前多数的LoRa网络都是小区域和私有的,很少有全国性的通用物联网络,而设备和网络间的兼容也是一个很大的挑战。

LoRa通过扩频技术实现高灵敏度,从而能够进行远距离传输,但是网络容量有限,无法高效实现大批量设备信息的并行接收和处理,这对于大面积或全国性的部署是个巨大挑战。

术语

A link budget is used to compute cell coverage by accounting for all the factors that determine the cell coverage to balance the system cost against the required cell capacity. Link budget factors controlled by the RF engineer include transmitter-radiated power, antenna gain, noise figures, and co-channel interference (i.e., reuse factor N). Factors that cannot be controlled directly, but must be considered in the link budget, include propagation path loss and system bandwidth.

链路预算是用来计算小区覆盖率的,它考虑了决定小区覆盖率的所有因素,以平衡系统成本和所需小区容量。由射频工程师控制的链路预算因素包括发射器辐射功率、天线增益、噪声数字和同信道干扰(即重用系数N)。不能直接控制,但必须在链路预算中考虑的因素包括传播路径损耗和系统带宽。

参考

  1. 《无线传感网络》杨博雄/倪玉华
  2. 物联网通信标准分类 谁最有优势?
  3. 为什么WIMAX没有普及?
  4. 什么是LPWA
  5. NB-IoT 通往智能世界的基础联接技术
  6. Link Budget - an overview | ScienceDirect Topics
  7. LPWA 物联网络

RS Serial Port

RS系列(RS-232/RS-422/RS-485)标准(RS,即Recommend Standard,推荐标准 之意 )是常用的(异步)串行通信接口标准,该系列标准由美国电子工业协会(EIA)牵头开发。

RS系列标准只对 接口电气特性(Electric Specification of Interface)进行规定,并不涉及插件、电缆或协议,再次基础上,用户可以建立自己的接头、插座形状 以及 高层通信协议 。

RS-232

RS-232标准接口(又称EIA RS-232)是由美国电子工业协会(EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。

RS232协议 和 TTL协议更多是电气特性(如电平标准和电压),二者在软件协议层面是一样的,如对于同样传输 0b01010101 来说,RS232 和 TTL的时序对比如下图所示:

img

图 RS232标准和TTL标准的时序对比

当然,RS232和TTL/CMOS之间的转换,不仅仅是简单的电平转换,还要考虑到其他一些因素,比如 调节矫正 一些电平(提高或降低对应的电平),确保可能的有害的RS232电压不会破坏微控制器的串口针脚。较为成熟的方案是通过MAX3232之类的芯片,把TTL电平转为RS232电平,或者在淘宝购买TTL转RS232电缆即可。

由于RS-232采取 不平衡传输 方式,即所谓 单端通讯。收(RX)、发(TX) 端的数据信号是相对于信号地(GND)。典型的RS-232信号在正负电平之间摆动,

  • 在发送数据时,发送端驱动器输出正电平在+5+15V,负电平在-5-15V电平。
  • 当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。

接收器典型的工作电平在 +3~+12V-3~-12V由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20Kbps。RS-232是为 单节点通讯(即点对点,用一对收、发设备)而设计的,其驱动器负载为3kΩ~7kΩ。所以RS-232适合本地设备之间的通信。

RS-422

RS-422、RS-485与RS-232不一样,数据信号采用差分传输方式,也称作 平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B。通常情况下,发送驱动器A、B之间的正电平在+2+6V,是一个逻辑状态,负电平在-2V6V,是另一个逻辑状态。另有一个信号地C,在RS-485中还有一“使能”端,而在RS-422中这是可用可不用的。“使能”端是用于控制发送驱动器与传输线的切断与连接。当“使能”端起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1”与“0”的第三态。

由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多的双向通信。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mbps。其平衡双绞线的长度与传输速率成反比,在100Kbps速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mbps。RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。

RS-485

RS-485 标准只对 接口电气特性(Electric Specification of Interface)进行规定,并不涉及插件、电缆或协议,再次基础上,用户可以建立自己的接头、插座形状 以及 高层通信协议 。

RS-485 的 通信距离通信速率 是负相关的,

RS485有 两线制四线制,四线制只能实现点对点的通信方式,现很少采用。

接口(标准)对比

以下仅从RS的硬件要求进行横向对比:

表 RS系列标准对比
RS-232 RS-422 RS-485
半双工/全双工 全双工 全双工 半双工
波特率
传输速率范围 300bps~100Kbps 10Mbps 10Mbps
联网支持(多设备连接) 不支持 支持 支持
电压范围
差模/共模 共模 差模 差模
最少信号线数量 3根 5根 2根
最大传输距离 15m(波特率=9600时) 3900m
控制信号(DE,Drive Enable) 可选
输入阻抗 3~7kΩ

使用RS422协议的设备间的引脚互相连接示意图:

img

UART Protocol

UART,即Universal Asynchronous Receiver/Transmitter,通用异步收发

在通信和计算机科学中,Serial communication是一个通用概念,泛指所有的串行的通信协议,如RS232、USB、I2C、SPI、1-Wire、Ethernet等。这里的串行(serial),是相对并行通信(parallel communication)来说的,如下图:

img

广义上讲,UART是指 支持RS系列(物理接口)标准和TLL电平 的 通信协议

因为UART更多关注规定编码格式的标准,如 波特率(baud rate)、帧格式波特率误差 等等,所以了解UART时,不可避免需要先在电气特性上区分几个常用的概念,如 TLL电平CMOS电平

TTL集成电路的主要型式为晶体管-晶体管逻辑门(transistor-transistor logic gate),TTL大部分都采用5V电源。

TTL电平(参考值) CMOS电平(参考值)
输入高电平 ≥ 2.4V ≈ 0.7*VCC
输入低电平 ≤ 0.4V ≈ 0.3*VCC
输出高电平 ≥ 2.0V ≈ VCC 或 <0.9*VCC
输出低电平 ≤ 0.8V ≈ GND 或 < 0.1*VCC

:VCC的概念可以参考文章《VCC、VDD、VEE、VSS的区别》,具体输入输出的高低电平范围需要参考芯片及电路的手册。

接口

以下介绍均为UART常用的物理接口。

D型数据接口连接器,用于连接电子设备(比如:计算机与外设)的接口标准。因形状类似于英文字母D,故得名D型接口。

按照接口数量细分为A型(15针),B型(25针),C型(37针),D型(50针),E型(9针)。因此常见的计算机并口即为DB25针的连接器。而串口则应为DE9针连接器。

由于早期的计算机的串口与并口都是使用DB25针连接器,而人们则习惯把字母B与D合在一起记了下来,当作D型接口的共同名字,以至于后来计算机串口改用9针接口以后,人们更多的使用DB9而不是DE9来称呼9针的接口。这一习惯进一步推广的结果就是如今人们使用DBxx来代表D型接口,数字xx则为接口的针数。

DB9

COM口是指针对串行通信协议的一种端口,是PC上异步串行通信口的简写,大部分为9针孔D型。

因此 DB9 就和 COM口 混用了,但是COM口里又进一步区分RS232,RS422和RS485,传输功能依次递增。

image-20210915103057209
图 DB9/COM口在各RS标准下的引脚使用和定义

但由于历史原因,IBM的PC外部接口配置为RS232,成为实际上的PC界默认标准。所以,现在PC机的COM口的物理标准均为RS232。DB9/COM口的公头和母头实际外观如下:

image-20210915093214837image-20210915104612002
图 DB9/COM口的公头(左)和母头(右)外观

端子

端子,Terminal,也称为 接线终端 / 接线端子

种类分单孔,双孔,插口,挂钩等,从材料分,铜镀银,铜镀锌,铜,铝,铁等。它们的作用主要传递电信号或导电用。

端子排型号

转换器

USB转TTL

常见的USB转TTL的芯片,如CP2101 / CP2102 / CH340 / CH341 / FT232BM / FT232RL / PL2303 / PV8651等,尤其CH340和CP2102 的转换器最为常见。

image-20210915113729086

图 USB转TTL(CH340G芯片)转换器

image-20210915114016213

图 USB转TTL(FT232芯片)转换器

USB转DB9(RS232)

image-20210915095451523

图 USB转DB9数据线

RJ45和DB9

这种转换器通常用在交换器和路由器的调试工作上,

image-20210915105657103
图 RJ45母 转 DB9公

image-20210915105821577

图 RJ45公 转 DB9母

RJ45转端子

imgimgimg
图 RJ45公 转 2/3/4引脚端子

RS-232转RS-485

目前主流的家用台式机上已经逐渐取消DB9接口,在某些旧台式电脑主机或者商用台式电脑主机上可能仍有DB9端口可以适配 RS-232(DB9公/母)/RS-485(端子) 转换器,然后再利用一根双绞线(可以用网线制作)连接转换器的 A+ / B- 端子 和 通信设备。如下图所示:

image-20210915091142748
图 DB9公(RS232)转3引脚端子(RS485)

由于该转换器为电气隔离设计,需要使用独立的VCC/GND/T/R来进行供电,因此不能只连接两根信号线。

该类转换器同样按照DB9接口的公/母来区分引脚/信号定义,下表为深圳市宇泰科技出品的UT-2201转换器说明书中的内容:

image-20210915142023932

下图为RS485和转换器之间的连接示意,转换器和单点之间的连接:

image-20210915141402305

转换器和多点的连接:

image-20210915141728889

参考

  1. 《串行通信技术 面向嵌入式系统开发》 周云波 著 中国工信出版集团 电子工业出版社
  2. 《ANALOG DEVICE-5 V Low PowerEIA RS-485 Transceiver》
  3. 《InterfaceCircuitsforTIA/EIA-485(RS-485)》
  4. 聚英JY-CON503 RS232转RS485/RS422 宽压DC7-30V供电 全隔离设计
  5. DB9针和DB25针串口的引脚定义
  6. 为什么越来越多人使用RS232接口,却还分不清DB9、DB25的引脚定义?
  7. RS-232
  8. DB9
  9. 串口、COM口、UART口, TTL、RS-232、RS-485区别详解
  10. UART、RS232、TTL关系浅析
  11. RS232、RS422、RS485、TTL电平
  12. 一文搞懂Modbus与RS485通信协议

自从Github被微软收购,除了Copilot这个AI代码写作助手,大家开源贡献的代码都被拿来用了之后,就不想在Github上贡献代码了。

转而使用Gitee,感觉也挺好。

生成并绑定公钥

使用terminal生成公钥:

1
ssh-keygen

遇到选择就按回车,不用管就好。然后使用以下命令进行查看:

1
cat ~/.ssh/id_rsa.pub

公钥样例(千万不要复制下面的模板)如下:

1
ssh-rsa BBBBA3NzaC1yc2EBBBBDAQBABBBABQCoLmvwKsFETfy0Lj8VN0QwDj/fu2J1msoM+kWCLTj64zXXXXXXXXXSKQxj30zjVO4tZ9PsO/jaItdev1uV7a9lk9MiemLLAxc1LSYsBdki81tx+7941rl9y/XXXXXXXXXXDjNpPCMq6xH8ZSRoRLcgCz+gRaDfnQALWBcavEO0uVqYGn4I4KRFPup7gm+3j5gRpdm1uKtkrqHxqykErCwXXXXXXXXXX6+okRt/TN5jjq6zV44D6tRYAK6oCOFpwO/RTqTIUU//w/XXXXXXXXXXXXXXXXXXXXdPCqs8Zax9cH/31FJqltQzsRbGDLTFFXqyICK7QKVgFXGhrzM3AVvD xxxx@xxxx.local

绑定到Gitee配置

这里就不延时注册Gitee账户了。

在Gitee头像下点击 设置 ,然后在左侧选择 SSH公钥,将生成的公钥粘贴进去,标题会自动识别和生成,使用默认标题即可,最后点击 确定 进行保存。

image-20210902220637986

在Gitee上生成项目

在gitee页面右上角选择那个 + 号,选择里面的 新建仓库

image-20210902222312335

跳转到 新建仓库 仓库页面,填写相关信息即可。

image-20210902222413221

然后在仓库页面的 克隆/下载 处选择 HTTPS 源 并 复制

image-20210902222531450

绑定VSCode

在本地新建文件夹,命名和存储路径随意。

image-20210902222116108

然后使用VSCode打开该文件夹,如下:

image-20210902222631177

点选左侧树杈型图标,选择 初始化存储库

image-20210902222655162

在上方 ... 处选择 远程添加远程仓库

image-20210902223026835

粘贴刚刚复制过来的仓库地址。

image-20210902223107646

填写远程存储库名称,就是仓库名称。

image-20210902223222009

VSCode右下角会出现如下提示,选择

image-20210902223253826

正常来说点选 拉取 也是直接可以拉取到远程数据的,但是也可能因为配置错误导致拉取失败,出现如下提示。

image-20210902223319460
image-20210902224720818

配置本地git参数

如果拉取不成功,仍需要配置以下信息:

1
2
git config --global user.name "xxxx"
git config --global user.email xxxx@xxx.com

其中xxxx需要替换成个人在gitee网站的用户名和对应的邮箱,如下:

image-20210902224904264

拉取仓库文件

如果仍然无法拉取仓库文件,可以在VSCode下按 CTRL + JCOMMAND + J 来打开,然后输入如下命令进行 拉取,命令中对应的源需要替换。

1
git pull https://gitee.com/xxxx/xxxx.git master

拉取完后如下所示:

image-20210902225228260
image-20210902225338842

可靠性概论

只有在图纸设计阶段就考虑到使用场景时遇到的问题,再按图生产,才能制造出合格的产品。

  • 1950年12月7日,美国电子设备可靠性专门委员会成立。
  • 1952年8月21日,电子设备可靠性咨询组(AGREE)成立。
  • 1953年,美国兰德公司给出衡量武器系统优劣的七项参数:性能、可靠性、精度、易损性、可操作性、维修性和可用性。
  • 1957年6月,AGREE发表《军用电子设备可靠性》研究报告。

可靠性工程这门学科被认为是自1957年问世的。

1957年6月,AGREE发表的《军用电子设备可靠性》研究报告中,提出一套可靠性设计、试验及管理方法,形成了一套完善的可靠性设计、试验和管理标准。并在新一代产品的研制中,逐渐制定了较为完善的可靠性大纲,规定了定量的可靠性要求,进行了可靠性分配及预计、故障模式及影响分析(FMEA)和故障树分析(FTA),采用了冗余设计,开展了可靠性鉴定试验、验收试验和老炼试验,进行了可靠性评审等。

  • 1970年代,可靠性发展步入成熟阶段。
  • 1980年,美国国防部颁布《(D0DD 5000.40)可靠性及维修性》。
  • 1985年,美国空军推行“可靠性及维修性2000年行动计划”(R&M2000),提出了“可靠性翻一番,维修性减半”的目标。

可靠性定义

可靠性 是指产品在 规定条件下规定时间内完成规定功能 的能力。

维修性 是指产品在 规定条件下规定时间内,按规定的程序和方法维修时,保持或恢复到规定功能 的能力。

三个时间点

如果将产品比作人,那么产品从被研发、生产、出厂、使用到寿命终结的阶段,就好比人受精、怀胎、分娩、成长到死亡的阶段。将整个过程看做一个时间轴 $ t $ , 那么其中的产品出厂(人的分娩)的时间就为 $ t=0 $,产品被研发和生产(人的受精、怀胎)的阶段,其时间被视为 \(t<0\)​, 产品被使用到寿命终结(人的成长到死亡)的阶段,其时间被视为 \(t>0\)​ 。这种方法是将产品简单划为三个时间点,例如在 \(t<0\)​ 时,研发和预制是两个不同的工作内容或阶段。

三个阶段

实际上,\(t=0\)​ 仅仅是个时间点,在可靠性研究过程中,产品寿命周期通常是按以下三个阶段进行研究:研发阶段\(t<0\)​)、生产制造阶段\(t<0\)​)和 使用至报废阶段\(t>0\)​)。

图1-1 质量与可靠性关系示意图
表 质量、可靠性与时间三者的关系
质量的度量
t = 0
出厂时间
使用产品合格率进行度量
t < 0
研制阶段
提高 制造过程 中的一致性和稳定性,以降低不合格率
t > 0
使用阶段

可靠性数学基础

所有可观测的现象包括 自然现象社会现象,按照结果的确定性对此类现象进行分类可以分为:确定现象不确定现象

1
2
3
4
graph LR
现象 --结果确定--> 确定现象
现象 --结果不确定--> 不确定现象 --具有统计规律--> 随机现象
不确定现象 --不具有统计规律--> 未知

随机

概念 定义 特点
随机现象 具有统计规律性的 不确定现象 - 描述 过程/现象可能性
随机事件 随机现象的某种 可能结果 - 描述 结果可能性
- 具有不可确定性,即事件真正发生之前不能确定其是否出现。
随机试验 研究随机现象中各种 可能发生的结果的过程 - 描述 研究结果可能性的过程
- 试验全部可能结果的集合可确定
- 试验条件不变的情况下,试验可以无限重复
- 试验的结果以随机的形式发生(实验条件相同,结果可能不同)

随机现象之所以称之为随机现象,是因为现象发生后具有1个以上的可能结果,如果仅有1种结果,则可以称之现象和事件为 确定现象确定事件

例如:

小球会落入某个洞口,小球的总数为2,小球落入洞口的现象是可观察可统计的,但小球确实地落在哪个洞口中具有不确定性,称之为现象。

但小球落入到洞口A或者洞口B,是可以预测到的结果,落入洞口A则称之为事件A,落入洞口B则称之为事件B,总称之为事件。

频率/概率

每一种随机现象的试验结果用 事件 一词来描述,则随机事件有可能在一次试验中可能发生,也可能不发生,其事件的发生可能性使用 频率概率 来度量。

在相同试验条件下,进行 \(n\) 次试验,事件A的出现次数 \(m\) 称之为 频数 ,使用 试验总次数 \(n\)事件A的频数 \(m\)​ 来表示 事件A在所有试验下的 频率 \(P^*(A)\)\[ P^*(A)={m\over n} \tag{频率公式} \]

频率频数频次 等术语在描述或者度量事件发生的可能性大小时,会因试验总次数太低 或 某个随机事件出现的次数具有波动性而导致不合理,就连以上三个词汇本身在描述时含有一定的随机性。

但在 大量重复 某一试验时,频率趋于稳定,此时该稳定值可以称之为随机事件的 概率统计概率,使用 \(P(A)\) 表示。

即,概率频率 两个词汇在描述随机试验中的事件时,最大的区别在于该事件频率值是否趋于 稳定,或者试验本身的总次数是否已经 足够大

频率 概率
数学符号 \(P^*(A)\) \(P(A)\)
特点 - 试验值,具有波动性
- 近似反映 事件发生的可能性大小
- 理论值,由事件的本质属性决定
- 精确反映 事件的可能性大小

概率分布

常用的分布函数由:两点分布、二项分布泊松分布、均匀分布、正态分布对数正态分布指数分布威布尔分布 等。

随机变量按照试验结果的值是否有限或连续可以分为:离散型随机变量连续型随机变量,其中离散型随机变量在可靠性工程中常见的统计分布类型有 二项分布泊松分布;连续型随机变量在可靠性工程中常见的统计分布类型有: 指数分布正态分布对数正态分布威布尔分布

1
2
3
4
5
6
7
8
9
graph LR
id1[随机变量] --试验结果的值有限--> id2[离散型随机变量]
id1 --试验结果的值连续--> id3[连续型随机变量]
id2 --> 二项分布
id2 --> 泊松分布
id3 --> 正态分布
id3 --> 对数正态分布
id3 --> 指数分布
id3 --> 威布尔分布γ=0
离散型随机变量 连续型随机变量
可能取值范围 可能取值有限 给定区间(或无限区间)内可取得任意数值
可能取值符号 \(x_1, x_2,x_3...x_n\) [0,∞)
概率函数/分布律
某点的概率
\(P(X=x_i)=p_i,(i=1,2,3 ... n)\) /
概率密度函数
概率在点的变化率
/ \(f(x)=F'(x)={dF(x)\over dx}\)
概率分布函数/累积概率函数
区间内的概率之和
\(F(x)=P(X≤x)=\sum_{x_k≤x}p_k\)​​​ \(F(x)=P(X≤x)\)
性质 - 任意取值变量的概率都在 [0,1) 之间:\(0≤P(X=x_i)=p_i<1\)​​
- 所有事件概率总和为 1\(\sum^n_{i=1}p_i=1\)

概率密度函数概率分布 反映了随机变量的统计规律。概率密度函数值反映了概率在该点的变化率,而非该点的概率。

以下需要区分几个概念,什么是 故障概率函数故障率函数故障概率密度函数故障密度函数可靠度函数

故障概率函数,也称为 故障率函数,即 失败概率函数,用事件的失败概率进行求解。

故障概率密度函数,即适用于 连续型随机变量的故障概率函数。

在连续型统计分布中,故障密度函数 = 可靠度函数 * 故障率函数

离散型随机变量分布

(故障)概率函数 (故障)(累积)概率分布函数 均值 \(\mu\) 方差 \(\sigma^2\)
二项分布 \(P(x)=C^x_np^xq^{n-x}\)​​
\(C^x_n = {n!\over x!(n-x)!}\)
\(F(x)=\sum ^r_{x=0} C^x_n p^x q^{n-x}\)
\(C^x_n = {n!\over x!(n-x)!}\)
\(np\) \(npq\)
泊松分布 \(P(x)={(np)^x \over x!}e^{-np}\) \(F(x) = \sum ^r_{x=0} {(np)^x \over x!}e^{-np}\) \(\lambda\)
\(\lambda = np\)
\(\lambda\)
  • \(n\)​ 为 样本量,即抽取样本总数
  • \(x\)\(r\) ​均为失败数,即抽取样本总数下失败的数量
  • \(p\) 为 失败概率
  • \(q\) 为 成功概率

需要注意\(C^x_n = {n!\over x!(n-x)!}\)​​​ ,是为 总试验次数的累乘(阶乘)与 (成功次数的累乘失败次数的累乘 之积) 的商。

二项分布

贝努力试验:随机变量的基本结果只有两种(成功/失败)的试验。

N重贝努力试验:随机现象是由N次相同的贝努力试验组成,每次试验结果 只有两种互不影响

例题 2-1

某新产品在规定的生产条件下废品率为 0.2 ,从批量较大的产品中随机抽取出 20 个,有 \(r\)\(r=0,1,2...,10\))个废品的概率是多少?

:已知某新产品的的废品与否,可以分为两种独立事件:成功失败(废品)。且单个产品是否成功或失败不影响下一个产品,即符合N重贝努力试验的要求。使用二项分布概率公式 \(P(x)=C^x_np^xq^{n-x}\)​ 代入,随机抽取的20个产品即为 \(n\)\(p\) 为失败的概率,即题目中的 0.220%\(x\) 则为抽取总数 20 下的失败产品数量,代入可得: \[ P(X=r)=C^r_{20}0.2^r(1-0.2)^{20-r},r=0,1,2,3...10 \tag{例2-1} \]

泊松分布

二项分布和泊松分布是不一样的。虽然都是离散型随机变量的分布类型,但是 二项分布适用于抽样总数小于 20 且 失败概率大于 0.05 的情况,当抽样数无限大时,使用二项分布公式进行求解计算不了,代码中会出现 -nan 关键字,此时泊松分布可以轻松计算,因此,泊松分布被认为是二项分布在大抽样数下的扩展

反之,如果将适用于二项分布的数据代入泊松分布公式,虽然能够计算,但是可能会获得异常数据。

即,虽然人为泊松分布是二项分布的在大抽样数下的扩展,但是毕竟公式和理念都不一样,不能够用来互相验证。

image-20210902105513439
image-20210902105540683

例题 2-2

控制台指示灯平均失效率为每小时 0.001 次。如果指示灯的失效数不能超过 2 个,该控制台指示灯工作 500 小时的可靠度是多少?

:结合上方题目和泊松分布的概率公式 \(P(x)={(np)^x \over x!}e^{-np}\) 可知,每小时平均失效率即为 失败概率 \(p\) ,工作时长500个小时即为抽样总数 \(n\) ,而失效灯数不能超过 2 个即为失败数 x ,代入公式可得: \[ P(x) = {(500·0.001)^x \over x!} ·e^{-500*0.001} = {0.5^x \over x!} ·e^{-0.5} \tag{例2-2 概率函数} \] 然后求的其 \(P(0) + P(1) +P(2)\) 之和: \[ F(2) = \sum^2_{0}P(x) = {0.5^0 \over 0!} ·e^{-0.5} + {0.5^1 \over 1!} ·e^{-0.5} +{0.5^2 \over 2!} ·e^{-0.5} = 1.625*0.606530 = 0.9856 \tag{例2-2 累积概率分布函数} \]

连续型随机变量分布

分布形式 故障密度函数 \(f(x)\) 可靠度函数 \(R(x)\) 故障率函数 \(\lambda(x)\)​​
正态分布 \(\frac{1}{\sigma\sqrt{2\pi}}e^{-{(x-\mu)^2}/{2\sigma^2}}\)​​ \(\frac{1}{\sigma\sqrt{2\pi}}\int_x^\infin e^{-{(x-\mu)^2}/{2\sigma^2}} dt\) \(e^{-(x-\mu)^2/(2\sigma)^2} / \int ^\infin _x e^{-(x-\mu)^2/(2\sigma)^2} dt\)
对数正态分布 \(\frac{1}{x\sigma\sqrt{2\pi}}e^{-(lnx-\mu)^2/2\sigma^2}\) \(\frac{1}{\sigma\sqrt{2\pi}}\int_x^\infin \frac{1}{t}e^{-(lnt-\mu)^2/2\sigma^2} dt\)​​ \(\frac{1}{x}e^{-(lnt-\mu)^2/(2\sigma)^2}/ \int_x^\infin \frac{1}{t}e^{-(lnt-\mu)^2/(2\sigma)^2} dt\)​​
指数分布 \(λe^{-λx}\) \(e^{-λx}\) \(λ\)
威布尔分布 $(){m-1}e{-(x/)^m} $​​ \(e^{-(x/\eta)^m}\) \(\frac{m}{\eta}(\frac{x}{\eta})^{m-1}\)

正态分布

在数学上,正态分布(Normal Distribution)利用 均值 \(\mu\)​ 和 方差 \(\sigma^2\)​ 记为 \(\Nu(\mu, \sigma^2)\)​​ 。

标准正态分布:正态分布曲线的 均值 为0,标准差 为1的正态分布,即 \(\mu = 0, \sigma = 1\)​。

一般正态分布:除标准正态分布以外的正态分布。任何正态分布都可以使用标准正态分布来计算。

一般正态分布

正态分布的密度函数 \(f(x)\) 为: \[ \varphi(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-{(x-\mu)^2}/{2\sigma^2}} \tag{正态密度函数} \] 正态分布的可靠度函数 \(R(x)\) 为: \[ R(x) = \frac{1}{\sigma\sqrt{2\pi}}\int_x^\infin e^{-{(x-\mu)^2}/{2\sigma^2}} dt \tag{正态可靠度函数} \]

标准正态分布

标准正态分布以下简称标正,由于标正的均值为0,标准差为1,即 \(\mu = 0, \sigma = 1\) ,代入对应公式可得 标正密度函数 记为 \(\varphi(z)\)标正累积分布函数 记为 \(\Phi(z)\)​ ,分别如下: \[ \varphi(z) = \frac{1}{\sqrt{2\pi}} e^{-z^2/2} \tag{标正密度函数} \]

\[ \Phi(z) = \int^z_{-\infin} \varphi(z) \ dz = \frac{1}{\sqrt{2\pi}} \int^z_{-\infin} e^{-z^2/2} \ dz \tag{标正累积分布函数} \]

image-20210903143312170image-20210903144047691
图 标准正态分布密度函数曲线 及 累积曲线

正态分布的 可靠度函数 为: \[ R(t) = 1-\Phi(\frac{t-\mu}{\sigma}) \tag{正态可靠度函数} \]

image-20210903145950111
图 标准正态分布可靠度函数曲线

总结成下表:

密度函数 累积分布函数 可靠度函数
一般正态 \(\varphi(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-{(x-\mu)^2}/{2\sigma^2}}\) \(\Phi(x) = \frac{1}{\sigma\sqrt{2\pi}} \int^x_{-\infin} e^{-{(x-\mu)^2}/{2\sigma^2}} \ dx\)​​ \(R(x) = \frac{1}{\sigma\sqrt{2\pi}}\int_x^\infin e^{-{(x-\mu)^2}/{2\sigma^2}}\)
标准正态 \(\varphi(z) = \frac{1}{\sqrt{2\pi}} e^{-z^2/2}\) \(\Phi(z) = \int^z_{-\infin} \varphi(z) \ dz = \frac{1}{\sqrt{2\pi}} \int^z_{-\infin} e^{-z^2/2} \ dz\) \(R(t) = 1-\Phi(\frac{t-\mu}{\sigma})\)

正态分布的重要参数有以下几个:

  1. 工作时长 \(x\)
  2. 均值 \(\mu\)
  3. 标准差 \(\sigma\)

需要注意的是

  • 一般正态密度函数 的符号记为 \(f(x)\)​ ,标准正态密度函数 的符号记为小写的希腊字母 \(\varphi(z)\)​。
  • 一般其他分布的 累积分布函数 为 大写的 \(F(x)\)
  • 标正累积分布函数 的符号记为大写的希腊字母 \(\Phi(z)\)​​​​ ,与 标正密度函数 的符号发音一致,标正累积分布函数的值计算较为麻烦,可以通过查表获得
  • 就标正比较特殊,需要全部用希腊字母
  • 因为 标正累积分布函数标正可靠度函数 的曲线互为水平翻转。

例题 2-3

假设发电机的寿命服从正态分布,其均值为300小时,标准差为40小时。试求当工作时间为250小时时,发电机的可靠度是多少?

:已知均值 \(u = 300\) ,标准差 \(\sigma = 40\) 且 工作时长为 250 小时,可代入正态可靠度函数进行求解,如下: \[ R(t) = 1- \Phi(\frac{t-\mu}{\sigma}) = 1-\Phi(\frac{250-300}{40}) = 1 - \Phi(-1.25) \tag{例2-3 正态分布可靠度函数} \] 其中,\(\Phi(-1.25)\)​​ 和 \(\Phi(1.25)\)​​ 互补(和为 1),可以通过查询标准正态累积分布表 或使用 自行编写的函数进行计算,可得 \(\Phi(1.25) = 0.89\)​​ ,则发电机的可靠度为: \[ R(250) = 1-(1-\Phi(1.25)) = 1 - (1-0.89) = 0.89 \tag{例2-3 可靠度计算} \]

正态分布的特性
  1. \(\Phi(x)\)\(\Phi(-x)\)互补关系,即 \(\Phi(x) + \Phi(-x) =1\)
  2. 标准正态分布 下,可靠度累积分布值 互补为1, \(R(t) = 1-\Phi(t)\)​,在 一般正态分布 下,需要注意加入 均值 \(\mu\)标准差\(\sigma\)​​ 。
正态分布的用途

在可靠性工程中,正态分布具有以下三种用途:

  1. 分析由于磨损发生故障的产品,如机械装置。
  2. 对制造的产品及其性能是否符合规范进行分析。
  3. 用于机械可靠性概率设计。

对数正态分布

对数正态分布(Logarithmic Normal Distribution) 是 正态分布随机变量的 自然对数 \(y = ln(x)\)​​​​ ,记为 \(LN(\mu, \sigma^2)\)​​​​​​。

特点:使用 对数正态分布 的对数变换 可以使得较大的数缩小为较小的数,且越大的数缩小的越明显。好处是使得较为分散的数据通过对数变换后,可以相对地集中起来,所以常把 跨几个数量级的数据用对数正态分布区拟合(如下方例题2-4)。

适用产品/场景半导体器件 的可靠性分析、机械零件 的疲劳寿命分析 或 在 维修性分析 中对维修时间数据的分析。

对数正态分布的密度函数如下,需要注意,该函数的取值范围为 \([0,\infin)\)\[ f(x)=\frac{1}{x\sigma\sqrt{2\pi}}e^{-(lnx-\mu)^2/2\sigma^2}\tag{对数正态分布密度函数} \]

image-20210903171208666image-20210903170823326
图 标准对数正态分布密度函数曲线 及 累积曲线

注意:应该是没有标准对数正态分布的吧,就代入 \(\mu = 0, \sigma = 1\)​ 进行计算求得图像

对数正态累积分布函数如下: \[ F(x) = \frac{1}{\sigma \sqrt{2\pi}} \int^x_0 \frac{1}{t} e^{-{(lnt-\mu)^2}/{2\sigma^2}} \ dt \tag{对数正态累积分布函数} \] 其可靠度函数如下: \[ R(x) = 1 - \Phi(\frac{ln(x)-\mu}{\sigma}) \tag{对数正态分布可靠度函数} \] 其中,\(ln(x)\)​​ 和 \(x\)​​ 的均值和方差如下:

均值 方差
\(ln(x)\) \(\mu\) \(\sigma^2\)
\(x\) \(E(x)=exp(\mu + \frac{\sigma^2}{2})\) \(Var(x)=exp(2\mu + \sigma^2) · [exp(\sigma^2)-1]\)

对数正态分布的重要参数有以下几个:

  1. 工作时长 \(x\)
  2. 均值 \(\mu\)
  3. 标准差 \(\sigma\)

例题 2-4

假设人们观察到炮管寿命服从对数正态分布,\(\mu = 9,\sigma = 2\)。(注意,\(\mu\)\(\sigma\)\(ln(x)\) 的均值和标准差)求发射1000发炮弹时的可靠度。

情况一:已知对数正态分布可靠度表格

在已知表格时,直接代入公式,然后查表计算即可。 \[ R(1000)=1-\Phi(\frac{ln1000-9}{2}) = 1-\Phi(-1.046) = 1-0.15 = 0.85 \tag{例2-4 可靠度计算} \] 情况二:未知对数正态分布可靠度表格

在没有对数正态分布可靠度值表格可查询的情况下,是没有办法直接得出答案的。正常的思路如下:

  1. \(\mu=9, \sigma=2\) 代入密度公式 \(f(x)\)
  2. 然后在区间 \((0,1000]\)​ 内进行积分,通过累计分布函数 \(\Phi(1000)\) ,可以得到其特定区间内的累积分布值。
  3. 然后使用 1 减去该累积分布值即可获得该可靠度值 \(R(1000)\)
image-20210903165737856image-20210903165632407
图 例题的对数正态累积分布曲线和可靠度曲线

上面两个图片是经由C++函数计算并使用gnuplot进行绘制的,实际计算得到本例题的 \(\Phi(1000) = 0.14781, R(1000)= 0.85219\)

无聊着又稍微拟合了该产品在工作到 100,000 小时时的 可靠度曲线 和 工作到 10,000 小时时的 密度曲线

image-20210903172937541image-20210903195121209
图 工作到10万小时的炮管的可靠度曲线 和 工作到1万小时的炮管的密度曲线

指数分布

指数分布(Exponential Distribution) 是可靠性工程中最重要的一种分布。

当产品工作进入浴盆曲线的偶然故障期后,产品的故障率基本接近常数,其对应的故障分布函数就是指数分布。

优点

  • 参数估计简单容易,只有一个变量;
  • 在数学上非常容易处理;
  • 适用范围非常广;
  • 大量指数分布的独立变量之和还是指数分布,具有可加性。

性质

  • 指数分布的失效率 \(\lambda\) 等于 常数
  • 指数分布的 平均寿命 \(\theta\)失效率 \(\lambda\) 互为倒数,即 \(\theta = 1/\lambda\)
  • 指数分布“无记忆性”。(无记忆性 是指故障分布为指数分布的系统的失效率,在任何时刻都与系统已工作过的时间长短没有关系。)

指数分布的密度函数如下: \[ f(x) = \left\{ \displaylines{\lambda e^{-\lambda x}, x ≥ 0\\ 0,x < 0} \right. \tag{指数分布密度函数} \] 其累积失效分布函数为: \[ F(x) = 1 - e^{-\lambda x} \tag{指数累积分布函数} \] 其可靠度函数为: \[ R(x)=e^{-\lambda x} \tag{指数分布可靠度函数} \]

image-20210903190717009image-20210903191446082
图 故障率为100 和 故障率为0.01的指数分布密度函数曲线

上图为错误例子啊,因为故障率 \(\lambda = 100\)​​​ 时已经高得离谱,且故障率和平均工作时长是呈反比的,故障率为 100 的话,就是说大概只能工作 0.01 小时(大概 36 s),所以会看到该 密度曲线 在x轴没到0.1就飞降。把故障率修改为 0.01,即大概能工作100个小时,就可以看到较为 正常 的密度曲线了。

如果要求其可靠度曲线,则用 密度值 \(F(x)\) 除以 故障率 \(\lambda\)​ 即可,曲线如下:

image-20210903193144464
图 故障率为0.01的指数分布可靠度函数曲线

例题 2-5

机载火控系统的平均故障间隔时间是 100 小时,即 \(\theta = 100\)​ 小时,工作5小时不发生故障的概率是多少?

:由题目已知 \(\theta = 100\) , 即 \(\lambda = 0.01\) ,要求的是工作5小时不发生故障的概率,即求可靠度。

代入指数分布可靠度公式 \(R(x)=e^{-\lambda x}\) 即可求得 0.951229,即 95.12%

威布尔分布

威布尔分布(Weibull Distribution)是由 最弱环节模型 导出的,如链条的寿命就服从威布尔分布。

威布尔分布 是 通用分布 ,通过调整分布参数可以构成各种不同的分布,可以为各种不同类型的产品的寿命特性建立模型。

威布尔分布既包括 故障率 为常数的模型,也包括故障率随时间变化的 递减(早期故障)和 递增(损耗故障)模型,因而可以描述更为复杂的失效过程。许多产品的故障率是单调递增的,威布尔分布可以很好地描述产品疲劳、磨损等损耗故障。

两参数公式 三参数公式
概率密度函数 \(f(t)=\frac{m}{\eta}(\frac{t}{\eta})^{m-1}exp[-(\frac{t}{\eta})^m]\) \(f(t)=\frac{m}{\eta}(\frac{t-\gamma}{\eta})^{m-1}exp[-(\frac{t-\gamma}{\eta})^m]\)
累积分布函数 \(F(t)=1-exp[-(\frac{t}{\eta})^m]\) \(F(t)=1-exp[-(\frac{t-\gamma}{\eta})^m]\)
可靠度函数 \(R(t)=exp[-(\frac{t}{\eta})^m]\) \(R(t)=exp[-(\frac{t-\gamma}{\eta})^m]\)
故障率函数 \(\lambda(t)=\frac{m}{\eta}(\frac{t}{\eta})^{m-1}\) \(\lambda(t)=\frac{m}{\eta}(\frac{t-\gamma}{\eta})^{m-1}\)

威布尔分布的重要参数有以下几个:

  1. 随机变量 \(t\)\(t≥0\)(两参数),\(t≥\gamma\)​(三参数)
  2. 无量纲 形状参数 \(m,\ m>0\)​​
  3. 尺度参数 \(\eta,\ \eta>0\)​​
  4. 位置参数 \(\gamma, \ \gamma>0\)

除形状参数 \(m\) 以外,其他参数单位相同。

例题 2-6

人们发现某种特定的发射管的失效时间服从威布尔分布,其中 \(m=2, \eta = 1000\) 小时,试确定当任务时间为100小时时这种发射管的可靠度。

威布尔分布除了时间 \(t\) 以外,就只剩下三个参数,而题目中并无使用位置参数 \(\gamma\) ,因此直接代入可靠度公式进行求解即可: \[ R(x) =exp[-(\frac{t-\gamma}{\eta})^m] = e^{-(t/\eta)^m} \tag{例2-6 可靠度求解} \] 得到该产品在工作时长为100小时时的可靠度为: \[ R(100) = e^{-(100/1000)^2} = e^{-0.01} = 0.990049 ≈ 99\% \]

使用C++驱动GNUPLOT拟合该曲线至 \(t=3000\)​​ 时的 可靠度曲线累积曲线 如下:

image-20210903201848206image-20210903203111178
图 例题2-6 威布尔分布的 可靠度曲线 和 累积曲线

参数估计

可靠性工程中,数理统计 是进行数据整理和分析的基础,其基本内容是统计推断

随机变量的概率分布虽然能很好地描述随机分布,但是通常不能对研究对象的总体都进行观测和试验,只能从中随机地抽取一部分子样进行观察和试验,获得必要的数据,对齐进行分析处理,然后对总体的 分布类型参数 进行推断。

抽样相关概念

总体:也称为 母体,研究对象的全体。

个体:组成总体的每个基本单元。

样本:也称为 子样,在总体中随机抽取的部分个体。

样本值:在每次抽样后测得的具体数值(记为 \(x_1, x_2, x_3 ... x_n\))。

样本容量:样本所包含的个体数目(记为 \(n\))。

随机抽样:不掺入人为主观因素而具有随机性的抽样,即具有 代表性独立性 的抽样。

样本统计量:是指子样 \(x_1, x_2, ..., x_n\) 是从母体 \(X\) 中随机抽取出来后,进一步提炼和加工后的统计量,如 均值 \(\overline x\)方差 \(S^2\)极差 \(R\)​​

子样之所以很宝贵,是因为包含了母体的各种信息,尚未对子样进一步提炼和加工处理前,母体的各种信息仍分散在子样中,子样经过加工成一些统计量之后可以反映出一些信息,如:均值 反映了母体数学期望信息,方差 反映了母体方差信息,极差 粗略地反映了母体分散程度,但不能直接用于估计母体的方差。下方为统计量的一些概念。

统计量相关概念

均值:反映了母体数学期望的信息,表示为 \(\overline x =\frac{1}{n} \sum^n_{i=1}x_i\)​​

平均差:平均差是表示各个变量值之间差异程度的数值之一。指各个变量值同平均数的离差绝对值的算术平均数。

方差:方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,表示为 \(S^2=\frac{1}{n-1}\sum ^n_{i=1}(x_i-\overline x)^2\)​ 。

标准差:是离均差平方的算术平均数的平方根,是方差的算术平方根,表示为 \(\sigma=\sqrt{S^2}\)

极差:极差又称范围误差或全距(Range),以 \(R\)​ 表示,是用来表示统计资料中的变异量数(measures of variation),其最大值与最小值之间的差距,即最大值减最小值后所得之数据。是指一组数据内的最大值和最小值之间的差异,表示为 \(R=max(x_1,x_2, ..., x_n)-min(x1, x2, ..., xn)\)

分布参数的点估计

如果 \(X\) 是一个具有概率分布 \(f(x)\) 的随机变量,样本容量为 \(n\),样本值为 \(x_1, x_2, ..., x_n\) ,则与其位置参数 \(\theta\) 相应的统计量 \(\hat{\theta }\) 的估计值。

此处,\(\hat{\theta}\) 是一个随机变量,因为它是样本数据的函数。在样本已经选好之后,就能得到一个确定的 \(\hat{\theta}\) 值,就是 \(\theta\) 的点估计。

点估计的解析法

在点估计的解析法中,有很多方法可以选择,如 矩法、最小二乘法、极大似然法、最好线性无偏估计、最好线性不变估计、简单线性无偏估计 和 不变估计。以上方法的特点如下:

  • 矩法只适用于完全样本;
  • 最好线性无偏估计 和 不变估计 已有国家标准《GB 2689.4-1981 寿命试验和加速寿命试验的最好线性无偏估计法(用于威布尔分布)》,但只适用于定数截尾情况,在一定样本量下有专用表格;
  • 极大似然法和最小二乘法适用于所有情况,极大似然法是精度最好的方法。
极大似然法

极大似然估计(Maximum Likelihood Estimate, MLE)是一种重要的估计方法,利用总体分布函数表达式及样本数据两种信息来建立似然函数。

特点:具有一致性、有效性 和 渐近无偏性 等优良性质。

缺点:求解方法最为复杂,需要用迭代法并借助计算机求解。

分布参数的区间估计

区间估计:在实际问题中,对于未知参数 \(\theta\) ,并不一定求出其点估计值 \(\hat{\theta}\) 为满足,仍希望求出其范围,并希望知道该范围包含未制参数 \(\theta\) 真值的置信概率的估计。

置信区间:表示计算估计的精确程度

置信度:是样品的试验结果在母体的概率分布参数(如均值或标准差)的某个区间内出现的概率,表示结果的可信性。

与置信度不同,可靠度 是指 样品在规定条件下和规定时间内正常工作的概率,反映的是产品本身的质量状况。

可靠性设计与分析

Gitee项目分享

适用于《可靠性工程师手册》的数学函数已经开源共享至Gitee,依托于 GNUPLOT 的图形绘制能力,可以轻松查看各种函数的曲线形状,十分方便。

Math-For-Reliability

在Gitee上的开源项目,开放给所有学习可靠性的人使用。

Gitee项目地址:https://gitee.com/tonyliew/math-for-reliability

DEBUG_RECORDS

20210902-01

在Linux上运行标准正态累积分布计算函数,其计算结果与标准正态分布表方向相反了。\(x = 0\)​​ 时的 \(\Phi(x)\)​​ 值本应为0.5,结果和 \(x = 5\)​​ 时的 \(\Phi(x)\)​​​​ 值相反。

image-20210902193634846

一番检查发现积分函数可能不适用

image-20210902194119411

经过“校准”一番,终于修改好了,不知道还会不会卡Bug。

image-20210902194157770

目前可以计算x值为正时的累积分布值,结果与标准正态分布表一致。

image-20210902194241093

重新解答完 2-3例题,发现知道了修改bug的方法,也只是补上了而已,哈哈哈哈。

image-20210902200537224

经过验证,结果正确。

image-20210902200910935

9月3日订正,为了生成标准正态累积分布的图形,发现带负号的 integral() 函数生成曲线时是 水平翻转 的。

image-20210903144047691image-20210903145950111
图 标准正态分布的 累积(故障)函数曲线 和 可靠度函数曲线 互为水平翻转

仔细思考后发现,标准正态函数下,可靠度曲线值 是和 累积分布函数曲线 值各点互补为 1 的,很容易将累积分布函数和可靠度函数互相搞混,因此其图像才会互为 水平翻转,修改后的标正累积分布函数代码如下:

image-20210903144813581

参考

  1. 《可靠性工程师手册(第二版)》中国人名大学出版社 李良巧主编
  2. 概率分布函数、概率密度函数

[TOC]

公式书写

Typora虽然是支持Markdown出名,但是也支持LaTex公式,需要在Typora的设置中打开相关选项

Typora设置

  1. 在Typora的偏好设置 下,选择 Markdown 选项,勾选 內联公式(例:$\LaTeX$) 选项和 自动添加序号 选项(此项可不选)

  2. 在 “当复制或导出为无格式的HTML时” 选择 “使用LaTeX代码

image-20210904111919668

书写方法

设置完毕后,即可进入公式书写。

在使用Typora的Markdown语法来编辑LaTex公式,本身LaTex就与Markdown语法存在一定的冲突,但在Pandoc(Typora使用的效果渲染器)的加持下,显示效果较好,但公式写得多了或者书写过程中可能仍会存在一定的显示延迟(解决办法是:暂时没有)。

以下全程默认使用Typora编辑器。

使用LaTex支持两种书写方式,行模式块模式 ,对应的通用叫法是 内联公式(行内公式,inline) 和 块公式(block)。这里需要一点HTML5的知识,就是该公式是可以被存放在文字中间的,还是独占一行的,存放在文字中间的叫 内联,如 \(f(x)=x^2\) ,独占一行的叫 ,如: \[ f(x)= \lambda e^{-\lambda x} \tag{样例公式} \]

内联公式

书写内联公式时,只需要在同一行文字内书写两个美元符号 $$ ,然后再两个美元符号中间书写内容即可。

尝试复制粘贴右侧文字到typora吧: $f(x)= x^2$

块公式

块公式需要在独占一行时书写 $$,然后按回车键,即可进入块编辑模式,编辑框如下:

image-20210904113516554

不管是内联公式还是快公式都是支持实时编辑和实时显示的。

基础符号

中文 样式 语法
上标 \(X^2\)
\(X^{log(10)}\)
X2
X
{log(10)}
下标 \(X_i\)
\(X_{a-b}\)
X_iX_{a-b}
积分符号 \(\int\) \int
无限 \(\infin\) \infin
平均值符号 \(\overline x\) \overline x
帽子符号 \(\hat{a}\) \hat{a}
\(\widehat{a}\) \widehat{a}
\(\acute{a}\) \acute{a}
\(\grave{a}\) \grave{a}
\(\bar{a}\) \bar{a}
\(\dot{a}\) \dot{a}
\(\ddot{a}\) \ddot{a}
短波浪号 \(\tilde{A_2}\) \tilde{A_2}
长波浪号 \(\widetilde{A_2}\) \widetilde{A_2}
上左箭头 \(\overleftarrow{N}\) \overleftarrow{N}
上右箭头 \(\overrightarrow{N}\) \overrightarrow{N}
下左箭头 \(\underleftarrow{N}\) \underleftarrow{N}
下右箭头 \(\underrightarrow{N}\) \underrightarrow{N}
限制下标 \(\mathop{a}\limits_{i=1}\) \mathop{a}\limits_{i=1}
分子式 \(\frac{1}{2}\) \frac{1}{2}
根号 \(\sqrt{2\pi}\) \sqrt{2\pi}
求和符号 \(\sum\) \sum
三角符号 \(\triangle\) \triangle

块公式样例

直接复制代码框中的内容到typora即可。

样例1

\[ f(x) = \left\{ \displaylines{\lambda e^{-\lambda x}, x ≥ 0\\ 0,x < 0} \right. \tag{指数分布密度函数} \]

1
2
3
4
5
$$
f(x) = \left\{
\displaylines{\lambda e^{-\lambda x}, x ≥ 0\\ 0,x < 0}
\right. \tag{指数分布密度函数}
$$

样例2

\[ F(x) = \frac{1}{\sigma \sqrt{2\pi}} \int^x_0 \frac{1}{t} e^{-{(lnt-\mu)^2}/{2\sigma^2}} \ dt \tag{对数正态累积分布函数} \]

1
2
3
$$
F(x) = \frac{1}{\sigma \sqrt{2\pi}} \int^x_0 \frac{1}{t} e^{-{(lnt-\mu)^2}/{2\sigma^2}} \ dt \tag{对数正态累积分布函数}
$$

样例3

\[ \varphi(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-{(x-\mu)^2}/{2\sigma^2}} \tag{正态密度函数} \]

1
2
3
$$
\varphi(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-{(x-\mu)^2}/{2\sigma^2}} \tag{正态密度函数}
$$

希腊字母

整理了常用的希腊字母及其Latex书写方式。

LaTex书写希腊字母时都是使用 转义字符 进行的,即 \ + 对应的英文

如果需要表现大写希腊字母,则对应英文的首字母大写,否则就用小写。

需要注意的是,epsilonphi 有额外的符号,所以会有额外的写法,如下方表格所示。

序号 大写 LATEX 小写 LATEX 英文 国际音标[推荐] 汉字注音
1 Α $Alpha$ α $alpha$ alpha /'ælfə/ 阿尔法
2 Β $Beta$ β $beta$ beta /'bi:tə/或/'beɪtə/ 贝塔/毕塔
3 Γ $Gamma$ γ $gamma$ gamma /'gæmə/ 伽玛/甘玛
4 Δ $Delta$ δ $delta$ delta /'deltə/ 德尔塔/岱欧塔
5 Ε $Epsilon$ ε $epsilon$ epsilon /'epsɪlɒn/ 艾普西龙
$varepsilon$
6 Ζ $Zeta$ ζ $zeta$ zeta /'zi:tə/ 泽塔
7 Η $Eta$ η $eta$ eta /'i:tə/ 伊塔/诶塔
8 Θ $Theta$ θ $theta$ theta /'θi:tə/ 西塔
9 Ι $Iota$ ι $iota$ iota /aɪ'əʊtə/ 埃欧塔
10 Κ $Kappa$ κ $kappa$ kappa /'kæpə/ 堪帕
11 $Lambda$ λ $lambda$ lambda /'læmdə/ 兰姆达
12 Μ $Mu$ μ $mu$ mu /mju:/ 谬/穆
13 Ν $Nu$ ν $nu$ nu /nju:/ 拗/奴
14 Ξ $Xi$ ξ $xi$ xi 希腊:/ksi/英美:/ˈzaɪ/或/ˈksaɪ/ 可西/赛
15 Ο $Omicron$ ο $omicron$ omicron /əuˈmaikrən/或/ˈɑmɪˌkrɑn/ 欧(阿~)米可荣
16 $Pi$ π $pi$ pi /paɪ/
17 Ρ $Rho$ ρ $rho$ rho /rəʊ/ 柔/若
18 $Sigma$ σ $sigma$ sigma /'sɪɡmə/ 西格玛
19 Τ $Tau$ τ $tau$ tau /tɔ:/或/taʊ/ 套/驼
20 Υ $Upsilon$ υ $upsilon$ upsilon /ˈipsilon/或/ˈʌpsɨlɒn/ 宇(阿~)普西龙
21 Φ $Phi$ φ $varphi$ phi /faɪ/ 弗爱/弗忆
$phi$
22 Χ $chi$ χ $chi$ chi /kaɪ/ 凯/柯义
23 Ψ $Psi$ ψ $psi$ psi /psaɪ/ 赛/普赛/普西
24 Ω $Omega$ ω $omega$ omega /'əʊmɪɡə/或/oʊ'meɡə/ 欧米伽/欧枚嘎

NTC及热敏电阻

NTCNegative Temperature Coefficient)是指 随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料

该类材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷,可制成具有负温度系数(NTC)的热敏电阻。其 电阻率材料常数 随材料成分比例、烧结气氛、烧结温度和结构状态不同而变化。现在还出现了以碳化硅、硒化锡、氮化钽等为代表的非氧化物系NTC热敏电阻材料。

1834年,科学家首次发现了硫化银有 负温度系数 的特性。

1930年,科学家发现氧化亚铜-氧化铜也具有负温度系数的性能,并将之成功地运用在航空仪器的温度补偿电路中。随后,由于晶体管技术的不断发展,热敏电阻器的研究取得重大进展。

1960年研制出了NTC热敏电阻器。NTC热敏电阻器广泛用于测温、控温、温度补偿等方面。

热敏电阻Thermistor)也可作为电子线路元件用于仪表线路温度补偿和温差电偶冷端温度补偿等。利用NTC热敏电阻的自热特性可实现自动增益控制,构成RC振荡器稳幅电路,延迟电路和保护电路。在自热温度远大于环境温度时阻值还与环境的散热条件有关,因此在流速计、流量计、气体分析仪、热导分析中常利用热敏电阻这一特性,制成专用的检测元件。

功率型NTC热敏电阻 多用于电源抑制浪涌。抑制浪涌用NTC热敏电阻器,是一种大功率的圆片式热敏电阻器,常用于有电容器、加热器和马达启动的电子电路中。 在电路电源接通瞬间,电路中会产生比正常工作时高出许多倍的浪涌电流,而NTC热敏电阻器的初始阻值较大,可以抑制电路中过大的电流,从而保护其电源电路及负载。当电路进入正常工作状态时,热敏电阻器由于通过电流而引起阻体温度上升,电阻值下降至很小,不会影响电路的正常工作。

B值特性

热敏电阻的 B值(B-value) 是NTC的属性之一,B值简单的说就是 材料系数Material Coefficient)。

相同温度区间不同的B值,说明材料可能不一样,因为NTC热敏电阻是负温度系数温度升高阻值成规律下降,B值代表曲线的弯曲程度或者说温度的敏感指数,单位温度变化的时候阻值增幅程度就代表B值。

通俗的说,即当温度降低,阻值曲线发生变化时会陡一点还是平一点。一般来说B值越大曲线越陡,当曲线越陡说明电阻值的变化就越大,相对来说就灵敏些;B值越小曲线越平,当曲线越平说明电阻值的变化就没那么大,相对来说阻值温度系数也就越小。

注意:B值是 经由人为计算出来的 逼近某款热敏电阻 在某个温度区间内的 温度阻值特性曲线的 常数/系数。

因为B值反映的是 两个温度点之间 的阻值变化规律,可以用以下公式来计算,以每摄氏度的百分比 %/°C​​ 为单位。 \[ B = {ln(R_{T1}) - ln(R_{T2})\over {1 \over {T_1}} -{ 1 \over T_2}} \]

$ R1 $ 或 $ RT1 $:温度T1的时候零功率电阻值

$ R2 $​ 或 $ RT2 $​​:温度T2的时候零功率电阻值

T1 = 273.15 k + (T1℃)

T2 = 273.15 k + (T2℃)

除非特别指出,B值通常是在[25, 50]这个温度范围中进行测量,由 T1 = 25℃(298.15K)T2 = 50℃(323.15K) 时的零功率电阻值计算而得。

根据式1,若已知B值的情况下,可以得出目标温度对应的阻值,如下式2: \[ R_{T2} = R_{T1} * e^{B * ({1 \over T_2} - {1 \over T_1})} \]

e = 2.718281828459045

温度系数

NTC热敏电阻的 温度系数 定义为 相对于温度变化的阻值的相对变化。计算NTC 热敏电阻温度系数 的最简单转换公式如下: \[ α = {-β \over T^2} \]

β:B常数

T:25摄氏度时的电阻值

最终结果之所以带上负号,因为是“负温度系数”啊,不带的话就是“正温度系数”。

阻值特性表

厂家在提供热敏电阻电气特性时都会给出B值,但并不是是就不需要阻值特性表了。

使用B值并能够推算出全部想要的温度阻值,因为B值所描述的是某个温度区间内的温度和阻值关系,而热敏电阻所呈现的是温度与阻值的非线性关系,也就是说这种关系没法通过B值和公式准确描述全部温度区间的阻值关系。否则一旦不同厂家的热敏电阻其B值相同,用公式来推导那岂不是阻值全是一样。

image-20210821102248552
某温度-阻值特性表示例

例如,[-25℃ ~ 50℃]内的B值已给出,意思就是说在25~50度这个区间用公式是完全没有问题的,超出这个范围,那么B值是不同的,所以不在这个范围用公式得出的阻值也是不对的。

如下图所示,为三款B值相同的热敏电阻,然而其阻值却不同。由此可知,B值只是一个针对每款热敏电阻的某区间参数,它只反应此热敏电阻的部分特性,并不是一个严谨的参数,在实际应用中,需要提供检测温度范围内的阻值表才是正确的做法。

热敏电阻应用详解

B值的范围一般在1800K ~ 5800k,其测温点范围通常为 [25, 50]、[25, 85]、 [0, 100] 或 [0, 50],部分厂家可以提供特殊NTC热敏电阻 B值的定制

案例

假设客户订购10,000 W热敏电阻,其热敏电阻的精度为±0.5°C。部件号为MF52A-103,B值为3950 K.25°C(298.15 K)。

根据 式3 求其 热敏电阻温度系数 α : \[ α = -{3950K \over (298.15K)^2} = - 4.44 \%/℃ \] 根据热敏电阻温度系数 α 和 其器件精度求得 25℃时的温度容差为: \[ Resistance \ Tolerance\ @25℃ = α *(±0.5℃) = -4.44\%/℃ * (±0.5℃) = ± 2.22\% \ @25℃ \]

电气特性

image-20210821095249164
  • 电阻值:R25 = 50kΩ ± 2% 。即在25摄氏度下,其阻值为50k欧姆,阻值允差为百分之二。
  • B常数: B25/50 = 3950K ± 2% 。即该NTC热敏电阻的材料系数B值,在25摄氏度至50摄氏度之间的B常数为3950K,允差为百分之二。

参考

  1. 热敏电阻应用与参数详解
  2. NTC

串行外设接口

串行外设接口(Serial Peripheral Interface,SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。

SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或下降沿同步。主机和从机可以同时传输数据。SPI接口可以是 3线式4线式。后述中重点介绍常用的4线SPI接口。

与I2C的 多主多从 模式不同,SPI协议为 一主多从 模式。SPI所消耗的接口数也大大提升。

接口介绍

image-20210819075248043

图1. 含主机和从机的SPI配置

4线SPI器件有四个信号:

  • 时钟(SPI CLK, SCLK)
  • 片选(CS)
  • 主机输出、从机输入(MOSI)
  • 主机输入、从机输出(MISO)

产生时钟信号的器件称为主机。主机和从机之间传输的数据与主机产生的时钟同步。同I2C接口相比,SPI器件支持更高的时钟频率。查阅相关产品数据手册以了解SPI接口的时钟频率规格。

SPI接口只能有一个主机,但可以有一个或多个从机。图1显示了主机和从机之间的SPI连接。

来自主机的片选信号用于选择从机。这 通常是一个低电平有效信号,拉高时从机与SPI总线断开连接。当使用多个从机时,主机需要为每个从机提供单独的片选信号。本文中 的片选信号始终是低电平有效信号。

MOSI和MISO是数据线。MOSI将数据从主机发送到从机,MISO将数据从从机发送到主机。

数据传输

要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。因此,主机必须在该信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)同时进行。串行时钟沿同步数据的移位和采样。SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。

需要注意:SPI接口传输的 数据位数 仍需查阅器件数据手册。

时钟极性和时钟相位

在SPI中,主机可以选择 时钟极性(Clock Polarity,CPOL)和 时钟相位(Clock Phase,CPHA)。

在空闲状态期间,CPOL 控制 时钟极性。空闲状态是指传输开始时CS为高电平且在向低电平转变的期间,以及传输结束时CS为低电平且在向高电平转变的期间。

CPHA 控制 时钟相位。根据CPHA位的状态,使用时钟上升沿或下降沿来采样和/或移位数据。主机必须 根据从机的要求选择时钟极性和时钟相位。根据CPOL和CPHA位的选择,有四种SPI模式可用,如下表:

SPI 模式 CPOL CPHA 空闲状态下的时钟极性 用于采样和/或移位数据的时钟相应
0 0 0 逻辑低电平 数据在上升沿采样,在下降沿移出
1 0 1 逻辑低电平 数据在下降沿采样,在上升沿移出
2 1 1 逻辑低电平 数据在下降沿采样,在上升沿移出
3 1 0 逻辑低电平 数据在上升沿采样,在下降沿移出

下图为TI公司F280049芯片的SPI时钟模式:

image-20210819084200284

下图为ADI公司ADSP21479芯片的SPI时钟模式:

image-20210819084447672

后述 图2 至 图5 显示了四种SPI模式下的通信示例。

在这些示例中,数据显示在MOSI和MISO线上。传输的开始和结束用绿色虚线表示,采样边沿用橙色虚线表示,移位边沿用蓝色虚线表示。请注意,这些图形仅供参考。要成功进行SPI通信,用户须参阅产品数据手册并确保满足器件的时序规格。

图2. SPI模式0,CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出

图2. SPI模式0,CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出

图3给出了SPI模式1的时序图。在此模式下,时钟极性为0,表示时钟信号的空闲状态为低电平。此模式下的时钟相位为1,表示数据在下降沿采样(由橙色虚线显示),并且数据在时钟信号的上升沿移出(由蓝色虚线显示)。

图3. SPI模式1,CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出

图3. SPI模式1,CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出

图4给出了SPI模式2的时序图。在此模式下,时钟极性为1,表示时钟信号的空闲状态为高电平。此模式下的时钟相位为1,表示数据在下降沿采样(由橙色虚线显示),并且数据在时钟信号的上升沿移出(由蓝色虚线显示)。

图4. SPI模式2,CPOL = 1,CPHA = 1:CLK空闲状态 = 高电平,数据在下降沿采样,并在上升沿移出

图4. SPI模式2,CPOL = 1,CPHA = 1:CLK空闲状态 = 高电平,数据在下降沿采样,并在上升沿移出。

图5给出了SPI模式3的时序图。在此模式下,时钟极性为1,表示时钟信号的空闲状态为高电平。此模式下的时钟相位为0,表示数据在上升沿采样(由橙色虚线显示),并且数据在时钟信号的下降沿移出(由蓝色虚线显示)。

图5. SPI模式3,CPOL = 1,CPHA = 0:CLK空闲状态 = 高电平,数据在上升沿采样,并在下降沿移出

图5. SPI模式3,CPOL = 1,CPHA = 0:CLK空闲状态 = 高电平,数据在上升沿采样,并在下降沿移出

多从机配置

多个从机可与单个SPI主机一起使用。从机可以采用常规模式连接,或采用菊花链模式连接。

常规SPI模式

image-20210819075431419
图6. 多从机SPI配置

在常规模式下,主机需要为每个从机提供单独的片选信号。一旦主机使能(拉低)片选信号,MOSI/MISO线上的时钟和数据便可用于所选的从机。如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。

从图6可以看出,随着从机数量的增加,来自主机的片选线的数量也增加。这会快速增加主机需要提供的输入和输出数量,并限制可以使用的从机数量。可以使用其他技术来增加常规模式下的从机数量,例如使用多路复用器产生片选信号。

菊花链模式

image-20210819075542602

图7. 多从机SPI菊花链配置

在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。

使用该方法时,由于数据是从一个从机传播到下一个从机,所以传输数据所需的时钟周期数与菊花链中的从机位置成比例(成比例倍增)。

例如在图7所示的8位系统中,为使第3个从机能够获得数据,需要24个时钟脉冲,而常规SPI模式下只需8个时钟脉冲。图8显示了时钟周期和通过菊花链的数据传播。并非所有SPI器件都支持菊花链模式。请参阅产品数据手册以确认菊花链是否可用。

图8. 菊花链配置:数据传播

图8. 菊花链配置:数据传播

ADI公司支持SPI的模拟开关与多路转换器

ADI公司最新一代支持SPI的开关可在不影响精密开关性能的情况下显著节省空间。本文的这一部分将讨论一个案例研究,说明支持SPI的开关或多路复用器如何能够大大简化系统级设计并减少所需的GPIO数量。

ADG1412 是一款四通道、单刀单掷(SPST)开关,需要四个GPIO连接到每个开关的控制输入。图9显示了微控制器和一个ADG1412之间的连接。

image-20210819075642098

图9. 微控制器GPIO用作开关的控制信号

随着电路板上开关数量的增加,所需GPIO的数量也会显著增加。例如,当设计一个测试仪器系统时,会使用大量开关来增加系统中的通道数。在4×4交叉点矩阵配置中,使用四个ADG1412。此系统需要16个GPIO,限制了标准微控制器中的可用GPIO。图10显示了使用微控制器的16个GPIO连接四个ADG1412。

图10. 在多从机配置中,所需GPIO的数量大幅增加

图10. 在多从机配置中,所需GPIO的数量大幅增加

为了减少GPIO数量,一种方法是使用串行转并行转换器,如图11所示。该器件输出的并行信号可连接到开关控制输入,器件可通过串行接口SPI配置。此方法的缺点是外加器件会导致物料清单增加。

image-20210819075735043

图11. 使用串行转并行转换器的多从机开关

另一种方法是使用SPI控制的开关。此方法的优点是可减少所需GPIO的数量,并且还能消除外加串行转并行转换器的开销。如图12所示,不需要16个微控制器GPIO,只需要7个微控制器GPIO就可以向4个ADGS1412提供SPI信号。

image-20210819080000988

图12. 支持SPI的开关节省微控制器GPIO

开关可采用菊花链配置,以进一步优化GPIO数量。在菊花链配置中,无论系统使用多少开关,都只使用主机(微控制器)的四个GPIO。

image-20210819080021307

图13. 菊花链配置的SPI开关可进一步优化GPIO

图13用于说明目的。ADGS1412数据手册建议在SDO引脚上使用一个上拉电阻。有关菊花链模式的更多信息,请参阅ADGS1412数据手册。为简单起见,此示例使用了四个开关。随着系统中开关数量的增加,电路板简单和节省空间的优点很重要。在6层电路板上放置8个四通道SPST开关,采用4×8交叉点配置时,ADI公司支持SPI的开关可节省20%的总电路板空间。文章《精密SPI开关配置提高通道密度》详细说明了精密SPI开关配置如何提高通道密度。

术语

MISO / SOMI / SDO: Master Input and Slaver Output / Slaver Output and Master Input / Slaver Data Output

MOSI / SIMO / SDI: Master Output and Slaver Input / Salver Input and Master Output / Slaver Data Input

SCLK: Serial Clock

CS / STE: Chip Select / Slaver Transmit Enable

参考

  1. SPI接口简介
  2. SPI通信协议详解(spi总线)
  3. 第23 章 串行外设接口(SPI)