diff --git a/database/sqls/05-field-mapping-is-enabled.sql b/database/sqls/05-field-mapping-is-enabled.sql new file mode 100644 index 0000000..b7db021 --- /dev/null +++ b/database/sqls/05-field-mapping-is-enabled.sql @@ -0,0 +1,35 @@ +-- ============================================================ +-- 05: 品牌字段映射增加启用/禁用开关 +-- 执行目标库:cnc_business +-- 幂等:是(通过 IF NOT EXISTS 检查列是否已存在) +-- ============================================================ + +-- 1. 增加 is_enabled 列(默认启用) +SET @dbname = 'cnc_business'; +SET @tablename = 'cnc_brand_field_mapping'; +SET @columnname = 'is_enabled'; +SET @preparedStatement = (SELECT IF( + ( + SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = @dbname + AND TABLE_NAME = @tablename + AND COLUMN_NAME = @columnname + ) > 0, + 'SELECT 1', + 'ALTER TABLE cnc_brand_field_mapping ADD COLUMN is_enabled tinyint(1) NOT NULL DEFAULT 1 COMMENT ''是否启用:1=启用 0=禁用'' AFTER is_required' +)); +PREPARE alterIfNotExists FROM @preparedStatement; +EXECUTE alterIfNotExists; +DEALLOCATE PREPARE alterIfNotExists; + +-- 2. 根据采集示例数据,禁用未出现的字段映射 +-- 采集示例中只出现了:_io_status, Tag5, Tag8, Tag9, Tag11, Tag22, Tag23 +-- 未出现的先设为禁用,后续可通过后台开关启用 +UPDATE cnc_brand_field_mapping SET is_enabled = 0 +WHERE field_name IN ('Tag14','Tag17','Tag18','Tag19','Tag20','Tag21','Tag24','Tag25','Tag26') + AND is_enabled = 1; + +-- 3. 验证结果 +SELECT id, standard_field, field_name, is_required, is_enabled +FROM cnc_brand_field_mapping +ORDER BY id; diff --git a/frontend/src/views/brand/BrandEditPage.vue b/frontend/src/views/brand/BrandEditPage.vue index c53c4b6..a05c8c9 100644 --- a/frontend/src/views/brand/BrandEditPage.vue +++ b/frontend/src/views/brand/BrandEditPage.vue @@ -13,12 +13,13 @@ - + + @@ -36,12 +37,12 @@ import request from '@/utils/request' const route = useRoute() const router = useRouter() import type { Brand, ApiResponse } from '@/types' -type BrandMappingForm = { standardField: string; fieldName: string; matchBy: string; dataType: string; isRequired: number } +type BrandMappingForm = { standardField: string; fieldName: string; matchBy: string; dataType: string; isRequired: number; isEnabled: number } const isEdit = !!route.params.id const submitting = ref(false) const standardFields = ['program_name','part_count','device_status','run_status','operate_mode','spindle_speed_set','feed_speed_set','spindle_speed_actual','feed_speed_actual','spindle_load','spindle_override','power_on_time','run_time','cutting_time','cycle_time','machining_status'] const form = reactive({ brandName: '', deviceField: 'device', tagsPath: 'tags', mappings: [] as BrandMappingForm[] }) -function addMapping() { form.mappings.push({ standardField: '', fieldName: '', matchBy: 'id', dataType: 'string', isRequired: 0 }) } +function addMapping() { form.mappings.push({ standardField: '', fieldName: '', matchBy: 'id', dataType: 'string', isRequired: 0, isEnabled: 1 }) } async function loadData() { if (!isEdit) return const r = await request.get(`/admin/brand/${route.params.id}`) diff --git a/src/CncModels/Dto/Brand/BrandFieldMappingDto.cs b/src/CncModels/Dto/Brand/BrandFieldMappingDto.cs index 1c91822..66a91f5 100644 --- a/src/CncModels/Dto/Brand/BrandFieldMappingDto.cs +++ b/src/CncModels/Dto/Brand/BrandFieldMappingDto.cs @@ -10,5 +10,7 @@ namespace CncModels.Dto.Brand public string MatchBy { get; set; } public string DataType { get; set; } public int IsRequired { get; set; } + + public int IsEnabled { get; set; } } } diff --git a/src/CncModels/Entity/BrandFieldMapping.cs b/src/CncModels/Entity/BrandFieldMapping.cs index 6fc2858..de3ba42 100644 --- a/src/CncModels/Entity/BrandFieldMapping.cs +++ b/src/CncModels/Entity/BrandFieldMapping.cs @@ -28,6 +28,9 @@ namespace CncModels.Entity /// 是否必填 public int IsRequired { get; set; } + /// 是否启用 + public int IsEnabled { get; set; } + /// 创建时间 public DateTime CreatedAt { get; set; } } diff --git a/src/CncRepository/Impl/BrandFieldMappingRepository.cs b/src/CncRepository/Impl/BrandFieldMappingRepository.cs index 06b460a..8db72a7 100644 --- a/src/CncRepository/Impl/BrandFieldMappingRepository.cs +++ b/src/CncRepository/Impl/BrandFieldMappingRepository.cs @@ -19,8 +19,8 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - var sql = @"SELECT id as Id, brand_id as BrandId, standard_field as StandardField, field_name as FieldName, match_by as MatchBy, data_type as DataType, is_required as IsRequired, created_at as CreatedAt - FROM cnc_brand_field_mapping WHERE brand_id = @BrandId ORDER BY id"; + var sql = @"SELECT id as Id, brand_id as BrandId, standard_field as StandardField, field_name as FieldName, match_by as MatchBy, data_type as DataType, is_required as IsRequired, is_enabled as IsEnabled, created_at as CreatedAt + FROM cnc_brand_field_mapping WHERE brand_id = @BrandId ORDER BY id"; return conn.Query(sql, new { BrandId = brandId }).ToList(); } } @@ -29,8 +29,8 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - var sql = @"SELECT id as Id, brand_id as BrandId, standard_field as StandardField, field_name as FieldName, match_by as MatchBy, data_type as DataType, is_required as IsRequired, created_at as CreatedAt - FROM cnc_brand_field_mapping WHERE id = @Id"; + var sql = @"SELECT id as Id, brand_id as BrandId, standard_field as StandardField, field_name as FieldName, match_by as MatchBy, data_type as DataType, is_required as IsRequired, is_enabled as IsEnabled, created_at as CreatedAt + FROM cnc_brand_field_mapping WHERE id = @Id"; return conn.QuerySingleOrDefault(sql, new { Id = id }); } } @@ -39,9 +39,9 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - var sql = @"INSERT INTO cnc_brand_field_mapping (brand_id, standard_field, field_name, match_by, data_type, is_required, created_at) - VALUES (@BrandId, @StandardField, @FieldName, @MatchBy, @DataType, @IsRequired, @CreatedAt); - SELECT LAST_INSERT_ID();"; + var sql = @"INSERT INTO cnc_brand_field_mapping (brand_id, standard_field, field_name, match_by, data_type, is_required, is_enabled, created_at) + VALUES (@BrandId, @StandardField, @FieldName, @MatchBy, @DataType, @IsRequired, @IsEnabled, @CreatedAt); + SELECT LAST_INSERT_ID();"; return conn.QuerySingle(sql, entity); } } @@ -50,7 +50,7 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - var sql = @"UPDATE cnc_brand_field_mapping SET brand_id = @BrandId, standard_field = @StandardField, field_name = @FieldName, match_by = @MatchBy, data_type = @DataType, is_required = @IsRequired, created_at = @CreatedAt WHERE id = @Id"; + var sql = @"UPDATE cnc_brand_field_mapping SET brand_id = @BrandId, standard_field = @StandardField, field_name = @FieldName, match_by = @MatchBy, data_type = @DataType, is_required = @IsRequired, is_enabled = @IsEnabled, created_at = @CreatedAt WHERE id = @Id"; return conn.Execute(sql, entity) > 0; } } @@ -74,8 +74,8 @@ namespace CncRepository.Impl try { int count = 0; - var sql = @"INSERT INTO cnc_brand_field_mapping (brand_id, standard_field, field_name, match_by, data_type, is_required, created_at) - VALUES (@BrandId, @StandardField, @FieldName, @MatchBy, @DataType, @IsRequired, @CreatedAt); + var sql = @"INSERT INTO cnc_brand_field_mapping (brand_id, standard_field, field_name, match_by, data_type, is_required, is_enabled, created_at) + VALUES (@BrandId, @StandardField, @FieldName, @MatchBy, @DataType, @IsRequired, @IsEnabled, @CreatedAt); SELECT LAST_INSERT_ID();"; foreach (var m in mappings) { @@ -94,5 +94,15 @@ namespace CncRepository.Impl } } } + + public List GetEnabledByBrandId(int brandId) + { + using (var conn = CreateConnection()) + { + var sql = @"SELECT id as Id, brand_id as BrandId, standard_field as StandardField, field_name as FieldName, match_by as MatchBy, data_type as DataType, is_required as IsRequired, is_enabled as IsEnabled, created_at as CreatedAt + FROM cnc_brand_field_mapping WHERE brand_id = @BrandId AND is_enabled = 1 ORDER BY id"; + return conn.Query(sql, new { BrandId = brandId }).ToList(); + } + } } } diff --git a/src/CncRepository/Interface/IBrandFieldMappingRepository.cs b/src/CncRepository/Interface/IBrandFieldMappingRepository.cs index f91e88d..8df3456 100644 --- a/src/CncRepository/Interface/IBrandFieldMappingRepository.cs +++ b/src/CncRepository/Interface/IBrandFieldMappingRepository.cs @@ -14,5 +14,6 @@ namespace CncRepository.Interface bool Update(BrandFieldMapping entity); bool DeleteByBrandId(int brandId); int BatchCreate(int brandId, List mappings); + List GetEnabledByBrandId(int brandId); } } diff --git a/src/CncService/Impl/BrandService.cs b/src/CncService/Impl/BrandService.cs index d16f1eb..bc1c668 100644 --- a/src/CncService/Impl/BrandService.cs +++ b/src/CncService/Impl/BrandService.cs @@ -56,15 +56,16 @@ namespace CncService.Impl TagsPath = brand.TagsPath, IsEnabled = brand.IsEnabled == 1, FieldCount = mappings?.Count ?? 0, - Mappings = mappings?.Select(m => new BrandFieldMappingDto - { - StandardField = m.StandardField, - FieldName = m.FieldName, - MatchBy = m.MatchBy, - DataType = m.DataType, - IsRequired = m.IsRequired - }).ToList() ?? new List() - }; + Mappings = mappings?.Select(m => new BrandFieldMappingDto + { + StandardField = m.StandardField, + FieldName = m.FieldName, + MatchBy = m.MatchBy, + DataType = m.DataType, + IsRequired = m.IsRequired, + IsEnabled = m.IsEnabled + }).ToList() ?? new List() + }; return detail; } @@ -139,16 +140,17 @@ namespace CncService.Impl var mappings = _mappingRepository.GetByBrandId(id); if (mappings != null && mappings.Count > 0) { - var newMappings = mappings.Select(m => new BrandFieldMapping - { - BrandId = newBrandId, - StandardField = m.StandardField, - FieldName = m.FieldName, - MatchBy = m.MatchBy, - DataType = m.DataType, - IsRequired = m.IsRequired, - CreatedAt = DateTime.Now - }).ToList(); + var newMappings = mappings.Select(m => new BrandFieldMapping + { + BrandId = newBrandId, + StandardField = m.StandardField, + FieldName = m.FieldName, + MatchBy = m.MatchBy, + DataType = m.DataType, + IsRequired = m.IsRequired, + IsEnabled = m.IsEnabled, + CreatedAt = DateTime.Now + }).ToList(); _mappingRepository.BatchCreate(newBrandId, newMappings); } return newBrandId; diff --git a/tests/CncRepository.Tests/BrandFieldMappingRepositoryTests.cs b/tests/CncRepository.Tests/BrandFieldMappingRepositoryTests.cs index 6b8d82d..66b7850 100644 --- a/tests/CncRepository.Tests/BrandFieldMappingRepositoryTests.cs +++ b/tests/CncRepository.Tests/BrandFieldMappingRepositoryTests.cs @@ -40,6 +40,8 @@ namespace CncRepository.Tests [Fact] public void GetEnabledByBrandId_只返回启用的映射() { + TestDb.Execute(@"INSERT IGNORE INTO cnc_brand (id, brand_name, device_field, tags_path, is_enabled, created_at, updated_at) + VALUES (1, 'FANUC', 'device', 'tags', 1, NOW(), NOW())"); TestDb.Execute(@"INSERT INTO cnc_brand_field_mapping (brand_id, standard_field, field_name, match_by, data_type, is_required, is_enabled, created_at) VALUES (1, 'program_name', 'Tag5', 'id', 'string', 1, 1, NOW()), (1, 'part_count', 'Tag8', 'id', 'number', 1, 1, NOW()), @@ -52,6 +54,9 @@ namespace CncRepository.Tests [Fact] public void Create_默认启用() { + // 确保 brand_id=1 存在 + TestDb.Execute(@"INSERT IGNORE INTO cnc_brand (id, brand_name, device_field, tags_path, is_enabled, created_at, updated_at) + VALUES (1, 'FANUC', 'device', 'tags', 1, NOW(), NOW())"); var entity = new BrandFieldMapping { BrandId = 1, @@ -85,6 +90,9 @@ namespace CncRepository.Tests [Fact] public void BatchCreate_批量插入保留启用状态() { + // 确保 brand_id=1 存在 + TestDb.Execute(@"INSERT IGNORE INTO cnc_brand (id, brand_name, device_field, tags_path, is_enabled, created_at, updated_at) + VALUES (1, 'FANUC', 'device', 'tags', 1, NOW(), NOW())"); var mappings = new[] { new BrandFieldMapping { StandardField = "f1", FieldName = "Tag1", MatchBy = "id", DataType = "string", IsRequired = 0, IsEnabled = 1, CreatedAt = DateTime.Now }, diff --git a/发那科系统采集示例.txt b/发那科系统采集示例.txt index 0096a9f..69bbea9 100644 --- a/发那科系统采集示例.txt +++ b/发那科系统采集示例.txt @@ -1,280 +1 @@ -[ - { - "device": "fanake_1.8", - "desc": "西-1.8", - "tags": [ - { - "id": "_io_status", - "desc": "设备状态", - "quality": "0", - "value": "1.00000", - "time": "2026-04-10 17:36:38" - }, - { - "id": "Tag2", - "desc": "当前轴数", - "quality": "0", - "value": "4.00000", - "time": "2026-04-10 17:36:34" - }, - { - "id": "Tag5", - "desc": "执行的NC主程序名", - "quality": "0", - "value": "1566.NC", - "time": "2026-04-10 17:36:35" - }, - { - "id": "Tag6", - "desc": "执行的NC主程序号", - "quality": "0", - "value": "N0", - "time": "2026-04-10 17:36:35" - }, - { - "id": "Tag7", - "desc": "当前加工程序内容", - "quality": "0", - "value": "<1566.NC>\nG40G49G80\n( NAME: Administrator )\n( M", - "time": "2026-04-10 17:36:35" - }, - { - "id": "Tag8", - "desc": "当前加工零件数", - "quality": "0", - "value": "1219.00000", - "time": "2026-04-10 17:36:35" - }, - { - "id": "Tag9", - "desc": "运行状态", - "quality": "0", - "value": "0.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag11", - "desc": "操作模式", - "quality": "0", - "value": "1.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag14", - "desc": "当前主轴倍率", - "quality": "0", - "value": "100.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag17", - "desc": "主轴设定速度", - "quality": "0", - "value": "300.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag18", - "desc": "进给设定速度", - "quality": "0", - "value": "0.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag19", - "desc": "主轴实际速度", - "quality": "0", - "value": "0.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag20", - "desc": "进给实际转速", - "quality": "0", - "value": "0.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag21", - "desc": "主轴负载", - "quality": "0", - "value": "0.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag22", - "desc": "开机时间", - "quality": "0", - "value": "23558160.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag23", - "desc": "运行时间", - "quality": "0", - "value": "18224.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag24", - "desc": "切削时间", - "quality": "0", - "value": "6848959.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag25", - "desc": "循环时间", - "quality": "0", - "value": "699.00000", - "time": "2026-04-10 17:36:38" - }, - { - "id": "Tag26", - "desc": "加工状态", - "quality": "0", - "value": "G01", - "time": "2026-04-10 17:36:38" - } - ] - }, - { - "device": "fanake_1.9", - "desc": "西-1.9", - "tags": [ - { - "id": "_io_status", - "desc": "设备状态", - "quality": "0", - "value": "1.00000", - "time": "2026-04-10 17:36:38" - }, - { - "id": "Tag2", - "desc": "当前轴数", - "quality": "0", - "value": "4.00000", - "time": "2026-04-10 17:36:34" - }, - { - "id": "Tag5", - "desc": "执行的NC主程序名", - "quality": "0", - "value": "O1", - "time": "2026-04-10 17:36:35" - }, - { - "id": "Tag6", - "desc": "执行的NC主程序号", - "quality": "0", - "value": "N20", - "time": "2026-04-10 17:36:35" - }, - { - "id": "Tag7", - "desc": "当前加工程序内容", - "quality": "0", - "value": "G99 G83 Z-43.000 Q3.000 R3.000 F60. \nG80 \nG00 Z", - "time": "2026-04-10 17:36:35" - }, - { - "id": "Tag8", - "desc": "当前加工零件数", - "quality": "0", - "value": "62.00000", - "time": "2026-04-10 17:36:35" - }, - { - "id": "Tag9", - "desc": "运行状态", - "quality": "0", - "value": "3.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag11", - "desc": "操作模式", - "quality": "0", - "value": "10.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag14", - "desc": "当前主轴倍率", - "quality": "0", - "value": "100.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag17", - "desc": "主轴设定速度", - "quality": "0", - "value": "450.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag18", - "desc": "进给设定速度", - "quality": "0", - "value": "60.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag19", - "desc": "主轴实际速度", - "quality": "0", - "value": "450.00000", - "time": "2026-04-10 17:36:36" - }, - { - "id": "Tag20", - "desc": "进给实际转速", - "quality": "0", - "value": "60.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag21", - "desc": "主轴负载", - "quality": "0", - "value": "25.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag22", - "desc": "开机时间", - "quality": "0", - "value": "23784960.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag23", - "desc": "运行时间", - "quality": "0", - "value": "24253.00000", - "time": "2026-04-10 17:36:37" - }, - { - "id": "Tag24", - "desc": "切削时间", - "quality": "0", - "value": "8009398.00000", - "time": "2026-04-10 17:36:38" - }, - { - "id": "Tag25", - "desc": "循环时间", - "quality": "0", - "value": "82.00000", - "time": "2026-04-10 17:36:38" - }, - { - "id": "Tag26", - "desc": "加工状态", - "quality": "0", - "value": "G01", - "time": "2026-04-10 17:36:38" - } - ] - } -] \ No newline at end of file +[{"device":"fanake_1.8","desc":"-1.8","tags":[{"id":"_io_status","desc":"豸״̬","quality":"0","value":"1.00000","time":"2026-05-06 15:07:14"},{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:51"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"X38.000 \nY-17.750 \nG80 \nG00 Z10.000 \nG00 G90 G5","time":"2026-05-06 15:06:46"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"63.00000","time":"2026-05-06 15:07:14"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"24523080.00000","time":"2026-05-06 15:04:27"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"15700.00000","time":"2026-05-06 15:04:55"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"16101.00000","time":"2026-05-06 15:05:24"},{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:51"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"X38.000 \nY-17.750 \nG80 \nG00 Z10.000 \nG00 G90 G5","time":"2026-05-06 15:06:46"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"63.00000","time":"2026-05-06 15:07:14"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"24523080.00000","time":"2026-05-06 15:04:27"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"15700.00000","time":"2026-05-06 15:04:55"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"16101.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.2","desc":"-1.2","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O504","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:46"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G02 X-162.715 Y31.284 I6.830 J0.000 \nG03 X-161.","time":"2026-05-06 15:07:13"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"14.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:27"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:27"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"44884260.00000","time":"2026-05-06 15:04:54"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"20043.00000","time":"2026-05-06 15:05:23"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"45751.00000","time":"2026-05-06 15:05:51"}]},{"device":"fanake_1.3","desc":"-1.3","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N0","time":"2026-05-06 15:06:46"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G43 Z93.300 H1 \nM8 \nZ5.300 \nG01 Z2.300 F400. \nY","time":"2026-05-06 15:07:13"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"53.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:27"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:27"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"45177540.00000","time":"2026-05-06 15:04:55"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"3403.00000","time":"2026-05-06 15:05:23"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"48951.00000","time":"2026-05-06 15:05:51"}]},{"device":"fanake_1.4","desc":"-1.4","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:46"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G02 X-57.510 Y34.310 I3.420 J0.000 \nG01 X-59.01","time":"2026-05-06 15:07:14"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"9.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:27"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:27"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"45858120.00000","time":"2026-05-06 15:04:55"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"20721.00000","time":"2026-05-06 15:05:23"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"40504.00000","time":"2026-05-06 15:05:51"}]},{"device":"fanake_1.5","desc":"-1.5","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O9001","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:46"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G02 X-3.853 Y13.826 I11.632 J-10.432 \nX11.301 Y","time":"2026-05-06 15:07:14"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"21.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:27"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:27"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"41894640.00000","time":"2026-05-06 15:04:55"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"19314.00000","time":"2026-05-06 15:05:23"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"43904.00000","time":"2026-05-06 15:05:51"}]},{"device":"fanake_1.6","desc":"-1.6","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O9001","time":"2026-05-06 15:05:51"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"<1370.NC>\nG40G49G80\n( NAME: Administrator )\n( M","time":"2026-05-06 15:06:46"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"5.00000","time":"2026-05-06 15:07:14"},{"id":"Tag9","desc":"״̬","quality":"0","value":"1.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"4.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"26481840.00000","time":"2026-05-06 15:04:27"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"16611.00000","time":"2026-05-06 15:04:55"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"12225.00000","time":"2026-05-06 15:05:23"}]},{"device":"fanake_1.7","desc":"-1.7","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:51"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"X-7.450 \nX-5.850 \nZ6.900 \nG00 Z42.000 \nY7.000 \n","time":"2026-05-06 15:06:46"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"12.00000","time":"2026-05-06 15:07:14"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"29563620.00000","time":"2026-05-06 15:04:27"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"14635.00000","time":"2026-05-06 15:04:55"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"18112.00000","time":"2026-05-06 15:05:23"}]},{"device":"fanake_1.9","desc":"-1.9","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:51"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"M1 \nG90A90.\nX-105.Y-48.303\nG43Z41.738H01\nM10\nZ2","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"18.00000","time":"2026-05-06 15:07:14"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"5.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"24744120.00000","time":"2026-05-06 15:04:28"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"1121.00000","time":"2026-05-06 15:04:55"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"16472.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.10","desc":"-1.10","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O88","time":"2026-05-06 15:05:51"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N380","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G01 X-115.000 \nG02 X-130.100 Y-127.500 I0.000 J","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"1789.00000","time":"2026-05-06 15:07:14"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"83095080.00000","time":"2026-05-06 15:04:28"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"953670.00000","time":"2026-05-06 15:04:56"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"61675.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.11","desc":"-1.11","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"","time":"2026-05-06 15:05:52"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N170","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"N178 Y-132.000 F1000. \nN180 X-131.500 \nN182 Y35","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"1153.00000","time":"2026-05-06 15:07:14"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"81371460.00000","time":"2026-05-06 15:04:28"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"1784670.00000","time":"2026-05-06 15:04:56"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"51653.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.12","desc":"-1.12","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O2","time":"2026-05-06 15:05:52"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N0","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":".189%","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"1162.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"57159300.00000","time":"2026-05-06 15:04:28"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"2611091.00000","time":"2026-05-06 15:04:56"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"52058.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.13","desc":"-1.13","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:52"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:19"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G91 G28 Y0.000 \nM30\n%","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"150.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"60468480.00000","time":"2026-05-06 15:04:28"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"52678.00000","time":"2026-05-06 15:04:56"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"58791.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.14","desc":"-1.14","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"","time":"2026-05-06 15:05:52"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N0","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"173.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:00"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:00"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"63446160.00000","time":"2026-05-06 15:04:28"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"55461.00000","time":"2026-05-06 15:04:56"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"69633.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.15","desc":"-1.15","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O506","time":"2026-05-06 15:05:52"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G01 X20.775 \nY-8.284 \nX4.800 \nY8.284 \nX36.750 \n","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"4.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:01"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:01"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"54781260.00000","time":"2026-05-06 15:04:28"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"6403.00000","time":"2026-05-06 15:04:56"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"32442.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.16","desc":"-1.16","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:52"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G02 X-60.570 Y47.947 I-0.989 J4.973 \nG01 X-60.6","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"103.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:01"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:01"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"56446080.00000","time":"2026-05-06 15:04:28"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"71194.00000","time":"2026-05-06 15:04:56"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"43958.00000","time":"2026-05-06 15:05:24"}]},{"device":"fanake_1.17","desc":"-1.17","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:52"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"Y-12.865 \nY-12.269 \nY-11.673 \nY-11.077 \nY-10.48","time":"2026-05-06 15:06:47"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"193.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:01"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:01"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"53566620.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"78701.00000","time":"2026-05-06 15:04:57"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"25609.00000","time":"2026-05-06 15:05:25"}]},{"device":"fanake_1.18","desc":"-1.18","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O2","time":"2026-05-06 15:05:52"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"X-187.885 Y-28.629 \nG02 X-192.115 I-2.115 J3.66","time":"2026-05-06 15:06:48"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"0.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:01"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:01"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"86160480.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"0.00000","time":"2026-05-06 15:04:57"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"113856.00000","time":"2026-05-06 15:05:25"}]},{"device":"fanake_1.19","desc":"-1.19","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:53"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N9","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"Z-4.500 \nG00 Z33.000 \nG90 X-90.641 Y-28.053 \nZ-","time":"2026-05-06 15:06:48"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"0.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:01"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:01"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"136464540.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"68.00000","time":"2026-05-06 15:04:57"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"144029.00000","time":"2026-05-06 15:05:25"}]},{"device":"fanake_1.20","desc":"-1.20","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:53"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N9","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G01 X-2.200 Y14.549 \nX-4.200 Y18.013 \nX-2.100 Y","time":"2026-05-06 15:06:48"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"0.00000","time":"2026-05-06 15:07:15"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:01"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:01"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"141877620.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"0.00000","time":"2026-05-06 15:04:57"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"139788.00000","time":"2026-05-06 15:05:25"}]},{"device":"fanake_1.21","desc":"-1.21","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:53"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N9","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G02 X-114.170 I2.830 J-4.902 \nG01 X-108.900 Y27","time":"2026-05-06 15:06:48"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"0.00000","time":"2026-05-06 15:07:16"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:01"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:01"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"140563920.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"639.00000","time":"2026-05-06 15:04:57"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"127265.00000","time":"2026-05-06 15:05:25"}]},{"device":"fanake_1.22","desc":"-1.22","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"1027","time":"2026-05-06 15:05:53"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N9","time":"2026-05-06 15:06:20"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"","time":"2026-05-06 15:06:48"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"24.00000","time":"2026-05-06 15:07:16"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:01"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:01"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"130547880.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"7936.00000","time":"2026-05-06 15:04:57"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"161742.00000","time":"2026-05-06 15:05:25"}]},{"device":"fanake_1.23","desc":"-1.23","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O2","time":"2026-05-06 15:05:53"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N0","time":"2026-05-06 15:06:21"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G01 X-235. M8 F39. \nG00 Z200.000 M9 \nM5 \nG28 Y0","time":"2026-05-06 15:06:48"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"38.00000","time":"2026-05-06 15:07:16"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:02"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"1.00000","time":"2026-05-06 15:04:02"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"124760580.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"14200.00000","time":"2026-05-06 15:04:57"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"106705.00000","time":"2026-05-06 15:05:25"}]},{"device":"fanake_1.24","desc":"-1.24","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:53"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N1","time":"2026-05-06 15:06:21"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"X-60.000 \nY-67.700 F500. \nG00 Z155.000 \nM9 \nM5 ","time":"2026-05-06 15:06:48"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"15.00000","time":"2026-05-06 15:07:16"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:02"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:02"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"117256500.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"12020.00000","time":"2026-05-06 15:04:58"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"106460.00000","time":"2026-05-06 15:05:25"}]},{"device":"fanake_1.25","desc":"-1.25","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:05:53"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:21"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G99 G83 Z-12.980 Q1.000 R9.020 F20. \nG80\nG0Z56.","time":"2026-05-06 15:06:48"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"13.00000","time":"2026-05-06 15:07:16"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:02"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:02"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"107630700.00000","time":"2026-05-06 15:04:29"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"18953.00000","time":"2026-05-06 15:04:58"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"88768.00000","time":"2026-05-06 15:05:26"}]},{"device":"fanake_1.26","desc":"-1.26","tags":[{"id":"Tag5","desc":"ִеNC","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag6","desc":"ִеNC","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag7","desc":"ǰӹ","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag8","desc":"ǰӹ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag9","desc":"״̬","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag11","desc":"ģʽ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag22","desc":"ʱ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag23","desc":"ʱ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag1","desc":"ӹ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"}]},{"device":"fanake_1.27","desc":"-1.27","tags":[{"id":"Tag5","desc":"ִеNC","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag6","desc":"ִеNC","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag7","desc":"ǰӹ","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag8","desc":"ǰӹ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag9","desc":"״̬","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag11","desc":"ģʽ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag22","desc":"ʱ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag23","desc":"ʱ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag1","desc":"ӹ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"}]},{"device":"fanake_1.28","desc":"-1.28","tags":[{"id":"Tag5","desc":"ִеNC","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag6","desc":"ִеNC","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag7","desc":"ǰӹ","quality":"1","value":"","time":"1970-01-01 08:00:00"},{"id":"Tag8","desc":"ǰӹ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag9","desc":"״̬","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag11","desc":"ģʽ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag22","desc":"ʱ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag23","desc":"ʱ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"},{"id":"Tag1","desc":"ӹ","quality":"1","value":"0.00000","time":"1970-01-01 08:00:00"}]},{"device":"fanake_1.29","desc":"-1.29","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N9","time":"2026-05-06 15:06:45"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G02 X-17.910 I-1.910 J3.308 \nG01 X-26.800 Y-18.","time":"2026-05-06 15:07:13"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"19.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:26"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:26"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"54806160.00000","time":"2026-05-06 15:04:54"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"20654.00000","time":"2026-05-06 15:05:22"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"57603.00000","time":"2026-05-06 15:05:50"}]},{"device":"fanake_1.30","desc":"-1.30","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N9","time":"2026-05-06 15:06:45"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"G91 G28 Y0.000 \nM30\n%","time":"2026-05-06 15:07:13"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"31.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:26"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:26"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"62122620.00000","time":"2026-05-06 15:04:54"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"17469.00000","time":"2026-05-06 15:05:22"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"62111.00000","time":"2026-05-06 15:05:50"}]},{"device":"fanake_1.31","desc":"-1.31","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N1","time":"2026-05-06 15:06:45"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"X0.000 \nX8.000 \nZ1.100 \nG00 Z50.000 \nM9 \nG91G28","time":"2026-05-06 15:07:13"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"0.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"3.00000","time":"2026-05-06 15:04:26"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:26"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"63428160.00000","time":"2026-05-06 15:04:54"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"1001.00000","time":"2026-05-06 15:05:22"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"85647.00000","time":"2026-05-06 15:05:50"}]},{"device":"fanake_1.32","desc":"-1.32","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N0","time":"2026-05-06 15:06:46"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"","time":"2026-05-06 15:07:13"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"90.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:27"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"5.00000","time":"2026-05-06 15:04:27"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"67187760.00000","time":"2026-05-06 15:04:54"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"23644.00000","time":"2026-05-06 15:05:23"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"86248.00000","time":"2026-05-06 15:05:50"}]},{"device":"fanake_1.33","desc":"-1.33","tags":[{"id":"Tag5","desc":"ִеNC","quality":"0","value":"O1","time":"2026-05-06 15:06:18"},{"id":"Tag6","desc":"ִеNC","quality":"0","value":"N20","time":"2026-05-06 15:06:46"},{"id":"Tag7","desc":"ǰӹ","quality":"0","value":"Y0.000 \nY4.792 \nG02 X-10.400 Y8.429 I4.200 J0.0","time":"2026-05-06 15:07:13"},{"id":"Tag8","desc":"ǰӹ","quality":"0","value":"3.00000","time":"2026-05-06 15:03:59"},{"id":"Tag9","desc":"״̬","quality":"0","value":"0.00000","time":"2026-05-06 15:04:27"},{"id":"Tag11","desc":"ģʽ","quality":"0","value":"10.00000","time":"2026-05-06 15:04:27"},{"id":"Tag22","desc":"ʱ","quality":"0","value":"85447860.00000","time":"2026-05-06 15:04:54"},{"id":"Tag23","desc":"ʱ","quality":"0","value":"577.00000","time":"2026-05-06 15:05:23"},{"id":"Tag1","desc":"ӹ","quality":"0","value":"99421.00000","time":"2026-05-06 15:05:50"}]}] \ No newline at end of file