在这里插入图片描述

TDengine 数据写入用户手册

概述

TDengine 提供了多种灵活的数据写入方式,以满足不同应用场景的需求。本手册将以智能电表场景为例,向初学者详细介绍各种数据写入方法的使用。

智能电表场景设定

假设我们需要为智能电表系统建立数据库:

-- 创建数据库
CREATE DATABASE test;
USE test;-- 创建超级表
CREATE STABLE meters (ts TIMESTAMP,           -- 时间戳current FLOAT,          -- 电流值voltage FLOAT,          -- 电压值phase FLOAT            -- 相位值
) TAGS (location VARCHAR(64),   -- 地理位置groupid INT            -- 设备组ID
);-- 创建子表
CREATE TABLE d1001 USING meters TAGS ('Beijing', 1);
CREATE TABLE d1002 USING meters TAGS ('Shanghai', 1);
CREATE TABLE d1003 USING meters TAGS ('Guangzhou', 2);

数据写入方式分类

1. SQL 语句写入

1.1 单条记录写入

最基本的写入方式,适合少量数据或测试场景。

-- 向子表写入单条记录
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95);-- 向多个子表写入数据
INSERT INTO d1001 VALUES ('2024-01-15 10:01:00', 12.8, 221.0, 0.96)d1002 VALUES ('2024-01-15 10:01:00', 15.2, 219.8, 0.94);
1.2 批量写入

一次性写入多条记录,提高写入效率。

-- 向单个表批量写入
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95),('2024-01-15 10:01:00', 12.8, 221.0, 0.96),('2024-01-15 10:02:00', 13.1, 220.8, 0.97);-- 向多个表批量写入
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95),('2024-01-15 10:01:00', 12.8, 221.0, 0.96)d1002 VALUES ('2024-01-15 10:00:00', 15.2, 219.8, 0.94),('2024-01-15 10:01:00', 15.5, 220.2, 0.95);
1.3 自动建表写入

写入数据时自动创建子表,简化开发流程。

-- 自动创建子表并写入数据
INSERT INTO d1004 USING meters TAGS ('Shenzhen', 2) VALUES ('2024-01-15 10:00:00', 14.2, 218.5, 0.93);-- 批量自动建表写入
INSERT INTO d1005 USING meters TAGS ('Hangzhou', 3) VALUES ('2024-01-15 10:00:00', 11.8, 222.1, 0.98),('2024-01-15 10:01:00', 12.1, 221.8, 0.97)d1006 USING meters TAGS ('Nanjing', 3) VALUES ('2024-01-15 10:00:00', 13.5, 219.6, 0.96);

2. 无模式写入(Schemaless)

无模式写入允许在写入数据时自动创建表结构,支持多种协议格式。

2.1 InfluxDB 行协议
# 使用 taos 客户端写入
taos> INSERT INTO test.meters,location=Beijing,groupid=1i current=12.5,voltage=220.3,phase=0.95 1642204800000000000
taos> INSERT INTO test.meters,location=Shanghai,groupid=1i current=15.2,voltage=219.8,phase=0.94 1642204860000000000# 批量写入多行
taos> INSERT INTO 
test.meters,location=Beijing,groupid=1i current=12.5,voltage=220.3,phase=0.95 1642204800000000000
test.meters,location=Shanghai,groupid=1i current=15.2,voltage=219.8,phase=0.94 1642204860000000000
test.meters,location=Guangzhou,groupid=2i current=14.1,voltage=221.2,phase=0.96 1642204920000000000
2.2 OpenTSDB JSON 格式
[{"metric": "meters.current","timestamp": 1642204800,"value": 12.5,"tags": {"location": "Beijing","groupid": "1"}},{"metric": "meters.voltage", "timestamp": 1642204800,"value": 220.3,"tags": {"location": "Beijing","groupid": "1"}}
]
2.3 OpenTSDB Telnet 格式
meters.current 1642204800 12.5 location=Beijing groupid=1
meters.voltage 1642204800 220.3 location=Beijing groupid=1
meters.phase 1642204800 0.95 location=Beijing groupid=1

3. 参数化查询(Prepared Statement)

使用参数化查询可以提高写入性能,特别适合大批量数据写入。

3.1 基本用法示例(C 语言)
#include <taos.h>int main() {TAOS *taos = taos_connect("localhost", "root", "taosdata", NULL, 0);if (taos == NULL) {printf("连接失败\n");return -1;}// 使用数据库taos_query(taos, "USE test");// 准备 SQL 语句TAOS_STMT *stmt = taos_stmt_init(taos);const char *sql = "INSERT INTO ? USING meters TAGS (?, ?) VALUES (?, ?, ?, ?)";taos_stmt_prepare(stmt, sql, 0);// 绑定表名和标签TAOS_BIND tags[2];char tbname[] = "d1007";char location[] = "Tianjin";int groupid = 1;// 设置表名taos_stmt_set_tbname(stmt, tbname);// 绑定标签tags[0].buffer_type = TSDB_DATA_TYPE_VARCHAR;tags[0].buffer = location;tags[0].buffer_length = strlen(location);tags[0].length = &tags[0].buffer_length;tags[0].is_null = NULL;tags[1].buffer_type = TSDB_DATA_TYPE_INT;tags[1].buffer = &groupid;tags[1].buffer_length = sizeof(int);tags[1].length = NULL;tags[1].is_null = NULL;taos_stmt_set_tags(stmt, tags);// 绑定数据值TAOS_BIND params[4];long long ts = 1642204800000;float current = 12.5;float voltage = 220.3;float phase = 0.95;params[0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;params[0].buffer = &ts;params[0].buffer_length = sizeof(ts);params[0].length = NULL;params[0].is_null = NULL;params[1].buffer_type = TSDB_DATA_TYPE_FLOAT;params[1].buffer = &current;params[1].buffer_length = sizeof(float);params[1].length = NULL;params[1].is_null = NULL;params[2].buffer_type = TSDB_DATA_TYPE_FLOAT;params[2].buffer = &voltage;params[2].buffer_length = sizeof(float);params[2].length = NULL;params[2].is_null = NULL;params[3].buffer_type = TSDB_DATA_TYPE_FLOAT;params[3].buffer = &phase;params[3].buffer_length = sizeof(float);params[3].length = NULL;params[3].is_null = NULL;taos_stmt_bind_param(stmt, params);taos_stmt_add_batch(stmt);// 执行写入if (taos_stmt_execute(stmt) != 0) {printf("执行失败: %s\n", taos_errstr(NULL));}// 清理资源taos_stmt_close(stmt);taos_close(taos);return 0;
}
3.2 Python 示例
import taos# 连接数据库
conn = taos.connect(host="localhost", user="root", password="taosdata", database="test")# 创建 Prepared Statement
stmt = conn.statement("INSERT INTO ? USING meters TAGS (?, ?) VALUES (?, ?, ?, ?)")# 设置表名
stmt.set_tbname("d1008")# 设置标签
stmt.set_tags([("Wuhan", taos.FIELD_TYPE.C_VARCHAR), (2, taos.FIELD_TYPE.C_INT)])# 批量绑定数据
timestamps = [1642204800000, 1642204860000, 1642204920000]
currents = [12.5, 12.8, 13.1]
voltages = [220.3, 221.0, 220.8]
phases = [0.95, 0.96, 0.97]for i in range(len(timestamps)):stmt.bind_param([(timestamps[i], taos.FIELD_TYPE.C_TIMESTAMP),(currents[i], taos.FIELD_TYPE.C_FLOAT),(voltages[i], taos.FIELD_TYPE.C_FLOAT),(phases[i], taos.FIELD_TYPE.C_FLOAT)])stmt.add_batch()# 执行写入
stmt.execute()
stmt.close()
conn.close()

4. 连接器写入

4.1 JDBC 连接器(Java)
import java.sql.*;public class TDengineExample {public static void main(String[] args) {String jdbcUrl = "jdbc:TAOS://localhost:6030/test";String user = "root";String password = "taosdata";try {Class.forName("com.taosdata.jdbc.TSDBDriver");Connection conn = DriverManager.getConnection(jdbcUrl, user, password);// 批量写入示例String sql = "INSERT INTO d1009 USING meters TAGS ('Chengdu', 3) VALUES (?, ?, ?, ?)";PreparedStatement pstmt = conn.prepareStatement(sql);// 添加多个批次long baseTime = 1642204800000L;for (int i = 0; i < 1000; i++) {pstmt.setTimestamp(1, new Timestamp(baseTime + i * 60000));pstmt.setFloat(2, 12.0f + (float)Math.random() * 5);pstmt.setFloat(3, 220.0f + (float)Math.random() * 10);pstmt.setFloat(4, 0.9f + (float)Math.random() * 0.1f);pstmt.addBatch();}// 执行批量写入int[] results = pstmt.executeBatch();System.out.println("写入记录数: " + results.length);pstmt.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
4.2 Python 连接器
import taos
import time
import random# 连接数据库
conn = taos.connect(host="localhost", user="root", password="taosdata", database="test")
cursor = conn.cursor()# 批量写入数据
def batch_insert_data():# 生成测试数据sql = "INSERT INTO d1010 USING meters TAGS ('Chongqing', 3) VALUES "values = []base_time = int(time.time() * 1000)for i in range(1000):timestamp = base_time + i * 60000  # 每分钟一条记录current = round(12.0 + random.random() * 5, 2)voltage = round(220.0 + random.random() * 10, 2)phase = round(0.9 + random.random() * 0.1, 2)values.append(f"({timestamp}, {current}, {voltage}, {phase})")sql += ",".join(values)try:cursor.execute(sql)print(f"成功写入 {len(values)} 条记录")except Exception as e:print(f"写入失败: {e}")# 执行批量写入
batch_insert_data()cursor.close()
conn.close()
4.3 Go 连接器
package mainimport ("database/sql""fmt""math/rand""time"_ "github.com/taosdata/driver-go/v3/taosRestful"
)func main() {// 连接数据库db, err := sql.Open("taosRestful", "root:taosdata@http(localhost:6041)/test")if err != nil {panic(err)}defer db.Close()// 批量写入数据stmt, err := db.Prepare("INSERT INTO d1011 USING meters TAGS ('Dalian', 4) VALUES (?, ?, ?, ?)")if err != nil {panic(err)}defer stmt.Close()// 开始事务tx, err := db.Begin()if err != nil {panic(err)}baseTime := time.Now().UnixMilli()for i := 0; i < 1000; i++ {timestamp := baseTime + int64(i*60000)current := 12.0 + rand.Float64()*5voltage := 220.0 + rand.Float64()*10phase := 0.9 + rand.Float64()*0.1_, err = stmt.Exec(timestamp, current, voltage, phase)if err != nil {tx.Rollback()panic(err)}}// 提交事务err = tx.Commit()if err != nil {panic(err)}fmt.Println("成功写入 1000 条记录")
}

5. RESTful API 写入

5.1 基本 REST 写入
# 单条记录写入
curl -X POST http://localhost:6041/rest/sql \-H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" \-H "Content-Type: application/json" \-d '{"sql": "INSERT INTO test.d1012 USING test.meters TAGS (\"Xiamen\", 4) VALUES (1642204800000, 13.2, 218.9, 0.94)"}'# 批量写入
curl -X POST http://localhost:6041/rest/sql \-H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" \-H "Content-Type: application/json" \-d '{"sql": "INSERT INTO test.d1013 USING test.meters TAGS (\"Qingdao\", 4) VALUES (1642204800000, 11.8, 222.1, 0.98), (1642204860000, 12.1, 221.8, 0.97), (1642204920000, 12.4, 221.5, 0.96)"}'
5.2 无模式 REST 写入
# InfluxDB 行协议写入
curl -X POST http://localhost:6041/influxdb/v1/write?db=test \-H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" \-d 'meters,location=Harbin,groupid=5 current=14.5,voltage=219.2,phase=0.93 1642204800000000000'# OpenTSDB JSON 写入
curl -X POST http://localhost:6041/opentsdb/v1/put/json/test \-H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" \-H "Content-Type: application/json" \-d '[{"metric": "meters.current","timestamp": 1642204800,"value": 13.8,"tags": {"location": "Changchun", "groupid": "5"}}]'

性能优化建议

1. 批量写入优化

-- 推荐:批量写入多条记录
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95),('2024-01-15 10:01:00', 12.8, 221.0, 0.96),('2024-01-15 10:02:00', 13.1, 220.8, 0.97);-- 不推荐:单条记录多次写入
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95);
INSERT INTO d1001 VALUES ('2024-01-15 10:01:00', 12.8, 221.0, 0.96);
INSERT INTO d1001 VALUES ('2024-01-15 10:02:00', 13.1, 220.8, 0.97);

2. 预先创建子表

-- 推荐:预先创建子表
CREATE TABLE d1001 USING meters TAGS ('Beijing', 1);
CREATE TABLE d1002 USING meters TAGS ('Shanghai', 1);
-- 然后写入数据
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95);-- 或者使用自动建表(适合动态场景)
INSERT INTO d1001 USING meters TAGS ('Beijing', 1) VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95);

3. 参数调优

-- 调整数据库参数以优化写入性能
ALTER DATABASE test WAL_LEVEL 1;          -- 设置 WAL 级别
ALTER DATABASE test WAL_FSYNC_PERIOD 3000; -- 设置 WAL 同步周期
ALTER DATABASE test BUFFER 256;            -- 设置写入缓冲区大小

错误处理和注意事项

1. 时间戳格式

-- 正确的时间戳格式
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00.000', 12.5, 220.3, 0.95);
INSERT INTO d1001 VALUES (1642204800000, 12.5, 220.3, 0.95);-- 时间戳必须是递增的
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95),('2024-01-15 10:01:00', 12.8, 221.0, 0.96),  -- 正确:递增('2024-01-15 10:02:00', 13.1, 220.8, 0.97);

2. 数据类型匹配

-- 确保数据类型与表结构匹配
-- 错误示例:字符串不能写入数值列
-- INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 'abc', 220.3, 0.95);-- 正确示例:
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', 12.5, 220.3, 0.95);

3. NULL 值处理

-- TDengine 支持 NULL 值
INSERT INTO d1001 VALUES ('2024-01-15 10:00:00', NULL, 220.3, 0.95);
INSERT INTO d1001 VALUES ('2024-01-15 10:01:00', 12.5, NULL, 0.95);-- 使用 CASE 语句处理 NULL 值
SELECT ts,CASE WHEN current IS NULL THEN 0 ELSE current END as safe_current,CASE WHEN voltage IS NULL THEN 220 ELSE voltage END as safe_voltage
FROM d1001;

4. 错误码处理

常见的写入错误码:

  • TSDB_CODE_TDB_TIMESTAMP_OUT_OF_RANGE: 时间戳超出范围
  • TSDB_CODE_TDB_INVALID_TABLE_ID: 无效的表名
  • TSDB_CODE_OUT_OF_MEMORY: 内存不足
  • TSDB_CODE_PAR_INVALID_COLUMN: 无效的列名

最佳实践总结

  1. 批量写入:尽量使用批量写入,减少网络往返次数
  2. 时间有序:确保写入的时间戳是有序的
  3. 预先建表:对于已知的设备,预先创建子表
  4. 参数化查询:大批量数据写入时使用 Prepared Statement
  5. 错误处理:妥善处理各种错误情况
  6. 性能监控:监控写入性能,适时调整参数
  7. 数据压缩:利用 TDengine 的自动压缩特性,无需额外处理

通过合理选择写入方式和优化配置,可以充分发挥 TDengine 在时序数据写入方面的高性能优势。

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96858.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96858.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96858.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PTA 天梯赛 7-43:字符串关键字的散列映射

【题目来源】 https://pintia.cn/problem-sets/15/exam/problems/type/7?problemSetProblemId890 【题目描述】 给定一系列由大写英文字母组成的字符串关键字和素数 P&#xff0c;用移位法定义的散列函数 H(Key) 将关键字 Key 中的最后 3 个字符映射为整数&#xff0c;每个字…

Python核心技术开发指南(065)——with语句

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl with语句定义 with语句是Python中用于简化资源管理的语法结构,通过上下文管理器(实现__enter__()和__exit__()方法的对象)确保资源在使用完毕后被正确释放,无论代码块是否发生异常。其核心作…

从基础到高级:一文快速认识MySQL UPDATE 语句

在数据库日常运维与开发中&#xff0c;数据更新是与数据查询同等重要的核心操作。MySQL 的 UPDATE 语句凭借其灵活的语法结构和强大的功能&#xff0c;能够满足从简单字段修改到复杂关联表更新的各类需求。然而&#xff0c;若使用不当&#xff0c;不仅可能导致数据一致性问题&a…

材料基因组计划(MGI)入门:高通量计算与数据管理最佳实践

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 材料基因组计划&#xff08;Materials Genome Ini…

Vision Transformer (ViT) :Transformer在computer vision领域的应用(一)

在图像领域,CNN卷积神经网络结构已经成为了标配,所有的模型都是基于CNN来构造的。 而在NLP领域,自从Transformer横空出世之后,基本上也统治了NLP的各个领域。 基于Transformer的强大,一些论文的工作都是将Transformer也应用到CV领域,在这篇论文:AN IMAGE IS WORTH 16X1…

自动驾驶中的传感器技术45——Radar(6)

本文详细介绍4D雷达相关解决方案&#xff0c;4D雷达关键词&#xff1a;4D Imaging Radar 1、4D雷达特点 图1 4D雷达 vs 3D雷达图2 4D雷达虚拟通道数量不断增加图3 4D雷达 vs 3D雷达 vs 摄像头和激光雷达图4 毫米波雷达在不同驾驶等级下的应用需求Ref&#xff1a;https://pdf.d…

浏览器调试工具详解

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

代码审计-PHP专题原生开发SQL注入1day分析构造正则搜索语句执行监控功能定位

挖掘技巧&#xff1a; -语句监控-数据库SQL监控排查可利用语句定向分析 -功能追踪-功能点文件SQL执行代码函数调用链追踪 -正则搜索-(update|select|insert|delete|).*?where.* 如何快速的在多个文件代码里面找脆弱&#xff1a; 1、看文件路径 2、看代码里面的变量&#…

Linux中:调试器gdb/cgdb的使用

引言在追寻光的路上不断前行&#xff0c;详细介绍Linux下gdb/cgdb的使用。一、准备• 程序的发布方式有两种&#xff0c;默认是 debug 模式和 release 模式。Linux gcc/g编译出来的二进制程序默认是release模式• 要使用gdb调试&#xff0c;必须在源代码生成⼆进制程序的时候加…

【算法】【链表】148.排序链表--通俗讲解

算法通俗讲解推荐阅读 【算法–链表】83.删除排序链表中的重复元素–通俗讲解 【算法–链表】删除排序链表中的重复元素 II–通俗讲解 【算法–链表】86.分割链表–通俗讲解 【算法】92.翻转链表Ⅱ–通俗讲解 【算法–链表】109.有序链表转换二叉搜索树–通俗讲解 【算法–链表…

计算机组成原理:存储系统概述

&#x1f4cc;目录&#x1f4be; 存储系统概述&#xff1a;计算机的“记忆中枢”&#x1f3d7;️ 一、存储系统的层次结构&#xff1a;速度与容量的“黄金平衡”&#xff08;一&#xff09;经典存储层次金字塔&#xff08;二&#xff09;层次结构的设计原则&#xff08;三&…

基于CNN/CRNN的汉字手写体识别:从图像到文字的智能解码

在人工智能浪潮的推动下&#xff0c; handwriting recognition&#xff08;手写识别&#xff09;技术已成为连接传统书写与数字世界的重要桥梁。其中&#xff0c;汉字手写体识别因其字符集的庞大和结构的复杂性&#xff0c;被视为模式识别领域最具挑战性的任务之一。近年来&…

【无人机】无人机用户体验测试策略详细介绍

一、 道&#xff1a;核心测试理念与目标核心理念&#xff1a; 用户体验测试的核心不是寻找功能Bug&#xff0c;而是评估用户在与无人机系统&#xff08;包括飞行器、遥控器、APP&#xff09;交互全过程中的主观感受、操作效率、情感变化和达成目标的难易度。我们的目标是让科技…

@RequiredArgsConstructor使用

spring推荐通过构造方法进行注入&#xff0c;如果需要注入的成员变量较多&#xff0c;手动创建构造方法可能需要频繁修改&#xff0c;这时&#xff0c;可以使用RequiredArgsConstructor。RequiredArgsConstructor是lombok中提供的注解&#xff0c;可以为类中final或者NotNull修…

TA-VLA——将关节力矩反馈融入VLA中:无需外部力传感器,即可完成汽车充电器插入(且可多次自主尝试)

前言 今25年9.13日&#xff0c;我在微博上写道&#xff1a; “我们为何24年起聚焦具身开发呢 23年我们做了一系列大模型应用&#xff0c;发觉卷飞了&#xff0c;c端搞不过大厂的工程迭代 流量获取&#xff0c;b端拼不过大厂的品牌&#xff0c;且大厂外 人人都可以搞 ​然&…

数据驱动破局商业信息不对称:中国商业查询平台的技术实践与方法论心得

前言 在当前中国经济高质量发展的浪潮中,企业数量已突破5000万户(截至2024年数据,延续2021年超5亿用户查询需求的增长趋势),但“企业质量参差、信息不透明”的痛点始终困扰着市场主体——企业合作前怕踩坑、个人求职担心“皮包公司”、投资者规避坏账风险,这些需求的核心…

光谱相机的图像模式

光谱相机通过不同的成像方式获取目标的光谱信息&#xff0c;主要分为以下几种图像模式&#xff1a;一、按成像方式分类‌点扫描模式&#xff08;Whiskbroom&#xff09;‌工作原理&#xff1a;逐点扫描目标区域&#xff0c;每个点获取完整光谱曲线特点&#xff1a;光谱分辨率最…

连接器上的pin针和胶芯如何快速组装?

在连接器生产过程中&#xff0c;pin 针与胶芯的组装是核心环节 —— 人工组装不仅效率低&#xff08;单组耗时约 15-20 秒&#xff09;&#xff0c;还易因对齐偏差导致 pin 针弯曲、胶芯卡滞&#xff0c;不良率高达 3%-5%。针对这一问题&#xff0c;可通过 “机器精准排列 定制…

Zynq-7000与Zynq-MPSoC 的 AXI 接口对比

Zynq 与 Zynq UltraScale MPSoC 的的 AXI 接口对比 1. 总体架构差异Zynq-7000 双核 ARM Cortex-A9 (PS) 7 系列 FPGA (PL)PS–PL 之间主要通过 AXI 总线通讯提供 GP (General Purpose)、HP (High Performance)、ACP (Accelerator Coherency Port) 等接口ZynqMP (UltraScale MP…

关键字 - 第六讲

前文补充#include <iostream> using namespace std;int main() {int a 10;int c 20; // 将变量c定义在switch语句之前switch(a){case 1:{cout << ".........." << endl;cout << c << endl;}break;default:cout << ".....…