本帖最后由 我爱下载 于 2023-9-5 11:36 编辑
高速数据采集系统由采集单元,交换机,数据核心(MYB-YG2LX评估板)组成,可以通过PC机的浏览器查看数据核心的web数据展示输出。 数据采集系统的基本结果如下图:
采集系统的设计目的是利用MYB-YG2LX评估板作为数据采集核心,并完成数据计算和结果展示。数据采集系统为了提高数据采集的效率,采用linux系统下libpcap技术,利用以太网链路层完成数据侦听和过滤。数据采集系统同时利用redis数据库作为数据结果存储和共享,利用node-red作为数据展示终端构建而成。 设计采集单元采用单片机为核心,通过电压互感器采集输入的交流电压信号,采样频率为3.2KHz。采集单元每间隔1s采集100ms的数据,并使用单片机集成的以太网接口将采集到的数据发送到数据采集中心。 2. 数据采集系统实现2.1. 数据采核心实现
2.1.1. libpcap的交叉编译和部署2.1.2. redis的交叉编译和部署redis是一个完全开源,遵守BSD协议的key-value数据库存储系统。redis具有极高的性能,读的速度是110000次/s,写的速度是81000次/s 。丰富的数据类型,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。redis支持数据的持久化,可将数据库中的内容写入磁盘,重启后在导入到数据库中。也支持数据备份。 选择它的还有一个重要原因,它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端操作接口,对于应用程序开发也是非常的方便。 交叉编译 源代码下载 编译 编译过程还是比较顺利的。我是在ubuntu22.04的64位系统上完成的。 第一步:解压源码 tarxzf redis-7.2.0.tar.gz 第二步:编译准备 为了可以正确的编译redis,首先必须先要编译一下目录下的deps文件夹下的几个组件,要不编译的时候可能提示缺少静态库的支持。 编译的命令,因为要支持RZG2L,所以需要米尔的SDK中的编译器。具体操作参见文档《MYD-YG2LX_Linux软件开发指南.pdf》中的相关章节。 进入deps目录中,执行 makehiredis linenoise lua 编译结束后回到redis-7.2.0的主目录下,执行真正的编译过程 makeMALLOC=libc 正常情况下可以编译我们需要的所有文件了。 第三步:导出执行文件 make install PREFIX=~/redis-install 执行完后,在redis-install目录中存储了可以使用的所有可执行文件了。 部署 将redis-install目录下的所有文件打包后复制到评估板上。在bin目录下包含了redis的执行文件,将这些文件复制到/usr/local/bin中。 复制源码目录中的redis.conf文件到/usr/local/bin目录中,编辑该文件,调整如下几步: 在87行,增加bind 0.0.0.0 在113行,将protected-mode 调整为 no 保存。 执行的时候要注意,需要指定redis.conf的路径。 redis-server/usr/local/bin/redis.conf 执行后redis-server会自动进入守护进程方式。 客户端操作实现 在编译redis时,需要编译deps目录下的hiredis,整个就是基于C操作的客户端库文件。默认为静态库应用方式。 使用的基本方法为: 连接建立 - struct timeval timeout = { 1, 500000 }; // 1.5 seconds
- c = redisConnectWithTimeout(hostname, port, timeout);
- if (c == NULL || c->err) {
- if (c) {
- printf("Connection error: %s\n", c->errstr);
- redisFree(c);
- } else {
- printf("Connection error: can'tallocate redis context\n");
- }
- return (-1);
- }
复制代码
执行操作命令 reply = redisCommand(c,"DELharm"); freeReplyObject(reply); redisCommand参数中的字符串即为操作命令,如上命令为删除键值为harm的数据。 2.1.3. fftw频谱分析库的交叉编译FFTW 是一个 C 语言的快速傅立叶变换库。它包括复数,实数,对称的,多层面的,和并行转换,并且可以处理任意大小的 efficiently.It 阵列通常比其他免费提供的FFT 实现更快。为了实现这一性能,它使用新的代码生成和运行时的自我优化技术。 FFTW编译出的库可以支持单精度浮点数,双精度浮点数等,所提供的库上会有明显的区别。 交叉编译: 工具链路径。 source /opt/yg2lx/environment-setup-aarch64-poky-linux 工程配置。 ./configure --enable-single --enable-neon--prefix=/home/ubuntu/myprog/yg2lx-sdk/fftw-3.3.10/__install --host=arm-linux --target=arm-linux --disable-fortran --enable-threads 经过编译和安装后,可以在安装目录下看到所有的库文件及头文件。 基本使用方法: 将生成的库文件和头文件复制到应用程序工程目录下,将库文件的引用增加到Makefile中。 这是一个1d的fft运算的基本使用方法。
- int fft_process(float indata[], float outdata[])
- {
- int n = 256;
- fftwf_complex* in;
- fftwf_complex* out;
- in= (fftwf_complex*)fftwf_malloc(n * sizeof(fftwf_complex));
- out = (fftwf_complex*)fftwf_malloc(n * sizeof(fftwf_complex));
- // 数据填充
- for(int i=0; i< n; i++)
- {
- in[0] = indata;
- in[1] = 0;
- }
- fftwf_plan plan = fftwf_plan_dft_1d(n, in, out,FFTW_FORWARD, FFTW_ESTIMATE);
- fftwf_execute(plan);
- fftwf_destroy_plan(plan);
- for(int i=0; i< n/2; i++)
- {
- float val = sqrt(out[0] * out[0] + out[1] * out[1]);
- val = val / (n / 2);
- outdata = val;
- }
- fftwf_free(in);
- fftwf_free(out);
- return 0;
- }
复制代码
2.1.4. nodejs及node-red的部署
1、 nodejs的部署 将下载的安装文件node-v1.8.17.1-linux-arm64.tar.xz解压到/usr/local中,并建立软件链接到/usr/local/bin中。 - ln –s /usr/local/node-v1.8.17.1-linux-arm64/bin/node /usr/local/bin
- ln –s /usr/local/node-v1.8.17.1-linux-arm64/bin/npm /usr/local/bin
复制代码
然后分别执行node –v 和npm –v 检查安装情况:
2、 node-red安装 nodejs安装完成后,需要连接网络完成node-red的安装,wifi连接部分可以参考《MYD-YG2LX_Linux软件评估指南.pdf》中的相关章节。 ※测试中发现,采用cnpm的方式安装node-red会失败,所以还是采用npm来安装 npm install -g --unsafe-perm node-red
可以正确的安装。 3、 node-red组件的安装 运行node-red 后,我们可以在浏览器打开 //本机IP:1880 启动node-red的编辑环境。需要通过包安装管理工具,安装node-red-contrib-redis和node-red-dashboard这两个包。分别用来访问redis数据库和实现web显示界面。 4、 基于node-red显示内容的开发 1) 数据获取 通过redis cmd组件,从redis数据库中读取由采集核心程序写入的数据。 读取波形数据处理过程: 读取计算结果数据处理过程: 2) 显示内容 显示界面利用dashboard控件来完成,主要使用两种类型控件,一种为text控件,另一种为template控件。 波形显示部分利用dashboard中template控件采用echarts的第三方库来实现。具备局部放大,还原,图形导出等功能。 2.2. 采集单元的仿真实现由于一些原因,采集单元并没有实际的装置可以完成测试。因此这里利用QT在windows上,采用winpcap库实现采集单元的模拟。 软件主要完成端口管理,波形数据文件仿真生成,数据发送等主要功能。 2.3. 结果展示视频展示 QT实现的仿真数据终端代码和执行文件:
仿真数据终端.rar
(1.05 MB, 下载次数: 273)
Linux系统数据收集和处理代码和执行文件:
数据采集程序和执行文件.rar
(1.6 MB, 下载次数: 305)
|