mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2026-02-17 21:25:12 +00:00
Compare commits
5 Commits
385a495e21
...
5cbd880e5a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5cbd880e5a | ||
|
|
41e7251f62 | ||
|
|
727d2c2595 | ||
|
|
202a2667fd | ||
|
|
03745c5d08 |
38
new_cellconfig3c.json
Normal file
38
new_cellconfig3c.json
Normal file
@@ -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": []
|
||||||
|
}
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"id": "3a1d4b7e-4bdc-16bf-7169-f60350d03c7e",
|
"id": "3a1d4c14-a9fb-d7dc-9e96-7a3ad6e50219",
|
||||||
"typeName": "配液瓶(小)板",
|
"typeName": "配液瓶(小)板",
|
||||||
"code": "0001-00088",
|
"code": "0001-00093",
|
||||||
"barCode": "",
|
"barCode": "",
|
||||||
"name": "test1",
|
"name": "test",
|
||||||
"quantity": 1.0,
|
"quantity": 2.0,
|
||||||
"lockQuantity": 0.0,
|
"lockQuantity": 0.0,
|
||||||
"unit": "块",
|
"unit": "块",
|
||||||
"status": 1,
|
"status": 1,
|
||||||
"isUse": false,
|
"isUse": false,
|
||||||
"locations": [
|
"locations": [
|
||||||
{
|
{
|
||||||
"id": "3a19deae-2c7a-2426-6d71-e9de3cb158b1",
|
"id": "3a19deae-2c7a-36f5-5e41-02c5b66feaea",
|
||||||
"whid": "3a19deae-2c79-05a3-9c76-8e6760424841",
|
"whid": "3a19deae-2c79-05a3-9c76-8e6760424841",
|
||||||
"whName": "手动堆栈",
|
"whName": "手动堆栈",
|
||||||
"code": "4",
|
"code": "1",
|
||||||
"x": 2,
|
"x": 1,
|
||||||
"y": 1,
|
"y": 1,
|
||||||
"z": 1,
|
"z": 1,
|
||||||
"quantity": 0
|
"quantity": 0
|
||||||
@@ -24,13 +24,58 @@
|
|||||||
],
|
],
|
||||||
"detail": [
|
"detail": [
|
||||||
{
|
{
|
||||||
"id": "3a1d4b7e-4bdc-12e8-4d26-dddc77b03f63",
|
"id": "3a1d4c14-a9fc-1daa-71fa-146cb1ccb930",
|
||||||
"detailMaterialId": "3a1d4b7e-4bdc-4e9e-8a3c-e9ba4a26457e",
|
"detailMaterialId": "3a1d4c14-a9fc-4f38-4c48-68486c391c42",
|
||||||
"code": null,
|
"code": "0001-00093 - 05",
|
||||||
"name": "test1",
|
"name": "配液瓶(小)",
|
||||||
"quantity": "1",
|
"quantity": "1",
|
||||||
"lockQuantity": "0",
|
"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,
|
"x": 1,
|
||||||
"y": 2,
|
"y": 2,
|
||||||
"z": 1,
|
"z": 1,
|
||||||
@@ -39,75 +84,64 @@
|
|||||||
"typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb"
|
"typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "3a1d4b7e-4bdc-35b6-22d4-e6f3235e1c27",
|
"id": "3a1d4c14-a9fc-b41f-e968-64953bfddccd",
|
||||||
"detailMaterialId": "3a1d4b7e-4bdc-ce0f-1fbb-b88de76fce98",
|
"detailMaterialId": "3a1d4c14-a9fc-daf7-9d64-e5ec8d3ae0e2",
|
||||||
"code": null,
|
"code": "0001-00093 - 07",
|
||||||
"name": "test1",
|
"name": "配液瓶(小)",
|
||||||
"quantity": "1",
|
"quantity": "1",
|
||||||
"lockQuantity": "0",
|
"lockQuantity": "0",
|
||||||
"unit": "块",
|
"unit": "个",
|
||||||
"x": 1,
|
"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,
|
"y": 1,
|
||||||
"z": 1,
|
"z": 1,
|
||||||
"associateId": null,
|
"associateId": null,
|
||||||
"typeName": "配液瓶(小)",
|
"typeName": "配液瓶(小)",
|
||||||
"typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb"
|
"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",
|
"id": "3a1d4c14-a9fc-d732-2b93-9b2bd2bf581b",
|
||||||
"whid": "3a19deae-2c79-05a3-9c76-8e6760424841",
|
"detailMaterialId": "3a1d4c14-a9fc-7f5d-b6b6-8bcb2e15f320",
|
||||||
"whName": "手动堆栈",
|
"code": "0001-00093 - 04",
|
||||||
"code": "5",
|
"name": "配液瓶(小)",
|
||||||
|
"quantity": "1",
|
||||||
|
"lockQuantity": "0",
|
||||||
|
"unit": "个",
|
||||||
"x": 2,
|
"x": 2,
|
||||||
"y": 2,
|
"y": 2,
|
||||||
"z": 1,
|
"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,
|
"associateId": null,
|
||||||
"typeName": "5ml分液瓶",
|
"typeName": "配液瓶(小)",
|
||||||
"typeId": "3a192c2a-ebb7-58a1-480d-8b3863bf74f4"
|
"typeId": "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb"
|
||||||
},
|
|
||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from unilabos.ros.nodes.resource_tracker import ResourceTreeSet
|
|||||||
from unilabos.registry.registry import lab_registry
|
from unilabos.registry.registry import lab_registry
|
||||||
|
|
||||||
from unilabos.resources.bioyond.decks import BIOYOND_PolymerReactionStation_Deck
|
from unilabos.resources.bioyond.decks import BIOYOND_PolymerReactionStation_Deck
|
||||||
|
from unilabos.resources.bioyond.decks import YB_Deck
|
||||||
|
|
||||||
lab_registry.setup()
|
lab_registry.setup()
|
||||||
|
|
||||||
@@ -16,6 +17,8 @@ lab_registry.setup()
|
|||||||
type_mapping = {
|
type_mapping = {
|
||||||
"加样头(大)": ("YB_jia_yang_tou_da_1X1_carrier", "3a190ca0-b2f6-9aeb-8067-547e72c11469"),
|
"加样头(大)": ("YB_jia_yang_tou_da_1X1_carrier", "3a190ca0-b2f6-9aeb-8067-547e72c11469"),
|
||||||
"液": ("YB_1BottleCarrier", "3a190ca1-2add-2b23-f8e1-bbd348b7f790"),
|
"液": ("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]:
|
def test_resourcetreeset_from_plr() -> list[dict]:
|
||||||
# 直接加载 bioyond_materials_reaction.json 文件
|
# 直接加载 bioyond_materials_reaction.json 文件
|
||||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
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:
|
with open(json_path, "r", encoding="utf-8") as f:
|
||||||
materials = json.load(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)
|
output = resource_bioyond_to_plr(materials, type_mapping=type_mapping, deck=deck)
|
||||||
print(output)
|
print(output)
|
||||||
# print(deck.summary())
|
# print(deck.summary())
|
||||||
|
|||||||
Binary file not shown.
@@ -112,7 +112,7 @@ class BioyondCellWorkstation(BioyondWorkstation):
|
|||||||
|
|
||||||
return {"status": "received"}
|
return {"status": "received"}
|
||||||
|
|
||||||
def wait_for_order_finish(self, order_code: str, timeout: int = 1800) -> Dict[str, Any]:
|
def wait_for_order_finish(self, order_code: str, timeout: int = 36000) -> Dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
等待指定 orderCode 的 /report/order_finish 报送。
|
等待指定 orderCode 的 /report/order_finish 报送。
|
||||||
Args:
|
Args:
|
||||||
@@ -253,7 +253,7 @@ class BioyondCellWorkstation(BioyondWorkstation):
|
|||||||
def auto_feeding4to3(
|
def auto_feeding4to3(
|
||||||
self,
|
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 - 加样头面 (Z=1, 12个点位) ----------------
|
||||||
WH4_x1_y1_z1_1_materialName: str = "", WH4_x1_y1_z1_1_quantity: float = 0.0,
|
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,
|
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)
|
result = self.wait_for_order_finish(order_code)
|
||||||
return result
|
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]:
|
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)
|
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
|
return response
|
||||||
|
|
||||||
# 2.14 新建实验
|
# 2.14 新建实验
|
||||||
@@ -1151,7 +1085,7 @@ if __name__ == "__main__":
|
|||||||
# result = ws.create_and_inbound_materials()
|
# result = ws.create_and_inbound_materials()
|
||||||
|
|
||||||
# 继续后续流程
|
# 继续后续流程
|
||||||
# logger.info(ws.auto_feeding4to3()) #搬运物料到3号箱
|
logger.info(ws.auto_feeding4to3()) #搬运物料到3号箱
|
||||||
# # # 使用正斜杠或 Path 对象来指定文件路径
|
# # # 使用正斜杠或 Path 对象来指定文件路径
|
||||||
# excel_path = Path("unilabos\\devices\\workstation\\bioyond_studio\\bioyond_cell\\2025092701.xlsx")
|
# excel_path = Path("unilabos\\devices\\workstation\\bioyond_studio\\bioyond_cell\\2025092701.xlsx")
|
||||||
# logger.info(ws.create_orders(excel_path))
|
# logger.info(ws.create_orders(excel_path))
|
||||||
|
|||||||
Binary file not shown.
@@ -8,7 +8,8 @@ import os
|
|||||||
# BioyondCellWorkstation 默认配置(包含所有必需参数)
|
# BioyondCellWorkstation 默认配置(包含所有必需参数)
|
||||||
API_CONFIG = {
|
API_CONFIG = {
|
||||||
# API 连接配置
|
# 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"),
|
"api_key": os.getenv("BIOYOND_API_KEY", "8A819E5C"),
|
||||||
"timeout": int(os.getenv("BIOYOND_TIMEOUT", "30")),
|
"timeout": int(os.getenv("BIOYOND_TIMEOUT", "30")),
|
||||||
|
|
||||||
@@ -16,7 +17,7 @@ API_CONFIG = {
|
|||||||
"report_token": os.getenv("BIOYOND_REPORT_TOKEN", "CHANGE_ME_TOKEN"),
|
"report_token": os.getenv("BIOYOND_REPORT_TOKEN", "CHANGE_ME_TOKEN"),
|
||||||
|
|
||||||
# HTTP 服务配置
|
# HTTP 服务配置
|
||||||
"HTTP_host": os.getenv("BIOYOND_HTTP_HOST", "172.21.33.174"), # HTTP服务监听地址,监听计算机飞连ip地址
|
"HTTP_host": os.getenv("BIOYOND_HTTP_HOST", "172.21.32.83"), # HTTP服务监听地址,监听计算机飞连ip地址
|
||||||
"HTTP_port": int(os.getenv("BIOYOND_HTTP_PORT", "8080")),
|
"HTTP_port": int(os.getenv("BIOYOND_HTTP_PORT", "8080")),
|
||||||
"debug_mode": False,# 调试模式
|
"debug_mode": False,# 调试模式
|
||||||
}
|
}
|
||||||
@@ -159,9 +160,9 @@ MATERIAL_TYPE_MAPPINGS = {
|
|||||||
"5ml分液瓶板": ("YB_6x5ml_DispensingVialCarrier", "3a192fa4-007d-ec7b-456e-2a8be7a13f23"),
|
"5ml分液瓶板": ("YB_6x5ml_DispensingVialCarrier", "3a192fa4-007d-ec7b-456e-2a8be7a13f23"),
|
||||||
"5ml分液瓶": ("YB_fen_ye_5ml_Bottle", "3a192c2a-ebb7-58a1-480d-8b3863bf74f4"),
|
"5ml分液瓶": ("YB_fen_ye_5ml_Bottle", "3a192c2a-ebb7-58a1-480d-8b3863bf74f4"),
|
||||||
"20ml分液瓶板": ("YB_6x20ml_DispensingVialCarrier", "3a192fa4-47db-3449-162a-eaf8aba57e27"),
|
"20ml分液瓶板": ("YB_6x20ml_DispensingVialCarrier", "3a192fa4-47db-3449-162a-eaf8aba57e27"),
|
||||||
"20ml分液瓶": ("YB_fen_ye_20ml_Bottler", "3a192c2b-19e8-f0a3-035e-041ca8ca1035"),
|
"20ml分液瓶": ("YB_fen_ye_20ml_Bottle", "3a192c2b-19e8-f0a3-035e-041ca8ca1035"),
|
||||||
"配液瓶(小)板": ("YB_6x_SmallSolutionBottleCarrier", "3a190c8b-3284-af78-d29f-9a69463ad047"),
|
"配液瓶(小)板": ("YB_6x_SmallSolutionBottleCarrier", "3a190c8b-3284-af78-d29f-9a69463ad047"),
|
||||||
"配液瓶(小)": ("YB_pei_ye_xiao_Bottler", "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb"),
|
"配液瓶(小)": ("YB_pei_ye_xiao_Bottle", "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb"),
|
||||||
"配液瓶(大)板": ("YB_4x_LargeSolutionBottleCarrier", "53e50377-32dc-4781-b3c0-5ce45bc7dc27"),
|
"配液瓶(大)板": ("YB_4x_LargeSolutionBottleCarrier", "53e50377-32dc-4781-b3c0-5ce45bc7dc27"),
|
||||||
"配液瓶(大)": ("YB_pei_ye_da_Bottle", "19c52ad1-51c5-494f-8854-576f4ca9c6ca"),
|
"配液瓶(大)": ("YB_pei_ye_da_Bottle", "19c52ad1-51c5-494f-8854-576f4ca9c6ca"),
|
||||||
"适配器块": ("YB_AdapterBlock", "efc3bb32-d504-4890-91c0-b64ed3ac80cf"),
|
"适配器块": ("YB_AdapterBlock", "efc3bb32-d504-4890-91c0-b64ed3ac80cf"),
|
||||||
|
|||||||
@@ -906,10 +906,11 @@ class CoinCellAssemblyWorkstation(WorkstationBase):
|
|||||||
|
|
||||||
return self.success
|
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)
|
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")
|
summary_csv_file = os.path.join(file_path, "duandian.csv")
|
||||||
# 如果断点文件存在,先读取之前的进度
|
# 如果断点文件存在,先读取之前的进度
|
||||||
|
|
||||||
if os.path.exists(summary_csv_file):
|
if os.path.exists(summary_csv_file):
|
||||||
read_status_flag = True
|
read_status_flag = True
|
||||||
with open(summary_csv_file, 'r', newline='', encoding='utf-8') as csvfile:
|
with open(summary_csv_file, 'r', newline='', encoding='utf-8') as csvfile:
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ bioyond_cell:
|
|||||||
WH4_x5_y1_z1_5_quantity: 0.0
|
WH4_x5_y1_z1_5_quantity: 0.0
|
||||||
WH4_x5_y2_z1_10_materialName: ''
|
WH4_x5_y2_z1_10_materialName: ''
|
||||||
WH4_x5_y2_z1_10_quantity: 0.0
|
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: {}
|
handles: {}
|
||||||
placeholder_keys: {}
|
placeholder_keys: {}
|
||||||
result: {}
|
result: {}
|
||||||
@@ -463,7 +463,7 @@ bioyond_cell:
|
|||||||
default: 0.0
|
default: 0.0
|
||||||
type: number
|
type: number
|
||||||
xlsx_path:
|
xlsx_path:
|
||||||
default: unilabos\devices\workstation\bioyond_studio\bioyond_cell\样品导入模板.xlsx
|
default: unilabos\devices\workstation\bioyond_studio\bioyond_cell\material_template.xlsx
|
||||||
type: string
|
type: string
|
||||||
required: []
|
required: []
|
||||||
type: object
|
type: object
|
||||||
@@ -530,6 +530,42 @@ bioyond_cell:
|
|||||||
title: create_and_inbound_materials参数
|
title: create_and_inbound_materials参数
|
||||||
type: object
|
type: object
|
||||||
type: UniLabJsonCommand
|
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:
|
auto-create_materials:
|
||||||
feedback: {}
|
feedback: {}
|
||||||
goal: {}
|
goal: {}
|
||||||
@@ -580,6 +616,43 @@ bioyond_cell:
|
|||||||
title: create_orders参数
|
title: create_orders参数
|
||||||
type: object
|
type: object
|
||||||
type: UniLabJsonCommand
|
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:
|
auto-order_list_v2:
|
||||||
feedback: {}
|
feedback: {}
|
||||||
goal: {}
|
goal: {}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
from unilabos.resources.warehouse import WareHouse, warehouse_factory
|
from unilabos.resources.warehouse import WareHouse, YB_warehouse_factory
|
||||||
|
|
||||||
|
|
||||||
def bioyond_warehouse_1x4x4(name: str) -> WareHouse:
|
def bioyond_warehouse_1x4x4(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x4仓库"""
|
"""创建BioYond 4x1x4仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=1,
|
num_items_x=1,
|
||||||
num_items_y=4,
|
num_items_y=4,
|
||||||
@@ -20,7 +20,7 @@ def bioyond_warehouse_1x4x4(name: str) -> WareHouse:
|
|||||||
|
|
||||||
def bioyond_warehouse_1x4x2(name: str) -> WareHouse:
|
def bioyond_warehouse_1x4x2(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x2仓库"""
|
"""创建BioYond 4x1x2仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=1,
|
num_items_x=1,
|
||||||
num_items_y=4,
|
num_items_y=4,
|
||||||
@@ -37,7 +37,7 @@ def bioyond_warehouse_1x4x2(name: str) -> WareHouse:
|
|||||||
# 定义benyond的堆栈
|
# 定义benyond的堆栈
|
||||||
def bioyond_warehouse_1x2x2(name: str) -> WareHouse:
|
def bioyond_warehouse_1x2x2(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x4仓库"""
|
"""创建BioYond 4x1x4仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=2,
|
num_items_x=2,
|
||||||
num_items_y=2,
|
num_items_y=2,
|
||||||
@@ -50,9 +50,26 @@ def bioyond_warehouse_1x2x2(name: str) -> WareHouse:
|
|||||||
item_dz=120.0,
|
item_dz=120.0,
|
||||||
category="YB_warehouse",
|
category="YB_warehouse",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def bioyond_warehouse_2x2x1(name: str) -> WareHouse:
|
||||||
|
"""创建BioYond 2x2x1仓库(自动堆栈)"""
|
||||||
|
return YB_warehouse_factory(
|
||||||
|
name=name,
|
||||||
|
num_items_x=2,
|
||||||
|
num_items_y=2,
|
||||||
|
num_items_z=1,
|
||||||
|
dx=10.0,
|
||||||
|
dy=10.0,
|
||||||
|
dz=10.0,
|
||||||
|
item_dx=137.0,
|
||||||
|
item_dy=96.0,
|
||||||
|
item_dz=120.0,
|
||||||
|
category="YB_warehouse",
|
||||||
|
)
|
||||||
|
|
||||||
def bioyond_warehouse_10x1x1(name: str) -> WareHouse:
|
def bioyond_warehouse_10x1x1(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x4仓库"""
|
"""创建BioYond 4x1x4仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=10,
|
num_items_x=10,
|
||||||
num_items_y=1,
|
num_items_y=1,
|
||||||
@@ -67,7 +84,7 @@ def bioyond_warehouse_10x1x1(name: str) -> WareHouse:
|
|||||||
)
|
)
|
||||||
def bioyond_warehouse_1x3x3(name: str) -> WareHouse:
|
def bioyond_warehouse_1x3x3(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x4仓库"""
|
"""创建BioYond 4x1x4仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=1,
|
num_items_x=1,
|
||||||
num_items_y=3,
|
num_items_y=3,
|
||||||
@@ -82,7 +99,7 @@ def bioyond_warehouse_1x3x3(name: str) -> WareHouse:
|
|||||||
)
|
)
|
||||||
def bioyond_warehouse_2x1x3(name: str) -> WareHouse:
|
def bioyond_warehouse_2x1x3(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x4仓库"""
|
"""创建BioYond 4x1x4仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=2,
|
num_items_x=2,
|
||||||
num_items_y=1,
|
num_items_y=1,
|
||||||
@@ -98,7 +115,7 @@ def bioyond_warehouse_2x1x3(name: str) -> WareHouse:
|
|||||||
|
|
||||||
def bioyond_warehouse_3x3x1(name: str) -> WareHouse:
|
def bioyond_warehouse_3x3x1(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x4仓库"""
|
"""创建BioYond 4x1x4仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=3,
|
num_items_x=3,
|
||||||
num_items_y=3,
|
num_items_y=3,
|
||||||
@@ -113,7 +130,7 @@ def bioyond_warehouse_3x3x1(name: str) -> WareHouse:
|
|||||||
)
|
)
|
||||||
def bioyond_warehouse_5x1x1(name: str) -> WareHouse:
|
def bioyond_warehouse_5x1x1(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x4仓库"""
|
"""创建BioYond 4x1x4仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=5,
|
num_items_x=5,
|
||||||
num_items_y=1,
|
num_items_y=1,
|
||||||
@@ -128,7 +145,7 @@ def bioyond_warehouse_5x1x1(name: str) -> WareHouse:
|
|||||||
)
|
)
|
||||||
def bioyond_warehouse_3x3x1_2(name: str) -> WareHouse:
|
def bioyond_warehouse_3x3x1_2(name: str) -> WareHouse:
|
||||||
"""创建BioYond 4x1x4仓库"""
|
"""创建BioYond 4x1x4仓库"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=3,
|
num_items_x=3,
|
||||||
num_items_y=3,
|
num_items_y=3,
|
||||||
@@ -144,7 +161,7 @@ def bioyond_warehouse_3x3x1_2(name: str) -> WareHouse:
|
|||||||
|
|
||||||
def bioyond_warehouse_liquid_and_lid_handling(name: str) -> WareHouse:
|
def bioyond_warehouse_liquid_and_lid_handling(name: str) -> WareHouse:
|
||||||
"""创建BioYond开关盖加液模块台面"""
|
"""创建BioYond开关盖加液模块台面"""
|
||||||
return warehouse_factory(
|
return YB_warehouse_factory(
|
||||||
name=name,
|
name=name,
|
||||||
num_items_x=2,
|
num_items_x=2,
|
||||||
num_items_y=5,
|
num_items_y=5,
|
||||||
@@ -157,4 +174,36 @@ def bioyond_warehouse_liquid_and_lid_handling(name: str) -> WareHouse:
|
|||||||
item_dz=120.0,
|
item_dz=120.0,
|
||||||
category="warehouse",
|
category="warehouse",
|
||||||
removed_positions=None
|
removed_positions=None
|
||||||
|
)
|
||||||
|
|
||||||
|
def bioyond_warehouse_3x5x1(name: str) -> WareHouse:
|
||||||
|
"""创建BioYond 3x5x1仓库(手动堆栈)"""
|
||||||
|
return YB_warehouse_factory(
|
||||||
|
name=name,
|
||||||
|
num_items_x=3,
|
||||||
|
num_items_y=5,
|
||||||
|
num_items_z=1,
|
||||||
|
dx=10.0,
|
||||||
|
dy=10.0,
|
||||||
|
dz=10.0,
|
||||||
|
item_dx=137.0,
|
||||||
|
item_dy=96.0,
|
||||||
|
item_dz=120.0,
|
||||||
|
category="warehouse",
|
||||||
|
)
|
||||||
|
|
||||||
|
def bioyond_warehouse_20x1x1(name: str) -> WareHouse:
|
||||||
|
"""创建BioYond 20x1x1仓库(粉末加样头堆栈)"""
|
||||||
|
return YB_warehouse_factory(
|
||||||
|
name=name,
|
||||||
|
num_items_x=20,
|
||||||
|
num_items_y=1,
|
||||||
|
num_items_z=1,
|
||||||
|
dx=10.0,
|
||||||
|
dy=10.0,
|
||||||
|
dz=10.0,
|
||||||
|
item_dx=137.0,
|
||||||
|
item_dy=96.0,
|
||||||
|
item_dz=120.0,
|
||||||
|
category="warehouse",
|
||||||
)
|
)
|
||||||
@@ -1,255 +0,0 @@
|
|||||||
from unilabos.resources.itemized_carrier import Bottle, BottleCarrier
|
|
||||||
# 工厂函数
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Solid_Stock(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 20.0,
|
|
||||||
height: float = 100.0,
|
|
||||||
max_volume: float = 30000.0, # 30mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建粉末瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,# 未知
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Solid_Stock",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Solid_Vial(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 25.0,
|
|
||||||
height: float = 60.0,
|
|
||||||
max_volume: float = 30000.0, # 30mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建粉末瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Solid_Vial",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Liquid_Vial(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 25.0,
|
|
||||||
height: float = 60.0,
|
|
||||||
max_volume: float = 30000.0, # 30mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建滴定液瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Liquid_Vial",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Solution_Beaker(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 60.0,
|
|
||||||
height: float = 70.0,
|
|
||||||
max_volume: float = 200000.0, # 200mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建溶液烧杯"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Solution_Beaker",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Reagent_Bottle(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 70.0,
|
|
||||||
height: float = 120.0,
|
|
||||||
max_volume: float = 500000.0, # 500mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建试剂瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Reagent_Bottle",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_100ml_Liquid_Bottle(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 50.0,
|
|
||||||
height: float = 80.0,
|
|
||||||
max_volume: float = 100000.0, # 100mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建100ml液体瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="100ml_Liquid_Bottle",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Liquid_Bottle(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 40.0,
|
|
||||||
height: float = 70.0,
|
|
||||||
max_volume: float = 50000.0, # 50mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建液体瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Liquid_Bottle",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_High_Viscosity_Liquid_Bottle(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 45.0,
|
|
||||||
height: float = 75.0,
|
|
||||||
max_volume: float = 60000.0, # 60mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建高粘液瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="High_Viscosity_Liquid_Bottle",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Large_Dispense_Head(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 35.0,
|
|
||||||
height: float = 90.0,
|
|
||||||
max_volume: float = 50000.0, # 50mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建加样头(大)"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Large_Dispense_Head",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_5ml_Dispensing_Vial(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 15.0,
|
|
||||||
height: float = 45.0,
|
|
||||||
max_volume: float = 5000.0, # 5mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建5ml分液瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="5ml_Dispensing_Vial",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_20ml_Dispensing_Vial(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 20.0,
|
|
||||||
height: float = 65.0,
|
|
||||||
max_volume: float = 20000.0, # 20mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建20ml分液瓶"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="20ml_Dispensing_Vial",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Small_Solution_Bottle(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 35.0,
|
|
||||||
height: float = 60.0,
|
|
||||||
max_volume: float = 40000.0, # 40mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建配液瓶(小)"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Small_Solution_Bottle",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Large_Solution_Bottle(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 55.0,
|
|
||||||
height: float = 90.0,
|
|
||||||
max_volume: float = 150000.0, # 150mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建配液瓶(大)"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Large_Solution_Bottle",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def YB_Pipette_Tip(
|
|
||||||
name: str,
|
|
||||||
diameter: float = 10.0,
|
|
||||||
height: float = 50.0,
|
|
||||||
max_volume: float = 1000.0, # 1mL
|
|
||||||
barcode: str = None,
|
|
||||||
) -> Bottle:
|
|
||||||
"""创建枪头"""
|
|
||||||
return Bottle(
|
|
||||||
name=name,
|
|
||||||
diameter=diameter,
|
|
||||||
height=height,
|
|
||||||
max_volume=max_volume,
|
|
||||||
barcode=barcode,
|
|
||||||
model="Pipette_Tip",
|
|
||||||
)
|
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
from os import name
|
from os import name
|
||||||
from pylabrobot.resources import Deck, Coordinate, Rotation
|
from pylabrobot.resources import Deck, Coordinate, Rotation
|
||||||
|
|
||||||
from unilabos.resources.bioyond.warehouses import bioyond_warehouse_1x4x4, bioyond_warehouse_1x4x2, bioyond_warehouse_liquid_and_lid_handling, bioyond_warehouse_1x2x2, bioyond_warehouse_1x3x3, bioyond_warehouse_10x1x1, bioyond_warehouse_3x3x1, bioyond_warehouse_3x3x1_2, bioyond_warehouse_5x1x1
|
from unilabos.resources.bioyond.YB_warehouses import bioyond_warehouse_1x4x4, bioyond_warehouse_1x4x2, bioyond_warehouse_liquid_and_lid_handling, bioyond_warehouse_1x2x2, bioyond_warehouse_1x3x3, bioyond_warehouse_10x1x1, bioyond_warehouse_3x3x1, bioyond_warehouse_3x3x1_2, bioyond_warehouse_5x1x1, bioyond_warehouse_20x1x1, bioyond_warehouse_2x2x1, bioyond_warehouse_3x5x1
|
||||||
|
|
||||||
|
|
||||||
class BIOYOND_PolymerReactionStation_Deck(Deck):
|
class BIOYOND_PolymerReactionStation_Deck(Deck):
|
||||||
@@ -85,31 +85,23 @@ class BIOYOND_YB_Deck(Deck):
|
|||||||
def setup(self) -> None:
|
def setup(self) -> None:
|
||||||
# 添加仓库
|
# 添加仓库
|
||||||
self.warehouses = {
|
self.warehouses = {
|
||||||
"321窗口": bioyond_warehouse_1x2x2("321窗口"),
|
"自动堆栈-左": bioyond_warehouse_2x2x1("自动堆栈-左"),
|
||||||
"43窗口": bioyond_warehouse_1x2x2("43窗口"),
|
"自动堆栈-右": bioyond_warehouse_2x2x1("自动堆栈-右"),
|
||||||
"手动传递窗左": bioyond_warehouse_1x3x3("手动传递窗左"),
|
"手动堆栈-左": bioyond_warehouse_3x5x1("手动堆栈-左"),
|
||||||
"手动传递窗右": bioyond_warehouse_1x3x3("手动传递窗右"),
|
"手动堆栈-右": bioyond_warehouse_3x5x1("手动堆栈-右"),
|
||||||
"加样头堆栈左": bioyond_warehouse_10x1x1("加样头堆栈左"),
|
"粉末加样头堆栈": bioyond_warehouse_20x1x1("粉末加样头堆栈"),
|
||||||
"加样头堆栈右": bioyond_warehouse_10x1x1("加样头堆栈右"),
|
"配液站内试剂仓库": bioyond_warehouse_3x3x1("配液站内试剂仓库"),
|
||||||
|
"试剂替换仓库": bioyond_warehouse_10x1x1("试剂替换仓库"),
|
||||||
"15ml配液堆栈左": bioyond_warehouse_3x3x1("15ml配液堆栈左"),
|
|
||||||
"母液加样右": bioyond_warehouse_3x3x1_2("母液加样右"),
|
|
||||||
"大瓶母液堆栈左": bioyond_warehouse_5x1x1("大瓶母液堆栈左"),
|
|
||||||
"大瓶母液堆栈右": bioyond_warehouse_5x1x1("大瓶母液堆栈右"),
|
|
||||||
}
|
}
|
||||||
# warehouse 的位置
|
# warehouse 的位置
|
||||||
self.warehouse_locations = {
|
self.warehouse_locations = {
|
||||||
"321窗口": Coordinate(-150.0, 158.0, 0.0),
|
"自动堆栈-左": Coordinate(-300.0, 158.0, 0.0),
|
||||||
"43窗口": Coordinate(4160.0, 158.0, 0.0),
|
"自动堆栈-右": Coordinate(4160.0, 158.0, 0.0),
|
||||||
"手动传递窗左": Coordinate(-150.0, 877.0, 0.0),
|
"手动堆栈-左": Coordinate(-400.0, 877.0, 0.0),
|
||||||
"手动传递窗右": Coordinate(4160.0, 877.0, 0.0),
|
"手动堆栈-右": Coordinate(4160.0, 877.0, 0.0),
|
||||||
"加样头堆栈左": Coordinate(385.0, 1300.0, 0.0),
|
"粉末加样头堆栈": Coordinate(385.0, 1300.0, 0.0),
|
||||||
"加样头堆栈右": Coordinate(2187.0, 1300.0, 0.0),
|
"配液站内试剂仓库": Coordinate(1164.0, 676.0, 0.0),
|
||||||
|
"试剂替换仓库": Coordinate(2717.0, 676.0, 0.0),
|
||||||
"15ml配液堆栈左": Coordinate(749.0, 355.0, 0.0),
|
|
||||||
"母液加样右": Coordinate(2152.0, 333.0, 0.0),
|
|
||||||
"大瓶母液堆栈左": Coordinate(1164.0, 676.0, 0.0),
|
|
||||||
"大瓶母液堆栈右": Coordinate(2717.0, 676.0, 0.0),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for warehouse_name, warehouse in self.warehouses.items():
|
for warehouse_name, warehouse in self.warehouses.items():
|
||||||
|
|||||||
@@ -1,161 +0,0 @@
|
|||||||
from unilabos.resources.warehouse import WareHouse, warehouse_factory
|
|
||||||
|
|
||||||
|
|
||||||
def bioyond_warehouse_1x4x4(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x4仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=1,
|
|
||||||
num_items_y=4,
|
|
||||||
num_items_z=4,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def bioyond_warehouse_1x4x2(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x2仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=1,
|
|
||||||
num_items_y=4,
|
|
||||||
num_items_z=2,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
removed_positions=None
|
|
||||||
)
|
|
||||||
# 定义benyond的堆栈
|
|
||||||
def bioyond_warehouse_1x2x2(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x4仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=2,
|
|
||||||
num_items_y=2,
|
|
||||||
num_items_z=1,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="YB_warehouse",
|
|
||||||
)
|
|
||||||
def bioyond_warehouse_10x1x1(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x4仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=10,
|
|
||||||
num_items_y=1,
|
|
||||||
num_items_z=1,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
)
|
|
||||||
def bioyond_warehouse_1x3x3(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x4仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=1,
|
|
||||||
num_items_y=3,
|
|
||||||
num_items_z=3,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
)
|
|
||||||
def bioyond_warehouse_2x1x3(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x4仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=2,
|
|
||||||
num_items_y=1,
|
|
||||||
num_items_z=3,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
)
|
|
||||||
|
|
||||||
def bioyond_warehouse_3x3x1(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x4仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=3,
|
|
||||||
num_items_y=3,
|
|
||||||
num_items_z=1,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
)
|
|
||||||
def bioyond_warehouse_5x1x1(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x4仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=5,
|
|
||||||
num_items_y=1,
|
|
||||||
num_items_z=1,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
)
|
|
||||||
def bioyond_warehouse_3x3x1_2(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond 4x1x4仓库"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=3,
|
|
||||||
num_items_y=3,
|
|
||||||
num_items_z=1,
|
|
||||||
dx=12.0,
|
|
||||||
dy=12.0,
|
|
||||||
dz=12.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
)
|
|
||||||
|
|
||||||
def bioyond_warehouse_liquid_and_lid_handling(name: str) -> WareHouse:
|
|
||||||
"""创建BioYond开关盖加液模块台面"""
|
|
||||||
return warehouse_factory(
|
|
||||||
name=name,
|
|
||||||
num_items_x=2,
|
|
||||||
num_items_y=5,
|
|
||||||
num_items_z=1,
|
|
||||||
dx=10.0,
|
|
||||||
dy=10.0,
|
|
||||||
dz=10.0,
|
|
||||||
item_dx=137.0,
|
|
||||||
item_dy=96.0,
|
|
||||||
item_dz=120.0,
|
|
||||||
category="warehouse",
|
|
||||||
removed_positions=None
|
|
||||||
)
|
|
||||||
@@ -8,7 +8,7 @@ from unilabos.resources.itemized_carrier import ItemizedCarrier, ResourcePLR
|
|||||||
LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
|
||||||
|
|
||||||
def warehouse_factory(
|
def YB_warehouse_factory(
|
||||||
name: str,
|
name: str,
|
||||||
num_items_x: int = 1,
|
num_items_x: int = 1,
|
||||||
num_items_y: int = 4,
|
num_items_y: int = 4,
|
||||||
@@ -44,7 +44,8 @@ def warehouse_factory(
|
|||||||
name_prefix=name,
|
name_prefix=name,
|
||||||
)
|
)
|
||||||
len_x, len_y = (num_items_x, num_items_y) if num_items_z == 1 else (num_items_y, num_items_z) if num_items_x == 1 else (num_items_x, num_items_z)
|
len_x, len_y = (num_items_x, num_items_y) if num_items_z == 1 else (num_items_y, num_items_z) if num_items_x == 1 else (num_items_x, num_items_z)
|
||||||
keys = [f"{LETTERS[j]}{i + 1}" for i in range(len_x) for j in range(len_y)]
|
|
||||||
|
keys = [f"{LETTERS[len_y-1-j]}{str(i+1).zfill(2)}" for j in range(len_y) for i in range(len_x)]
|
||||||
sites = {i: site for i, site in zip(keys, _sites.values())}
|
sites = {i: site for i, site in zip(keys, _sites.values())}
|
||||||
|
|
||||||
return WareHouse(
|
return WareHouse(
|
||||||
|
|||||||
Reference in New Issue
Block a user