### 一、程序功能

自动化测试数据处理工具，减少人工处理时长，提高测试数据处理的效率和准确度：

1. 制动数据，单轴数据处理 3min 以内
2. 电机电流数据，全部轴数据处理 1min 以内
3. ISO 激光数据整理，1min 以内
4. wavelogger 波形处理，几乎不花费时间
5. 制动自动化测试
6. 电机电流自动化测试


---

### 二、使用方法

点击可执行程序 AIO.exe，然后选择功能，根据提示填写必要参数，红色标签提示是必填项，蓝色标签提示是可选项，然后点击运行即可

> 需要注意的是，可选项填写的不合适，有可能导致数据错误，或者无法运行！！

---

### 三、第三方库

```text
参考 requirements.txt
```

---

### 四、打包方法

```
pyinstaller.exe -F --version-file file_version_info.txt -i .\icon.ico .\aio.py -p .\brake.py -p .\current.py
pyinstaller --noconfirm --onedir --windowed --add-data "C:/Users/Administrator/AppData/Local/Programs/Python/Python312/Lib/site-packages/customtkinter;customtkinter/" --version-file ..\assets\file_version_info.txt -i ..\assets\icon.ico ..\code\aio.py -p ..\code\data_process\brake.py -p ..\code\data_process\iso.py -p ..\code\data_process\current.py -p ..\code\data_process\wavelogger.py
```

---

### 五、注意事项

#### 1) 制动数据

```text
1. 数据文件存储存储规则
数据文件，就是我们拍急停的时候，采集到的 .data 文件，根据规则选择某个方向拍三次急停，会采集到三个 .data 文件，存储在同一个文件夹内，即每组（三个 .data 文件）文件必须存储在同一个文件夹内，数据文件的命名无要求
	
2. 文件夹命名规则
对采集到的 .data 文件没有命名要求，但是对于其存储的文件夹的命名是有要求的，必须是如下格式：
	reachXX_loadXX_speedXX
	XX代表不同条件下的测试数值，比如：
	reach100_load66_speed33，指的是，臂展100%，负载66%，速度33%

3. 结果文件命名规则
所谓结果文件，就是处理数据的那个 excle 文件，该文件名字的前缀必须是 reachXX_XXXXXXXXX.xlsx，比如：
	reach33_自研_制动性能测试.xlsx
	reach66_自研_制动性能测试.xlsx
	reach100_自研_制动性能测试.xlsx
	
！！结果文件可以是没有数据的，也可以是之前有数据的，只要保证输入参数的正确性即可
	
4. 数据存储的组织结
	..../j1/reach100_load66_speed33
	..../j1/reach100_load66_speed66
	....
	..../j1/reach100_load33_speed33
	..../j1/reach100_load100_speed33/2024_05_16_09_18_52.data
	..../j1/reach100_load100_speed33/2024_05_16_09_19_52.data
	..../j1/reach100_load100_speed33/2024_05_16_09_20_52.data
	..../j1/reach33_自研_制动性能测试.xlsx
	..../j1/reach66_自研_制动性能测试.xlsx
	..../j1/reach100_自研_制动性能测试.xlsx
	..../j1/configs.xlsx
	
5. 文件的打开与关闭
	a. 在执行程序之前，需要关闭所有相关 excle 文件
	b. 在执行程序之中，不允许打开相关 excle 文件
	c. 在执行程序之后，需要逐个打开结果文件，并保存一次
	
6. 数据准确性检查
执行完程序之后，可以在日志输出框中看到全部文件的处理过程，对于有问题的文件，会用特殊颜色进行标识，需要注意观察

7. configs.xlsx配置文件
需要运行前需要手动修改该文件，并确保配置参数的正确性，测试时按照第 4 点中的位置存放

8. 其他
程序运行主要的耗时集中在打开，保存和关闭结果文件，第一次打开的时候会比较慢，另外还需要注意采集的数据长度和结果文件中预设的数据长度是否一致，若采集的数据长度大于预设的数据长度，则需要补齐数据
```

#### 2) 电机电流

1. 单独使用 max/avg 功能时，要求文件命名以 "jx_" 开头，例如 j1_2024_06_18_09_09_11.data，只允许有 .data 或者 .csv 文件，以及configs.xlsx配置表，可同时处理所有轴的数据
2. cycle 功能支持处理单轴数据以及场景电机电流的数据，可以批量处理所有轴，但要确保遵守如下规则：

- 包含电机电流结果汇总文件（excel）
- 单轴文件：jx_xxxxx.data/csv
- 保持电流：jx_hold_xxxx.data/csv
- 场景文件：factory_53.8_2024_06_18_09_01_26.data（需手动拆分）
- 配置文件：configs.xlsx
- 所有文件放在同一个文件夹即可
- 界面输入rc参数时，需要输入所有轴的数据，即使只处理个别轴的数据

3. configs.xlsx配置文件：需要运行前需要手动修改该文件，并确保配置参数的正确性

> 程序运行主要的耗时集中在打开，保存和关闭结果文件
> 需要注意采集的数据长度和结果文件中预设的数据长度是否一致，若采集的数据长度大于预设的数据长度，则需要补齐数据
> 和制动数据统一，后续将仅支持对hw_joint_vel_feedback的解析和处理，不再支持device_servo_vel_feedback

#### 3) iso 数据

所有文件放在同一个文件夹即可，命名规则如下：
	a. ISO.pdf
	b. ISO-V1000.pdf
	c. ISO-V100.pdf
	d. iso-results.xlsx

> 目前仅能处理 6 轴数据

#### 4) wavelogger 波形数据

1. 需要提前将 .xdt 波形数据转换成 .csv 文件
2. 组织目录下只允许有 .csv 文件，对文件夹无要求
3. 运行结束后，会生成 result.xlsx 文件，结果按照 .csv 文件名存放
4. 采集数据时，不同轮次数据时间间隔最好大于 2 倍的周期时间，否则会出现采集的轮数不正确的情况，但数据是完整的

#### 5) 制动自动化测试

只需要提前将如下文件放在指定路径下即可：
1. zip 工程文件
2. excel 制动结果处理文件
3. excel configs.xlsx 配置文件

> **需要注意的点**

1. 【重要】使用之前需要手动修改!!负载信息!!点位信息!!，确保所有点位不会发生撞击，确保所有程序正常运行之后，导出工程，再进行自动化测试
2. 工程文件不能手动重命名，需要重命名存档，可以导入HMI，然后另存为
3. 务必正确填写configs.xlsx中的Target页面，A1单元格可以选择正负方向急停，但不完全保证100%，大概有95%左右的准确度
4. 由于xCore系统问题，运行过程中可能会出现机器人宕机问题，如果遇到，可以手动重启控制柜，重新运行
5. 运行过程中，如果是因为机器问题无法达到额定百分比速度，会在日志输出框提示，注意观察
6. 运行自动化程序之前，确保机器处于正常状态，无故障，未触发急停
7. 需要额外硬件接线，详细参考configs.xlsx中急停接线图sheet页
8. 注意观察二轴100%臂展时，是否可以获取到正确的数据
9. 将autotest.xml导入到寄存器，并新建一个modbus，命名为autotest
10. 针对五轴机型，六轴数据可以填写1-5轴任意一轴的点位信息

#### 6) 电机电流自动化测试

只需要提前将如下文件放在指定路径下即可：
1. zip 工程文件
2. excel 电机电流结果处理文件，一份模板即可
3. excel configs.xlsx 配置文件

> **需要注意的点**

基本同第五点

#### 其他
customtkinter的tabview组件不支持修改字体大小，可以参考 [Changing Font of a Tabview](https://github.com/TomSchimansky/CustomTkinter/issues/2296) 进行手动修改源码实现：
	a. 运行 `pip show customtkinter`，获取到库的路径
	b. 修改.../windows/widgets/ctk_tabview.py
	c. 增加 from .font.ctk_font import CTkFont
	d. 在大概 78 行的位置，增加 font=CTkFont(family="Consolas", size=18, weight='bold')

---

RELEASE CHANGES


已知问题：
1. -

v0.0.1(2024/05/18)
Draft

v0.0.2(2024/05/20)
1. 功能模块化，为后面其他功能奠定一个基本的框架
2. 使用了多线程提高效率
3. 优化了准备工作中的细节
4. 运行初始化时自动删除 raw_data_dir 中的 .xlsx 文件
5. 优化了输出格式
6. 使用 pyinstaller 库进行代码冻结并调试成功

v0.0.3(2024/05/21)
1. just_open函数打开失败的信息中，添加文件名
2. 删除global变量，函数全部通过传参实现
3. configuration.xlsx配置文件增加AXIS常量，表示那个轴，取值为 j1/j2/j3/j4/j5/j6/j7
4. [bugfix] 增加get_threshold_step函数，用来获取在计算row_start时合适的阈值和步长，主要是解决了二轴最差工况下，最大速度是个尖端的问题：
	a. load100_speed100_reachxxx 二轴 threshold = 50 step = 20
	b. 其他 threshold = 50 step = 100
	如上是一个比较保守的设定，因为设定的step比较小，找到点之后要往后延200最好
5. 在find_row_start_dp函数中新增一个参数data_file，方便后续调试

v0.0.4(2024/05/22)
1. 重新标定了get_threshold_step函数，让处理更加准确
2. 新定义了now_doing_msg函数，实时输出处理信息
3. 修改了find_row_start和find_row_start_dp函数，增加的部分相同，处理数据的时候，先判断是否是空值，或者是0，此时可以加快步进
4. 修改了just_open函数，不在做重试

v0.0.5(2024/05/23)
1. 完善了函数注释
2. 调整了阈值和步长
3. 删除了just_open函数，以及对应的win32com库（Thank GOD!终于可以不用这个库了）
4. 重写了获取开始点位的代码，直接使用speed来判断，而不用角度，所以find_row_start_dp以及copy_data_to_excel_file函数也被一并删除
5. 修改了配置文件configs.xlsx的初始参数顺序及结构，使程序通用性更强
6. 将initialazation中的预定义变量赋值调整到try...except...之外，更方便排查问题
7. 修改结束时间的格式，精确到秒

v0.0.6(2024/05/23)
1. 为了调整多功能框架，aio.py文件将会作为入口程序存在，不实现具体功能，功能的实现将由具体的功能脚本实现，aio.py只负责条件调用
2. 新增了自动化处理电流数据（电机/过载）的功能

v0.1.0(2024/05/29)
1. 修改为customtkinter图形化界面
2. 支持工业机器人制动数据处理（理论上支持，测试数据有问题，待验证）
3. 删除configs.xlsx配置表格，直接在界面配置，新增layout.xlsx文件，存储customtkinter布局
4. 电流尚未支持

v0.1.1(2024/05/30)
1. 增加版本检测功能
2. 修改了无效数据下的动作
3. textbox只在开始和结束时改变状态，而不是每次写入都更改
4. 调整了brake的结构
5. 重新在write2textbox中添加exitcode参数，并补齐相关逻辑和修改brake中的调用方式
6. 修复参数检查无效的情况
7. 屏蔽电流相关的功能

v0.1.2(2024/06/01)
1. 增加iso数据处理功能
2. 重新修改了README.md
3. 单独将rokae拉出来，作为一个独立的repo进行维护，与scripts分离

v0.1.3(2024/06/01)
1. 完成电流处理的基本功能
2. 修复了一些已知bugs

v0.1.4(2024/06/06)
1. AV/RR支持小数
2. 可处理电机电流单轴以及多轴数据，可根据需要进行参数设定处理不同轴的数据
3. 界面初始位置修改，以及删除所有entry的长度设定，因为设定无效
4. 修改了layout.xlsx布局，增加了duration/trqH/STO字段，以及额外的RC行，整体扩展了区域
5. 更改label/entry/optionmenu等控件的生成方式，使用循环实现，更加简洁和容易维护（暂未实现）
6. 支持工业/协作两条产品线的电机电流数据处理，包括单轴，场景，max/avg计算

v0.1.5(2024/06/12)
1. [aio.py] 主界面切换不同功能时保持placehold一致
2. [brake.py] 由于制动采集模板和内容的更改，适配了新的数据，更新了算法
3. [aio.py] 新增tabview组件，区分数据处理和自动化测试功能
4. [aio.py] 重新调整界面配色
5. [aio.py] 修改了write2textbox函数，定制化显示每一行的颜色，针对每一行可自定义输出内容颜色
6. [brake.py/iso.py/current.py] 由于第 5 点的更改，同时修改了其他文件相关引用的部分
7. [aio.py] 更改label/entry/optionmenu等控件的生成方式，使用循环实现，更加简洁和容易维护
8. [aio.py] 修改customtkinter库中C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\customtkinter\windows\widgets\ctk_tabview.py文件，参考https://github.com/TomSchimansky/CustomTkinter/issues/2296，实现修改tabview组件的字体大小
9. [aio.py] 修改menu_main->menu_main_dp，menu_sub->menu_sub_dp，为后续其他tab功能按钮做扩展，是针对第三点做出的相应调整
10. [layout.xlsx] 添加了各个功能的流程图

v0.1.5.1(2024/06/12)
1. [current.py] 修改cycle功能中，数据清理范围为70000行，并将threshold从2调整为5
2. [current.py] 修改位置超限提示，使更清楚了解问题原因
3. [current.py] 修改find_point函数中错误提示，增加定位信息
4. [README.md] 精简打包命令
5. [requirements.txt] 新增必要库配置文件

v0.1.5.2(2024/06/13)
1. [brake.py/aio.py]: 将sto修改为estop
2. [brake.py] 修改了速度计算逻辑，新版本的vel列数据遵循如下规则，av = vel * 180 / pi，根据av再计算speed
3. [brake.py] 将threshold修改为常量50
4. [brake.py] 提高了输出提示语的明确性，删除了不必要的省略号
5. [brake.py] 更正了之前的数据copy错误，重新优化了estop处是否达到指定百分比的判定逻辑

v0.1.5.3(2024/06/14)
1. [aio.py] 修改w_param为84，适配14寸电脑屏幕
2. [brake.py] 将判定合规逻辑修改为角速度超过指定角速度的95%
3. [README.md] 稍作修改，包括打包方式，功能特性等

v0.1.6.0(2024/06/15)
1. [aio.py] 新增wavelogger处理界面
2. [wavelogger.py] 新增精度数据处理模块

v0.1.6.1(2024/06/16)
1. [wavelogger.py] bugfix single_file_proc函数中，修改_start起始点的计算逻辑
2. [wavelogger.py] bugfix find_point函数中，当判断条件为临界值 2.0 的时候，针对forward和backward两种情况，对row_target做与判断逻辑相同的处理，目的是避免形成死循环

v0.1.6.2(2024/06/16)
1. [current.py] 修改了max/avg相关功能中对于返回值的处理逻辑，并在输出框以行的形式打印出来

v0.1.6.3(2024/06/18)
1. [current.py] 适配电机电流中速度使用hw_joint_vel_feedback的数据，取消对device_servo_vel_feedback的支持，后续所有涉及到速度相关的数据均已前者为准，现已完成对单轴和场景的适配

> ！！WARNING：目前版本的电机电流程序还支持DriverMaster采集的数据处理，等明确后，将不再支持，也即所有的电机电流数据（工业+协作），都是用诊断曲线来采集

v0.1.7.0(2024/06/19)-未发布
1. [openapi.py] 初步搭建起框架，完成了新老协议的封包/解包/异步采集日志的操作（未充分测试，但基本无问题）
2. [openapi.py] 修改了封包的规则，使之更加明晰，封包操作没有实现分包功能，目前看实际场景用不到

v0.1.7.0(2024/06/21)-未发布
1. [openapi.py] 定义 MAX_FRAME_SIZE 常量（1024），替换socket接收以及响应数据处理相关部分
2. [openapi.py] 使用 int.to_bytes 和 int.from_bytes 替换 binascii 模块的功能
3. [aio.py] 修改了Data Process中初始化的动作，使得初始化时的状态统一成程序刚启动时的样子

v0.1.7.0(2024/06/23)-未发布
1. [aio.py] 增加了tabview的点击行为函数，每次点击tab都会初始化
2. [aio.py] 增加了Automatic Test界面元素，包括如下，并完成了功能框架的搭建
   - 标签：文件/角速度/减速比
   - 按钮：急停及恢复
   - 输入框：文件路径/角速度/减速比
   - OptionMenu：负载
   - 进度条
3. [openapi.py] 增加心跳检测函数，并开启线程执行；取消在该文件中生成实例
4. [aio.py] 完成detect_network，并在main函数开启线程
5. 将templates文件夹移动到assets内

v0.1.7.0(2024/06/24)-未发布
1. [openapi.py] 建联部分做容错逻辑，并将读写文件做自适应处理
2. [aio.py] 将读写文件做自适应处理，引入openapi模块并生成实例，做心跳检测，将socket超时时间修改为3s

v0.1.7.0(2024/06/25)-未发布
1. [aio.py] 取消了在本文件中开启openapi线程的做法，并修改如下：
	- 通过包的方式导入其他模块
    - 使用current_path来规避文件路径问题
    - 声名了 self.hr 变量，用来接收openapi的实例化
    - 修改了对于segment button的错误调用
    - 设定progress bar的长度是10
    - 完善了segmented_button_callback函数
    - 在detect_network函数中增加heartbeat初始化
    - tabview_click函数中新增textbox清屏功能，以及实例化openapi，并做检测
2. [openapi.py] 取消了初始化中无限循环检测，因为阻塞了aio主界面进程！！！socket也无法多次连接！！！浪费了好多时间！！！很生气！！！！
	- 通过tabview切换来实现重新连接，并保留了异常处理部分
    - 将所有的 __xxxx 函数都替换成 xxxx 函数，去掉了 __
    - 使用current_path来规避文件路径问题
3. [do_brake.py] 初步完成了机器状态收集的功能，还需要完善
    - 使用current_path来规避文件路径问题
    - 新增validate_resp函数，校验数据
    - 完善了调用接口

> **关于HMI接口**
> - 封包解包顺序：帧长度二字节/包长度四字节/协议二字节/预留二字节，\x04\x00:\x00\x00\tR:\x02:\x00
> - 帧长度和包长度没有必然关系，单帧的时候是帧长度减去包长度等于6，包长度指的是所有内容的长度
> - HMI内部每次发送1024个字节，进行分包，内容长度规则是：第一帧1024-6=1018(帧大小减去包头长度)，第二帧（包含）及之后的帧，帧长度即是数据长度

v0.1.7.0(2024/06/26)-初步可用
1. [aio.py] 在detect_network函数中需改查询时间间隔是1s，在tabview_click中增加textbox配置normal的语句
2. [do_brake.py -> btn_functions.py] 新增执行相应函数，并在get_state函数中设置无示教器模式
3. [openapi.py] 新增sock_conn函数，并做连接时的异常处理，新增类参数w2t
4. [aio.py] 修改customtkinter库中C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\customtkinter\windows\widgets\ctk_tabview.py文件，参考https://github.com/TomSchimansky/CustomTkinter/issues/2296，实现修改tabview组件的字体大小，使用原生字体，同时将segmented button字体修改为原生，为了解决segmented button在禁用和启用时，屏幕抖动的问题，并将大小修改为16
5. [aio.py] 修改了segmented_button_callback的实现逻辑，使代码更简洁
6. [aio.py] 修改了在tabview_click函数中对于实例化HmiRequest的动作，使每次切换标签都会重新实例化，也就是每次都会重新连接，修复显示不正确的问题
7. [openapi.py] 新增了socket关闭的函数，并增加msg_id为None的处理逻辑
8. [btn_functions.py] 完善了状态获取的功能，新增告警获取以及功能切换的逻辑
9. [aio.py] 修改了版本
10. [current.py] max/avg功能结束之前会将结果数据追加写入源文件，avg算法更改为average+3×std
11. [wavelogger.py] 算法更改为 average+3×std

v0.1.7.1.0(2024/06/29)
1. [APIs: aio.py] 
   - 对于automatic test删除了输入框，使用configs.xlsx配置文件作为参数输入
   - 完善initialization/param_check/func_start_callback函数中对于automatic test的处理
   - 将textbox组件一直设置为normal状态，不再频繁切换disabled
   - 将所有的f_h文件对象修改为f_hb，并将connection_state修改为c_state
   - 在detect_network函数中，实例化HmiRequest，并在无限循环中检测心跳是否正常，如异常，则销毁hr，重新生成
   - 取消在tabview切换时，检测心跳的逻辑，这样做无法保证实时性
2. [APIs: openapi.py]
   - 将sock_conn函数移出__init__，单独作为连接函数存在
   - 新增全局变量self.t_bool，控制所有的线程中无限循环的启停，也就是可以人为的退出线程
   - 移除close_sock函数
   - heartbeat函数中新增打印所有消息的代码，调试时打开，平常关闭
   - execution函数中，新增对overview.set_autoload和overview.reload的支持
   - execution函数中，对send动作增加异常处理逻辑
3. [APIs: do_brake.py] 
   - 新增文件，处理制动测试流程，建立连接，导入project，pp2main，run，采集并处理曲线数据，本地修改RL程序，推送至控制器等
   - 目前完成：
     - 文件合规性检查
     - 导入工程并设置为运行工程
4. [APIs: current.py] 修改scenario/single电机电流最大长度为150s
5. 在本文件中更新关于制动自动化测试的相关内容
6. [t_change_ui: aio.py/brake.py/current.py] 整体修改了操作界面，删除了大部分的配置输入框，改用 configs.xlsx 配置文件替代，并优化了max/avg功能中写入结果数据的方式

v0.1.7.1.1(2024/06/29)
1. [APIs: aio.py] 
   - 修改detect_network函数中sleep语句放到最后，重新生成HmiRequest实例中增加sleep(4)，这个停顿时间一定是比openapi中heartbeat函数的sleep要长1s以上才能正常工作
   - 修改write2textbox函数，新增默认参数tab_name，只有当该值与当前tab一致时，函数才会有输出
   - 第二条改动影响到了automatic_test文件夹下所有的文件
2. [APIs: openapi.py]
   - 规定了所有的网络异常均由heartbeat函数来定义，其他异常不做中断处理
   - execution函数中合并了case条件
   - 增加了N多指令，多为诊断曲线和rl程序相关
   - 日志保留条数修改为20000
3. [APIs: do_brake.py]
   - 实现自动推送工程到xCore并自动运行
   - 初步实现了Modbus发送消息和检测状态
4. [APIs: do_current.py]
   - 将do_brake.py的内容完全拷贝到此文件，待修改

v0.1.7.2(2024/06/30)
1. 初步完成NB4h_R580_3BH7.zip工程的设计
2. 重新研究了解包操作，重新实现了一版
3. 修改openapi.pi中excution为execution函数
4. 增加了解包原理性文档

v0.1.7.3(2024/07/01)
1. [APIs: openapi.py]
   - 继续完善封包解包操作，并优化了所有调试信息，默认打开状态，直到bug数量明显减少
   - 修复了两个bug，删除了一个多余的break，另一个是补齐了self.broke的重置
2. [APIs: do_current.py] 使用原工程的工程名进行move操作，语义更加明确

> 目前看openapi.py封包解包没有任何问题了，但是所有的调试信息都默认打开，以便可以第一时间保留现场
> 打开诊断，跑了10多分钟，共计解包没有报错，应该是没有问题了

v0.1.7.4(2024/07/02)
1. [APIs: openapi.py]
   - 增加了modbus的python实现
   - heartbeat函数修改发送间隔为1s
   - 清除了绝大部分调试性输出，发现太多的这种输出也会导致心跳丢包...，不清楚这个原理是什么
   - 在get_response函数中的while self.pkg > 0循环中，删除了else语句，因为它永不会被执行到
   - 在get_response函数中，修复一个bug，在flag==0的else语句中，补齐了index==6的情况
2. [APIs: do_current.py]
   - 完成了六个轴的电机电流动作的执行，以及数据采集
   - 完成了对应的RL程序的编写
3[APIs: aio.py]
   - 引入modbus实例化，并以参数的形式，传递给相应的tabview
   - 新增pre_warning函数，在做自动化测试之前，确保所有条件皆具备

v0.1.7.5(2024/07/03)
1. [APIs: aio.py]
   - 增加触发急停和恢复急停功能逻辑
2. [APIs: do_current.py]
   - 重新调整运行顺序，增加数据处理的逻辑（惯量负载逻辑暂不实现，等待软件部解决了修改工程之后不生效的问题再考虑）
3. [APIs: btn_functions.py]
   - 增加触发急停和恢复急停的modbus实现，仅适用于自动化测试

v0.1.7.6(2024/07/04)
1. [APIs: aio.py]
   - Automatic Test逻辑中增加选择current时，需要选负载类型的逻辑
2. [APIs: do_current.py]
   - 单轴/场景电机电流的采集已完成
3. [APIs: openapi.py]
   - 增加了modbus读取浮点数的功能
   - 优化了get_from_id的逻辑
4. [autotest.xml]: 新增了scenario_time只写寄存器

v0.1.8.0(2024/07/04)
1. [APIs: do_current.py]: 完成了堵转电流和惯量负载电机电流的采集和处理，至此，电机电流的自动化工作基本完成

v0.1.8.1(2024/07/05)
1. [APIs: do_brake.py]: 完成了制动性能测试框架的搭建，可以顺利执行完整的测试程序，但是未实现急停和数据处理
2. [APIs: aio.py]: 修改了do_brake主函数的参数
3. 增加工程文件target.zip

v0.1.8.2(2024/07/08)
1. [APIs: do_brake.py]: 完成了制动性能测试逻辑，只不过制动信号传递生效延迟不可控，暂时pending
2. [APIs: do_current.py]: 修改曲线数据时序，主要是value data取反即可，解决了波形锯齿明细的问题
3. [APIs: openapi.py]: modbus新增了触发急停信号的寄存器 stop0_signal，并重写了解除急停，socket新增了register.set_value协议

v0.1.9.0(2024/07/10)
1. 完成了制动性能的自动化采集
2. 完善了modbus浮点数读写相关的功能
3. 修改了target.zip工程，该工程目前适配电机电流和制动性能

v0.1.9.1(2024/07/12)
1. [APIs: do_brake.py]
   - 修改正负方向拍急停的逻辑，基本原理为：运行之前发送正负方向信号pon给RL，RL根据信号以及速度正负号运作
   - 由于上述修改，正负方向急停准确率可达100%
2. [APIs: aio.py]
   - 修改write2textbox的输出逻辑，实现更加灵活的自定义输出，同时修改相关部分
3. [APIs: openapi.py]
   - modbus类新增指示政府方向急停的信号pon，将modbus类入参中的tab_name删除，并修改tab_name的值为'openapi'
   - socket类种修改tab_name的值为'openapi'

v0.1.9.2(2024/07/13)
1. [APIs: do_brake.py]
   - 修改ready_to_go信号的接收逻辑，适配大负载机型
2. [APIs: do_current.py]
   - 修改ready_to_go信号的接收逻辑，适配大负载机型
   - 调整单轴测试时间为35s，适配大负载机型，调整堵转电流持续时间15s，适当减少测试时间
   - 将act信号置为False的动作放在初始化，增加程序健壮性
   - 修改所有输出文件的命名，在扩展名之前加入时间戳
3. [current: current.py]: 在find_point函数种，当无法找到正确点位时，继续执行，而不是直接终止执行

