EPICS是什么?

实验物理和工业控制系统(EPICS)由一个可以用于创建分布式控制系统的软件组件和工具组成。EPICS提供了期望来自一个分布式系统的代表性功能:

  1. 设施设备的远程控制和监控
  2. 自动化的操作顺序
  3. 设置模式和配置控制
  4. 设施之间公共时间管理
  5. 警报侦测,报告和日志
  6. 闭环(反馈)控制
  7. 建模和仿真
  8. 数据转化和过滤
  9. 包含图像数据的数据采集
  10. 数据趋势,存档,获取和绘制
  11. 数据分析
  12. 访问安全(防止无意操作的基本保护)

EPICS规模变化可以从非常大到非常小的系统。大型系统必须能够传输和存储海量数据,健壮和可靠,但也容错。单个组件的错误不应该使系统停摆。对于小型安装,设立一个不需要复杂或昂贵基础组件的控制系统一定是可能的。

对于现代的程序,数据管理变得越发重要。为长期存储采集的操作数据并且用原来格式提取它应该是可能的。EPICS提供了实现此目标的工具并且根据设施的需求裁剪数据管理。

EPICS一个最令人感激方面是遍布全球的活跃合作。合作成员乐于在问题上帮助其它使用者并且讨论新的想法。

系统组件

从广义上将,EPICS工具集能够进行服务器和客户端程序创建。服务器提供对数据的访问,读或写,本地或通过一个网络。经常对连接物理组件的硬件进行读和写,但数据也可以在其它地方产生或使用。物理I/O是任何控制系统的中心任务,包括EPICS。

客户端可以显示,存储和操作数据。客户端软件范围涵盖(图形和命令行)用户接口到用于数据管理的强大服务。

一个基于EPICS控制系统的基本组件是:

1、IOC:输入/输出控制器。这是EPICS的I/O服务器组件。能够支持如数据库和网络通信的EPICS基本组件的几乎任何计算平台可以用成IOC。一个示例是一台常见桌面计算机,其它示例是基于像vxWorks或RTEMS的实时操作系统的系统并且运行在专用的像MicroTCA,VME或者CompacctPIC的模块计算平台。EPICS IOC也可以运行在像树莓派或类似的低成本硬件上。

2、CWS:或客户端工作站。这是一台能够运行各种EPICS工具和客户程序的计算机;代表性示例是用户接口工具和数据归档。CWS可以是台式计算机,一台服务器或者类似,并且通常运行一个像Linux,Widnows或MacOS的"常见"的操作系统。

3、LAN:局域网。这只是一个能够使IOCs和CWS相互通信的标准的基于以太网(或无线)通信网络。

一个简单的EPICS控制系统可以由一个或多个IOCs和通过一个LAN(下图)通信的客户工作站组成。分开客户端和服务器使得系统配置更容易并且也使系统更加健壮。能够在不停止运行下从系统添加和移除客户端和服务器。

一个简单的EPICS控制系统架构

除了一个"经典"EPICS控制系统的这些基本组件外,实现用于数据的服务器(即:服务,其不处理I/O(来自一个受控过程的实时值)或者连接了硬件)也是可能的。例如,这些其它服务能够提供配置或者标定数据,或者像粒子束建模的计算服务。由于所有服务"说"相同的协议以及交换相同类型的数据结构,数据源对客户端软件是透明的(即是:你不需要进一步知道数据来自哪里或者如何获取它。) 在这个意义上,IOC可以被视为服务器的一种特殊类型,其处理数据并且连接到真实的现场硬件(在很多情况中,但不是必需的)。

EPICS软件组件通道访问(CA)和pvAccess(PVA)提供了协议和结构体,它们在CWS上运行的客户端软件和任何数量IOCs以及其它服务之间使得能够网络透明通信。在之后章节更详细地提供有关CA和PVA。

基本属性

EPICS的基本属性:

1、基于工具:EPICS提供了一个用于创建控制系统的交互工具和组件集合。这降低对自定义编程的需求到最小并且有助于确保统一操作接口。

2、分布式:能够支持任何数目的IOCs和CWSs。只要网络没有饱和,没有单个瓶颈。如果单个IOC变得饱和,其功能可以分布到若干IOCs。程序能够分布到很多CWSs,而不是在单个CWS上运行所有程序。

3、事件驱动:EPICS软件组件都最大可能地被设计成事件驱动。例如,一个EPICS客户端请求得到变化的通知而不是必须为变化请求IOC。这种设计致使资源的高效使用以及快速响应时间。

4、高性能:一个IOC能够提供处理每秒数万数据项(”数据记录“,见以下)。客户端和服务器使系统用最小的网络开销处理百万过程变量。

6、可扩展:作为分布式系统,EPICS能够从单个IOC和少量客户端扩展到数百个IOCs和百万I/O通道和过程变量。

7、健壮:单个组件的故障会使整个系统停摆。可以在不停止控制系统操作下添加组件(I/O客户端)到系统或从系统移除它。组件能够经受互联网络的简写故障并且在网络从故障恢复时自动恢复。

8、基于过程变量:相较于某些其它控制系统包,EPICS没有把控制系统(I/O)设备建模成对象(如在面向对象编程中),而是建模成描述受控过程或设备单个方面的数据实体,因而名称"过程变量"或"PV"。一个代表性PV可以代表各种属性中任何一种,诸如温度或(电)流。在过程控制系统中这个设计是代表性的。在附录中简短地讨论这种设计的优缺点。

IOC软件组件

EPICS IOC在其核心是一个软件实体或者一个进程,它包括以下软件组件:

1、IOC 数据库:内存驻留数据库,包含指定名称的各种记录的集合。这些记录服务以上提到的过程变量。

2、Scanners:用于在IOC数据库中运行记录的机制。

3、记录支持:每种记录类型有相关联的实现这种记录类型的功能的记录支持例程集合。

4、设备支持:设备支持例程绑定I/O数据到数据库记录。

5、设备驱动:设备驱动处理对外部设备的访问。

5、通道访问或pvAccess:外部设世界和IOC之间的接口。它提供了通过网络访问(EPICS)数据库的接口。

6、Squencer:一个有限状态机。严格讲,这是一个外部模块并且不包含在EPICS核心软件发行中。

我们简要地描述IOC地主要组件以及它们如何交互。

EPICS IOC组件

IOC数据库

每个IOC的核心是一个过程数据库。这个数据库是内存驻留的(即是,不是存储在磁盘或其它永久存储设备上)并且与更知名的关系数据库(SQL)没有关系。

数据库定义IOC的功能:它提供什么过程数据,如何处理和存储数据。数据库能够包含任何数目的记录,其中每个记录属于一个特定的记录类型。记录类型定义这个记录处理的数据类型以及一个定义如何处理数据的函数集合。记录特定类型元数据,也称为"特性",包含在记录中来配置和支持操作。例如,一个模拟输入(ai)记录类型支持从硬件设备读入值并且把它们转成所需的(工程)单位。它也为预计的操作范围提供限制,并且超过这些限制时报警。EPICS支持一个大型和扩展的记录类型集合,例如ai(模拟输入),ao(模拟输出)等。

称为"字段"的元数据用来配置记录的行为。有很多所有记录类型共有的字段,而某些字段使专用于特定的记录类型。每个记录有一个记录名称并且每个字段有一个字段名称。记录名称必须在连接了相同TCP/IP子网的所有IOCs之间唯一,使得客户端软件能发现在子网上任何记录并且访问它的值和其它字段。

record(ai, "Cavity1:T") #type = ai, name = “Cavity1:T”
{field(DESC, “Cavity Temperature”) #descriptionfield(SCAN, “1 second”) #record update ratefield(DTYP, “XYZ ADC”) #Device typefield(INP, “#C1 S4”) #input channelfield(PREC, “1”) #display precisionfield(LINR, “typeJdegC”) #conversion specfield(EGU, “degrees C”) #engineering unitsfield(HOPR, “100”) #highest value on GUIfield(LOPR, “0”) #lowest value on GUIfield(HIGH, “65”) #High alarm limitfield(HSV, “MINOR”) #Severity of “high” alarm
}

一个EPICS数据库记录的示例。这里只定义了一个字段子集

数据记录可以相互之间链接。例如,记录可以从其它记录获取输入,触发其它记录运行,使能或禁用记录等等。

通过链接记录的组合一起,EPICS数据库变成了一种编程工具。使用这个工具,用这个数据库能够实现非常高级的功能。另外,由于这个逻辑驻留在IOC上,它不依赖任何客户端软件来运行。通过利用这个工具的优势,很多客户端程序能够是"薄的",并且只是显示或者在数据库记录中写值。以下图说明一个记录链接的简单示例:如果两个传感器T1和T的平均温度超过10°C,启动制冷器。这个数据库包含四个记录:两个模拟输入(ai),一个二进制输出(bo)和一个计算(calc)。

记录链接的示例

提供了数据结构,因而能够高效地访问这个数据库。因为大部分软件组件通过库例程访问这个数据库,所以它们不需要了解这个结构。

数据扫描

提供了四种基本的记录扫描类型:Periodic, Event, I/O Event和Passive。在一个IOC中能够混合所有这些方法。

1、Periodic:周期地运行一个记录。支持很多时间间隔,代表性范围从10Hz到0.01Hz。范围是可配置的来支持更高或更低速率。

2、Event:当任何IOC软件组件提交一个(EPICS软件)事件时,事件扫描发生,诸如一个新温度传感器测量值。

3、I/O Event:I/O事件扫描系统基于像处理器中断的外部事件处理记录。一个IOC设备驱动中断例程必须可用于接受外部中断。一个I/O事件不是一定要是传统意义的CPU中断的中断。

4、Passive:被动记录不是被定期扫描或者对事件。但,由于链接到它们的其它记录被运行了,或者由于诸如使用通道访问通过网络设置了新值,能够运行它们。

记录支持,设备支持和设备驱动

访问数据库不需要记录特定类型的知识;每种记录类型提供实现了所有记录特定行为的记录支持例程集合。因而,IOCs能够支持任何数目的记录和记录类型。类似地,记录支持不包含设备特定的知识,赋予了每种记录类型具有任意数目独立设备支持模块。如果访问这件硬件的方法比能够被设备支持处理的更复杂,则可以开发设备驱动。有时,在设备支持(当它是记录类型特定的时)和驱动(当代码处理设备特定细节时)之间分隔功能是一个好习惯。

不关联硬件的记录类型不需要设备支持或设备驱动。一个示例是从其它记录读取它输入,执行计算并且接着(可选地)转发结果到其它记录的("calc")记录。

IOC软件设计允许特定安装以及在一个安装中一个特定IOC选择记录类型、设备类型和驱动地唯一集合。剩下的IOC系统不受影响。

给出分离如何运行的概要,看一下记录支持的任务。每个记录支持模块必须提供由数据库scanners调用的记录处理例程。记录处理由以下功能的某些组合组成(所有记录类型不需要包含所有功能):

1、输入:读取输入。能够通过设备支持例程从硬件,通过数据库链接从其它数据库记录,或者通过通道访问(CA)或pvAccess(PVA)链接从其它IOCs获取输入。

2、转换:原始输入到工程单位或者从工程单位到原始输出值的转换。

3、输出:写输出。通过设备支持例程到硬件,在相同IOC内部通过数据库链接到其它数据库记录或者通过CA或PVA到其它IOCs,输出能够被定向。

4、产生警报:检查并产生警报。

5、监控:触发与CA或PVA回调相关的monitors.。

6、链接:触发链接记录的运行。

相同概念被应用于设备支持和设备驱动模块:每个支持模块必须定义一个函数集合,使其成为IOC软件的一部分。

数据库监控

在一个数据库值变化是发送通告的机制被称为"数据库监控"。监控设施使得一个客户端程序在数据库值变化时被通告,而不是必须持续查询这个数据库。可以配置这些来指定值变化,警报变化和/或存档变化。

数据库监控是由EPICS标准协议通道访问和pvAccess支持。

网络协议

EPICS通过支持以下用于数据交换的网络协议,提供了对IOC数据库的网络透明访问。

通道访问

通道访问是基于客户端/服务器模型。每个IOC提供一个通道访问服务器,它能够与任何数目的客户端建立通信。通道访问客户端服务在CWSs和IOCs都可用。一个客户端能够与任意数目的服务器通信。

客户端服务

基本的通道访问客户端服务是:

  • search:定位包含所选过程变量的IOCs并且与每一个IOC建立通信。
  • get:获取对应所选过程变量集合的值以及其它可选信息。
  • put:更改所选过程变量的值。
  • minitor:请求服务器只在相关联过程变量更改状态时发送信息。能够请求以下状态变化的任意组合:值的变化,警报状态和/或严重性的变化和存档值得变化。很多记录类型提供用于值变化得回滞因子。

除了过程变量值外,可以请求以下更多信息("元数据")的任意组合:

  • status:警报状态和严重性。
  • units:对应这个过程变量的工程单位。
  • precision:用哪个精度显示浮点数值。
  • timestamp:上次运行这个记录的时间。
  • enumeration:定义枚举值含义的ASCII字符串集。
  • grahpics:用于在图形用户接口(GUI)上配置图形组件和图形的高低限制。
  • control:高低控制限制;用于记录的操作限制。
  • alarm:用于过程变量的警报状态(HIHI, HIGH, LOW和LOLO)和严重性

搜索服务器

通道访问提供了一个IOC驻留服务器,它等待通道访问搜索消息。这些是当通道访问搜索包含它使用过程变量的IOCs时由通道访问客户端(例如当一个操作接口任务启动时)产生的UDP广播。服务器接受所有搜索消息,检查是否有任何过程变量位于这个IOC中,并且如果找到了任何过程变量,用"I have it"消息应答给发送者。

连接请求服务器

一旦过程变量已经被定位了,通道访问客户端对每个包含这个客户端使用的过程变量的IOC发送连接请求。在IOC中的连接请求服务器接受这个请求并且建立一个到这个客户端的连接。每个连接被两个单独的任务管理:ca_get和ca_put。ca_add_event请求导致数据库监控被建立。数据库访问和/或记录支持例程通过对db_post_event的调用提供值更新(monitos)。

连接管理

每个IOC提供连接管理服务。如果通道访问服务器故障(例如:它的IOC崩溃),客户端被通知,而当一个客户端故障(例如,它的任务崩溃),服务器被通知。如果一个客户端故障,服务器断开连接。如果一个服务器崩溃,当服务器重启时,客户端自动重建通信。

pvAccess

pvAccess是一个现代替换和在EPICS 7中对通道访问的可用替代方案。pvAccess向EPICS增加了很多功能,它增强了由通道访问提供的服务集。用pvAccess,以高效传递结构化数据并且能够处理大数据集;用很多优化已经实现这个pvAccess:

  • 数据结构检查和数据传输已经被分开,因而每个连接只需要携带一次结构信息。
  • 监控只发送一个数据结构已经变化的项。
  • 在数据操作中做了若干内在优化(减少拷贝等)。在程序测试中,pvAccess已经能够使用10Gbit以太网链接的可用理论带宽的96-99%,这接近了实际上可达到的限制。

客户端服务

基本的pvAccess客户端服务类似于通道访问,有一些补充:

  • search:搜索包含有兴趣过程变量的IOCs并且与每个IOC建立通信。
  • get:获取对应所选过程变量集的值和更多可选信息。
  • put:更改所选过程变量的值。
  • 添加Monitor:添加一个状态变化的回调,类似通道访问。
  • PutGet:在一次原子操作中更改一个PV的值,运行这个EPICS记录并且回读这个值。
  • ChannelRPC:一个"远程过程调用"通信模式。这类似于PutGet,但通信是不对等的,即是:由客户端发送的数据(“请求”)不同于服务器发回的数据结构。这种模式被描述成一个带参数的请求。示例可以是为一个特定设备或者用于在加速器某个坐标计算束线参数的束线物理服务器请求参数标定服务。

对于IOC,一个IOC驻留服务器(qsvr)提供接口来访问过程数据记录。对单个PV的基本访问提供对通道访问相当的功能。此外,qsrv提供合并来自不同数据库记录的数据成作为单元传输的结构体的数据结构的可能性。从EPICS 3.16以来,IOC核心能够确保对记录的原子访问,意味着qsvr提供的在结构中的数据被确保是单次运行的结果(或者更好的表述,当qsrv组装数据结构时记录不更改它们的值)。这也应用于puts,在运行记录前所有值被写入到被寻址的记录。这种方式,保证了对应一次操作的参数一致性。

搜索服务器

像在通道访问中,qsvr等待搜索消息。服务器接受所有(UDP)搜索请求,检查任意过程变量是否位于这个IOC中,并且如果找到了任何过程变量,用"I have it"消息应答发送者。

连接请求服务器

在pvAccess中,一个客户端和服务器如何建立通信通道的过程稍微不同于通道访问并且包含两个阶段。第一个阶段是交换检查数据。在这个阶段,服务器传递给客户端要被交换的数据的结构。两边接着都能创建用于通信的必要占位结构。在第二个阶段,能够使用分配的数据结构交换实际的数据结构。

连接管理

pvAccess类似于通道访问的连接管理服务。

EPICS数据库和网络传输

应该注意:访问方法(pvAccess, 通道访问)不提供以记录访问EPICS数据库。这是一个用意明显的设计决定。这使得能够在不影响通过PVA或CA访问数据库的任何软件下在数据库结构中进行更改或者添加新的记录类型,并且它允许这些客户端与具有不同记录类型集的多个IOCs之间通信。

客户端工作站工具

EPICS提供了在客户端工作站上执行的很多工具和服务。基于它们是否使用通道访问和/或pvAccess,它们可以被分为两组。CA/PVA工具是实时工具,即是:它们用于监控和控制IOCs。这些工具未被包含在EPICS “base”发行中并且必须单独下载。用不同语言和技术实现了这些工具,并且用户应该选择哪些工具最合适于它们的特定设置和基础设施。

CA/pvAccess工具的示例

已经开发了很多CA/PVA工具。以下是一些代表性示例。

  • CS-Studio:Control System Studio,一个带有很多可用插件(如显示管理器(BOY, Display Buidler),数据可视化/图表工具(DataBrower)等等)的程序包。
  • EDM:Exensible Display Manager。若干替代显示管理器之一。其它流行替代方案是caQtDM(基于Qt框架), medm(Motif Extended Display Manager, 一个老旧工具),仅指明几个。
  • Alarm handler:由警报配置文件驱动的多用途警报handler。
  • Sequencer:运行在IOC中来实现状态机。
  • Archiver Appliance:从EPICS服务器(CA, PVA)采集数据并且在时序文件中存储数据,使得之后为关联事件和监视"机器"性能提取和分析它们,即是:受控的设备或设施。
  • Channel Finder(索引服务):在系统中管理(list, tag,catergorize)EPICS记录的工具。这是一个强大工具,来管理和提供对于数目非常多记录的层级和不同视角。用这种服务,能够提供对这些记录平面命名空间的抽象视图。例如,列出在系统中所有真空泵,或者在加速器中由束线位置监控测量的水平位置。

其它工具的示例

1、VDCT:一个基于java的数据库配置工具,它可以用于设计和配置EPICS数据库,并且能够可视化这些记录和它们的连接。

2、SNC:状态标记编译器。它产生代表这个IOC Squencer工具的状态的C程序。

参考和进一步阅读

  1. Control Theory (https://en.wikipedia.org/wiki/Control_theory)
  2. http://epics.web.psi.ch/training/handouts/e_EPICS_Training_at_PSI.ppt
  3. https://en.wikipedia.org/wiki/Remote_procedure_call
  4. EPICS Application Developer’s Manual (version dependent, see for instance http://www.aps.anl.gov/epics/base/R3-15/5-docs/AppDevGuide/AppDevGuide.html)
  5. https://www.encyclopedia.com/computing/dictionaries-thesauruses-pictures-and-press-releases/atomic-action
  6. Recent Advancements and Deployments of EPICS Version 4, Greg White et. al., ICALEPCS 2015, Melbourne, Australia.

附录:对象 vs 过程变量的讨论

EPICS是基于"平面",即是:记录的非层级集,它代表控制系统的过程变量。这有很多优点和缺点:

优点:

  • 不需要设备的详细建模下,易于调整任何特定的情况
  • 高效通信:只需要传递感兴趣的数据
  • PVs是模块化构建块,能够根据需求混合和匹配这些块
  • 没有(传统的)编程,可以实现甚至复杂的功能

缺点:

  • 缺少抽象:必须在PVs上实现复杂实体的控制
  • 离散数据项的管理是难得;缺少原子操作
  • 不能利用面向对象编程得优势(代码重用,封装等)

可以延伸这些列表并且讨论它们,但以上是最常见得。

没有简单的结论说这种模型比另外设计的模型更好或更差。它取决于使用情况以及在每种不同因素上关注的分量。

已经添加在EPICS 7中的新特性缓解了缺乏抽象性和原子操作。在EPICS 7中结构化数据模型允许代表抽象实体的复杂结构的构建。能够进一步从已有构建块构建这些实体,因而保持了灵活性;在某种程度上,这甚至好于严格建模,因为能够在之后的工作系统上添加抽象。已经增加了原子操作,到某种程度,在一个分布式系统中能够实现它们,因而移除了对复杂解决方法的需求。

严格将,一个记录的每个字段也可以被认为一个过程变量。但,为了这个讨论,采取把一个记录等价为一个PV的更简单方法足够了。

EPICS记录参考1--EPICS概要相关推荐

  1. EPICS记录参考5 -- 数组模拟输入记录Array Analog Input (aai)

    static long process(aaiRecord *prec) 数组模拟输入记录类型用于读取数组数据.数组数据能够包含任何可支持的数据类型.这个记录在很多方面类似于waveform记录.它允 ...

  2. EPICS记录参考2--EPICS过程数据库概念

    EPICS过程数据库 一个基于EPICS的控制系统包含一个或多个输入输出控制器,IOCs.每个IOC装载一个或多个数据库.一个数据库是各种类型记录的集合. 一个记录是一个对象,有: 一个唯一名称 有其 ...

  3. EPICS记录参考--Waveform记录(waveform)

    waveform记录类用于与waveform数字仪表做接口.这个记录在数组中存储其数据.此数组能够包含任意受支持的数据类型. 参数字段 在下面描述记录特定的字段,按功能分组. 用于扫描的参数 wave ...

  4. EPICS记录参考--模拟输出记录(ao)

    这个记录类型通常用于发送一个模拟输出值到一个输出设备,如果需要,把它从工程单位转成一个整数值.这个记录支持警报和驱动限制,变化率限制,输出值积分,从工程单位线性和断点表转换,以及图形和控制限制. 记录 ...

  5. EPICS记录参考--sub-Array记录(subArray)

    subArray记录类型的一般用法是从waveform记录获取子数组.设置元素数目(NELM)或索引(INDX)字段使得这个记录再被运行依次,因此使用标准EPICS操作接口工具能够实现这样的应用程序, ...

  6. EPICS记录参考--Select记录(sel)

    这个select记录根据获最多获取自12个位置的输入计算一个值.选择算法可以是以下之一:Specified, High Signal, Low Signal, Median Signal.每个输入可以 ...

  7. EPICS记录参考3 -- 所有记录都有的字段

    这部分包含了一段对所有记录类型都有的字段的描述.这些字段在dbCommon.dbd中定义. 操作显示参数 NAME字段包含了记录名称,它在一个EPICS通道访问名称空间中必须唯一.由程序开发者提供这个 ...

  8. EPICS记录参考--模拟输入记录(ai)

    这个记录类型通常用于从硬件输入获取一个模拟值并且转换它为工程单位.这个记录支持到工程单位的线性转换和断点转换,平滑,警报限制,警报过滤以及图形和控制限制. 参数字段 在下面描述记录专用字段,按功能分组 ...

  9. EPICS记录参考--Sequence记录(seq)

    Sequence记录用于触发最多16个其它记录运行并且发送这些值到那些记录.除了它将获取一个输入值并且写一个输出值而不是仅仅运行一个forward链接的集合外,它类似于fanout记录.它也能够指定若 ...

最新文章

  1. 在线作图|微生物多样性分析——物种累计曲线
  2. 深入 理解 Statement 和 PreparedStatement
  3. 水题Kattis Temperature Confusion小学数学
  4. 剑指Offer #03 从尾到头打印链表(递归)
  5. hadoop调优之一:概述
  6. vue点击弹窗自动触发点击事件的解决办法
  7. Mysql高级考试题_MySQL高级应用答案试题题目及答案,期末考试题库,章节测验答案...
  8. Linux命令行性能监控工具大全
  9. 三星 SGH-G810 多普达 P800 多普达 Touch Diamond(S900) 多普达 P860 多普达 Touch(T3238) 对比...
  10. Spring MVC 入门指南(二):@RequestMapping用法详解
  11. python爬虫案例——csdn数据采集
  12. [导入]ATA 50 pin to 40 pin
  13. 在服务端合并和压缩JavaScript和CSS文件[转]
  14. Linux0.11内核详解,linux 内核0.11 学习(一)
  15. 在线有道词典,又添新特色了!
  16. python经纬度转换xy坐标公式_Python经纬度坐标转换为距离及角度的实现
  17. 什么网页游戏是按地地狱划分服务器的,不思议迷宫地域边境详细攻略 全方位介绍地狱边境所有玩法...
  18. Python 【趣头条】短视频的自动上传与发布实例演示,同时支持抖音、快手、哔哩哔哩、小红书、微视、西瓜视频、微信视频号等平台的视频自动化同步发布
  19. 找回Windows 10安全通知图标
  20. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java喵星人网站h9p8i

热门文章

  1. Single Image Haze Removal Using Dark Channel Prior 基于暗原色先验的单一图像去雾方法【翻译】
  2. 太平洋网站的css样式
  3. CAD中如何创建复合实体?CAD创建复合实体步骤
  4. cpu是计算机硬件中的,电脑硬件CPU介绍
  5. 实验五 java gui(预习报告)
  6. html怎么实现计算bmi,利用Javascript实现BMI计算器
  7. MySQL学习宝典之最全的常用语法语句
  8. Cordova 拨打电话_Cordova 项目开启拨打电话
  9. 个人Ubuntu安装配置
  10. IDEA最全最常用的配置与性能优化(Java必备)