<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>控制系统</title><link>http://www.cim-cs.com/</link><description>个人技术分享</description><item><title>EPICS-----模拟输出（ao）</title><link>http://www.cim-cs.com/?id=19</link><description>&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;1. 介绍&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;这个记录是将值输出到数模转换器，然后输出到硬件，这个记录支持报警限值，工程单位转换&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;以及图形和控制限值。这个字段分为以下几个类别：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;扫描参数&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;所需输出参数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;转换和写参数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;操作员显示参数&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;警报参数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;2.扫描参数&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;同ai记录&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;3.所需输出参数&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;模拟输出&lt;/span&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;</description><pubDate>Mon, 16 Sep 2024 14:29:50 +0800</pubDate></item><item><title>EPICS-----模拟输入记录（ai）</title><link>http://www.cim-cs.com/?id=18</link><description>&lt;p&gt;最近在使用通过StreamDevice来发送和接受字符串从而实现控制设备，对于里面的参数做一些记录。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;这个字段下面有这几个参数：&lt;br&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;扫描参数      2.读取并转换参数     3. 操作器显示参数     4.报警参数     5. 监控参数    6. 运行时参数&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;一、SCAN&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;：&lt;span style=&quot;font-size: 16px;&quot;&gt;扫描&lt;span style='font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap; vertical-align: inherit;'&gt;决定了记录的处理时间。当记录处理其数据并执行与该数据相关的任何操作时，记录即被处理&lt;/span&gt;&lt;em style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;，&lt;/em&gt;每个记录都需要设定这个&lt;em style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;，&lt;/em&gt;它一共有三种方式：&lt;strong&gt;1.定期的 2.事件 3.被动的。&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;em style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;1. 定期扫描按照设定的时间间隔进行。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;2. 事件扫描发生在 I/O 中断事件或用户定义事件上。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;3. 当扫描链接到被动记录的记录时，或者当通过数据库访问例程将值“放入”被动记录中时，就会发生被动扫描。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;对于定期或事件扫描，用户还可以使用该PHASE机制控制一组记录的处理顺序。对于事件扫描，用户可以控制记录处理的优先级。除了扫描和阶段机制外，还有数据链接和正向处理链接可用于引起其他记录的处理。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;1.1  定期的&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-size: medium; font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap;'&gt;按照一定的时间间隔来读取数据，常用的是这么设置 1 second、.1 second等等。&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;menu(menuScan) {
choice(menuScanPassive,&quot;Passive&quot;)
choice(menuScanEvent,&quot;Event&quot;)
choice(menuScanI_O_Intr,&quot;I/O Intr&quot;)
choice(menuScan10_second,&quot;10 second&quot;)
choice(menuScan5_second,&quot;5 second&quot;)
choice(menuScan2_second,&quot;2 second&quot;)
choice(menuScan1_second,&quot;1 second&quot;)
choice(menuScan_5_second,&quot;.5 second&quot;)
choice(menuScan_2_second,&quot;.2 second&quot;)
choice(menuScan_1_second,&quot;.1 second&quot;)
}&lt;/pre&gt;&lt;p&gt;&lt;span style='font-size: medium; font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap;'&gt;在.dbd后缀文件里面的menu下面你还可以自己设置其他时间间隔，官网文档里面建议不要删除上面的选项，并且添加时间间隔最好按照顺序添加，比如添加 .11  second最好在 .1 second后面添加。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;1.2  事件&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;分为&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;  &lt;/span&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;I/O Intr&lt;/span&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;和用户定义事件，对于这两种类型事件，&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;用户可以使用 PRIO 或优先级字段指定事件的调度优先级。调度优先级是指事件在堆栈上相对于其他正在运行的任务的优先级。有三种可能的选择：&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-size: medium; text-wrap: wrap; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;LOW&lt;/span&gt;&lt;/code&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;、&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-size: medium; text-wrap: wrap; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;MEDIUM&lt;/span&gt;&lt;/code&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;或&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-size: medium; text-wrap: wrap; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;HIGH&lt;/span&gt;&lt;/code&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;。低优先级事件的优先级略高于通道访问。中等优先级事件的优先级大约等于定期扫描任务的中位数。高优先级事件的优先级等于事件扫描任务。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;1.3  被动的&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;1.4 PHAS&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;用来给记录排序，从而实现以相同的时间间隔或者优先级定期扫描记录，但是使用这个字段的前提是扫描不能是被动的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;1.5 FLNK&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;在第一条记录的字段设置第二条记录的地址，就会导致处理完第一条记录后处理第二条记录。&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;二、扫描字段&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;table width=&quot;1436&quot;&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot; height=&quot;2&quot;&gt;SCAN&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot; height=&quot;2&quot;&gt;扫描字段&lt;/td&gt;&lt;td width=&quot;882&quot; height=&quot;2&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;这可以是周期（&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;.1 second&lt;/span&gt;&lt;/code&gt;&lt;span style='font-size: medium; text-wrap: wrap; vertical-align: inherit; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;，&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;.2 second&lt;/span&gt;&lt;/code&gt;&lt;span style='font-size: medium; text-wrap: wrap; vertical-align: inherit; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;，&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;.5 second&lt;/span&gt;&lt;/code&gt;&lt;span style='font-size: medium; text-wrap: wrap; vertical-align: inherit; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;，&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;1 second&lt;/span&gt;&lt;/code&gt;&lt;span style='font-size: medium; text-wrap: wrap; vertical-align: inherit; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;，&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;2 second &lt;/span&gt;&lt;/code&gt;&lt;span style='font-size: medium; text-wrap: wrap; vertical-align: inherit; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;，或&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;5 second）、&lt;/span&gt;&lt;/code&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;  &lt;/span&gt;&lt;/code&gt;&lt;span style='font-size: medium; text-wrap: wrap; vertical-align: inherit; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;I/O Intr、&lt;/span&gt;&lt;/code&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;  &lt;/span&gt;&lt;/code&gt;&lt;span style='font-size: medium; text-wrap: wrap; vertical-align: inherit; font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='font-family: 微软雅黑, &quot;Microsoft YaHei&quot;;'&gt;Passive&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;PINI&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;初始化过程&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;如果字段设置为True，在启动正常扫描任务之前处理一次记录。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;PHAS&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;扫描相位数&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;对记录进行优先级排序，对于scan字段是passive无效，并且官方不推荐使用这个进行排序，更推荐使用flnk字段&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;EVNT&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;活动编号&lt;/td&gt;&lt;td width=&quot;882&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;PRIO&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;优先级&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;处理I/O事件扫描记录和异步记录完成任务的调度优先级。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;DISV&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;禁用值&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;如果 DISV=DISA，则该记录将被禁用，即 dbProcess 将不会处理该记录。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;DISA&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;扫描禁用输入链接值&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;这是与 DISV 进行比较以确定记录是否被禁用的值。如果 SDIS 是数据库或通道访问链接，则通过 SDIS 获取其值。如果 SDIS 不是数据库或通道访问链接，则可以通过 dbPutField 或 dbPutLink 设置 DISA。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;SDIS&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;扫描禁用输入链接&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;一个输入链接，用于获取 DISA 的值。除非是数据库链接或通道访问链接，否则将忽略此字段。如果是数据库或通道访问链接，dbProcess 会调用 dbGetLink 来获取 DISA 的值，然后再决定调用处理例程。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;PROC&lt;br&gt;&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;流程记录&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;每当 dbPutField 指向该字段时，就会处理一条记录。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;DISS&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;禁用警报严重性&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;当此记录被禁用时，它将进入此严重程度的警报状态，状态为 DISABLE_ALARM。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;LSET&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;锁设置&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;此记录所属的锁集。通过输入、输出或正向数据库链接以任何方式链接的所有记录都属于同一锁集。唯一的例外是非进程被动输入链接不会强制链接的记录位于同一锁集中。锁集在 IOC 初始化时确定。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;99&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;LCNT&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;锁计数&lt;/td&gt;&lt;td width=&quot;882&quot; style=&quot;word-break: break-all;&quot;&gt;dbProcess 连续发现记录处于活动状态的次数，即 PACT 为 TRUE。如果 dbProcess 连续发现记录处于活动状态 MAX_LOCK（当前设置为 10）次，则会引发 SCAN_ALARM。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;word-break: break-all;&quot; width=&quot;99&quot;&gt;FLNK&lt;/td&gt;&lt;td style=&quot;word-break: break-all;&quot; width=&quot;124&quot;&gt;前向链接&lt;/td&gt;&lt;td style=&quot;word-break: break-all;&quot; width=&quot;882&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;如果指定了 FLNK，则处理此记录将强制处理扫描被动前向链接记录。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style='vertical-align: inherit; font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap; font-size: 20px;'&gt;三、读取并转换字段&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap; vertical-align: inherit; font-size: 16px;'&gt;这些参数决定记录从何处获取输入以及如何将原始信号转换为工程单位。对于从设备获取输入或使用设备 &lt;code style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style='text-wrap: wrap; vertical-align: inherit; font-family: &quot;times new roman&quot;;'&gt;Raw Soft Channel &lt;/span&gt;&lt;/code&gt;支持的记录，设备支持例程会将此设备的值返回到 RVAL 字段。除非 LINR 转换字段指定 NO CONVERSION，否则将执行正确的转换算法，并将结果值放置在 VAL 字段中。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='text-wrap: wrap; font-family: &quot;Microsoft YaHei&quot;; font-size: medium; vertical-align: inherit;'&gt;&lt;/span&gt;&lt;/p&gt;&lt;table width=&quot;1436&quot;&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot; height=&quot;0&quot;&gt;VAL&lt;/td&gt;&lt;td width=&quot;124&quot; height=&quot;0&quot; style=&quot;word-break: break-all;&quot;&gt;值字段&lt;br&gt;&lt;/td&gt;&lt;td width=&quot;897&quot; height=&quot;0&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;这是在执行所有必要的转换之后记录的最终值。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot;&gt;INP&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;输入链接&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;对于从硬件获取其值的模拟记录，I/O 的地址必须出现在 INP 字段中&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot;&gt;DTYP&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;设备类型&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;设备支持模块的名称必须出现在设备类型字段 (DTYP) 中&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot;&gt;LINR&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;转换类型&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;模拟记录是否执行线性转换、断点转换或根本不进行转换取决于记录的 LINR 字段的配置方式。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot;&gt;RVAL&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;原始值&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;只要有可能，此字段就包含从硬件或相关设备驱动程序获得的原始数据值，并且是在进行任何转换之前。&lt;/span&gt;&lt;code style=&quot;text-wrap: wrap;&quot;&gt;Soft Channel&lt;/code&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap; vertical-align: inherit;'&gt;设备支持模块会直接将值读入 VAL，从而绕过此字段。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot;&gt;ROFF&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;原始值偏移&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;Val= RVAL + ROFF&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot;&gt;EGUF&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;单位完整&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;EGUF 和 EGUL 字段的值分别对应于传感器的最大值和最小值。因此，这些字段的值取决于设备。例如，如果传感器的范围为 -10 至 +10 伏，则 EGUF 字段应为 10，EGUL 字段应为 -10。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot;&gt;EGUL&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;单位最低&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;EGUF 和 EGUL 字段的值分别对应于传感器的最大值和最小值。因此，这些字段的值取决于设备。例如，如果传感器的范围为 -10 至 +10 伏，则 EGUF 字段应为 10，EGUL 字段应为 -10。&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; style=&quot;word-break: break-all;&quot;&gt;AOFF&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;调整偏移&lt;/td&gt;&lt;td width=&quot;897&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;85&quot; height=&quot;40&quot; style=&quot;word-break: break-all;&quot;&gt;ASLO&lt;/td&gt;&lt;td width=&quot;124&quot; height=&quot;40&quot; style=&quot;word-break: break-all;&quot;&gt;调整斜率&lt;/td&gt;&lt;td width=&quot;897&quot; height=&quot;40&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;Val = Val * ASLO + AOFF&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;word-break: break-all;&quot; width=&quot;85&quot;&gt;SMOO&lt;br&gt;&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;平滑因子&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;平滑可用于过滤噪声信号。平滑参数是 0 到 1 之间的常数，在 SMOO 字段中指定&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;word-break: break-all;&quot; width=&quot;85&quot;&gt;ESLO&lt;/td&gt;&lt;td width=&quot;124&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;线性转换的斜率&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;897&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;四、操作器显示参数&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;这些参数用于向操作员呈现有意义的数据。它们以文本或图形方式显示模拟输入的值和其他参数。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap; font-size: 16px;'&gt;EGU 是一个最多 16 个字符的字符串，描述模拟输入测量的单位。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap; font-size: 16px;'&gt;HOPR 和 LOPR 字段设置 VAL、HIHI、HIGH、LOW 和 LOLO 字段的显示上限和下限&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap; font-size: 16px;'&gt;PREC 字段确定显示 VAL 的浮点精度。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; text-wrap: wrap; font-size: 16px;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;五、报警参数&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;模拟输入的可能报警状态为扫描、读取和极限报警。扫描和读取报警由记录或设备支持程序调用。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;&lt;/span&gt;&lt;/p&gt;&lt;table&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;291&quot; height=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;HIHI&lt;/td&gt;&lt;td width=&quot;1111&quot; height=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;Hihi 报警限值&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;291&quot; style=&quot;word-break: break-all;&quot;&gt;LOLO&lt;/td&gt;&lt;td width=&quot;1111&quot; style=&quot;word-break: break-all;&quot;&gt;lolo报警限值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;291&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;HIGH&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;1111&quot; style=&quot;word-break: break-all;&quot;&gt;高报警限值&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;291&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;LOW&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;1111&quot; style=&quot;word-break: break-all;&quot;&gt;低报警限值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;291&quot; style=&quot;word-break: break-all;&quot;&gt;HHSV&lt;/td&gt;&lt;td width=&quot;1111&quot; style=&quot;word-break: break-all;&quot;&gt;HIHI警报严重程度&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;291&quot; style=&quot;word-break: break-all;&quot;&gt;LLSV&lt;/td&gt;&lt;td width=&quot;1111&quot; style=&quot;word-break: break-all;&quot;&gt;LOLO警报严重程度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;291&quot; style=&quot;word-break: break-all;&quot;&gt;HSV&lt;/td&gt;&lt;td width=&quot;1111&quot; style=&quot;word-break: break-all;&quot;&gt;高警报严重程度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;291&quot; style=&quot;word-break: break-all;&quot;&gt;LSV&lt;/td&gt;&lt;td width=&quot;1111&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;低警报严重程度&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;291&quot; style=&quot;word-break: break-all;&quot;&gt;HYST&lt;/td&gt;&lt;td width=&quot;1111&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;报警死区&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;Microsoft YaHei&quot;; font-size: medium; text-wrap: wrap;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;</description><pubDate>Wed, 21 Aug 2024 22:32:15 +0800</pubDate></item><item><title>QuestDB数据库：C++基本使用</title><link>http://www.cim-cs.com/?id=17</link><description>&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; text-wrap: wrap; background-color: #FFFFFF; font-size: 18px;&quot;&gt;QuestDB 支持 C 和 C++ 编程语言。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;要想使用C++链接使用数据库，你的电脑需要：1. &lt;a href=&quot;https://rustup.rs/&quot; style='box-sizing: border-box; background-color: rgb(255, 255, 255); text-underline-offset: 0.2rem; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Noto Sans&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;; font-size: 16px; text-wrap: wrap;' target=&quot;_blank&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;Rust 1.61&lt;/span&gt;&lt;/a&gt;或者更新版本  2. C++17编译器  3.  &lt;/span&gt;CMake 3.15 或更新版本。&lt;/p&gt;&lt;p&gt;在你已经安装并编译好QuestDB数据库(&lt;a href=&quot;https://github.com/questdb/questdb)%EF%BC%8C%E4%BD%A0%E8%BF%98%E9%9C%80%E8%A6%81%E4%B8%8B%E8%BD%BDC++%E6%89%80%E9%9C%80%E8%A6%81%E7%9A%84%E4%BE%9D%E8%B5%96%E9%A1%B9%EF%BC%88https://github.com/questdb/c-questdb-client%EF%BC%89%EF%BC%8C%E4%B8%8B%E8%BD%BD%E5%A5%BD%E6%96%87%E4%BB%B6%E5%90%8E%EF%BC%8Cmake%E4%B8%80%E4%B8%8B&quot; target=&quot;_blank&quot;&gt;https://github.com/questdb/questdb)，你还需要下载C++所需要的依赖项（https://github.com/questdb/c-questdb-client），下载好文件后&lt;/a&gt;，make编译一下文件。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;#include &amp;lt;questdb/ingress/line_sender.hpp&amp;gt;&lt;/pre&gt;&lt;p&gt;使用前需要包含这个头文件，注意的是想编译运行前，你需要链接一个libquestdb_client.so的共享库文件，不然会报 “error: ld returned 1 exit status”这样的错误，其实写代码报这种错几乎都是缺少共享库，然后编译器找不到你使用的函数。&lt;/p&gt;&lt;p&gt;1.临时启用环境&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;export LD_LIBRARY_PATH=/home/hejiahao/QuestDB/c-questdb-client-main/examples:$LD_LIBRARY_PATH&lt;/pre&gt;&lt;p&gt;2.永久启用&lt;/p&gt;&lt;p&gt;（1）&lt;/p&gt;&lt;pre class=&quot;language-bash light-scrollbar-WEp2KJ&quot; style='-w  Mono&quot;, monospace; overflow-wrap: normal; background: var(--color-bg-page); color: rgba(0, 0, 0, 0.85); word-break: normal; hyphens: none; line-height: 1.5; tab-size: 4; margin-top: 0px; margin-bottom: 0px; overflow: auto; font-size: 13.6px; border-radius: 6px; padding: 0px; overflow-anchor: auto; width: fit-content;'&gt;sudo nano /etc/environment
 (2)
添加LD_LIBRARY_PATH=&quot;/home/hejiahao/QuestDB/c-questdb-client-main/examples:$LD_LIBRARY_PATH&quot; 添加引号保证空格等特殊符号也能被识别&lt;/pre&gt;&lt;p&gt;#启动数据库&lt;/p&gt;&lt;p&gt;./bin/questdb.sh start -d ./data -t questdb&lt;/p&gt;&lt;p&gt;#查询数据库状态&lt;/p&gt;&lt;p&gt;./bin/questdb.sh status -d ./data&lt;/p&gt;&lt;p&gt;#关闭数据库&lt;/p&gt;&lt;p&gt;./bin/questdb.sh stop -d ./data -t questdb&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;编译命令：g++ -o client Client.cpp -L/home/hejiahao/projects/QuestDBLinux  -lquestdb_client&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;这一步是为了让&lt;span style='color: #05073B; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Ubuntu, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans CN&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;; font-size: 15px; text-wrap: wrap; background-color: #FDFDFE;'&gt;程序在编译时能够找到 &lt;/span&gt;&lt;code class=&quot; inline&quot; style='box-sizing: bord  Mono&quot;, Menlo, Courier, monospace; font-size: 12.75px; tab-size: 4; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; color: rgb(5, 7, 59); text-wrap: wrap;'&gt;libquestdb_client.so&lt;/code&gt;&lt;span style='color: #05073B; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Ubuntu, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans CN&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;; font-size: 15px; text-wrap: wrap; background-color: #FDFDFE;'&gt; 这个共享库文件，并且在运行时系统找到它。所以要将库文件的路径添加到系统的库搜索路径中。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;questdb/ingress/line_sender.hpp&amp;gt;
#include &amp;lt;chrono&amp;gt;
int main()
{
    auto sender = questdb::ingress::line_sender::from_conf(
        &quot;http::addr=localhost:9000;&quot;);  //链接数据库
    questdb::ingress::line_sender_buffer buffer;
    buffer
    .table(&quot;room_controls&quot;)
    
    .symbol(&quot;channel_id&quot;,&quot;12819&quot;)
    .symbol(&quot;smpl_time&quot;,&quot;2024-07-01 17:09:15&quot;)
    .column(&quot;nanosecs&quot;, &quot;219&quot;)
    .column(&quot;severity_id&quot;,&quot;5&quot;)
    .column(&quot;status_id&quot;,&quot;3&quot;)
    .column(&quot;num_val&quot;,&quot;1&quot;)
    .column(&quot;float_val&quot;,&quot;-206.442&quot;)
    .column(&quot;str_val&quot;,&quot;NULL&quot;)
    .column(&quot;datatype&quot;,&quot;NULL&quot;)
    .column(&quot;array_val&quot;, &quot;NULL&quot;)
    .at(questdb::ingress::timestamp_nanos::now());
    
    // To insert more records, call `buffer.table(..)...` again.
    
    sender.flush(buffer);
    return 0;
}&lt;/pre&gt;&lt;p&gt;然后根据一个项目简单写一个示例。运行一下，如图所示：&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.cim-cs.com/zb_users/upload/2024/08/202408181723991012117085.png&quot; alt=&quot;1723990940609.png&quot; width=&quot;1445&quot; height=&quot;512&quot; style=&quot;width: 1445px; height: 512px; float: left;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: SegoeUI, -apple-system, BlinkMacSystemFont, Ubuntu, sans-serif; font-size: 15px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 15px; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 15px; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 15px; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 15px; background-color: #FFFFFF;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 15px; background-color: #FFFFFF;&quot;&gt;再简单做个查询操作：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 15px; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;http://www.cim-cs.com/zb_users/upload/2024/08/202408181723991159720792.png&quot; alt=&quot;7be98aad2f41b794c2575fe92d94946.png&quot; width=&quot;1447&quot; height=&quot;577&quot; style=&quot;width: 1447px; height: 577px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Sun, 18 Aug 2024 21:48:39 +0800</pubDate></item><item><title>Open Splice DDS 示例</title><link>http://www.cim-cs.com/?id=16</link><description>&lt;p&gt;根据实际项目写一个能够运行的示例程序：&lt;/p&gt;&lt;p&gt;Publisher：&lt;br&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &quot;ccpp_dds_dcps.h&quot;        /* Include the DDS::DCPS API */
#include&quot;interlocks_DCPS.hpp&quot;
#include&quot;interlock_enums_DCPS.hpp&quot;
#include&quot;common_DCPS.hpp&quot;
#include &quot;interlocksSplDcps.h&quot;
int main(){
   dds::domain::DomainParticipant dp(0);
   
   dds::topic::qos::TopicQos topicQos=dp.default_topic_qos()    // 保证当前Topic的信息保存在所有publisher之外，且在接下来的是可用的。
   &amp;lt;&amp;lt; dds::core::policy::Reliability::Reliable();   // 保证当前Topic信息传递的可靠性级别。
   
   
   dds::topic::Topic&amp;lt;PyramidDDS::interlock_condition&amp;gt; inter_lock_topic(dp, &quot;interlock_condition&quot;, topicQos);
   
   dds::pub::qos::PublisherQos pubQos
            = dp.default_publisher_qos()
                &amp;lt;&amp;lt; dds::core::policy::Partition(&quot;room1&quot;);
   dds::pub::Publisher pub(dp, pubQos);
   dds::pub::DataWriter&amp;lt;PyramidDDS::interlock_condition&amp;gt; dw(pub, inter_lock_topic);
   
   PyramidDDS::interlock_e interlock=PyramidDDS::interlock_e::eILK_COUNT;
   PyramidDDS::interlock_condition data(interlock,true,1,&quot;message&quot;);
   dw.write(data);
   
   std::cout&amp;lt;&amp;lt;&quot;走到这一步&quot;&amp;lt;&amp;lt;std::endl;
   
   return 0;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Suscriber：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;thread&amp;gt;
#include&quot;interlocks_DCPS.hpp&quot;
#include&quot;interlock_enums_DCPS.hpp&quot;
#include&quot;common_DCPS.hpp&quot;
#include &quot;interlocksSplDcps.h&quot;
#include &quot;common/example_utilities.h&quot;
std::ostream&amp;amp;
operator &amp;lt;&amp;lt; (std::ostream&amp;amp; os, const PyramidDDS::interlock_condition&amp;amp; dc)
{
  os &amp;lt;&amp;lt; &quot;(id = &quot; &amp;lt;&amp;lt; dc.condition()
     &amp;lt;&amp;lt; &quot;, interlock = &quot; &amp;lt;&amp;lt; dc.interlock()
     &amp;lt;&amp;lt; &quot;, message = &quot; &amp;lt;&amp;lt; dc.messageText()
     &amp;lt;&amp;lt; &quot;)&quot;;
     
  return os;
}
int main(){
   dds::domain::DomainParticipant dp(0);
   
   dds::topic::qos::TopicQos topicQos=dp.default_topic_qos()    // 保证当前Topic的信息保存在所有publisher之外，且在接下来的是可用的。
   &amp;lt;&amp;lt; dds::core::policy::Reliability::Reliable();   // 保证当前Topic信息传递的可靠性级别。
   dds::topic::Topic&amp;lt;PyramidDDS::interlock_condition&amp;gt; inter_lock_topic(dp, &quot;interlock_condition&quot;, topicQos);
   dds::sub::qos::SubscriberQos subQos
            = dp.default_subscriber_qos()
                &amp;lt;&amp;lt; dds::core::policy::Partition(&quot;room1&quot;);
   
   dds::sub::Subscriber sub(dp, subQos);
   dds::sub::DataReader&amp;lt;PyramidDDS::interlock_condition&amp;gt; dr(sub, inter_lock_topic);
   
   while(true){
       std::cout&amp;lt;&amp;lt;&quot;开始读&quot;&amp;lt;&amp;lt;std::endl;
       auto samples=dr.read();
       std::for_each(samples.begin(),
            samples.end(),
            [](const dds::sub::Sample&amp;lt;PyramidDDS::interlock_condition&amp;gt;&amp;amp; s) {
                std::cout &amp;lt;&amp;lt; s.data() &amp;lt;&amp;lt; std::endl;
            });
   }
   
   return 0;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;注意：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;在上述代码中，publisher和suscriber里面的dp，topic的name，partion都要保持一致，不然接收不到。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在suscriber里面，想打印信息到控制台里面，需要重载&amp;lt;&amp;lt;符号，不然的话会报错误，另外，不知道为什么，我用samples.bengin;samples&amp;lt;samples.end;samples++,也会报同类型错误，即使我不输出什么数据，很奇怪&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;编译执行程序需要链接文件，可以参考examples里面的示例&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</description><pubDate>Tue, 06 Aug 2024 10:43:10 +0800</pubDate></item><item><title>QuestDB的安装与测试</title><link>http://www.cim-cs.com/?id=15</link><description>&lt;p dir=&quot;auto&quot;&gt;QuestDB 是一个开源的時序数据库，支持高吞吐数据获取和快速 SQL 查询，操作简单。 它支持使用InfluxDB连接协议、PostgreSQL协议和REST API进行批量无模式导入和导出。&lt;/p&gt;&lt;p dir=&quot;auto&quot;&gt;QuestDB非常适用于金融市场数据、应用程序指标、传感器数据、实时分析、仪表板和系统基础设施监控。&lt;/p&gt;&lt;p dir=&quot;auto&quot;&gt;QuestDB使用原生时间序列SQL插件实现了ANSI SQL。这些 SQL 扩展语义能更简单的连接 （JOIN）多个来源的关系型数据以及时间序列数据。我们通过列导向的存储模型、大规模 并行的矢量执行、SIMD 指令和各种低延迟技术实现了高性能。整个代码库是用 Java 和 C++从头开始构建的，没有任何外部依赖，并且 100% 不受垃圾回收的影响。&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;一、QuestDB的下载与安装&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;1、下载QuestDB&amp;nbsp;&lt;a href=&quot;https://questdb.io/&quot; target=&quot;_blank&quot;&gt;https://questdb.io/&lt;/a&gt;，截止本文发布的最新版本为8.1.0；&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;2、将文件上传到 ubuntu 20.04 服务器，并解压；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;tar&amp;nbsp;-zxvf&amp;nbsp;questdb-8.1.0-rt-linux-amd64.tar.gz&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;减压后，为方便管理移动到 /usr/local/questdb-8.1.0 路径下&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mv&amp;nbsp;questdb-8.1.0-rt-linux-amd64&amp;nbsp;/usr/local/questdb-8.1.0&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;由于本机机械硬盘挂载在 /home 目录下，新建 /home/questdb 用于存储数据&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mkdir&amp;nbsp;/home/questdb&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;启动、停止QuestDB数据库&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;启动
./questdb.sh&amp;nbsp;start&amp;nbsp;-d&amp;nbsp;/home/questdb/&amp;nbsp;-t&amp;nbsp;questdb

#&amp;nbsp;查看状态
./bin/questdb.sh&amp;nbsp;status&amp;nbsp;-d&amp;nbsp;/home/questdb

#&amp;nbsp;停止
./questdb.sh&amp;nbsp;start&amp;nbsp;-d&amp;nbsp;/home/questdb/&amp;nbsp;-t&amp;nbsp;questdb&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;启动成功：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;root@ubuntu:/usr/local/questdb-8.1.0/bin#&amp;nbsp;./questdb.sh&amp;nbsp;start&amp;nbsp;-d&amp;nbsp;/home/questdb/&amp;nbsp;-t&amp;nbsp;questdb
JAVA:&amp;nbsp;./java
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;___&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_&amp;nbsp;&amp;nbsp;&amp;nbsp;____&amp;nbsp;&amp;nbsp;____
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;nbsp;_&amp;nbsp;\&amp;nbsp;_&amp;nbsp;&amp;nbsp;&amp;nbsp;_&amp;nbsp;&amp;nbsp;___&amp;nbsp;&amp;nbsp;___|&amp;nbsp;|_|&amp;nbsp;&amp;nbsp;_&amp;nbsp;\|&amp;nbsp;__&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;|&amp;nbsp;|&amp;nbsp;|&amp;nbsp;|&amp;nbsp;|&amp;nbsp;|/&amp;nbsp;_&amp;nbsp;\/&amp;nbsp;__|&amp;nbsp;__|&amp;nbsp;|&amp;nbsp;|&amp;nbsp;|&amp;nbsp;&amp;nbsp;_&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;|_|&amp;nbsp;|&amp;nbsp;|_|&amp;nbsp;|&amp;nbsp;&amp;nbsp;__/\__&amp;nbsp;\&amp;nbsp;|_|&amp;nbsp;|_|&amp;nbsp;|&amp;nbsp;|_)&amp;nbsp;|
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\__\_\\__,_|\___||___/\__|____/|____/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;www.questdb.io
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Web&amp;nbsp;Console&amp;nbsp;URL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ILP&amp;nbsp;Client&amp;nbsp;Connection&amp;nbsp;String
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://10.10.3.167:9000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http::addr=10.10.3.167:9000;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://127.0.0.1:9000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http::addr=127.0.0.1:9000;
QuestDB&amp;nbsp;configuration&amp;nbsp;files&amp;nbsp;are&amp;nbsp;in&amp;nbsp;/home/questdb/conf&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 06 Aug 2024 09:56:39 +0800</pubDate></item><item><title>Open Splice DDS 个人学习</title><link>http://www.cim-cs.com/?id=14</link><description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;opensplice的架构是，首先定义好每个信息(topic)，将信息存储到GDS（Global Data Space）中，然后动态的分配publisher与subscriber。虽然数据在程序执行之初已经静态分配，但可以动态的分配publisher与subscriber。从而实现去中心化，可以部分实现动态建立拓扑结构。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;strong&gt;1.建立域&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这是一个相当于空间的概念，你想两个或多个设备互相通信，首先需要建立空间。&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;按照ioscpp2标准，生成的参与者的代码应该为：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;dds::domain::DomainParticipant dp(0);&lt;/pre&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;对于多个参与者订阅者，想要互相发数据接收数据，都需要建立同样的域，上述代码就是将域设置为0。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt; &lt;span style=&quot;font-size: 20px;&quot;&gt;2.建立Topic&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;Topic支持很多vendors，比如IDL、XML、protobuf等。我主要用的是IDL格式。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;（1）Topic是由一个type、一个唯一的name和一系列的services组成。&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;Topic type是由IDL(Interface Definition Language[1])表示，如下代码就是一个简单的HelloWorldData.idl文件。（这个文件在软件的example有。路径：HDE/x86_64.linux/examples/dcps/HelloWorld/idl）&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;module HelloWorldData
{
   struct Msg
   {
      /** User ID */
      long userID;
      /**  message */
      string message;
   };
   #pragma keylist Msg userID
};&lt;/pre&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;这个&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;.idl文件&lt;/span&gt;是不是很熟悉，很像C++中的class的感觉，里面包含了struct，&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;HelloWorldData&lt;/span&gt;是指idl的范围（scope）；&lt;span style=&quot;text-wrap: wrap;&quot;&gt;Msg&lt;/span&gt;是指idl的数据内容（包含的信息）；#pragma keylist指明了DataCommType的键值（keys），每个键值将标识特定的数据流; 更准确地说，在DDS中，每个键值都标识一个Topic实例。第一步虽然是在一个域下面，但是多种数据，又需要用topic区分开，&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;&lt;code class=&quot;cpp plain&quot; style=&quot;font-siz : initial !important; background-siz : static !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;&quot;&gt;dds::topic::Topic&amp;lt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;HelloWorldData&lt;/span&gt;::&lt;span style=&quot;text-wrap: wrap;&quot;&gt;Msg&lt;/span&gt;&amp;gt; topic(dp, &lt;/code&gt;&lt;code class=&quot;cpp string&quot; style=&quot;font-siz : initial !important; background-siz : static !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; color: rgb(0, 0, 255) !important;&quot;&gt;&quot;DDataComm&quot;&lt;/code&gt;&lt;code class=&quot;cpp plain&quot; style=&quot;font-siz : initial !important; background-siz : static !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&quot;DDataComn&quot;这个名字对于publisher和scriber要设定一样，不然互相找不到，dp就是你自己的域名。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;strong&gt;3.&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;写数据&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;好的，你现在既在一个域和一个topic下面了，应该就能互相发送数据了。（其实还会有一个Partion，这个目前不是很熟，后面熟悉了再解释）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace; font-size: 12px;'&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;dds::pub::Publisher pub(dp);
dds::pub::DataWriter&amp;lt;DataComm::DataCommType&amp;gt; dw(pub, topic);&lt;/pre&gt;&lt;p style='font-family: Consolas, &quot;Bitstr t; padding: 0px 1em !important; position: static !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;'&gt;&lt;span style='background-color: #FFFFFF; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;'&gt;参与者dp2是数据的publisher，同时定义了写数据dw。（有点像定义一个画家和笔一样的感觉）&lt;/span&gt;&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;将数据写入topic，数据写入topic的方式主要由两种：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;HelloWorldData::Msg msg(1, &quot;hello world&quot;)
dw.write(msg)&lt;/pre&gt;&lt;p&gt;先将数据存入变量，然后写到dw中区&lt;/p&gt;&lt;p&gt;或者&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;dw&amp;lt;&amp;lt;
HelloWorldData::Msg (1, &quot;hello world&quot;);&lt;/pre&gt;&lt;p&gt;将数据按照数据流的方式写入dw里面去。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;strong&gt;4.读数据&lt;/strong&gt;&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;和写数据差不多&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;dds::sub::Subscriber sub(dp);
dds::sub::DataReader&amp;lt;HelloWorldData::Msg&amp;gt; dr(sub, topic);&lt;/pre&gt;&lt;p&gt;然后通过dw.read()读取数据，你可以将读出来的数据放到变量里面，打印出来，看看是不是想要的&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;strong&gt;5.Topic介绍&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;（1）&lt;span style=&quot;text-wrap: wrap;&quot;&gt;pragma keylist&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个topic里面有个pragma keylist，后面你可以跟参数也可以不跟，区别是：比如跟个id，不同的id，相当于创建不同的实例，而这样的话，在系统中就会占据多个资源，好像是坏处，但其实，你可以将不同的id看作现实中不同的硬件，不同硬件传递不同参数，这样的话，在系统运行的过程中，每由一个设备接入，系统会监测到，同时为设个设备分配相应的topic instance。如果你只有一个硬件设备，那么就可以不设，节省资源&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;（2）分区&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面有提到partion，根据网上的资料：域可以进一步组织成分区，其中每个分区可以表示topic的逻辑分组。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;dds::pub::qos::PublisherQos pubQos
            = dp.default_publisher_qos()
                &amp;lt;&amp;lt; dds::core::policy::Partition(&quot;room1&quot;)&lt;/pre&gt;&lt;p&gt;目前实践可以这么使用，和topic一样，要想在分布订阅数据，分区名也要一样。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;&lt;strong&gt;6.Qos介绍&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Qos可以理解为数据发送者和接收者之间的合约，Qos基本负责DDS中的所有配置，像我们熟知的心跳机制，消息可靠性，流量控制，等等，所以想要保证顺利接受到发送方发的数据，我们要保证Qos的策略要兼容（可以理解为接受方的策略严格程度小于发送方）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;（1）&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;数据可用性服务（Data availability）&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;Opensplice为域的参与者提供了一些数据可用行服务，包括如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFFFFF;&quot;&gt;         &lt;span style=&quot;background-color: #FFFFFF; font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;VOLATILE：&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;        dds::core::policy::Durability::Volatile()&lt;/pre&gt;&lt;p&gt;         一旦设定，当前发布者发布的数据只提供给现有的订阅者，后面再加入的订阅者就收不到信息了，这是默认设置。&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;       &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;  &lt;/span&gt;PERSISTENT：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;        dds::core::policy::Durability::Persistent()&lt;/pre&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;         一旦设定，永久保存数据，后面的订阅者仍然能够获得数据，即使系统发生重启，源码里面解释会将数据存入例如硬盘的存储空间里。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;         &lt;strong&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF; font-size: 16px;'&gt;TRANSIENT：&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;        dds::core::policy::Durability::Transient();&lt;/pre&gt;&lt;p&gt;         一旦设定，GDS保存数据，&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;后面的订阅者仍然能够获得数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;       &lt;strong&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF; font-size: 16px;'&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;TRANSIENT_LOCAL&lt;/span&gt;：&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;        dds::core::policy::Durability::TransientLocal();&lt;/pre&gt;&lt;p&gt;         一旦设定，&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;如果publisher还存在，为了接下来的subscriber得到最新发布的数据，TRANSIENT_LOCAL服务保证publisher需要将数据存储在本地。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;         对于这些策略，个人理解是， 对于一个DDS系统，里面有多个发布者和订阅者，对于这些订阅者，不一定是同时启动，有的快，有的慢，如果使用默认的VOLATILE策略那么后启动的订阅者则会失去一些信息，而使用其他模式，其实你是后启动的或者离线重新连接的，由于这些数据是存储在本地的，所以仍然会接收到。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;(2) 数据传输服务（Data delivery）&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;以下策略是控制数据的交付方式：&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt; dds::core::policy::Presentation()&lt;/span&gt; &lt;/strong&gt;：控制着想subscriber提供信息变更的方式，它下面有好几种方式，主要是这两种：coherent_access和ordered_access 第一个就是接收方的信息都收到，程序才能访问，第二个就是应用程序按照数据到达顺序访问。此QoS可控制数据更新的排序和一致性。应用范围由访问范围定义，访问范围可以是INSTANCE，TOPIC或GROUP级别之一。&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt; &lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;dds::core::policy::Reliability()&lt;/span&gt;&lt;/strong&gt;：控制与数据扩散相关的可靠性级别。可能的选择是RELIABLE和BEST_EFFORT分配。reliable就是可靠送达，另一个就是尽力送达，前者比较耗资源。&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;dds::core::policy::Partition()&lt;/span&gt;&lt;/strong&gt;&lt;span style='background-color: #FFFFFF; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;'&gt;：同上分区介绍。&lt;/span&gt;&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt; &lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;dds::core::policy::DestinationOrder()&lt;/span&gt;&lt;/strong&gt;：控制publisher对给定topic的某个instance所做的更改的顺序。 DDS允许根据源或目标时间戳排序不同的更改。ReceptionTimestamp和SourceTimestamp，一个以接受端最后收到的数据为准，一个是以发送端发送的最后的数据为准。&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;dds::core::policy::Ownership()&lt;/span&gt;&lt;/strong&gt;&lt;span style='background-color: #FFFFFF; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;'&gt;：控制哪个writer拥有topic的访问权，当有多个writers要求访问topic，且topic是EXCLUSIVE（独占）。仅仅拥有最高OWNERSHIP_STRENGTH（拥有权）的writer可以publish数据。如果OWNERSHIP QoS是共享的那么可以由多个writer访问topic，因此有助于管理相同数据的复制发布者。&lt;/span&gt;当系统中存在针对同一个数据实例的多个Datawriter时，可以通过设置每个Datawriter的&quot;强度&quot;来控制Datawriter的写入权限(“强度”最高的DataWriter拥有写入权限)&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;span style=&quot;font-family: 微软雅黑, 宋体, Arial, Helvetica, sans-serif;&quot;&gt;比如:有两套传感器(冗余)只使用一个，一个发生故障(高强度)，切换到另一个传感器(次强度)&lt;/span&gt;&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;这些DDS数据传输服务控制数据的可靠性和可用性，从而允许在正确的时间将正确的数据传送到正确的位置。&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;br&gt;&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;(3)  数据及时性服务（Data timeliness）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;下面的这些策略是控制分布式数据的时效性：&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt; &lt;strong&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;dds::core::policy::&lt;/span&gt;DeadLine&lt;/strong&gt;&lt;/span&gt;：可以定义的最大到达时间值。当任务错过最大时间到达值，Opensplice可以配置通知任务已经错过。设置deadline注意要将接收端的deadline&amp;gt;=发送方的，不然会不兼容！&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;dds::core::policy::&lt;/span&gt;&lt;span style=&quot;font-family: 微软雅黑, 宋体, Arial, Helvetica, sans-serif;&quot;&gt;LatencyBudget&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;：可以为任务提供了一种通知Opensplice传输数据相关的紧急程度的方法。这个服务指定DDS必须分发信息的时间段。此时间段从publisher写入数据的那一刻开始，直到subscriber的数据缓存中可用，以供读者使用。&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;dds::core::policy::TransportPriority &lt;/span&gt;&lt;/strong&gt;：允许任务控制topic或者topic instance的重要程度，从而允许处理任务优先处理相对重要的topic。里面设置数值，越大表示优先级越高。&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;span style=&quot;font-family: 微软雅黑, 宋体, Arial, Helvetica, sans-serif;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style='margin: 10px auto; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);'&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 微软雅黑, 宋体, Arial, Helvetica, sans-serif; font-size: 18px;&quot;&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;(4)  &lt;/span&gt;Resources (计算资源)&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;DDS定义了以下Qos策略来控制满足数据分发要求所必需的网络和计算资源:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;1、TimeBasedFilter&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;设置该参数意味着在指定时间周期内只期望收到一个data sample,过多的data sample将被DataReader丢弃该参数有助于优化网络负载及节点的计算资源。&lt;/p&gt;&lt;p&gt;比如:默认情况发送方能发送得很快(1秒108个)，接受方只要求1秒5个，就可以设置这个参数控制发送速度，减小本地系统资源。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;2、ResourceLimits&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用于限制DDS可以分配的系统内存&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF; font-size: 18px;'&gt;(5)  组态（Configuration）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;未完待续。。。。。。。。。。。。。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;'&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Sun, 04 Aug 2024 19:37:46 +0800</pubDate></item><item><title>Open Splice  DDS安装</title><link>http://www.cim-cs.com/?id=13</link><description>&lt;p&gt;Open Splice&amp;nbsp; DDS网址：&lt;a href=&quot;https://github.com/ADLINK-IST/opensplice&quot; target=&quot;_blank&quot;&gt;https://github.com/ADLINK-IST/opensplice&lt;/a&gt;&amp;nbsp;选择自己的版本&lt;/p&gt;&lt;p&gt;使用前，请确认自己的环境里面包含运行依赖包，具体看github网址下面的&lt;/p&gt;&lt;h4 class=&quot;heading-element&quot; style=&quot;box-sizing: bord t-size: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;POSIX / Linux Minimal Build Required Tools&lt;/h4&gt;&lt;p&gt;准备完毕后，首先cd到/HDE/x86_64.linux目录下（不同的下载包名字可能不同），执行source&amp;nbsp;release.com命令配置环境变量，&lt;/p&gt;&lt;p&gt;每次执行前都需要执行这一步，嫌麻烦的话，可以将这个命令放到/etc/bashrc下，执行完应该会有&lt;/p&gt;&lt;p&gt;&amp;lt;&amp;lt;&amp;lt; Vortex OpenSplice HDE Release 6.9.181127OSS For x86_64.linux, Date 2018-11-28 &amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;这个提示，不想看的话也可以去release.com里面注释掉&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 03 Aug 2024 09:29:07 +0800</pubDate></item><item><title>EPICS集成AutoSave模块实现参数初始化</title><link>http://www.cim-cs.com/?id=12</link><description>&lt;p&gt;EPICS synApps是用于开发基于EPICS的输运线控制系统的软件工具集，其子模块之一的 AutoSave 可用于保存PV的值并在EPICS启动时初始化上次保存的值。&lt;/p&gt;&lt;p&gt;阅读本文建设你已经完成EPICS环境的安装（可参考 &lt;a href=&quot;http://www.cim-cs.com/?id=11&quot; target=&quot;_self&quot;&gt;Ubuntu 22.04 EPICS 环境搭建&lt;/a&gt; ）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、AutoSave的编译&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1、下载EPICS AutoSave模块的Release版本 &lt;a href=&quot;https://github.com/epics-modules/autosave/releases&quot; target=&quot;_self&quot;&gt;https://github.com/epics-modules/autosave/releases&lt;/a&gt;，截止目前该模块最新发布版本为R5-11，由于笔者EPICS-Base等版本非最新，安装过程中提示支持R5-9版本；&lt;/p&gt;&lt;p&gt;2、将文件上传到 /opt/epics/support 目录下，解压并编译；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;tar&amp;nbsp;-zxvf&amp;nbsp;autosave-R5-9.tar.gz&lt;/pre&gt;&lt;p&gt;减压后切换到加压的文件夹目录的&amp;nbsp;configure&amp;nbsp;路径下，修改配置文件&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;cd&amp;nbsp;autosave-R5-9/configure
vim&amp;nbsp;RELEASE&lt;/pre&gt;&lt;p&gt;修改EPICS_BASE路径为实际路径&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;EPICS_BASE=/opt/epics/epics-base&lt;/pre&gt;&lt;p&gt;修改完成后，切换回AutoSave根目录下直接 make 编译&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;make&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;二、AutoSave示例&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;新建一个EPICS IOC 用来来测试；&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;cd&amp;nbsp;/opt
mkdir&amp;nbsp;sim-ioc
cd&amp;nbsp;sim-ioc&lt;/pre&gt;&lt;p&gt;在sim-ioc路径下，通过&amp;nbsp;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;makeBaseApp.pl 脚本&lt;/span&gt;创建示例IOC，并 make 编译；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;makeBaseApp.pl&amp;nbsp;-t&amp;nbsp;ioc&amp;nbsp;sim-ioc
makeBaseApp.pl&amp;nbsp;-i&amp;nbsp;-t&amp;nbsp;ioc&amp;nbsp;sim-ioc&lt;/pre&gt;&lt;p&gt;修改&amp;nbsp;configure/RELEASE 中 epics-base 和 support 路径，示例中用到了还用到了 opcua 模块 &lt;a href=&quot;http://www.cim-cs.com/?id=10&quot; target=&quot;_self&quot;&gt;EPICS 使用open62541 SDK集成OPC UA设备支持&lt;/a&gt;；&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;Variables&amp;nbsp;and&amp;nbsp;paths&amp;nbsp;to&amp;nbsp;dependent&amp;nbsp;modules:
#MODULES&amp;nbsp;=&amp;nbsp;/path/to/modules
#MYMODULE&amp;nbsp;=&amp;nbsp;$(MODULES)/my-module
SUPPORT&amp;nbsp;=&amp;nbsp;/opt/epics/support
#&amp;nbsp;If&amp;nbsp;using&amp;nbsp;the&amp;nbsp;sequencer,&amp;nbsp;point&amp;nbsp;SNCSEQ&amp;nbsp;at&amp;nbsp;its&amp;nbsp;top&amp;nbsp;directory:
#SNCSEQ&amp;nbsp;=&amp;nbsp;$(MODULES)/seq-ver
OPCUA&amp;nbsp;=&amp;nbsp;$(SUPPORT)/opcua-v0.10.0
AUTOSAVE&amp;nbsp;=&amp;nbsp;$(SUPPORT)/autosave-R5-9
#&amp;nbsp;EPICS_BASE&amp;nbsp;should&amp;nbsp;appear&amp;nbsp;last&amp;nbsp;so&amp;nbsp;earlier&amp;nbsp;modules&amp;nbsp;can&amp;nbsp;override&amp;nbsp;stuff:
EPICS_BASE&amp;nbsp;=&amp;nbsp;/opt/epics/epics-base&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;修改&amp;nbsp;sim-iocApp/src/Makefile&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;Include&amp;nbsp;dbd&amp;nbsp;files&amp;nbsp;from&amp;nbsp;all&amp;nbsp;support&amp;nbsp;applications:
sim-ioc_DBD&amp;nbsp;+=&amp;nbsp;opcua.dbd
sim-ioc_DBD&amp;nbsp;+=&amp;nbsp;asSupport.dbd
#&amp;nbsp;Add&amp;nbsp;all&amp;nbsp;the&amp;nbsp;support&amp;nbsp;libraries&amp;nbsp;needed&amp;nbsp;by&amp;nbsp;this&amp;nbsp;IOC
sim-ioc_LIBS&amp;nbsp;+=&amp;nbsp;opcua
sim-ioc_LIBS&amp;nbsp;+=&amp;nbsp;autosave&lt;/pre&gt;&lt;p&gt;修改 st.cmd 文件&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#!../../bin/linux-x86_64/sim-ioc

#-&amp;nbsp;You&amp;nbsp;may&amp;nbsp;have&amp;nbsp;to&amp;nbsp;change&amp;nbsp;sim-ioc&amp;nbsp;to&amp;nbsp;something&amp;nbsp;else
#-&amp;nbsp;everywhere&amp;nbsp;it&amp;nbsp;appears&amp;nbsp;in&amp;nbsp;this&amp;nbsp;file

&amp;lt;&amp;nbsp;envPaths

cd&amp;nbsp;&amp;quot;${TOP}&amp;quot;

##&amp;nbsp;Register&amp;nbsp;all&amp;nbsp;support&amp;nbsp;components
dbLoadDatabase&amp;nbsp;&amp;quot;dbd/sim-ioc.dbd&amp;quot;
sim_ioc_registerRecordDeviceDriver&amp;nbsp;pdbbase

set_requestfile_path(&amp;quot;$(TOP)/iocBoot/$(IOC)&amp;quot;,&amp;quot;&amp;quot;)
set_requestfile_path(&amp;quot;$(TOP)/iocBoot/$(IOC)&amp;quot;,&amp;quot;autosave&amp;quot;)

set_savefile_path(&amp;quot;$(TOP)/iocBoot/$(IOC)/autosave&amp;quot;)

set_pass1_restoreFile(&amp;quot;auto_settings.sav&amp;quot;)

save_restoreSet_numSeqFiles(3)
save_restoreSet_SeqPeriodInSeconds(600)
save_restoreSet_RetrySeconds(60)
save_restoreSet_CAReconnect(1)
save_restoreSet_CallbackTimeout(-1)

##&amp;nbsp;Load&amp;nbsp;record&amp;nbsp;instances
opcuaCreateSession&amp;nbsp;OPC_SIM&amp;nbsp;opc.tcp://192.168.142.1:53530/OPCUA/SimulationServer
opcuaCreateSubscription&amp;nbsp;OPC_SIM_SUB&amp;nbsp;OPC_SIM&amp;nbsp;1000
dbLoadRecords(&amp;quot;${TOP}/db/TEST-SIM.db&amp;quot;)

cd&amp;nbsp;&amp;quot;${TOP}/iocBoot/${IOC}&amp;quot;
iocInit

create_monitor_set(&amp;quot;auto_settings.req&amp;quot;,&amp;nbsp;5,&amp;nbsp;&amp;quot;P=TEST-SIM:&amp;quot;)

##&amp;nbsp;Start&amp;nbsp;any&amp;nbsp;sequence&amp;nbsp;programs
#seq&amp;nbsp;sncxxx,&amp;quot;user=root&amp;quot;&lt;/pre&gt;&lt;p&gt;在 st.cmd 同级目录下创建 autosave 目录，并新建&amp;nbsp;auto_settings.req 文件，添加需要自动保存的数据点；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;$(P)Constant.VAL
$(P)Setting.VAL&lt;/pre&gt;&lt;p&gt;修改完成后 make 编译，随后切换到 ./iocBoot/sim-ioc/ 路径下，给启动脚本赋予执行权限；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;cd&amp;nbsp;iocBoot/sim-ioc/
chmod&amp;nbsp;+x&amp;nbsp;st.cmd&lt;/pre&gt;&lt;p&gt;启动IOC，通过日志可以看到当前两个PV数据点都连接成功；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;create_monitor_set(&amp;quot;auto_settings.req&amp;quot;,&amp;nbsp;5,&amp;nbsp;&amp;quot;P=TEST-SIM:&amp;quot;)
##&amp;nbsp;Start&amp;nbsp;any&amp;nbsp;sequence&amp;nbsp;programs
#seq&amp;nbsp;sncxxx,&amp;quot;user=root&amp;quot;
auto_settings.sav:&amp;nbsp;2&amp;nbsp;of&amp;nbsp;2&amp;nbsp;PV&amp;#39;s&amp;nbsp;connected
epics&amp;gt;&lt;/pre&gt;&lt;p&gt;修改这两个PV值，重启IOC可观察PV值可实现上一次保存值的初始化；&lt;/p&gt;</description><pubDate>Wed, 13 Mar 2024 09:18:31 +0800</pubDate></item><item><title>Ubuntu 22.04 EPICS 环境搭建</title><link>http://www.cim-cs.com/?id=11</link><description>&lt;p&gt;本次示例安装在 Ubuntu 22.04 虚拟机上，真机安装系统时需要注意 BIOS 设置及硬盘分区。此外搭建环境过程中需要接入外网，方便在线安装相关依赖。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、安装准备&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1、新建Ubuntu 22.04虚拟机，具体安装步骤略，注意配置虚拟机网络连接；&lt;/p&gt;&lt;p&gt;2、设置root用户密码，开启ssh远程连接；&lt;/p&gt;&lt;p&gt;设置root用户密码&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;sudo&amp;nbsp;passwd&amp;nbsp;root&lt;/pre&gt;&lt;p&gt;开启ssh远程连接&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;ifconfig
sudo&amp;nbsp;apt-get&amp;nbsp;update
sudo&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;net-tools
sudo&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;openssh-server&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;安装ssh&lt;/pre&gt;&lt;p&gt;安装ssh完成后，修改配置文件，添加&amp;nbsp;&lt;span style=&quot;background-color: white; color: #4D4D4D; font-family: Arial, sans-serif;&quot;&gt;PermitRootLogin yes&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;vim&amp;nbsp;/etc/ssh/sshd_config&lt;/pre&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#LoginGraceTime&amp;nbsp;2m
#PermitRootLogin&amp;nbsp;prohibit-password
PermitRootLogin&amp;nbsp;yes
#StrictModes&amp;nbsp;yes
#MaxAuthTries&amp;nbsp;6
#MaxSessions&amp;nbsp;10&lt;/pre&gt;&lt;p&gt;修改完成后，重启ssh服务&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;/etc/init.d/ssh&amp;nbsp;restart
systemctl&amp;nbsp;restart&amp;nbsp;ssh&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;二、安装epics base&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;安装流程可参考官方帮助文档：&lt;a href=&quot;https://docs.epics-controls.org/projects/how-tos/en/latest/getting-started/installation.html&quot; target=&quot;_self&quot;&gt;https://docs.epics-controls.org/projects/how-tos/en/latest/getting-started/installation.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;1、安装编译环境等相关依赖；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;sudo&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;g++
sudo&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;gcc
sudo&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;c++
sudo&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;libreadline-dev

sudo&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;make
sudo&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;cmake&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;用于开源库的编译&lt;/pre&gt;&lt;p&gt;2、下载epics base并编译；&lt;/p&gt;&lt;p&gt;可以在EPICS官网 &lt;a href=&quot;https://epics-controls.org/&quot; target=&quot;_self&quot;&gt;https://epics-controls.org/&lt;/a&gt;&amp;nbsp; 或github仓库&amp;nbsp;&lt;a href=&quot;https://github.com/epics-base/epics-base&quot; target=&quot;_self&quot;&gt;https://github.com/epics-base/epics-base&lt;/a&gt; 下载；&lt;/p&gt;&lt;p&gt;这里下载的 Base Release 3.15.9&amp;nbsp; 稳定版本，该版本发布于2021年6月；V4版本后引入了PVA，后合并版本3 4为V7版本，PVA相比CA协议支持更高的性能，目前使用较多的还是标准通信协议CA。&lt;/p&gt;&lt;p&gt;下载后路径为 /opt/epics，解压缩并修改路径为epics-base，方便后续配置环境变量；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mkdir&amp;nbsp;/opt/epics&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;新建路径，并将&amp;nbsp;*.tar.gz&amp;nbsp;通过&amp;nbsp;ftp&amp;nbsp;上传至该路径

tar&amp;nbsp;-zxvf&amp;nbsp;epics-base-R3.15.9.tar.gz
mv&amp;nbsp;epics-base-R3.15.9&amp;nbsp;epics-base&lt;/pre&gt;&lt;p&gt;切换到 /opt/epics/epics-base 路径并编译；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;cd&amp;nbsp;/opt/epics/epics-base
make&lt;/pre&gt;&lt;p&gt;编译完成后，配置EPICS的环境变量&lt;/p&gt;&lt;p&gt;vim /etc/profile&lt;/p&gt;&lt;p&gt;在配置文件中加入以下内容，并通过source使之生效：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;export&amp;nbsp;EPICS_BASE=/opt/epics/epics-base
export&amp;nbsp;EPICS_HOST_ARCH=$(${EPICS_BASE}/startup/EpicsHostArch)
export&amp;nbsp;PATH=${EPICS_BASE}/bin/${EPICS_HOST_ARCH}:${PATH}&lt;/pre&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;source&amp;nbsp;/etc/profile&lt;/pre&gt;&lt;p&gt;至此，EPICS base环境已经搭建好，可新建一个EPICS IOC Example来测试；&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;cd&amp;nbsp;/opt
mkdir&amp;nbsp;example-ioc
cd&amp;nbsp;example-ioc&lt;/pre&gt;&lt;p&gt;在example-ioc路径下，通过&amp;nbsp;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;makeBaseApp.pl 脚本&lt;/span&gt;创建示例IOC，并 make 编译；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;makeBaseApp.pl&amp;nbsp;-t&amp;nbsp;example&amp;nbsp;example-ioc
makeBaseApp.pl&amp;nbsp;-i&amp;nbsp;-t&amp;nbsp;example&amp;nbsp;example-ioc

make&lt;/pre&gt;&lt;p&gt;编译完成后，切换到 ./&lt;span style=&quot;text-wrap: wrap;&quot;&gt;iocBoot/example-ioc/ 路径下，给启动脚本赋予执行权限；&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;cd&amp;nbsp;iocBoot/example-ioc/
chmod&amp;nbsp;+x&amp;nbsp;st.cmd&lt;/pre&gt;&lt;p&gt;启动IOC，并通过 dbl 查看当前IOC的数据点；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;root@cimcs-server:/opt/example-ioc/iocBoot/example-ioc#&amp;nbsp;./st.cmd&amp;nbsp;
#!../../bin/linux-x86_64/example-ioc
##&amp;nbsp;You&amp;nbsp;may&amp;nbsp;have&amp;nbsp;to&amp;nbsp;change&amp;nbsp;example-ioc&amp;nbsp;to&amp;nbsp;something&amp;nbsp;else
##&amp;nbsp;everywhere&amp;nbsp;it&amp;nbsp;appears&amp;nbsp;in&amp;nbsp;this&amp;nbsp;file
&amp;lt;&amp;nbsp;envPaths
epicsEnvSet(&amp;quot;IOC&amp;quot;,&amp;quot;example-ioc&amp;quot;)
epicsEnvSet(&amp;quot;TOP&amp;quot;,&amp;quot;/opt/example-ioc&amp;quot;)
epicsEnvSet(&amp;quot;EPICS_BASE&amp;quot;,&amp;quot;/opt/epics/epics-base&amp;quot;)
cd&amp;nbsp;&amp;quot;/opt/example-ioc&amp;quot;
##&amp;nbsp;Register&amp;nbsp;all&amp;nbsp;support&amp;nbsp;components
dbLoadDatabase&amp;nbsp;&amp;quot;dbd/example-ioc.dbd&amp;quot;
example_ioc_registerRecordDeviceDriver&amp;nbsp;pdbbase
##&amp;nbsp;Load&amp;nbsp;record&amp;nbsp;instances
dbLoadTemplate&amp;nbsp;&amp;quot;db/user.substitutions&amp;quot;
dbLoadRecords&amp;nbsp;&amp;quot;db/dbSubExample.db&amp;quot;,&amp;nbsp;&amp;quot;user=root&amp;quot;
##&amp;nbsp;Set&amp;nbsp;this&amp;nbsp;to&amp;nbsp;see&amp;nbsp;messages&amp;nbsp;from&amp;nbsp;mySub
#var&amp;nbsp;mySubDebug&amp;nbsp;1
##&amp;nbsp;Run&amp;nbsp;this&amp;nbsp;to&amp;nbsp;trace&amp;nbsp;the&amp;nbsp;stages&amp;nbsp;of&amp;nbsp;iocInit
#traceIocInit
cd&amp;nbsp;&amp;quot;/opt/example-ioc/iocBoot/example-ioc&amp;quot;
iocInit
Starting&amp;nbsp;iocInit
############################################################################
##&amp;nbsp;EPICS&amp;nbsp;R3.15.9
##&amp;nbsp;EPICS&amp;nbsp;Base&amp;nbsp;built&amp;nbsp;Mar&amp;nbsp;&amp;nbsp;5&amp;nbsp;2024
############################################################################
iocRun:&amp;nbsp;All&amp;nbsp;initialization&amp;nbsp;complete
##&amp;nbsp;Start&amp;nbsp;any&amp;nbsp;sequence&amp;nbsp;programs
#seq&amp;nbsp;sncExample,&amp;nbsp;&amp;quot;user=root&amp;quot;
epics&amp;gt;&amp;nbsp;dbl
root:aSubExample
root:subExample
root:xxxExample
root:compressExample
root:calcExample
root:calcExample1
root:calc1
root:calcExample2
root:calc2
root:calcExample3
root:calc3
root:aiExample
root:aiExample1
root:ai1
root:aiExample2
root:ai2
root:aiExample3
root:ai3
epics&amp;gt;&lt;/pre&gt;&lt;p&gt;另起一个终端，监控模拟数据点；&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-basic&quot;&gt;root@cimcs-server:/home/cimcs#&amp;nbsp;cainfo&amp;nbsp;root:ai1
root:ai1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;State:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connected
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Host:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;192.168.142.133:5064
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Access:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;read,&amp;nbsp;write
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Native&amp;nbsp;data&amp;nbsp;type:&amp;nbsp;DBF_DOUBLE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Request&amp;nbsp;type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DBR_DOUBLE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Element&amp;nbsp;count:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1
root@cimcs-server:/home/cimcs#&amp;nbsp;camonitor&amp;nbsp;root:ai1
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:03.032647&amp;nbsp;3&amp;nbsp;LOW&amp;nbsp;MINOR
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:04.046975&amp;nbsp;4&amp;nbsp;LOW&amp;nbsp;MINOR
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:05.032955&amp;nbsp;5&amp;nbsp;&amp;nbsp;
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:06.037752&amp;nbsp;6&amp;nbsp;HIGH&amp;nbsp;MINOR
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:07.032891&amp;nbsp;7&amp;nbsp;HIGH&amp;nbsp;MINOR
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:08.038839&amp;nbsp;8&amp;nbsp;HIHI&amp;nbsp;MAJOR
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:09.033308&amp;nbsp;9&amp;nbsp;HIHI&amp;nbsp;MAJOR
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:10.042908&amp;nbsp;0&amp;nbsp;LOLO&amp;nbsp;MAJOR
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:11.035694&amp;nbsp;1&amp;nbsp;LOLO&amp;nbsp;MAJOR
root:ai1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-03-05&amp;nbsp;15:31:12.044342&amp;nbsp;2&amp;nbsp;LOLO&amp;nbsp;MAJOR&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 05 Mar 2024 09:07:36 +0800</pubDate></item><item><title>EPICS 使用open62541 SDK集成OPC UA设备支持</title><link>http://www.cim-cs.com/?id=10</link><description>&lt;p&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;前言：本文假设你已经在Linux系统下搭建好了EPICS的开发环境，了解Linux常用命令。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #1F2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; box-sizing: border-box; vertical-align: inherit; font-size: 16px;&quot;&gt;EPICS opcua module（&lt;a href=&quot;https://github.com/epics-modules/opcua&quot; target=&quot;_self&quot;&gt;https://github.com/epics-modules/opcua&lt;/a&gt;）是用于连接 OPC UA 协议的&lt;/span&gt;&lt;a href=&quot;https://epics-controls.org/&quot; rel=&quot;nofollow&quot; style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; text-underline-offset: 0.2rem; text-decoration: underline; box-sizing: border-box; vertical-align: inherit; font-size: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit; font-size: 16px;&quot;&gt;EPICS设备支持模块。&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #1F2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; box-sizing: border-box; vertical-align: inherit; font-size: 16px;&quot;&gt;该模块支持两种OPC UA Client SDK的不同实现。&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 微软雅黑, 宋体, Arial, Helvetica, sans-serif; font-size: 16px;&quot;&gt;UA OPC UA SDK是目前市场普遍在用的解决方案，但需要购买授权，这里就不介绍太多，感兴趣可以浏览其官方网站。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 微软雅黑, 宋体, Arial, Helvetica, sans-serif; font-size: 16px;&quot;&gt;本文主要介绍使用open62541 SDK集成OPC UA设备支持，仅供学习和参考。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 微软雅黑, 宋体, Arial, Helvetica, sans-serif; font-size: 14px;&quot;&gt;&lt;img src=&quot;http://www.cim-cs.com/zb_users/upload/2024/01/202401221705890938274225.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;open62541（&lt;/span&gt;&lt;a href=&quot;https://www.open62541.org/&quot; target=&quot;_self&quot; style=&quot;font-size: 16px; text-decoration: underline;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;https://www.open62541.org/&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;）是开源的OPC UA SDK，基于MPL v2.0开源协议。值得注意的是&lt;span style=&quot;color: #1F2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; background-color: #FFFFFF; font-size: 16px;&quot;&gt;EPICS opcua module基于open62541 SDK的实现目前还处于开发阶段，尚不支持结构化数据。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 tabindex=&quot;-1&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; font-size: 1.25em; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;使用open62541 SDK&lt;/span&gt;&lt;/h3&gt;&lt;ul dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding-left: 2em; margin-bottom: 16px; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;下载并解压 open62541 发行版。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;在根目录下创建一个构建目录 build 并&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;cd&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;进入该目录路径。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;Open62541 的 cmake 构建默认创建一个静态库。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;EMBED 类型的设备支持构建需要这种类型的库（见下文）。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;要创建共享库，请构建 Open62541 库并设置 cmake 选项&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;BUILD_SHARED_LIBS=ON&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative !important; overflow: auto !important; margin-bottom: 16px; display: flex; justify-content: space-between; background-color: var(--bgColor-muted, var(--color-canvas-subtle));&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; color: var(--fgColor-default, var(--color-fg-default)); background-color: var(--bgColor-muted, var(--color-canvas-subtle)); border-radius: 6px; word-break: normal; min-height: 52px;&quot;&gt;cmake&amp;nbsp;..&amp;nbsp;-DBUILD_SHARED_LIBS=ON&amp;nbsp;[...]&lt;/pre&gt;&lt;clipboard-copy aria-label=&quot;Copy&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;cmake .. -DBUILD_SHARED_LIBS=ON [...]&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; position: relative; font-size: 14px; font-weight: var(--base-text-weight-medium, 500); line-height: 20px; text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; border: 0px; border-radius: 6px; appearance: none; color: var(--fgColor-accent, var(--color-accent-fg)); background-color: transparent; box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 0s ease 0s, box-shadow 0s ease 0s, border-color 0s ease 0s; width: var(--control-small-size, 28px); height: var(--control-small-size, 28px); display: flex !important; padding: 0px !important; justify-content: center !important; align-items: center !important; margin: var(--base-size-8, 8px) !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;您可以通过在同一构建目录中运行具有不同配置的两个构建来创建这两种类型。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;删除中间的 CMakeCache 以获得干净的配置。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;Open62541可以使用openssl来实现OPC UA安全性，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;通过设置 cmake 选项来选择它&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;UA_ENABLE_ENCRYPTION=OPENSSL&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;对于 Linux 构建，一般的编译选项设置是：&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative !important; overflow: auto !important; margin-bottom: 16px; display: flex; justify-content: space-between; background-color: var(--bgColor-muted, var(--color-canvas-subtle));&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; color: var(--fgColor-default, var(--color-fg-default)); background-color: var(--bgColor-muted, var(--color-canvas-subtle)); border-radius: 6px; word-break: normal; min-height: 52px;&quot;&gt;cmake&amp;nbsp;..&amp;nbsp;-DBUILD_SHARED_LIBS=ON&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-DCMAKE_BUILD_TYPE=RelWithDebInfo&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-DUA_ENABLE_ENCRYPTION=OPENSSL&lt;/pre&gt;&lt;clipboard-copy aria-label=&quot;Copy&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;cmake .. -DBUILD_SHARED_LIBS=ON \
         -DCMAKE_BUILD_TYPE=RelWithDebInfo \
         -DUA_ENABLE_ENCRYPTION=OPENSSL&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; position: relative; font-size: 14px; font-weight: var(--base-text-weight-medium, 500); line-height: 20px; text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; border: 0px; border-radius: 6px; appearance: none; color: var(--fgColor-accent, var(--color-accent-fg)); background-color: transparent; box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 0s ease 0s, box-shadow 0s ease 0s, border-color 0s ease 0s; width: var(--control-small-size, 28px); height: var(--control-small-size, 28px); display: flex !important; padding: 0px !important; justify-content: center !important; align-items: center !important; margin: var(--base-size-8, 8px) !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;创建共享库，以及&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative !important; overflow: auto !important; margin-bottom: 16px; display: flex; justify-content: space-between; background-color: var(--bgColor-muted, var(--color-canvas-subtle));&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; color: var(--fgColor-default, var(--color-fg-default)); background-color: var(--bgColor-muted, var(--color-canvas-subtle)); border-radius: 6px; word-break: normal; min-height: 52px;&quot;&gt;cmake&amp;nbsp;..&amp;nbsp;-DBUILD_SHARED_LIBS=OFF&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-DCMAKE_BUILD_TYPE=RelWithDebInfo&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-DUA_ENABLE_ENCRYPTION=OPENSSL&lt;/pre&gt;&lt;clipboard-copy aria-label=&quot;Copy&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;cmake .. -DBUILD_SHARED_LIBS=OFF \
         -DCMAKE_BUILD_TYPE=RelWithDebInfo \
         -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF \
         -DUA_ENABLE_ENCRYPTION=OPENSSL&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; position: relative; font-size: 14px; font-weight: var(--base-text-weight-medium, 500); line-height: 20px; text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; border: 0px; border-radius: 6px; appearance: none; color: var(--fgColor-accent, var(--color-accent-fg)); background-color: transparent; box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 0s ease 0s, box-shadow 0s ease 0s, border-color 0s ease 0s; width: var(--control-small-size, 28px); height: var(--control-small-size, 28px); display: flex !important; padding: 0px !important; justify-content: center !important; align-items: center !important; margin: var(--base-size-8, 8px) !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;创建静态变体。&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;还有很多其他选项可用，但大多数仅影响服务器部分，与客户端的使用无关。&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;对于 Open62541 版本 1.2，请设置&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;UA_ENABLE_ENCRYPTION_OPENSSL=ON&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;而不是上面显示的 OPENSSL 设置。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;您可能还必须在 file 中显式设置 Open62541 版本字符串&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;CMakeLists.txt&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;，因为当您不在 git 下工作时，自动检测不起作用。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;默认安装位置如下&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;/usr/local&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;通常，这是一个系统位置，因此部署模式设置（见下文）将为&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;SYSTEM&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;如果您想安装到其他位置，请设置选项&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;CMAKE_INSTALL_PREFIX=/other/location&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;在这种情况下，部署模式设置（见下文）将是&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;PROVIDED&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;，并且需要设置库位置。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;如果您想在其构建位置使用 Open62541 库，情况也是如此。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;库位置（在 中设置&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;CONFIG_SITE.local&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;）将有所&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;$(OPEN62541)/build/bin&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;不同&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;$(OPEN62541)/build/bin/Release&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;，具体取决于您的安装、操作系统和构建目录名称的选择。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;跑完后&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;cmake&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;，&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;make&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;再跑&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;make install&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;安装到系统位置需要 root 权限。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 tabindex=&quot;-1&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid var(--borderColor-muted, var(--color-border-muted)); color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;构建设备支持模块&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;在&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;configure&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;子目录内或 TOP 位置上一级，创建一个文件&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;RELEASE.local&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;，设置&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;EPICS_BASE&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;为 EPICS 安装的绝对路径。&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;在&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;configure&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;子目录内或 TOP 位置上一级，创建一个文件&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;CONFIG_SITE.local&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;，用于设置 Open62541 安装的绝对路径及其构建和部署功能（如果需要）。&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;您还需要配置安装的其他依赖项的位置。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-makefile notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: 16px; display: flex; justify-content: space-between; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; position: relative !important; overflow: auto !important;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; color: var(--fgColor-default, var(--color-fg-default)); background-color: var(--bgColor-muted, var(--color-canvas-subtle)); border-radius: 6px; word-break: normal; min-height: 52px;&quot;&gt;#&amp;nbsp;Path&amp;nbsp;to&amp;nbsp;the&amp;nbsp;Open62541&amp;nbsp;C++&amp;nbsp;installationOPEN62541&amp;nbsp;=&amp;nbsp;/other/location#&amp;nbsp;How&amp;nbsp;the&amp;nbsp;Open62541&amp;nbsp;shared&amp;nbsp;libraries&amp;nbsp;are&amp;nbsp;deployed#&amp;nbsp;&amp;nbsp;&amp;nbsp;SYSTEM&amp;nbsp;=&amp;nbsp;shared&amp;nbsp;libs&amp;nbsp;are&amp;nbsp;in&amp;nbsp;a&amp;nbsp;system&amp;nbsp;location#&amp;nbsp;&amp;nbsp;&amp;nbsp;PROVIDED&amp;nbsp;=&amp;nbsp;shared&amp;nbsp;libs&amp;nbsp;are&amp;nbsp;in&amp;nbsp;$(OPEN62541_SHRLIB_DIR)#&amp;nbsp;&amp;nbsp;&amp;nbsp;INSTALL&amp;nbsp;=&amp;nbsp;shared&amp;nbsp;libs&amp;nbsp;are&amp;nbsp;installed&amp;nbsp;(copied)&amp;nbsp;into&amp;nbsp;this&amp;nbsp;module#&amp;nbsp;&amp;nbsp;&amp;nbsp;EMBED&amp;nbsp;=&amp;nbsp;link&amp;nbsp;Open62541&amp;nbsp;code&amp;nbsp;statically&amp;nbsp;into&amp;nbsp;libopcua,#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;the&amp;nbsp;Open62541&amp;nbsp;libraries&amp;nbsp;are&amp;nbsp;not&amp;nbsp;required&amp;nbsp;on&amp;nbsp;target&amp;nbsp;systemOPEN62541_DEPLOY_MODE&amp;nbsp;=&amp;nbsp;PROVIDEDOPEN62541_LIB_DIR&amp;nbsp;=&amp;nbsp;$(OPEN62541)/libOPEN62541_SHRLIB_DIR&amp;nbsp;=&amp;nbsp;$(OPEN62541_LIB_DIR)#&amp;nbsp;How&amp;nbsp;the&amp;nbsp;Open62541&amp;nbsp;libraries&amp;nbsp;were&amp;nbsp;builtOPEN62541_USE_CRYPTO&amp;nbsp;=&amp;nbsp;YES&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot; style=&quot;box-sizing: border-box; animation: auto ease 0s 1 normal none running none;&quot;&gt;&lt;clipboard-copy aria-label=&quot;Copy&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;# Path to the Open62541 C++ installation
OPEN62541 = /other/location

# How the Open62541 shared libraries are deployed
#   SYSTEM = shared libs are in a system location
#   PROVIDED = shared libs are in $(OPEN62541_SHRLIB_DIR)
#   INSTALL = shared libs are installed (copied) into this module
#   EMBED = link Open62541 code statically into libopcua,
#           the Open62541 libraries are not required on target system
OPEN62541_DEPLOY_MODE = PROVIDED
OPEN62541_LIB_DIR = $(OPEN62541)/lib
OPEN62541_SHRLIB_DIR = $(OPEN62541_LIB_DIR)
# How the Open62541 libraries were built
OPEN62541_USE_CRYPTO = YES&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; position: relative; font-size: 14px; font-weight: var(--base-text-weight-medium, 500); line-height: 20px; text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; border: 0px; border-radius: 6px; appearance: none; color: var(--fgColor-accent, var(--color-accent-fg)); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 0s ease 0s, box-shadow 0s ease 0s, border-color 0s ease 0s; width: var(--control-small-size, 28px); height: var(--control-small-size, 28px); display: flex !important; padding: 0px !important; justify-content: center !important; align-items: center !important; margin: var(--base-size-8, 8px) !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;Open62541相关配置只需在该模块中完成，该模块会创建一个&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted)); border-radius: 6px;&quot;&gt;CONFIG_OPCUA&lt;/code&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;文件，该文件会被所有下游模块（创建IOC的模块）自动包含，以便配置始终保持一致。&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; text-wrap: wrap; background-color: #FFFFFF; font-size: 16px;&quot;&gt;EPICS opcua module&lt;/span&gt;支持 Linux 和 Windows 版本。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;本人已在Linux系统亲测可用；并尝试在Windows系统编译部署此环境，由于缺少相关依赖，暂时未完全编译部署成功，有兴趣可亲自尝试。&lt;/p&gt;</description><pubDate>Mon, 22 Jan 2024 10:02:57 +0800</pubDate></item></channel></rss>