MongoDB在自动化设备上的应用示例
发现MongoDB特别适合自动化检测数据的存储。。。
例如一个晶圆检测项目,定义其数据结构如下
#pragma once
#include <vector>
#include <QString>
#include <QRectF>
#include <string>
#include <memory>class tpoWafer;
class tpoDie;
class tpoDefect;class tpoWafer
{
public:std::vector<std::shared_ptr<tpoDie>>Layouts; //晶圆的layoutQRectF MaskArea;QString WaferID;QString BatchID;QString ProductID;QString StepID;QString LotID;QString EqpID;QString UnitID;QString OperatorID;QString RecipeName;QString RecipeID;int TotalDie;int OKDie;int NGDie;int TotalDefect;double Mark_x;double Mark_y;QString Judge;QString WarningLevel;int WariningCode;QString StartTime;QString EndTime;int ImageCount;QString ImagePath;
};class tpoDie
{
public:std::vector<std::shared_ptr<tpoDefect>>InspectedDefect; //检测到的缺陷double die_x;double die_y;double die_width;double die_height;double die_type;int die_model;
};class tpoDefect
{
public:int id = -1;double x = 0;double y = 0;double gray = 0;double height = 0;double width = 0;double size = 0;double roundness = 1;int type = -1;int judge = 0;QRectF bounding = QRectF(0, 0, 1, 1);bool visible = true;bool skip = false;int inspect_type = 1;int flag = -1;
};
如果用的是结构型数据库存储数据,就需要在数据库中建立3个表,wafer table,die table defect table,还要用外键进行关联。
而在MongoDB这类非关系型数据库中这些都不需要,只需按照定义的数据结构把数据写成类似json文件的domcument存到数据中就可以了。最最重要的是,当数据结构改变了,增加或者减少存储的数据时完全不需要改数据库表,这个在关系型数据库中就不行了。
bool tpoWafer::write_to_database(bsoncxx::builder::stream::document& doc)
{int idx = 0;doc <<"MaskArea_x" + std::to_string(idx) << MaskArea.x() <<"MaskArea_y" + std::to_string(idx) << MaskArea.y() <<"MaskArea_width" + std::to_string(idx) << MaskArea.width() << "MaskArea_height" + std::to_string(idx) << MaskArea.height() <<"WaferID" + std::to_string(idx) << WaferID.toStdString() <<"BatchID" + std::to_string(idx) << BatchID.toStdString() <<"ProductID" + std::to_string(idx) << ProductID.toStdString() <<"StepID" + std::to_string(idx) << StepID.toStdString() <<"LotID" + std::to_string(idx) << LotID.toStdString() <<"EqpID" + std::to_string(idx) << EqpID.toStdString() <<"UnitID" + std::to_string(idx) << UnitID.toStdString() <<"OperatorID" + std::to_string(idx) << OperatorID.toStdString() <<"RecipeName" + std::to_string(idx) << RecipeName.toStdString() <<"RecipeID" + std::to_string(idx) << RecipeID.toStdString() <<"TotalDie" + std::to_string(idx) << TotalDie <<"OKDie" + std::to_string(idx) << OKDie <<"NGDie" + std::to_string(idx) << NGDie <<"TotalDefect" + std::to_string(idx) << TotalDefect <<"Mark_x" + std::to_string(idx) << Mark_x <<"Mark_y" + std::to_string(idx) << Mark_y <<"Judge" << Judge.toStdString() <<"WarningLevel" + std::to_string(idx) << WarningLevel.toStdString() <<"WariningCode" + std::to_string(idx) << WariningCode <<"StartTime" + std::to_string(idx) << StartTime.toStdString() <<"EndTime" + std::to_string(idx) << EndTime.toStdString() <<"ImageCount" + std::to_string(idx) << ImageCount <<"ImagePath" + std::to_string(idx) << ImagePath.toStdString();for (int i = 0; i < Layouts.size(); i++){Layouts[i]->write_to_database(doc, i);}return true;
}bool tpoDefect::write_to_database(bsoncxx::builder::stream::document& doc, int idx)
{doc << "defect_info"+ std::to_string(idx) << bsoncxx::builder::stream::open_document <<"id"+ std::to_string(idx) << id <<"x" + std::to_string(idx) << x <<"t" + std::to_string(idx) << y <<"gray" + std::to_string(idx) << gray <<"height" + std::to_string(idx) << height <<"width" + std::to_string(idx) << width <<"size" + std::to_string(idx) << size <<"roundness" + std::to_string(idx) << roundness <<"type" + std::to_string(idx) << type <<"judge" + std::to_string(idx) << judge <<"bounding_x" + std::to_string(idx) << bounding.x() <<"bounding_y" + std::to_string(idx) << bounding.y() <<"bounding_width" + std::to_string(idx) << bounding.width() <<"bounding_height" + std::to_string(idx) << bounding.height() <<"visible" + std::to_string(idx) << visible <<"skip" + std::to_string(idx) << skip <<"inspect_type" + std::to_string(idx) << inspect_type <<"flag" << flag;doc << bsoncxx::builder::stream::close_document;return false;
}bool tpoDie::write_to_database(bsoncxx::builder::stream::document& doc, int idx)
{doc << "die_info" + std::to_string(idx) <<bsoncxx::builder::stream::open_document<<"die_x" + std::to_string(idx) << die_x <<"die_y" + std::to_string(idx) << die_y <<"die_width" + std::to_string(idx) << die_width <<"die_height" + std::to_string(idx) << die_height <<"die_type" + std::to_string(idx) << die_type <<"die_model" + std::to_string(idx) << die_model <<"die_id" + std::to_string(idx) << die_id.toStdString();for (int i = 0; i < InspectedDefect.size(); i++){InspectedDefect[i]->write_to_database(doc, i); }doc << bsoncxx::builder::stream::close_document;return true;
}
对每个数据结构写一个write document的方法,最后只需要调用wafer的write_to_database方法就能把wafer的每个die的详细信息记录到表中,包括每个die中的缺陷详细信息。
写到数据库中的数据结构是这样的,结构一目了然,wafer中带着die的信息和自身的一些详细信息,die中又有defect的详细信息。
而且这个数据库查询效率奇高,实测千万级的数据,添加了索引之后能在0.1秒之内查询到结果。
相关文章:

MongoDB在自动化设备上的应用示例
发现MongoDB特别适合自动化检测数据的存储。。。 例如一个晶圆检测项目,定义其数据结构如下 #pragma once #include <vector> #include <QString> #include <QRectF> #include <string> #include <memory>class tpoWafer; class tp…...

draggable插件——实现元素的拖动排序——拖动和不可拖动的两种情况处理
最近在写后台管理系统的时候,遇到一个需求,就是关于拖动排序的功能。 我之前是写过一个关于拖动表格的功能,此功能可以实现表格中的每一行数据上下拖动实现排序的效果。 vue——实现表格的拖拽排序功能——技能提升 但是目前我这边的需求是…...

Redux的使用
到如今redux的已经不是react程序中必须的一部分内容了, 我们应该在本地需要大量更新全局变量时才使用它! redux vs reducer reducer的工作机制: 手动构造action对象传入dispatch函数中 dispatch函数将 action传入reducer当中 reducer结合当前state与a…...
【JAVA】Java高级:多数据源管理与Sharding:数据分片(Sharding)技术的实现与实践
大规模分布式系统,数据存储和管理变得越来越复杂。随着用户数量和数据量的急剧增加,单一数据库往往难以承载如此庞大的负载。这时,数据分片(Sharding)技术应运而生。数据分片是一种将数据水平切分到多个数据库实例的技…...

ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )
一、结论 💢先看结论吧, MapStaticAssets 在大多数情况下可以替换 UseStaticFiles,它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置(如磁盘或嵌入资源)的资产,则应…...
LeetCode刷题day18——贪心
LeetCode刷题day18——贪心 135. 分发糖果分析: 406. 根据身高重建队列分析:for (auto& p : people) 昨天写了一道,今天写了一道,都有思路,却不能全整对。昨天和小伙伴聊天,说是因为最近作业多…...

MATLAB Simulink® - 智能分拣系统
系列文章目录 前言 本示例展示了如何在虚幻引擎 环境中对四种不同形状的标准 PVC 管件实施半结构化智能分拣。本示例使用 Universal Robots UR5e cobot 执行垃圾箱拣选任务,从而成功检测并分类物体。cobot 的末端执行器是一个吸力抓手,它使 cobot 能够拾…...

linuxCNC(五)HAL驱动的指令介绍
HAL驱动的构成 指令举例详解 从终端进入到HAL命令行,执行halrun,即可进入halcmd命令行 # halrun指令描述oadrt加载comoonent,loadrt threads name1 period1创建新线程loadusr halmeter加载万用表UI界面loadusr halscope加载示波器UI界面sho…...

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期
需求分析 上一个案例我们输出了PWM波,这个案例我们使用输入捕获功能,来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑,检查测试的结果。 如何测量 1、输入捕获功能主要是:测量输入通道的上升沿和下降沿 2、让第一个…...

第一节、电路连接【51单片机-TB6600驱动器-步进电机教程】
摘要:本节介绍如何搭建一个51单片机TB6600驱动器步进电机控制电路,所用材料均为常见的模块,简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制系统 ②USB转TTL模块 ③开关电源 ④TB6600步进电机驱动器 ⑤二相四线步进电机 ⑥电…...
【通俗理解】Koopman算符与非线性动力系统分析
【通俗理解】Koopman算符与非线性动力系统分析 关键词: #Koopman算符 Koopman Operator #非线性动力系统 Nonlinear Dynamical System #无穷维线性算子 Infinite-Dimensional Linear Operator #演化分析 Evolution Analysis #Bernard Koopman Bernard Koopman 第…...
mybatis plus打印sql日志
1、官方文档 使用配置 | MyBatis-Plus 2、日志实现 MyBatis-Plus 提供了多种日志实现(log-impl),用于记录 SQL 语句和相关操作,帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明: StdOutImpl…...
ObjectMapper
ObjectMapper 是 Jackson 库中非常重要的一个类,它是 JSON 和 Java 对象之间进行序列化与反序列化的核心工具。ObjectMapper 的底层实现是基于 Jackson 的数据绑定模型,它将 Java 对象与 JSON 数据转换为互通格式。 1. ObjectMapper 的设计与核心功能 O…...
新增白名单赋予应用安装权限
目录 相关问题 具体实现 相关问题 安装app到/data/分区时,如何在安装阶段就赋予权限,无需请求权限 具体实现 frameworks/base/core/res/res/values/config.xml <!-- For whitelis apk --><string-array translatable"false" nam…...
传奇996_51——脱下装备,附加属性设为0
奶奶的lua怎么都修改不了,可以调用txt的 ; LINKPICKUPITEM ; ChangeitemaddvaLue -1 5 0 ; GETITEMADDVALUE 3 5 M10 ; SENDUPGRADEITEM ; SENDMSG 9 你的衣服附加了<$STR(M10)>点防御属性. 或者lua callscriptex(actor,“LINKPICKUPITEM”) callscriptex(…...

【Mac】安装Gradle
1、说明 Gradle 运行依赖 JVM,需要先安装JDK,Gradle 与 JDK的版本对应参见:Java Compatibility IDEA的版本也是有要求Gradle版本的,二者版本对应关系参见:Third-Party Software and Licenses 本次 Gradle 安装版本为…...
MySQL中的redoLog
在数据库系统中,redo log(重做日志)用于记录所有已提交事务的修改操作,它的主要目的是确保在系统崩溃或故障后,能够恢复数据库到崩溃前的状态。Redo log 记录的是事务修改的数据的具体操作,而不是数据本身。…...

Windows 安装 MySQL
1.下载 MySQL 安装包 访问:MySQL :: Download MySQL Installer选择适合的版本。推荐下载 MySQL Installer for Windows,该安装包包含所有必要的组件选择 Windows (x86, 32-bit), MSI Installer 或 Windows (x86, 64-bit), MSI Installer 2.运行安装程序…...
yocto的xxx.bb文件在什么时候会拷贝文件到build目录
在 Yocto 中,.bb 文件用于描述如何构建和安装一个软件包,而文件在构建过程中的拷贝操作通常会在某些特定的步骤中进行。具体来说,文件会在以下几个阶段被拷贝到 build 目录(或者更准确地说,拷贝到目标目录 ${D}&#x…...

Ubuntu Server 22.04.5 LTS重启后IP被重置问题
Ubuntu Server 22.04.5 LTS重启后IP被重置问题 最近在使用Ubuntu Server 22.04做项目开发测试时发现每次重启和关机后,所设置的静态IP地址都会回复到安装系统时所设置的ip Ubuntu Server 22.04 官网下载地址:Ubuntu官方下载地址 对虚拟机下安装Ubuntu感…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...
Angular中Webpack与ngx-build-plus 浅学
Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具,用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中,Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...

Redis专题-实战篇一-基于Session和Redis实现登录业务
GitHub项目地址:https://github.com/whltaoin/redisLearningProject_hm-dianping 基于Session实现登录业务功能提交版本码:e34399f 基于Redis实现登录业务提交版本码:60bf740 一、导入黑马点评后端项目 项目架构图 1. 前期阶段2. 后续阶段导…...