From 03745c5d0875f2ca22c29465317c98f7a1258f0f Mon Sep 17 00:00:00 2001 From: lixinyu1011 <674842481@qq.com> Date: Sat, 1 Nov 2025 10:37:45 +0800 Subject: [PATCH] byxinyu111 --- new_cellconfig3c.json | 38 ++++ test/resources/test.json | 170 +++++++++++------- test/resources/test_resourcetreeset.py | 7 +- .../bioyond_cell/2025092701.xlsx | Bin 18159 -> 18159 bytes .../bioyond_cell/bioyond_cell_workstation.py | 76 +------- .../bioyond_cell/material_template.xlsx | Bin 22207 -> 22149 bytes .../workstation/bioyond_studio/config.py | 5 +- .../coin_cell_assembly/coin_cell_assembly.py | 3 +- unilabos/registry/devices/bioyond_cell.yaml | 77 +++++++- 9 files changed, 230 insertions(+), 146 deletions(-) create mode 100644 new_cellconfig3c.json diff --git a/new_cellconfig3c.json b/new_cellconfig3c.json new file mode 100644 index 00000000..36190858 --- /dev/null +++ b/new_cellconfig3c.json @@ -0,0 +1,38 @@ +{ + "nodes": [ + { + "id": "bioyond_cell_workstation", + "name": "配液分液工站", + "children": [ + ], + "parent": null, + "type": "device", + "class": "bioyond_cell", + "config": { + "protocol_type": [], + "station_resource": {} + }, + "data": {} + }, + { + "id": "BatteryStation", + "name": "扣电工作站", + "children": [ + "coin_cell_deck" + ], + "parent": null, + "type": "device", + "class": "coincellassemblyworkstation_device", + "position": { + "x": 600, + "y": 400, + "z": 0 + }, + "config": { + "debug_mode": false, + "protocol_type": [] + } + } + ], + "links": [] +} \ No newline at end of file diff --git a/test/resources/test.json b/test/resources/test.json index ee1be0f1..95a29d20 100644 --- a/test/resources/test.json +++ b/test/resources/test.json @@ -1,22 +1,22 @@ [ { - "id": "3a1d4b7e-4bdc-16bf-7169-f60350d03c7e", + "id": "3a1d4c14-a9fb-d7dc-9e96-7a3ad6e50219", "typeName": "配液瓶(小)板", - "code": "0001-00088", + "code": "0001-00093", "barCode": "", - "name": "test1", - "quantity": 1.0, + "name": "test", + "quantity": 2.0, "lockQuantity": 0.0, "unit": "块", "status": 1, "isUse": false, "locations": [ { - "id": "3a19deae-2c7a-2426-6d71-e9de3cb158b1", + "id": "3a19deae-2c7a-36f5-5e41-02c5b66feaea", "whid": "3a19deae-2c79-05a3-9c76-8e6760424841", "whName": "手动堆栈", - "code": "4", - "x": 2, + "code": "1", + "x": 1, "y": 1, "z": 1, "quantity": 0 @@ -24,13 +24,58 @@ ], "detail": [ { - "id": "3a1d4b7e-4bdc-12e8-4d26-dddc77b03f63", - "detailMaterialId": "3a1d4b7e-4bdc-4e9e-8a3c-e9ba4a26457e", - "code": null, - "name": "test1", + "id": "3a1d4c14-a9fc-1daa-71fa-146cb1ccb930", + "detailMaterialId": "3a1d4c14-a9fc-4f38-4c48-68486c391c42", + "code": "0001-00093 - 05", + "name": "配液瓶(小)", "quantity": "1", "lockQuantity": "0", - "unit": "块", + "unit": "个", + "x": 1, + "y": 3, + "z": 1, + "associateId": null, + "typeName": "配液瓶(小)", + "typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb" + }, + { + "id": "3a1d4c14-a9fc-3659-ea61-cd587da9e131", + "detailMaterialId": "3a1d4c14-a9fc-018f-93e5-c49343d37758", + "code": "0001-00093 - 08", + "name": "配液瓶(小)", + "quantity": "1", + "lockQuantity": "0", + "unit": "个", + "x": 2, + "y": 4, + "z": 1, + "associateId": null, + "typeName": "配液瓶(小)", + "typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb" + }, + { + "id": "3a1d4c14-a9fc-3f94-de83-979d2646e313", + "detailMaterialId": "3a1d4c14-a9fc-9987-c0ef-4b7cbad49e6b", + "code": "0001-00093 - 01", + "name": "配液瓶(小)", + "quantity": "1", + "lockQuantity": "0", + "unit": "个", + "x": 1, + "y": 1, + "z": 1, + "associateId": null, + "typeName": "配液瓶(小)", + "typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb" + }, + { + "id": "3a1d4c14-a9fc-8c35-6b25-913b11dbaf4e", + "detailMaterialId": "3a1d4c14-a9fc-9a83-865b-0c26ea5e8cc4", + "code": "0001-00093 - 03", + "name": "配液瓶(小)", + "quantity": "1", + "lockQuantity": "0", + "unit": "个", "x": 1, "y": 2, "z": 1, @@ -39,75 +84,64 @@ "typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb" }, { - "id": "3a1d4b7e-4bdc-35b6-22d4-e6f3235e1c27", - "detailMaterialId": "3a1d4b7e-4bdc-ce0f-1fbb-b88de76fce98", - "code": null, - "name": "test1", + "id": "3a1d4c14-a9fc-b41f-e968-64953bfddccd", + "detailMaterialId": "3a1d4c14-a9fc-daf7-9d64-e5ec8d3ae0e2", + "code": "0001-00093 - 07", + "name": "配液瓶(小)", "quantity": "1", "lockQuantity": "0", - "unit": "块", + "unit": "个", "x": 1, + "y": 4, + "z": 1, + "associateId": null, + "typeName": "配液瓶(小)", + "typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb" + }, + { + "id": "3a1d4c14-a9fc-c20f-c26e-b1bb2cdc3bca", + "detailMaterialId": "3a1d4c14-a9fc-673b-ac83-aaaf71287f1f", + "code": "0001-00093 - 06", + "name": "配液瓶(小)", + "quantity": "1", + "lockQuantity": "0", + "unit": "个", + "x": 2, + "y": 3, + "z": 1, + "associateId": null, + "typeName": "配液瓶(小)", + "typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb" + }, + { + "id": "3a1d4c14-a9fc-cf21-059c-fde361d82b6f", + "detailMaterialId": "3a1d4c14-a9fc-25b1-e736-6b0d8dac0fae", + "code": "0001-00093 - 02", + "name": "配液瓶(小)", + "quantity": "1", + "lockQuantity": "0", + "unit": "个", + "x": 2, "y": 1, "z": 1, "associateId": null, "typeName": "配液瓶(小)", "typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb" - } - ] - }, - { - "id": "3a1d4b7e-ee61-ae87-9cd0-31c7e6621b18", - "typeName": "5ml分液瓶板", - "code": "0010-00089", - "barCode": "", - "name": "test2", - "quantity": 1.0, - "lockQuantity": 0.0, - "unit": "块", - "status": 1, - "isUse": false, - "locations": [ + }, { - "id": "3a19deae-2c7a-79b0-5e44-efaafd1e4cf3", - "whid": "3a19deae-2c79-05a3-9c76-8e6760424841", - "whName": "手动堆栈", - "code": "5", + "id": "3a1d4c14-a9fc-d732-2b93-9b2bd2bf581b", + "detailMaterialId": "3a1d4c14-a9fc-7f5d-b6b6-8bcb2e15f320", + "code": "0001-00093 - 04", + "name": "配液瓶(小)", + "quantity": "1", + "lockQuantity": "0", + "unit": "个", "x": 2, "y": 2, "z": 1, - "quantity": 0 - } - ], - "detail": [ - { - "id": "3a1d4b7e-ee61-8fb3-9a39-2c2841c3c8d0", - "detailMaterialId": "3a1d4b7e-ee61-305c-fe30-2620017ca1bd", - "code": null, - "name": "test2", - "quantity": "1", - "lockQuantity": "0", - "unit": "块", - "x": 1, - "y": 1, - "z": 1, "associateId": null, - "typeName": "5ml分液瓶", - "typeId": "3a192c2a-ebb7-58a1-480d-8b3863bf74f4" - }, - { - "id": "3a1d4b7e-ee61-ef5f-a7d1-f9399a4d3145", - "detailMaterialId": "3a1d4b7e-ee61-2f1d-6969-202ad3cbe226", - "code": null, - "name": "test2", - "quantity": "1", - "lockQuantity": "0", - "unit": "块", - "x": 1, - "y": 2, - "z": 1, - "associateId": null, - "typeName": "5ml分液瓶", - "typeId": "3a192c2a-ebb7-58a1-480d-8b3863bf74f4" + "typeName": "配液瓶(小)", + "typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb" } ] } diff --git a/test/resources/test_resourcetreeset.py b/test/resources/test_resourcetreeset.py index b7602ed1..99c6a984 100644 --- a/test/resources/test_resourcetreeset.py +++ b/test/resources/test_resourcetreeset.py @@ -9,6 +9,7 @@ from unilabos.ros.nodes.resource_tracker import ResourceTreeSet from unilabos.registry.registry import lab_registry from unilabos.resources.bioyond.decks import BIOYOND_PolymerReactionStation_Deck +from unilabos.resources.bioyond.decks import YB_Deck lab_registry.setup() @@ -16,6 +17,8 @@ lab_registry.setup() type_mapping = { "加样头(大)": ("YB_jia_yang_tou_da_1X1_carrier", "3a190ca0-b2f6-9aeb-8067-547e72c11469"), "液": ("YB_1BottleCarrier", "3a190ca1-2add-2b23-f8e1-bbd348b7f790"), + "配液瓶(小)板": ("YB_6x_SmallSolutionBottleCarrier", "3a190c8b-3284-af78-d29f-9a69463ad047"), + "配液瓶(小)": ("YB_pei_ye_xiao_Bottler", "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb"), } @@ -56,10 +59,10 @@ def bioyond_materials_liquidhandling_2() -> list[dict]: def test_resourcetreeset_from_plr() -> list[dict]: # 直接加载 bioyond_materials_reaction.json 文件 current_dir = os.path.dirname(os.path.abspath(__file__)) - json_path = os.path.join(current_dir, "YB_materials_info.json") + json_path = os.path.join(current_dir, "test.json") with open(json_path, "r", encoding="utf-8") as f: materials = json.load(f) - deck = BIOYOND_PolymerReactionStation_Deck("test_deck") + deck = YB_Deck("test_deck") output = resource_bioyond_to_plr(materials, type_mapping=type_mapping, deck=deck) print(output) # print(deck.summary()) diff --git a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/2025092701.xlsx b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/2025092701.xlsx index d1e9d2f31a2385b1028209891e31c975ebc9744b..4147095ed2784e56ccc6f637aec02c2a575c2cc8 100644 GIT binary patch delta 66 zcmaFg%lN*RaYMfJj7zwu^!&0=Oo!_Av@&M*O~ R2K`N Dict[str, Any]: + def wait_for_order_finish(self, order_code: str, timeout: int = 36000) -> Dict[str, Any]: """ 等待指定 orderCode 的 /report/order_finish 报送。 Args: @@ -253,7 +253,7 @@ class BioyondCellWorkstation(BioyondWorkstation): def auto_feeding4to3( self, # ★ 修改点:默认模板路径 - xlsx_path: Optional[str] = "unilabos\\devices\\workstation\\bioyond_studio\\bioyond_cell\\material_template.xlsx", + xlsx_path: Optional[str] = "C:/ML/GitHub/Uni-Lab-OS/unilabos/devices/workstation/bioyond_studio/bioyond_cell/material_template.xlsx", # ---------------- WH4 - 加样头面 (Z=1, 12个点位) ---------------- WH4_x1_y1_z1_1_materialName: str = "", WH4_x1_y1_z1_1_quantity: float = 0.0, WH4_x2_y1_z1_2_materialName: str = "", WH4_x2_y1_z1_2_quantity: float = 0.0, @@ -391,73 +391,7 @@ class BioyondCellWorkstation(BioyondWorkstation): # 等待完成报送 result = self.wait_for_order_finish(order_code) return result - - - - # 3.30 自动化上料(老版本) - def auto_feeding4to3_from_xlsx(self, xlsx_path: str) -> Dict[str, Any]: - """ - 根据固定模板解析 Excel: - - 四号手套箱加样头面 (2-13行, 3-7列) - - 四号手套箱原液瓶面 (15-23行, 3-9列) - - 三号手套箱人工堆栈 (26-40行, 3-7列) - """ - path = Path(xlsx_path) - if not path.exists(): - raise FileNotFoundError(f"未找到 Excel 文件:{path}") - - try: - df = pd.read_excel(path, sheet_name=0, header=None, engine="openpyxl") - except Exception as e: - raise RuntimeError(f"读取 Excel 失败:{e}") - - items: List[Dict[str, Any]] = [] - - # 四号手套箱 - 加样头面(2-13行, 3-7列) - for _, row in df.iloc[1:13, 2:7].iterrows(): - item = { - "sourceWHName": "四号手套箱堆栈", - "posX": int(row[2]), - "posY": int(row[3]), - "posZ": int(row[4]), - "materialName": str(row[5]).strip() if pd.notna(row[5]) else "", - "quantity": float(row[6]) if pd.notna(row[6]) else 0.0, - } - if item["materialName"]: - items.append(item) - - # 四号手套箱 - 原液瓶面(15-23行, 3-9列) - for _, row in df.iloc[14:23, 2:9].iterrows(): - item = { - "sourceWHName": "四号手套箱堆栈", - "posX": int(row[2]), - "posY": int(row[3]), - "posZ": int(row[4]), - "materialName": str(row[5]).strip() if pd.notna(row[5]) else "", - "quantity": float(row[6]) if pd.notna(row[6]) else 0.0, - "materialType": str(row[7]).strip() if pd.notna(row[7]) else "", - "targetWH": str(row[8]).strip() if pd.notna(row[8]) else "", - } - if item["materialName"]: - items.append(item) - - # 三号手套箱人工堆栈(26-40行, 3-7列) - for _, row in df.iloc[25:40, 2:7].iterrows(): - item = { - "sourceWHName": "三号手套箱人工堆栈", - "posX": int(row[2]), - "posY": int(row[3]), - "posZ": int(row[4]), - "materialType": str(row[5]).strip() if pd.notna(row[5]) else "", - "materialId": str(row[6]).strip() if pd.notna(row[6]) else "", - "quantity": 1 # 默认数量1 - } - if item["materialId"] or item["materialType"]: - items.append(item) - - response = self._post_lims("/api/lims/order/auto-feeding4to3", items) - self._wait_for_response_orders(response, "auto_feeding4to3_from_xlsx") - return response + def auto_batch_outbound_from_xlsx(self, xlsx_path: str) -> Dict[str, Any]: """ @@ -523,7 +457,7 @@ class BioyondCellWorkstation(BioyondWorkstation): }) response = self._post_lims("/api/lims/storage/auto-batch-out-bound", items) - self._wait_for_response_orders(response, "auto_batch_outbound_from_xlsx") + self.wait_for_response_orders(response, "auto_batch_outbound_from_xlsx") return response # 2.14 新建实验 @@ -1151,7 +1085,7 @@ if __name__ == "__main__": # result = ws.create_and_inbound_materials() # 继续后续流程 - # logger.info(ws.auto_feeding4to3()) #搬运物料到3号箱 + logger.info(ws.auto_feeding4to3()) #搬运物料到3号箱 # # # 使用正斜杠或 Path 对象来指定文件路径 # excel_path = Path("unilabos\\devices\\workstation\\bioyond_studio\\bioyond_cell\\2025092701.xlsx") # logger.info(ws.create_orders(excel_path)) diff --git a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/material_template.xlsx b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/material_template.xlsx index abaf145e68e8910ddf877637d20ff10748c489ad..2467ab05e52c39e2aa0b3cabc49d44b7c5754247 100644 GIT binary patch delta 179 zcmdnLma%m${ieK|cNxxQoLpea%Is!nFWZOlNW|sGX_k)8*0ILbh22OEu-q> TkT5&Ob(1HDsj+JYMwV* delta 194 zcmZo&%ea3nFU`LzMxW^LoSiU^x0UknLnOq;A3YQrS$GC4ienz3v0 l;!q35|C8^8+A_s^O?LDWo~#$9#rR@!WSAP8UI+sa006B+KTZGu diff --git a/unilabos/devices/workstation/bioyond_studio/config.py b/unilabos/devices/workstation/bioyond_studio/config.py index 577833f2..6acc8f60 100644 --- a/unilabos/devices/workstation/bioyond_studio/config.py +++ b/unilabos/devices/workstation/bioyond_studio/config.py @@ -8,7 +8,8 @@ import os # BioyondCellWorkstation 默认配置(包含所有必需参数) API_CONFIG = { # API 连接配置 - "api_host": os.getenv("BIOYOND_API_HOST", "http://172.16.10.169:44388"), + # "api_host": os.getenv("BIOYOND_API_HOST", "http://172.21.32.65:44389"),#实机 + "api_host": os.getenv("BIOYOND_API_HOST", "http://172.16.10.169:44388"),# 仿真机 "api_key": os.getenv("BIOYOND_API_KEY", "8A819E5C"), "timeout": int(os.getenv("BIOYOND_TIMEOUT", "30")), @@ -16,7 +17,7 @@ API_CONFIG = { "report_token": os.getenv("BIOYOND_REPORT_TOKEN", "CHANGE_ME_TOKEN"), # HTTP 服务配置 - "HTTP_host": os.getenv("BIOYOND_HTTP_HOST", "172.21.33.174"), # HTTP服务监听地址,监听计算机飞连ip地址 + "HTTP_host": os.getenv("BIOYOND_HTTP_HOST", "172.21.33.30"), # HTTP服务监听地址,监听计算机飞连ip地址 "HTTP_port": int(os.getenv("BIOYOND_HTTP_PORT", "8080")), "debug_mode": False,# 调试模式 } diff --git a/unilabos/devices/workstation/coin_cell_assembly/coin_cell_assembly.py b/unilabos/devices/workstation/coin_cell_assembly/coin_cell_assembly.py index d8bb5975..f2571af5 100644 --- a/unilabos/devices/workstation/coin_cell_assembly/coin_cell_assembly.py +++ b/unilabos/devices/workstation/coin_cell_assembly/coin_cell_assembly.py @@ -906,10 +906,11 @@ class CoinCellAssemblyWorkstation(WorkstationBase): return self.success - def func_allpack_cmd(self, elec_num, elec_use_num, elec_vol:int=50, assembly_type:int=7, assembly_pressure:int=4200, file_path: str="D:\\coin_cell_data") -> bool: + def func_allpack_cmd(self, elec_num, elec_use_num, elec_vol:int=50, assembly_type:int=7, assembly_pressure:int=4200, file_path: str="C:\\Users\\67484\\Desktop") -> bool: elec_num, elec_use_num, elec_vol, assembly_type, assembly_pressure = int(elec_num), int(elec_use_num), int(elec_vol), int(assembly_type), int(assembly_pressure) summary_csv_file = os.path.join(file_path, "duandian.csv") # 如果断点文件存在,先读取之前的进度 + if os.path.exists(summary_csv_file): read_status_flag = True with open(summary_csv_file, 'r', newline='', encoding='utf-8') as csvfile: diff --git a/unilabos/registry/devices/bioyond_cell.yaml b/unilabos/registry/devices/bioyond_cell.yaml index a54e7021..d6988b7f 100644 --- a/unilabos/registry/devices/bioyond_cell.yaml +++ b/unilabos/registry/devices/bioyond_cell.yaml @@ -137,7 +137,7 @@ bioyond_cell: WH4_x5_y1_z1_5_quantity: 0.0 WH4_x5_y2_z1_10_materialName: '' WH4_x5_y2_z1_10_quantity: 0.0 - xlsx_path: unilabos\devices\workstation\bioyond_studio\bioyond_cell\样品导入模板.xlsx + xlsx_path: unilabos\devices\workstation\bioyond_studio\bioyond_cell\material_template.xlsx handles: {} placeholder_keys: {} result: {} @@ -463,7 +463,7 @@ bioyond_cell: default: 0.0 type: number xlsx_path: - default: unilabos\devices\workstation\bioyond_studio\bioyond_cell\样品导入模板.xlsx + default: unilabos\devices\workstation\bioyond_studio\bioyond_cell\material_template.xlsx type: string required: [] type: object @@ -530,6 +530,42 @@ bioyond_cell: title: create_and_inbound_materials参数 type: object type: UniLabJsonCommand + auto-create_material: + feedback: {} + goal: {} + goal_default: + location_name_or_id: null + material_name: null + type_id: null + warehouse_name: null + handles: {} + placeholder_keys: {} + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + location_name_or_id: + type: string + material_name: + type: string + type_id: + type: string + warehouse_name: + type: string + required: + - material_name + - type_id + - warehouse_name + type: object + result: {} + required: + - goal + title: create_material参数 + type: object + type: UniLabJsonCommand auto-create_materials: feedback: {} goal: {} @@ -580,6 +616,43 @@ bioyond_cell: title: create_orders参数 type: object type: UniLabJsonCommand + auto-create_sample: + feedback: {} + goal: {} + goal_default: + board_type: null + bottle_type: null + location_code: null + name: null + handles: {} + placeholder_keys: {} + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + board_type: + type: string + bottle_type: + type: string + location_code: + type: string + name: + type: string + required: + - name + - board_type + - bottle_type + - location_code + type: object + result: {} + required: + - goal + title: create_sample参数 + type: object + type: UniLabJsonCommand auto-order_list_v2: feedback: {} goal: {}