|
2 | 2 |
|
3 | 3 | [English](./README.md) | [中文](./README(zh-cn).md) |
4 | 4 |
|
5 | | -[](https://www.vipm.io/package/nevstop_lib_csm_ini_static_variable_support/) |
6 | | -[](https://www.vipm.io/package/nevstop_lib_csm_ini_static_variable_support/) |
7 | | -[](https://github.com/NEVSTOP-LAB/CSM-INI-Static-Variable-Support/releases) |
| 5 | +[](https://www.vipm.io/package/nevstop_lib_csm_ini_static_variable_support/) |
| 6 | +[](https://www.vipm.io/package/nevstop_lib_csm_ini_static_variable_support/) |
| 7 | +[](https://github.com/NEVSTOP-LAB/CSM-INI-Static-Variable-Support/releases) |
8 | 8 |
|
9 | | -配置文件是应用程序必备的功能之一。这个库的目的是为 CSM 提供简单易用的配置文件支持功能,用户可以通过配置文件来配置应用程序,而无需显式读写配置文件。 |
| 9 | +配置文件是应用程序开发中不可或缺的组成部分。本库为 CSM 提供简单易用的配置文件支持功能,使用户能够配置应用程序而无需显式读写配置文件。 |
10 | 10 |
|
11 | 11 | ## 安装 |
12 | 12 |
|
13 | | -您可以通过 VIPM 安装这个库,安装完毕后,可以在 CSM 的 Addon 函数选板中找到这个库的函数。 |
| 13 | +通过 VIPM 安装此库。安装完成后,您可以在 CSM 的 Addon 函数选板中找到该库的函数。 |
14 | 14 |
|
15 | | -## 设计 |
| 15 | +## 架构设计 |
16 | 16 |
|
17 | | -CSM INI-Static-Variable-Support 库的设计如下图所示: |
| 17 | +CSM INI-Static-Variable-Support 库的架构设计如下图所示: |
18 | 18 |
|
19 | | - |
| 19 | + |
20 | 20 |
|
21 | | -它的特点有: |
| 21 | +主要特点包括: |
22 | 22 |
|
23 | | -1. 支持默认的配置文件,这个配置文件会在第一次调用这个库的函数时隐式加载,无需用户显式加载配置文件。 |
24 | | -2. 支持多配置文件,可以通过 Multi-File Support 中的函数来加载多个配置文件。 |
25 | | -3. 在内存中创建一个缓存副本,应用程序实际读取的配置信息来源于缓存副本。 |
26 | | -4. 配置文件和内存副本都是 ini 文件格式,支持节和键值对。 |
27 | | -5. 全局创建了修改标记,能够在读取VI处缓存配置信息,当配置发生修改时才真正再次读取内存副本,效率高。 |
| 23 | +1. **默认配置处理**:首次调用库函数时自动加载默认配置文件,无需用户显式加载。 |
| 24 | +2. **多文件支持**:通过专用函数支持加载多个配置文件。 |
| 25 | +3. **内存缓存**:在内存中维护一个缓存副本,应用程序从该缓存中获取配置信息。 |
| 26 | +4. **INI 格式兼容**:配置文件和内存副本均采用标准 INI 格式,支持节和键值对。 |
| 27 | +5. **高效缓存机制**:使用全局修改标记优化性能,仅在配置发生修改时才重新读取内存副本。 |
28 | 28 |
|
29 | 29 | > [!IMPORTANT] |
30 | | -> **开源声明**: 包含并使用了 [@rcpacini](https://github.com/rcpacini) 的 [LabVIEW-Config](https://github.com/rcpacini/LabVIEW-Config) 的副本。 |
| 30 | +> **开源声明**: 本库包含并使用了由 [@rcpacini](https://github.com/rcpacini) 开发的 [LabVIEW-Config](https://github.com/rcpacini/LabVIEW-Config) 的副本。 |
31 | 31 |
|
32 | 32 | > [!NOTE] |
33 | | -> 默认配置文件的位置: |
| 33 | +> **默认配置文件位置**: |
34 | 34 | > |
35 | | -> - 开发状态:Application Directory 下的第一个 ini 配置文件,没有时默认的配置文件名称为 csm-app.ini |
36 | | -> - 编译后:exe 目录下 exe 同名的 ini 配置文件。(LabVIEW 编译后必然产生这样一个配置文件) |
| 35 | +> - 开发状态:Application Directory 中找到的第一个 INI 配置文件。若不存在配置文件,则默认为 `csm-app.ini`。 |
| 36 | +> - 编译后:可执行文件所在目录中与可执行文件同名的 INI 配置文件(LabVIEW 编译后会自动生成此文件)。 |
37 | 37 |
|
38 | 38 | > [!NOTE] |
39 | | -> 多配置文件的场景: |
| 39 | +> **多文件配置场景**: |
40 | 40 | > |
41 | | -> - 加载时,后加载的配置文件会覆盖前加载的配置文件中的相同配置项。 |
42 | | -> - 保存缓存到文件时,会将更改保存到后加载的配置文件中。 |
| 41 | +> - 加载多个文件时,后加载的文件会覆盖先前加载文件中的相同配置项。 |
| 42 | +> - 将缓存更改保存到文件时,修改会保存到最后加载的配置文件中。 |
43 | 43 |
|
44 | 44 | > [!WARNING] |
45 | | -> 请注意,由于这个库使用一个全局的缓存修改标志,频繁的配置信息修改会导致读取VI处的缓存机制失效,因此这个库不适合频繁修改配置信息的场景。 |
| 45 | +> 请注意,由于本库使用全局缓存修改标志,频繁的配置更改会降低读取 VI 中缓存机制的有效性。因此,本库不建议用于需要频繁修改配置的场景。 |
46 | 46 |
|
47 | 47 | ## 应用场景 |
48 | 48 |
|
49 | | -### 作为 CSM 的参数被解析后使用 |
| 49 | +### CSM 可解析参数 |
50 | 50 |
|
51 | | -为 CSM 提供 `${section.variable:defaultValue}` 的支持,直接使用在 CSM 发送的文本消息中。 |
| 51 | +为 CSM 提供 `${section.variable:defaultValue}` 语法支持,可直接在 CSM 发送的文本消息中使用。 |
52 | 52 |
|
53 | 53 | > [!TIP] |
54 | 54 | > |
55 | | -> - section 可以缺省,默认情况下使用 SectionName=LabVIEW 的配置段。 |
56 | | -> - defaultValue 可以缺省,默认为 ""。 |
| 55 | +> - section 参数为可选。省略时,使用默认配置段 `SectionName=LabVIEW`。 |
| 56 | +> - 默认值也为可选,未指定时默认为空字符串("")。 |
57 | 57 |
|
58 | | - |
| 58 | + |
59 | 59 |
|
60 | | -### 通过提供 prototype 载入对应的配置 |
| 60 | +### 基于原型的配置加载 |
61 | 61 |
|
62 | | -通过提供 prototype 载入对应的配置。既可以从 section 中载入,也可以从 key 中载入。 |
| 62 | +通过提供原型结构加载配置。您可以从整个节或特定键加载配置。 |
63 | 63 |
|
64 | | - |
| 64 | + |
65 | 65 |
|
66 | | -### 固化 CSM API 参数 |
| 66 | +### 固定 CSM API 参数 |
67 | 67 |
|
68 | | -提供了固化 CSM API 参数的功能。在这个场景下,CSM API 的参数优先级是:CSM API 参数 > 配置文件参数 > 默认 Constant 参数。例如示例中,很容易将串口初始化的参数固化在配置文件中。 |
| 68 | +提供固定 CSM API 参数的功能,具有明确的优先级层次:CSM API 参数 > 配置文件参数 > 默认常量参数。例如,这使得将串口初始化参数固定在配置文件中变得非常简单。 |
69 | 69 |
|
70 | | -- 初始化时,如果发送了参数,就会使用发送的参数; |
71 | | -- 如果没有发送参数,就会使用配置文件中的参数; |
72 | | -- 如果配置文件中没有参数,就会使用默认的 Constant 参数; |
73 | | -- 参数都可以部分提供,缺省的参数会使用下一级优先级的配置信息。 |
| 70 | +- 初始化时,显式发送的参数具有最高优先级。 |
| 71 | +- 若未发送参数,则使用配置文件中的参数。 |
| 72 | +- 在没有配置文件参数的情况下,应用默认常量参数。 |
| 73 | +- 参数可以部分指定,缺失的值会自动使用下一优先级的配置信息填充。 |
74 | 74 |
|
75 | | - |
| 75 | + |
76 | 76 |
|
77 | | -### 多文件的配置系统 |
| 77 | +### 多文件配置系统 |
78 | 78 |
|
79 | | -通过多文件的配置系统,可以实现分布式的配置文件系统。 |
| 79 | +利用多文件配置功能,可实现分布式配置文件系统。 |
80 | 80 |
|
81 | | - |
| 81 | + |
82 | 82 |
|
83 | | -### 通过[__include]实现配置文件的引用 |
| 83 | +### 使用 [__include] 引用配置文件 |
84 | 84 |
|
85 | | -[__include] 可以实现配置文件的引用。这个功能可以实现配置文件的分离和引用。被引用的配置文件相当于多文件的场景下提前载入。 |
| 85 | +`[__include]` 节支持引用其他配置文件,便于实现模块化和可重用的配置设置。被引用的文件会被预加载,遵循与多文件场景相同的行为。 |
86 | 86 |
|
87 | 87 | > [!TIP] |
88 | 88 | > |
89 | | -> - 注意,引用可能造成配置文件的循环引用,导致死循环。内部导入时,会保存载入的配置文件列表,当第二次载入同一个配置文件时,将忽略载入。 |
| 89 | +> - 请注意避免循环依赖,否则可能导致无限循环。库会维护已加载配置文件的记录,当第二次尝试加载同一文件时,将跳过该操作。 |
90 | 90 |
|
91 | | - |
| 91 | + |
92 | 92 |
|
93 | | -### 解析嵌套的变量 |
| 93 | +### 嵌套变量 |
94 | 94 |
|
95 | | -CSM INI-Static-Variable-Support 库支持嵌套的变量解析。在 Key中可以引用其他的key,更加灵活的定义配置文件。格式为`${section.variable:defaultValue}`. |
| 95 | +CSM INI-Static-Variable-Support 支持嵌套变量解析,允许在键中引用其他键,实现更灵活的配置定义。格式遵循 `${section.variable:defaultValue}`。 |
96 | 96 |
|
97 | | -1. **读取 API 说明**:CSM INI Read String.vi : 这个API会读取原始的配置信息,不会解析嵌套的变量;其他的读取 API 都会解析嵌套的变量 |
98 | | -2. **写入 API 说明**:写入的API都会覆盖配置信息。通常情况下,析嵌套的key不会被写入更改 |
| 97 | +1. **读取 API 行为**:`CSM INI Read String.vi` 获取原始配置值而不解析嵌套变量。其他所有读取 API 都会自动解析嵌套变量。 |
| 98 | +2. **写入 API 行为**:所有写入 API 都会直接覆盖配置值。通常情况下,包含嵌套引用的键不应通过写入操作直接修改。 |
99 | 99 |
|
100 | | -``` ini |
101 | | -// default configuration |
| 100 | +```ini |
| 101 | +// 默认配置 |
102 | 102 | [network] |
103 | 103 | host = ${protocol}://${ip}:${port} |
104 | 104 | protocol = http |
@@ -128,12 +128,12 @@ root = d:/data |
128 | 128 | path = ${root}/${info.operator}/${info.date}/${info.test}${info.time}.tdms |
129 | 129 | ``` |
130 | 130 |
|
131 | | -以此配置文件为例: |
| 131 | +使用上面的配置文件示例: |
132 | 132 |
|
133 | | -**场景1**:读取 ${file.path} 的值,可以读取到一个由其他信息拼接而成的实际路径,这样可以更加灵活的定义路径。 |
| 133 | +**场景1**:读取 `${file.path}` 会返回一个由其他配置项动态组合而成的实际文件路径,从而实现灵活的路径定义。 |
134 | 134 |
|
135 | | -**场景2**: [case1] 和 [case2] 定义了不同的两组相关配置信息,通过修改 ${RT.select} 的值,可以在读取${RT.select}时实现多种配置的切换。 |
| 135 | +**场景2**:`[case1]` 和 `[case2]` 节定义了两组不同的相关配置信息。通过修改 `${RT.select}`,您可以在访问 `${RT.addr}` 时轻松切换这些配置。 |
136 | 136 |
|
137 | | -运行范例获取更加详细的信息。 |
| 137 | +有关更详细的使用示例,请参考示例项目。 |
138 | 138 |
|
139 | 139 |  |
0 commit comments