Workstation dev yb2 (#100)

* Refactor and extend reaction station action messages

* Refactor dispensing station tasks to enhance parameter clarity and add batch processing capabilities

- Updated `create_90_10_vial_feeding_task` to include detailed parameters for 90%/10% vial feeding, improving clarity and usability.
- Introduced `create_batch_90_10_vial_feeding_task` for batch processing of 90%/10% vial feeding tasks with JSON formatted input.
- Added `create_batch_diamine_solution_task` for batch preparation of diamine solution, also utilizing JSON formatted input.
- Refined `create_diamine_solution_task` to include additional parameters for better task configuration.
- Enhanced schema descriptions and default values for improved user guidance.
This commit is contained in:
ZiWei
2025-10-10 15:25:50 +08:00
committed by GitHub
parent 1c9d2ee98a
commit 54cfaf15f3
18 changed files with 4152 additions and 185 deletions

View File

@@ -127,7 +127,7 @@ add_action_files(
```bash ```bash
mamba remove --force ros-humble-unilabos-msgs mamba remove --force ros-humble-unilabos-msgs
mamba config set safety_checks disabled # 如果没有提升版本号会触发md5与网络上md5不一致是正常现象因此通过本指令关闭md5检查 mamba config set safety_checks disabled # 如果没有提升版本号会触发md5与网络上md5不一致是正常现象因此通过本指令关闭md5检查
mamba install xxx.conda2 --offline mamba install xxx.conda --offline
``` ```
## 常见问题 ## 常见问题

View File

@@ -0,0 +1,60 @@
{
"nodes": [
{
"id": "dispensing_station_bioyond",
"name": "dispensing_station_bioyond",
"children": [
"Bioyond_Dispensing_Deck"
],
"parent": null,
"type": "device",
"class": "dispensing_station.bioyond",
"config": {
"config": {
"api_key": "DE9BDDA0",
"api_host": "http://192.168.1.200:44388"
},
"deck": {
"data": {
"_resource_child_name": "Bioyond_Dispensing_Deck",
"_resource_type": "unilabos.resources.bioyond.decks:BIOYOND_PolymerPreparationStation_Deck"
}
},
"station_config": {
"station_type": "dispensing_station",
"enable_dispensing_station": true,
"enable_reaction_station": false,
"station_name": "DispensingStation_001",
"description": "Bioyond配液工作站"
},
"protocol_type": []
},
"data": {}
},
{
"id": "Bioyond_Dispensing_Deck",
"name": "Bioyond_Dispensing_Deck",
"sample_id": null,
"children": [],
"parent": "dispensing_station_bioyond",
"type": "deck",
"class": "BIOYOND_PolymerPreparationStation_Deck",
"position": {
"x": 0,
"y": 0,
"z": 0
},
"config": {
"type": "BIOYOND_PolymerPreparationStation_Deck",
"setup": true,
"rotation": {
"x": 0,
"y": 0,
"z": 0,
"type": "Rotation"
}
},
"data": {}
}
]
}

View File

@@ -0,0 +1,69 @@
{
"nodes": [
{
"id": "reaction_station_bioyond",
"name": "reaction_station_bioyond",
"parent": null,
"children": [
"Bioyond_Deck"
],
"type": "device",
"class": "reaction_station.bioyond",
"config": {
"bioyond_config": {
"api_key": "DE9BDDA0",
"api_host": "http://192.168.1.200:44402",
"workflow_mappings": {
"reactor_taken_out": "3a16081e-4788-ca37-eff4-ceed8d7019d1",
"reactor_taken_in": "3a160df6-76b3-0957-9eb0-cb496d5721c6",
"Solid_feeding_vials": "3a160877-87e7-7699-7bc6-ec72b05eb5e6",
"Liquid_feeding_vials(non-titration)": "3a167d99-6158-c6f0-15b5-eb030f7d8e47",
"Liquid_feeding_solvents": "3a160824-0665-01ed-285a-51ef817a9046",
"Liquid_feeding(titration)": "3a160824-0665-01ed-285a-51ef817a9046",
"Liquid_feeding_beaker": "3a16087e-124f-8ddb-8ec1-c2dff09ca784",
"Drip_back": "3a162cf9-6aac-565a-ddd7-682ba1796a4a"
},
"material_type_mappings": {
"烧杯": "BIOYOND_PolymerStation_1FlaskCarrier",
"试剂瓶": "BIOYOND_PolymerStation_1BottleCarrier",
"样品板": "BIOYOND_PolymerStation_6VialCarrier"
}
},
"deck": {
"data": {
"_resource_child_name": "Bioyond_Deck",
"_resource_type": "unilabos.resources.bioyond.decks:BIOYOND_PolymerReactionStation_Deck"
}
},
"protocol_type": []
},
"data": {}
},
{
"id": "Bioyond_Deck",
"name": "Bioyond_Deck",
"sample_id": null,
"children": [
],
"parent": "reaction_station_bioyond",
"type": "deck",
"class": "BIOYOND_PolymerReactionStation_Deck",
"position": {
"x": 0,
"y": 0,
"z": 0
},
"config": {
"type": "BIOYOND_PolymerReactionStation_Deck",
"setup": true,
"rotation": {
"x": 0,
"y": 0,
"z": 0,
"type": "Rotation"
}
},
"data": {}
}
]
}

View File

@@ -173,6 +173,134 @@ class BioyondV1RPC(BaseRequest):
return {} return {}
return response.get("data", {}) return response.get("data", {})
def validate_workflow_parameters(self, workflows: List[Dict[str, Any]]) -> Dict[str, Any]:
"""验证工作流参数格式
Args:
workflows (List[Dict[str, Any]]): 工作流列表
Returns:
Dict[str, Any]: 验证结果
"""
try:
validation_errors = []
for i, workflow in enumerate(workflows):
workflow_errors = []
# 检查基本结构
if not isinstance(workflow, dict):
workflow_errors.append("工作流必须是字典类型")
continue
if "id" not in workflow:
workflow_errors.append("缺少必要的 'id' 字段")
# 检查 stepParameters如果存在
if "stepParameters" in workflow:
step_params = workflow["stepParameters"]
if not isinstance(step_params, dict):
workflow_errors.append("stepParameters 必须是字典类型")
else:
# 验证参数结构
for step_id, modules in step_params.items():
if not isinstance(modules, dict):
workflow_errors.append(f"步骤 {step_id} 的模块配置必须是字典类型")
continue
for module_name, params in modules.items():
if not isinstance(params, list):
workflow_errors.append(f"步骤 {step_id} 模块 {module_name} 的参数必须是列表类型")
continue
for j, param in enumerate(params):
if not isinstance(param, dict):
workflow_errors.append(f"步骤 {step_id} 模块 {module_name} 参数 {j} 必须是字典类型")
elif "key" not in param or "value" not in param:
workflow_errors.append(f"步骤 {step_id} 模块 {module_name} 参数 {j} 必须包含 key 和 value")
if workflow_errors:
validation_errors.append({
"workflow_index": i,
"workflow_id": workflow.get("id", "unknown"),
"errors": workflow_errors
})
if validation_errors:
return {
"valid": False,
"errors": validation_errors,
"message": f"发现 {len(validation_errors)} 个工作流存在验证错误"
}
else:
return {
"valid": True,
"message": f"所有 {len(workflows)} 个工作流验证通过"
}
except Exception as e:
return {
"valid": False,
"errors": [{"general_error": str(e)}],
"message": f"验证过程中发生异常: {str(e)}"
}
def get_workflow_parameter_template(self) -> Dict[str, Any]:
"""获取工作流参数模板
Returns:
Dict[str, Any]: 参数模板和说明
"""
return {
"template": {
"name": "拼接后的长工作流的名称",
"workflows": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"stepParameters": {
"步骤ID (UUID)": {
"模块名称": [
{
"key": "参数键名",
"value": "参数值或变量引用 {{index-m-n}}"
}
]
}
}
}
]
},
"parameter_descriptions": {
"name": "拼接后的长工作流名称",
"workflows": "待合并的子工作流列表",
"id": "子工作流 ID对应工作流列表中 workflows 数组中每个对象的 id 字段",
"stepParameters": "步骤参数配置,如果子工作流没有参数则不需要填写"
},
"common_modules": {
"反应模块-开始搅拌": {
"description": "反应模块搅拌控制",
"common_parameters": ["temperature"]
},
"通量-配置": {
"description": "通量配置模块",
"common_parameters": ["cutoff", "assignMaterialName"]
},
"烧杯溶液放置位-烧杯吸液分液": {
"description": "烧杯液体处理模块",
"common_parameters": ["titrationType", "assignMaterialName", "volume"]
}
},
"variable_reference_format": {
"format": "{{index-m-n}}",
"description": {
"index": "该步骤所在子工作流的拼接顺序(从 1 开始)",
"m": "拼接前该步骤在子工作流内部的 m 值",
"n": "拼接前该步骤在子工作流内部的 n 值"
}
}
}
# 工作流步骤查询接口 # 工作流步骤查询接口
def workflow_step_query(self, json_str: str) -> dict: def workflow_step_query(self, json_str: str) -> dict:
try: try:
@@ -259,6 +387,32 @@ class BioyondV1RPC(BaseRequest):
return {} return {}
return response.get("data", {}) return response.get("data", {})
def material_id_query(self, json_str: str) -> dict:
"""
查询物料id
json_str 格式为JSON字符串:
'{"material123"}'
"""
params = json_str
response = self.post(
url=f'{self.host}/api/lims/storage/workflow-sample-locations',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
"data": params
})
if not response:
return {}
if response['code'] != 1:
print(f"material_id_query error: {response.get('message')}")
return {}
print(f"material_id_query data: {response['data']}")
return response.get("data", {})
# 任务取出接口 # 任务取出接口
def order_takeout(self, json_str: str) -> int: def order_takeout(self, json_str: str) -> int:
try: try:
@@ -465,6 +619,88 @@ class BioyondV1RPC(BaseRequest):
return {} return {}
return response.get("data", {}) return response.get("data", {})
# 合并工作流并设置参数 API
def merge_workflow_with_parameters(self, json_str: str) -> dict:
"""合并工作流并设置参数
调用 Bioyond API: /api/lims/workflow/merge-workflow-with-parameters
Args:
json_str (str): JSON 字符串,包含工作流合并配置数据
Returns:
dict: API 响应结果,包含 code、message 和 timestamp
"""
try:
# 解析输入的 JSON 数据
data = json.loads(json_str)
# 构造 API 请求参数
params = {
"name": data.get("name", ""),
"workflows": data.get("workflows", [])
}
# 验证必要参数
if not params["name"]:
return {
"code": 0,
"message": "工作流名称不能为空",
"timestamp": int(datetime.now().timestamp() * 1000)
}
if not params["workflows"]:
return {
"code": 0,
"message": "工作流列表不能为空",
"timestamp": int(datetime.now().timestamp() * 1000)
}
except json.JSONDecodeError as e:
return {
"code": 0,
"message": f"JSON 解析错误: {str(e)}",
"timestamp": int(datetime.now().timestamp() * 1000)
}
except Exception as e:
return {
"code": 0,
"message": f"参数处理错误: {str(e)}",
"timestamp": int(datetime.now().timestamp() * 1000)
}
# 发送 POST 请求到 Bioyond API
try:
response = self.post(
url=f'{self.host}/api/lims/workflow/merge-workflow-with-parameters',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
"data": params,
})
# 处理响应
if not response:
return {
"code": 0,
"message": "API 请求失败,未收到响应",
"timestamp": int(datetime.now().timestamp() * 1000)
}
# 返回完整的响应结果
return {
"code": response.get("code", 0),
"message": response.get("message", ""),
"timestamp": response.get("timestamp", int(datetime.now().timestamp() * 1000))
}
except Exception as e:
return {
"code": 0,
"message": f"API 请求异常: {str(e)}",
"timestamp": int(datetime.now().timestamp() * 1000)
}
# 合并当前工作流序列 # 合并当前工作流序列
def merge_sequence_workflow(self, json_str: str) -> dict: def merge_sequence_workflow(self, json_str: str) -> dict:
try: try:
@@ -1056,3 +1292,660 @@ class BioyondV1RPC(BaseRequest):
def get_logger(self): def get_logger(self):
return self._logger return self._logger
# ==================== 配液站特有方法 ====================
def sample_waste_removal(self, order_id: str) -> dict:
"""
样品/废料取出接口
参数:
- order_id: 订单ID
返回: 取出结果
"""
params = {"orderId": order_id}
response = self.post(
url=f'{self.host}/api/lims/order/take-out',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
"data": params
})
if not response:
return {}
if response['code'] != 1:
self._logger.error(f"样品废料取出错误: {response.get('message', '')}")
return {}
return response.get("data", {})
def dispensing_material_inbound(self, material_id: str, location_id: str) -> dict:
"""
配液站物料入库接口
参数:
- material_id: 物料ID
- location_id: 库位ID
返回: 入库结果
"""
params = {
"materialId": material_id,
"locationId": location_id
}
response = self.post(
url=f'{self.host}/api/lims/storage/inbound',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
"data": params
})
if not response:
return {}
if response['code'] != 1:
self._logger.error(f"配液站物料入库错误: {response.get('message', '')}")
return {}
return response.get("data", {})
def dispensing_material_outbound(self, material_id: str, location_id: str, quantity: int) -> dict:
"""
配液站物料出库接口
参数:
- material_id: 物料ID
- location_id: 库位ID
- quantity: 出库数量
返回: 出库结果
"""
params = {
"materialId": material_id,
"locationId": location_id,
"quantity": quantity
}
response = self.post(
url=f'{self.host}/api/lims/storage/outbound',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
"data": params
})
if not response:
return {}
if response['code'] != 1:
self._logger.error(f"配液站物料出库错误: {response.get('message', '')}")
return {}
return response.get("data", {})
def create_90_10_vial_feeding_task(self,
order_name: str = None,
speed: str = None,
temperature: str = None,
delay_time: str = None,
percent_90_1_assign_material_name: str = None,
percent_90_1_target_weigh: str = None,
percent_90_2_assign_material_name: str = None,
percent_90_2_target_weigh: str = None,
percent_90_3_assign_material_name: str = None,
percent_90_3_target_weigh: str = None,
percent_10_1_assign_material_name: str = None,
percent_10_1_target_weigh: str = None,
percent_10_1_volume: str = None,
percent_10_1_liquid_material_name: str = None,
percent_10_2_assign_material_name: str = None,
percent_10_2_target_weigh: str = None,
percent_10_2_volume: str = None,
percent_10_2_liquid_material_name: str = None,
percent_10_3_assign_material_name: str = None,
percent_10_3_target_weigh: str = None,
percent_10_3_volume: str = None,
percent_10_3_liquid_material_name: str = None,
hold_m_name: str = None) -> dict:
"""
创建90%10%小瓶投料任务
参数说明:
- order_name: 任务名称如果为None则使用默认名称
- speed: 搅拌速度如果为None则使用默认值400
- temperature: 温度如果为None则使用默认值40
- delay_time: 延迟时间如果为None则使用默认值600
- percent_90_1_assign_material_name: 90%_1物料名称
- percent_90_1_target_weigh: 90%_1目标重量
- percent_90_2_assign_material_name: 90%_2物料名称
- percent_90_2_target_weigh: 90%_2目标重量
- percent_90_3_assign_material_name: 90%_3物料名称
- percent_90_3_target_weigh: 90%_3目标重量
- percent_10_1_assign_material_name: 10%_1固体物料名称
- percent_10_1_target_weigh: 10%_1固体目标重量
- percent_10_1_volume: 10%_1液体体积
- percent_10_1_liquid_material_name: 10%_1液体物料名称
- percent_10_2_assign_material_name: 10%_2固体物料名称
- percent_10_2_target_weigh: 10%_2固体目标重量
- percent_10_2_volume: 10%_2液体体积
- percent_10_2_liquid_material_name: 10%_2液体物料名称
- percent_10_3_assign_material_name: 10%_3固体物料名称
- percent_10_3_target_weigh: 10%_3固体目标重量
- percent_10_3_volume: 10%_3液体体积
- percent_10_3_liquid_material_name: 10%_3液体物料名称
- hold_m_name: 库位名称,如"C01"用于查找对应的holdMId
返回: 任务创建结果
"""
# 设置默认值
if order_name is None:
order_name = f"90%10%小瓶投料任务_{self.get_current_time_iso8601()}"
if speed is None:
speed = "400"
if temperature is None:
temperature = "20"
if delay_time is None:
delay_time = "600"
# 获取工作流ID
workflow_id = "3a19310d-16b9-9d81-b109-0748e953694b" # 90%10%小瓶投料工作流ID
# 查询holdMId
holdMId = None
if hold_m_name:
holdMId_response = self.material_id_query(hold_m_name)
if holdMId_response:
holdMId = holdMId_response
# 构建订单数据
order_data = [{
"code": order_name,
"Name": "90%10%小瓶投料任务",
"workflowName": "90%10%小瓶投料",
"borderNumber": 1,
"paramValues": {
workflow_id: [
# 搅拌速度
{"m": 3, "n": 2, "key": "speed", "value": speed},
# 温度
{"m": 3, "n": 2, "key": "temperature", "value": temperature},
# 延迟时间
{"m": 3, "n": 2, "key": "delayTime", "value": delay_time},
# 90%_1固体物料
{"m": 3, "n": 2, "key": "90%_1_assignMaterialName", "value": percent_90_1_assign_material_name},
{"m": 3, "n": 2, "key": "90%_1_targetWeigh", "value": percent_90_1_target_weigh},
# 90%_2固体物料
{"m": 3, "n": 2, "key": "90%_2_assignMaterialName", "value": percent_90_2_assign_material_name},
{"m": 3, "n": 2, "key": "90%_2_targetWeigh", "value": percent_90_2_target_weigh},
# 90%_3固体物料
{"m": 3, "n": 2, "key": "90%_3_assignMaterialName", "value": percent_90_3_assign_material_name},
{"m": 3, "n": 2, "key": "90%_3_targetWeigh", "value": percent_90_3_target_weigh},
# 10%_1液体物料
{"m": 3, "n": 2, "key": "10%_1_assignMaterialName", "value": percent_10_1_assign_material_name},
{"m": 3, "n": 2, "key": "10%_1_targetWeigh", "value": percent_10_1_target_weigh},
{"m": 3, "n": 2, "key": "10%_1_volume", "value": percent_10_1_volume},
{"m": 3, "n": 2, "key": "10%_1_liquidMaterialName", "value": percent_10_1_liquid_material_name},
# 10%_2液体物料
{"m": 3, "n": 2, "key": "10%_2_assignMaterialName", "value": percent_10_2_assign_material_name},
{"m": 3, "n": 2, "key": "10%_2_targetWeigh", "value": percent_10_2_target_weigh},
{"m": 3, "n": 2, "key": "10%_2_volume", "value": percent_10_2_volume},
{"m": 3, "n": 2, "key": "10%_2_liquidMaterialName", "value": percent_10_2_liquid_material_name},
# 10%_3液体物料
{"m": 3, "n": 2, "key": "10%_3_assignMaterialName", "value": percent_10_3_assign_material_name},
{"m": 3, "n": 2, "key": "10%_3_targetWeigh", "value": percent_10_3_target_weigh},
{"m": 3, "n": 2, "key": "10%_3_volume", "value": percent_10_3_volume},
{"m": 3, "n": 2, "key": "10%_3_liquidMaterialName", "value": percent_10_3_liquid_material_name}
]
},
"ExtendProperties": f"{{{holdMId}:null}}" if holdMId else "{}"
}]
try:
# 调用create_order方法创建任务
result = self.create_order(json.dumps(order_data, ensure_ascii=False))
self._logger.info(f"90%10%小瓶投料任务创建成功: {result}")
return result
except Exception as e:
error_msg = f"90%10%小瓶投料任务创建异常: {str(e)}"
self._logger.error(error_msg)
return {"error": error_msg}
def create_diamine_solution_task(self,
order_name: str = None,
material_name: str = None,
target_weigh: str = None,
volume: str = None,
liquid_material_name: str = "NMP",
speed: str = None,
temperature: str = None,
delay_time: str = None,
hold_m_name: str = None) -> dict:
"""
创建二胺溶液配置任务
参数说明:
- order_name: 任务名称如果为None则使用默认名称
- material_name: 固体物料名称,必填
- target_weigh: 固体目标重量,必填
- volume: 液体体积,必填
- liquid_material_name: 液体物料名称默认为NMP
- speed: 搅拌速度如果为None则使用默认值400
- temperature: 温度如果为None则使用默认值25
- delay_time: 延迟时间如果为None则使用默认值600
- hold_m_name: 库位名称,如"ODA-1"用于查找对应的holdMId
返回: 任务创建结果
"""
# 验证必填参数
if not material_name or not target_weigh or not volume:
return {
"status": "error",
"message": "material_name、target_weigh和volume为必填参数"
}
# 设置默认值
if order_name is None:
order_name = f"二胺溶液配置任务_{self.get_current_time_iso8601()}"
if speed is None:
speed = "400"
if temperature is None:
temperature = "25"
if delay_time is None:
delay_time = "600"
# 获取工作流ID
workflow_id = "1"
# 查询holdMId
holdMId = None
if hold_m_name:
try:
material_query_params = json.dumps({"materialName": hold_m_name})
material_response = self.material_id_query(material_query_params)
if material_response and material_response.get("code") == 1:
data = material_response.get("data", [])
if data:
holdMId = data[0].get("id")
self._logger.info(f"查询到holdMId: {holdMId} for {hold_m_name}")
else:
self._logger.warning(f"未找到物料: {hold_m_name}")
else:
self._logger.error(f"查询物料ID失败: {material_response}")
except Exception as e:
self._logger.error(f"查询holdMId时发生错误: {e}")
# 构建order_data
order_data = {
"workflowId": workflow_id,
"orderName": order_name,
"params": {
"1": speed, # 搅拌速度
"2": temperature, # 温度
"3": delay_time, # 延迟时间
"4": material_name, # 固体物料名称
"5": target_weigh, # 固体目标重量
"6": volume, # 液体体积
"7": liquid_material_name # 液体物料名称
}
}
if holdMId:
order_data["holdMId"] = holdMId
try:
# 使用create_order方法创建任务
order_params = json.dumps(order_data)
response = self.create_order(order_params)
return response
except Exception as e:
self._logger.error(f"创建二胺溶液配置任务时发生错误: {e}")
return {"status": "error", "message": f"创建任务失败: {str(e)}"}
def create_batch_90_10_vial_feeding_task(self, json_str: str) -> dict:
"""
创建批量90%10%小瓶投料任务
接受JSON输入支持多个90%10%小瓶投料任务的批量创建
JSON格式示例:
{
"batch_name": "批量90%10%小瓶投料任务_20240101",
"tasks": [
{
"order_name": "小瓶投料任务1",
"hold_m_name": "C01",
"percent_90_1_assign_material_name": "物料A",
"percent_90_1_target_weigh": "10.5",
"percent_10_1_assign_material_name": "物料B",
"percent_10_1_target_weigh": "5.2",
"percent_10_1_volume": "50.0",
"percent_10_1_liquid_material_name": "NMP",
"speed": "400",
"temperature": "40",
"delay_time": "600"
}
],
"global_settings": {
"speed": "400",
"temperature": "40",
"delay_time": "600"
}
}
参数说明:
- batch_name: 批量任务名称,可选
- tasks: 任务列表每个任务包含90%10%小瓶投料参数
- global_settings: 全局默认设置,当单个任务未指定参数时使用
返回: 批量任务创建结果
"""
try:
# 解析JSON输入
data = json.loads(json_str)
# 获取批量任务参数
batch_name = data.get("batch_name", f"批量90%10%小瓶投料任务_{self.get_current_time_iso8601()}")
tasks = data.get("tasks", [])
global_settings = data.get("global_settings", {})
if not tasks:
return {
"status": "error",
"message": "任务列表不能为空"
}
# 批量创建结果
batch_results = {
"batch_name": batch_name,
"total_tasks": len(tasks),
"successful_tasks": 0,
"failed_tasks": 0,
"task_results": []
}
self._logger.info(f"开始创建批量90%10%小瓶投料任务: {batch_name}, 包含 {len(tasks)} 个子任务")
# 逐个创建任务
for i, task in enumerate(tasks):
try:
# 合并全局设置和任务特定设置
task_params = {**global_settings, **task}
# 验证必填参数 - hold_m_name是必须的
if not task_params.get("hold_m_name"):
error_msg = f"任务 {i+1} 缺少必填参数: hold_m_name"
self._logger.error(error_msg)
batch_results["task_results"].append({
"task_index": i + 1,
"status": "error",
"message": error_msg
})
batch_results["failed_tasks"] += 1
continue
# 设置任务名称
if not task_params.get("order_name"):
task_params["order_name"] = f"{batch_name}_任务{i+1}"
# 调用单个90%10%小瓶投料任务创建方法
task_result = self.create_90_10_vial_feeding_task(
order_name=task_params.get("order_name"),
speed=task_params.get("speed"),
temperature=task_params.get("temperature"),
delay_time=task_params.get("delay_time"),
percent_90_1_assign_material_name=task_params.get("percent_90_1_assign_material_name"),
percent_90_1_target_weigh=task_params.get("percent_90_1_target_weigh"),
percent_90_2_assign_material_name=task_params.get("percent_90_2_assign_material_name"),
percent_90_2_target_weigh=task_params.get("percent_90_2_target_weigh"),
percent_90_3_assign_material_name=task_params.get("percent_90_3_assign_material_name"),
percent_90_3_target_weigh=task_params.get("percent_90_3_target_weigh"),
percent_10_1_assign_material_name=task_params.get("percent_10_1_assign_material_name"),
percent_10_1_target_weigh=task_params.get("percent_10_1_target_weigh"),
percent_10_1_volume=task_params.get("percent_10_1_volume"),
percent_10_1_liquid_material_name=task_params.get("percent_10_1_liquid_material_name"),
percent_10_2_assign_material_name=task_params.get("percent_10_2_assign_material_name"),
percent_10_2_target_weigh=task_params.get("percent_10_2_target_weigh"),
percent_10_2_volume=task_params.get("percent_10_2_volume"),
percent_10_2_liquid_material_name=task_params.get("percent_10_2_liquid_material_name"),
percent_10_3_assign_material_name=task_params.get("percent_10_3_assign_material_name"),
percent_10_3_target_weigh=task_params.get("percent_10_3_target_weigh"),
percent_10_3_volume=task_params.get("percent_10_3_volume"),
percent_10_3_liquid_material_name=task_params.get("percent_10_3_liquid_material_name"),
hold_m_name=task_params.get("hold_m_name")
)
# 记录任务结果
if isinstance(task_result, dict) and task_result.get("status") != "error":
batch_results["successful_tasks"] += 1
batch_results["task_results"].append({
"task_index": i + 1,
"task_name": task_params.get("order_name"),
"status": "success",
"result": task_result
})
self._logger.info(f"任务 {i+1} 创建成功: {task_params.get('order_name')}")
else:
batch_results["failed_tasks"] += 1
batch_results["task_results"].append({
"task_index": i + 1,
"task_name": task_params.get("order_name"),
"status": "error",
"message": str(task_result)
})
self._logger.error(f"任务 {i+1} 创建失败: {task_result}")
except Exception as e:
error_msg = f"任务 {i+1} 处理时发生异常: {str(e)}"
self._logger.error(error_msg)
batch_results["failed_tasks"] += 1
batch_results["task_results"].append({
"task_index": i + 1,
"status": "error",
"message": error_msg
})
# 设置批量任务整体状态
if batch_results["failed_tasks"] == 0:
batch_results["status"] = "success"
batch_results["message"] = f"批量90%10%小瓶投料任务全部创建成功,共 {batch_results['successful_tasks']} 个任务"
elif batch_results["successful_tasks"] == 0:
batch_results["status"] = "error"
batch_results["message"] = f"批量90%10%小瓶投料任务全部创建失败,共 {batch_results['failed_tasks']} 个任务"
else:
batch_results["status"] = "partial_success"
batch_results["message"] = f"批量90%10%小瓶投料任务部分成功,成功 {batch_results['successful_tasks']} 个,失败 {batch_results['failed_tasks']}"
self._logger.info(f"批量90%10%小瓶投料任务完成: {batch_results['message']}")
return batch_results
except json.JSONDecodeError as e:
error_msg = f"JSON解析失败: {str(e)}"
self._logger.error(error_msg)
return {"status": "error", "message": error_msg}
except Exception as e:
error_msg = f"创建批量90%10%小瓶投料任务时发生错误: {str(e)}"
self._logger.error(error_msg)
return {"status": "error", "message": error_msg}
def create_batch_diamine_solution_task(self, json_str: str) -> dict:
"""
创建批量二胺溶液配制任务
接受JSON输入支持多个二胺溶液配制任务的批量创建
JSON格式示例:
{
"batch_name": "批量二胺溶液配制任务_20240101",
"tasks": [
{
"order_name": "二胺溶液配制任务1",
"material_name": "物料A",
"target_weigh": "10.5",
"volume": "50.0",
"liquid_material_name": "NMP",
"speed": "400",
"temperature": "25",
"delay_time": "600",
"hold_m_name": "A01"
},
{
"order_name": "二胺溶液配制任务2",
"material_name": "物料B",
"target_weigh": "15.2",
"volume": "75.0",
"liquid_material_name": "DMF",
"speed": "350",
"temperature": "30",
"delay_time": "800",
"hold_m_name": "B02"
}
],
"global_settings": {
"speed": "400",
"temperature": "25",
"delay_time": "600",
"liquid_material_name": "NMP"
}
}
参数说明:
- batch_name: 批量任务名称,可选
- tasks: 任务列表,每个任务包含二胺溶液配制参数
- global_settings: 全局默认设置,当单个任务未指定参数时使用
每个任务参数:
- order_name: 任务名称
- material_name: 物料名称,必填
- target_weigh: 目标重量,必填
- volume: 体积,必填
- liquid_material_name: 液体物料名称,可选
- speed: 搅拌速度,可选
- temperature: 温度,可选
- delay_time: 延迟时间,可选
- hold_m_name: 库位名称,可选
返回: 批量任务创建结果
"""
try:
# 解析JSON输入
data = json.loads(json_str)
# 获取批量任务参数
batch_name = data.get("batch_name", f"批量二胺溶液配制任务_{self.get_current_time_iso8601()}")
tasks = data.get("tasks", [])
global_settings = data.get("global_settings", {})
if not tasks:
return {
"status": "error",
"message": "任务列表不能为空"
}
# 批量创建结果
batch_results = {
"batch_name": batch_name,
"total_tasks": len(tasks),
"successful_tasks": 0,
"failed_tasks": 0,
"task_results": []
}
self._logger.info(f"开始创建批量二胺溶液配制任务: {batch_name}, 包含 {len(tasks)} 个子任务")
# 逐个创建任务
for i, task in enumerate(tasks):
try:
# 合并全局设置和任务特定设置
task_params = {**global_settings, **task}
# 验证必填参数
required_params = ["material_name", "target_weigh", "volume"]
missing_params = [param for param in required_params if not task_params.get(param)]
if missing_params:
error_msg = f"任务 {i+1} 缺少必填参数: {', '.join(missing_params)}"
self._logger.error(error_msg)
batch_results["task_results"].append({
"task_index": i + 1,
"status": "error",
"message": error_msg
})
batch_results["failed_tasks"] += 1
continue
# 设置任务名称
if not task_params.get("order_name"):
task_params["order_name"] = f"{batch_name}_任务{i+1}"
# 调用单个二胺溶液配制任务创建方法
task_result = self.create_diamine_solution_task(
order_name=task_params.get("order_name"),
material_name=task_params.get("material_name"),
target_weigh=task_params.get("target_weigh"),
volume=task_params.get("volume"),
liquid_material_name=task_params.get("liquid_material_name", "NMP"),
speed=task_params.get("speed"),
temperature=task_params.get("temperature"),
delay_time=task_params.get("delay_time"),
hold_m_name=task_params.get("hold_m_name")
)
# 记录任务结果
if isinstance(task_result, dict) and task_result.get("status") != "error":
batch_results["successful_tasks"] += 1
batch_results["task_results"].append({
"task_index": i + 1,
"task_name": task_params.get("order_name"),
"status": "success",
"result": task_result
})
self._logger.info(f"任务 {i+1} 创建成功: {task_params.get('order_name')}")
else:
batch_results["failed_tasks"] += 1
batch_results["task_results"].append({
"task_index": i + 1,
"task_name": task_params.get("order_name"),
"status": "error",
"message": str(task_result)
})
self._logger.error(f"任务 {i+1} 创建失败: {task_result}")
except Exception as e:
error_msg = f"滴定液任务 {i+1} 处理时发生异常: {str(e)}"
self._logger.error(error_msg)
batch_results["failed_tasks"] += 1
batch_results["task_results"].append({
"task_index": i + 1,
"status": "error",
"message": error_msg
})
# 设置批量任务整体状态
if batch_results["failed_tasks"] == 0:
batch_results["status"] = "success"
batch_results["message"] = f"批量滴定液任务全部创建成功,共 {batch_results['successful_tasks']} 个任务"
elif batch_results["successful_tasks"] == 0:
batch_results["status"] = "error"
batch_results["message"] = f"批量滴定液任务全部创建失败,共 {batch_results['failed_tasks']} 个任务"
else:
batch_results["status"] = "partial_success"
batch_results["message"] = f"批量滴定液任务部分成功,成功 {batch_results['successful_tasks']} 个,失败 {batch_results['failed_tasks']}"
self._logger.info(f"批量滴定液任务完成: {batch_results['message']}")
return batch_results
except json.JSONDecodeError as e:
error_msg = f"JSON解析失败: {str(e)}"
self._logger.error(error_msg)
return {"status": "error", "message": error_msg}
except Exception as e:
error_msg = f"创建批量滴定液任务时发生错误: {str(e)}"
self._logger.error(error_msg)
return {"status": "error", "message": error_msg}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,506 @@
dispensing_station.bioyond:
category:
- work_station
- dispensing_station_bioyond
class:
action_value_mappings:
bioyond_sync:
feedback: {}
goal:
force_sync: force_sync
sync_type: sync_type
goal_default:
force_sync: false
sync_type: full
handles: {}
result: {}
schema:
description: 从Bioyond系统同步物料
properties:
feedback: {}
goal:
properties:
force_sync:
description: 是否强制同步
type: boolean
sync_type:
description: 同步类型
enum:
- full
- incremental
type: string
required:
- sync_type
type: object
result: {}
required:
- goal
title: bioyond_sync参数
type: object
type: UniLabJsonCommand
bioyond_update:
feedback: {}
goal:
material_ids: material_ids
sync_all: sync_all
goal_default:
material_ids: []
sync_all: true
handles: {}
result: {}
schema:
description: 将本地物料变更同步到Bioyond
properties:
feedback: {}
goal:
properties:
material_ids:
description: 要同步的物料ID列表
items:
type: string
type: array
sync_all:
description: 是否同步所有物料
type: boolean
required:
- sync_all
type: object
result: {}
required:
- goal
title: bioyond_update参数
type: object
type: UniLabJsonCommand
create_90_10_vial_feeding_task:
feedback: {}
goal:
delay_time: delay_time
order_name: order_name
percent_10_1_assign_material_name: percent_10_1_assign_material_name
percent_10_1_liquid_material_name: percent_10_1_liquid_material_name
percent_10_1_target_weigh: percent_10_1_target_weigh
percent_10_1_volume: percent_10_1_volume
percent_10_2_assign_material_name: percent_10_2_assign_material_name
percent_10_2_liquid_material_name: percent_10_2_liquid_material_name
percent_10_2_target_weigh: percent_10_2_target_weigh
percent_10_2_volume: percent_10_2_volume
percent_90_1_assign_material_name: percent_90_1_assign_material_name
percent_90_1_target_weigh: percent_90_1_target_weigh
percent_90_2_assign_material_name: percent_90_2_assign_material_name
percent_90_2_target_weigh: percent_90_2_target_weigh
percent_90_3_assign_material_name: percent_90_3_assign_material_name
percent_90_3_target_weigh: percent_90_3_target_weigh
speed: speed
temperature: temperature
goal_default:
delay_time: '600'
order_name: ''
percent_10_1_assign_material_name: ''
percent_10_1_liquid_material_name: ''
percent_10_1_target_weigh: ''
percent_10_1_volume: ''
percent_10_2_assign_material_name: ''
percent_10_2_liquid_material_name: ''
percent_10_2_target_weigh: ''
percent_10_2_volume: ''
percent_90_1_assign_material_name: ''
percent_90_1_target_weigh: ''
percent_90_2_assign_material_name: ''
percent_90_2_target_weigh: ''
percent_90_3_assign_material_name: ''
percent_90_3_target_weigh: ''
speed: '400'
temperature: '20'
handles: {}
result: {}
schema:
description: 创建90%/10%小瓶投料任务
properties:
feedback: {}
goal:
properties:
delay_time:
default: '600'
description: 延迟时间(s)
type: string
order_name:
description: 任务名称
type: string
percent_10_1_assign_material_name:
description: 10%组分1物料名称
type: string
percent_10_1_liquid_material_name:
description: 10%组分1液体物料名称
type: string
percent_10_1_target_weigh:
description: 10%组分1目标重量(g)
type: string
percent_10_1_volume:
description: 10%组分1液体体积(mL)
type: string
percent_10_2_assign_material_name:
description: 10%组分2物料名称
type: string
percent_10_2_liquid_material_name:
description: 10%组分2液体物料名称
type: string
percent_10_2_target_weigh:
description: 10%组分2目标重量(g)
type: string
percent_10_2_volume:
description: 10%组分2液体体积(mL)
type: string
percent_90_1_assign_material_name:
description: 90%组分1物料名称
type: string
percent_90_1_target_weigh:
description: 90%组分1目标重量(g)
type: string
percent_90_2_assign_material_name:
description: 90%组分2物料名称
type: string
percent_90_2_target_weigh:
description: 90%组分2目标重量(g)
type: string
percent_90_3_assign_material_name:
description: 90%组分3物料名称
type: string
percent_90_3_target_weigh:
description: 90%组分3目标重量(g)
type: string
speed:
default: '400'
description: 搅拌速度(rpm)
type: string
temperature:
default: '20'
description: 温度(°C)
type: string
type: object
result: {}
required:
- goal
title: create_90_10_vial_feeding_task参数
type: object
type: UniLabJsonCommand
create_batch_90_10_vial_feeding_task:
feedback: {}
goal:
batch_data: batch_data
goal_default:
batch_data: '{}'
handles: {}
result: {}
schema:
description: 创建批量90%10%小瓶投料任务
properties:
feedback: {}
goal:
properties:
batch_data:
description: 批量90%10%小瓶投料任务数据(JSON格式)包含batch_name、tasks列表和global_settings
type: string
required:
- batch_data
type: object
result: {}
required:
- goal
title: create_batch_90_10_vial_feeding_task参数
type: object
type: UniLabJsonCommand
create_batch_diamine_solution_task:
feedback: {}
goal:
batch_data: batch_data
goal_default:
batch_data: '{}'
handles: {}
result: {}
schema:
description: 创建批量二胺溶液配制任务
properties:
feedback: {}
goal:
properties:
batch_data:
description: 批量二胺溶液配制任务数据(JSON格式)包含batch_name、tasks列表和global_settings
type: string
required:
- batch_data
type: object
result: {}
required:
- goal
title: create_batch_diamine_solution_task参数
type: object
type: UniLabJsonCommand
create_diamine_solution_task:
feedback: {}
goal:
delay_time: delay_time
hold_m_name: hold_m_name
liquid_material_name: liquid_material_name
material_name: material_name
order_name: order_name
speed: speed
target_weigh: target_weigh
temperature: temperature
volume: volume
goal_default:
delay_time: '600'
hold_m_name: ''
liquid_material_name: NMP
material_name: ''
order_name: ''
speed: '400'
target_weigh: ''
temperature: '20'
volume: ''
handles: {}
result: {}
schema:
description: 创建二胺溶液配制任务
properties:
feedback: {}
goal:
properties:
delay_time:
default: '600'
description: 延迟时间(s)
type: string
hold_m_name:
description: 库位名称(如ODA-1)
type: string
liquid_material_name:
default: NMP
description: 液体物料名称
type: string
material_name:
description: 固体物料名称
type: string
order_name:
description: 任务名称
type: string
speed:
default: '400'
description: 搅拌速度(rpm)
type: string
target_weigh:
description: 固体目标重量(g)
type: string
temperature:
default: '20'
description: 温度(°C)
type: string
volume:
description: 液体体积(mL)
type: string
required:
- material_name
- target_weigh
- volume
type: object
result: {}
required:
- goal
title: create_diamine_solution_task参数
type: object
type: UniLabJsonCommand
create_resource:
feedback: {}
goal:
resource_config: resource_config
resource_type: resource_type
goal_default:
resource_config: {}
resource_type: ''
handles: {}
result: {}
schema:
description: 创建资源操作
properties:
feedback: {}
goal:
properties:
resource_config:
description: 资源配置
type: object
resource_type:
description: 资源类型
type: string
required:
- resource_type
- resource_config
type: object
result: {}
required:
- goal
title: create_resource参数
type: object
type: UniLabJsonCommand
dispensing_material_inbound:
feedback: {}
goal:
location: location
material_id: material_id
goal_default:
location: ''
material_id: ''
handles: {}
result: {}
schema:
description: 配液站物料入库操作
properties:
feedback: {}
goal:
properties:
location:
description: 存储位置
type: string
material_id:
description: 物料ID
type: string
required:
- material_id
- location
type: object
result: {}
required:
- goal
title: dispensing_material_inbound参数
type: object
type: UniLabJsonCommand
dispensing_material_outbound:
feedback: {}
goal:
material_id: material_id
quantity: quantity
goal_default:
material_id: ''
quantity: 0.0
handles: {}
result: {}
schema:
description: 配液站物料出库操作
properties:
feedback: {}
goal:
properties:
material_id:
description: 物料ID
type: string
quantity:
description: 出库数量
type: number
required:
- material_id
- quantity
type: object
result: {}
required:
- goal
title: dispensing_material_outbound参数
type: object
type: UniLabJsonCommand
sample_waste_removal:
feedback: {}
goal:
sample_id: sample_id
waste_type: waste_type
goal_default:
sample_id: ''
waste_type: general
handles: {}
result: {}
schema:
description: 样品废料移除操作
properties:
feedback: {}
goal:
properties:
sample_id:
description: 样品ID
type: string
waste_type:
description: 废料类型
enum:
- general
- hazardous
- organic
- inorganic
type: string
required:
- sample_id
type: object
result: {}
required:
- goal
title: sample_waste_removal参数
type: object
type: UniLabJsonCommand
module: unilabos.devices.workstation.bioyond_studio.station:BioyondWorkstation
protocol_type: []
status_types:
bioyond_status: dict
enable_dispensing_station: bool
enable_reaction_station: bool
station_type: str
type: python
config_info: []
description: Bioyond配液站 - 专门用于物料配制和管理的工作站
handles: []
icon: 配液站.webp
init_param_schema:
config:
properties:
bioyond_config:
description: Bioyond API配置
properties:
api_host:
description: Bioyond API主机地址
type: string
api_key:
description: Bioyond API密钥
type: string
material_type_mappings:
description: 物料类型映射配置
type: object
workflow_mappings:
description: 工作流映射配置
type: object
type: object
deck:
description: Deck配置
type: object
station_config:
description: 配液站配置
properties:
description:
description: 配液站描述
type: string
enable_dispensing_station:
default: true
description: 启用配液站功能
type: boolean
enable_reaction_station:
default: false
description: 禁用反应站功能
type: boolean
station_name:
description: 配液站名称
type: string
station_type:
default: dispensing_station
description: 站点类型 - 配液站
enum:
- dispensing_station
type: string
type: object
required: []
type: object
data:
properties: {}
required: []
type: object
version: 1.0.0

View File

@@ -0,0 +1,384 @@
reaction_station.bioyond:
category:
- work_station
- reaction_station_bioyond
class:
action_value_mappings:
bioyond_sync:
feedback: {}
goal:
force_sync: force_sync
sync_type: sync_type
goal_default:
force_sync: false
sync_type: full
handles: {}
result: {}
schema:
description: 从Bioyond系统同步物料
properties:
feedback: {}
goal:
properties:
force_sync:
description: 是否强制同步
type: boolean
sync_type:
description: 同步类型
enum:
- full
- incremental
type: string
required:
- sync_type
type: object
result: {}
required:
- goal
title: bioyond_sync参数
type: object
type: UniLabJsonCommand
bioyond_update:
feedback: {}
goal:
material_ids: material_ids
sync_all: sync_all
goal_default:
material_ids: []
sync_all: true
handles: {}
result: {}
schema:
description: 将本地物料变更同步到Bioyond
properties:
feedback: {}
goal:
properties:
material_ids:
description: 要同步的物料ID列表
items:
type: string
type: array
sync_all:
description: 是否同步所有物料
type: boolean
required:
- sync_all
type: object
result: {}
required:
- goal
title: bioyond_update参数
type: object
type: UniLabJsonCommand
reaction_station_drip_back:
feedback: {}
goal:
assign_material_name: assign_material_name
time: time
torque_variation: torque_variation
volume: volume
goal_default:
assign_material_name: ''
time: ''
torque_variation: ''
volume: ''
handles: {}
result: {}
schema:
description: 反应站滴回操作
properties:
feedback: {}
goal:
properties:
assign_material_name:
description: 溶剂名称
type: string
time:
description: 观察时间单位min
type: string
torque_variation:
description: 是否观察1否2是
type: string
volume:
description: 投料体积
type: string
required:
- volume
- assign_material_name
- time
- torque_variation
type: object
result: {}
required:
- goal
title: reaction_station_drip_back参数
type: object
type: UniLabJsonCommand
reaction_station_liquid_feed:
feedback: {}
goal:
assign_material_name: assign_material_name
time: time
titration_type: titration_type
torque_variation: torque_variation
volume: volume
goal_default:
assign_material_name: ''
time: ''
titration_type: ''
torque_variation: ''
volume: ''
handles: {}
result: {}
schema:
description: 反应站液体进料操作
properties:
feedback: {}
goal:
properties:
assign_material_name:
description: 溶剂名称
type: string
time:
description: 观察时间单位min
type: string
titration_type:
description: 滴定类型1否2是
type: string
torque_variation:
description: 是否观察1否2是
type: string
volume:
description: 投料体积
type: string
required:
- titration_type
- volume
- assign_material_name
- time
- torque_variation
type: object
result: {}
required:
- goal
title: reaction_station_liquid_feed参数
type: object
type: UniLabJsonCommand
reaction_station_process_execute:
feedback: {}
goal:
task_name: task_name
workflow_name: workflow_name
goal_default:
task_name: ''
workflow_name: ''
handles: {}
result: {}
schema:
description: 反应站流程执行
properties:
feedback: {}
goal:
properties:
task_name:
description: 任务名称
type: string
workflow_name:
description: 工作流名称
type: string
required:
- workflow_name
- task_name
type: object
result: {}
required:
- goal
title: reaction_station_process_execute参数
type: object
type: UniLabJsonCommand
reaction_station_reactor_taken_out:
feedback: {}
goal:
order_id: order_id
preintake_id: preintake_id
goal_default:
order_id: ''
preintake_id: ''
handles: {}
result: {}
schema:
description: 反应站反应器取出操作 - 通过订单ID和预取样ID进行精确控制
properties:
feedback: {}
goal:
properties:
order_id:
description: 订单ID用于标识要取出的订单
type: string
preintake_id:
description: 预取样ID用于标识具体的取样任务
type: string
required: []
type: object
result:
properties:
code:
description: 操作结果代码1表示成功0表示失败
type: integer
return_info:
description: 操作结果详细信息
type: string
type: object
required:
- goal
title: reaction_station_reactor_taken_out参数
type: object
type: UniLabJsonCommand
reaction_station_solid_feed_vial:
feedback: {}
goal:
assign_material_name: assign_material_name
material_id: material_id
time: time
torque_variation: torque_variation
goal_default:
assign_material_name: ''
material_id: ''
time: ''
torque_variation: ''
handles: {}
result: {}
schema:
description: 反应站固体进料操作
properties:
feedback: {}
goal:
properties:
assign_material_name:
description: 固体名称_粉末加样模块-投料
type: string
material_id:
description: 固体投料类型_粉末加样模块-投料
type: string
time:
description: 观察时间_反应模块-观察搅拌结果
type: string
torque_variation:
description: 是否观察1否2是_反应模块-观察搅拌结果
type: string
required:
- assign_material_name
- material_id
- time
- torque_variation
type: object
result: {}
required:
- goal
title: reaction_station_solid_feed_vial参数
type: object
type: UniLabJsonCommand
reaction_station_take_in:
feedback: {}
goal:
assign_material_name: assign_material_name
cutoff: cutoff
temperature: temperature
goal_default:
assign_material_name: ''
cutoff: ''
temperature: ''
handles: {}
result: {}
schema:
description: 反应站取入操作
properties:
feedback: {}
goal:
properties:
assign_material_name:
description: 物料名称
type: string
cutoff:
description: 截止参数
type: string
temperature:
description: 温度
type: string
required:
- cutoff
- temperature
- assign_material_name
type: object
result: {}
required:
- goal
title: reaction_station_take_in参数
type: object
type: UniLabJsonCommand
module: unilabos.devices.workstation.bioyond_studio.station:BioyondWorkstation
protocol_type: []
status_types:
bioyond_status: dict
enable_dispensing_station: bool
enable_reaction_station: bool
station_type: str
type: python
config_info: []
description: Bioyond反应站 - 专门用于化学反应操作的工作站
handles: []
icon: 反应站.webp
init_param_schema:
config:
properties:
bioyond_config:
description: Bioyond API配置
properties:
api_host:
description: Bioyond API主机地址
type: string
api_key:
description: Bioyond API密钥
type: string
material_type_mappings:
description: 物料类型映射配置
type: object
workflow_mappings:
description: 工作流映射配置
type: object
type: object
deck:
description: Deck配置
type: object
station_config:
description: 反应站配置
properties:
description:
description: 反应站描述
type: string
enable_dispensing_station:
default: false
description: 禁用配液站功能
type: boolean
enable_reaction_station:
default: true
description: 启用反应站功能
type: boolean
station_name:
description: 反应站名称
type: string
station_type:
default: reaction_station
description: 站点类型 - 反应站
enum:
- reaction_station
type: string
type: object
required: []
type: object
data:
properties: {}
required: []
type: object
version: 1.0.0

View File

@@ -105,8 +105,12 @@ set(action_files
"action/PostProcessTriggerPostPro.action" "action/PostProcessTriggerPostPro.action"
"action/ReactionStationDripBack.action" "action/ReactionStationDripBack.action"
"action/ReactionStationLiquidFeed.action" "action/ReactionStationLiquidFeedBeaker.action"
"action/ReactionStationLiquidFeedSolvents.action"
"action/ReactionStationLiquidFeedTitration.action"
"action/ReactionStationLiquidFeedVialsNonTitration.action"
"action/ReactionStationProExecu.action" "action/ReactionStationProExecu.action"
"action/ReactionStationReactorTakenOut.action"
"action/ReactionStationReaTackIn.action" "action/ReactionStationReaTackIn.action"
"action/ReactionStationSolidFeedVial.action" "action/ReactionStationSolidFeedVial.action"
) )

View File

@@ -1,11 +1,13 @@
# Goal - 滴回去 # Goal - 滴回去操作参数
string volume # 投料体积 string volume # 投料体积
string assign_material_name # 溶剂名称 string assign_material_name # 溶剂名称
string time # 观察时间单位min string time # 观察时间单位min
string torque_variation # 是否观察1否2是 string torque_variation # 是否观察1否2是
--- ---
# Result - 操作结果 # Result - 操作结果
bool success # 操作是否成功
string return_info # 结果消息 string return_info # 结果消息
int32 code # 操作结果代码1表示成功0表示失败
--- ---
# Feedback - 实时反馈 # Feedback - 实时反馈
string feedback # 操作过程中的反馈信息

View File

@@ -1,11 +0,0 @@
# Goal - 液体投料
string titration_type # 滴定类型1否2是
string volume # 投料体积
string assign_material_name # 溶剂名称
string time # 观察时间单位min
string torque_variation #是否观察1否2是
---
# Result - 操作结果
string return_info # 结果消息
---
# Feedback - 实时反馈

View File

@@ -0,0 +1,15 @@
# Goal - 液体投料-烧杯操作参数
string volume # 投料体积
string assign_material_name # 溶剂名称
string titration_type # 滴定类型1否2是
string time # 观察时间单位min
string torque_variation # 是否观察1否2是
string temperature # 温度设置
---
# Result - 操作结果
bool success # 操作是否成功
string return_info # 结果消息
int32 code # 操作结果代码1表示成功0表示失败
---
# Feedback - 实时反馈
string feedback # 操作过程中的反馈信息

View File

@@ -0,0 +1,15 @@
# Goal - 液体投料-溶剂操作参数
string volume # 投料体积
string assign_material_name # 溶剂名称
string titration_type # 滴定类型1否2是
string time # 观察时间单位min
string torque_variation # 是否观察1否2是
string temperature # 温度设置
---
# Result - 操作结果
bool success # 操作是否成功
string return_info # 结果消息
int32 code # 操作结果代码1表示成功0表示失败
---
# Feedback - 实时反馈
string feedback # 操作过程中的反馈信息

View File

@@ -0,0 +1,15 @@
# Goal - 液体投料滴定操作参数
string volume_formula # 投料体积公式
string assign_material_name # 溶剂名称
string titration_type # 滴定类型1否2是
string time # 观察时间单位min
string torque_variation # 是否观察1否2是
string temperature # 温度设置
---
# Result - 操作结果
bool success # 操作是否成功
string return_info # 结果消息
int32 code # 操作结果代码1表示成功0表示失败
---
# Feedback - 实时反馈
string feedback # 操作过程中的反馈信息

View File

@@ -0,0 +1,15 @@
# Goal - 液体投料-小瓶非滴定操作参数
string volume_formula # 投料体积公式
string assign_material_name # 溶剂名称
string titration_type # 滴定类型1否2是
string time # 观察时间单位min
string torque_variation # 是否观察1否2是
string temperature # 温度设置
---
# Result - 操作结果
bool success # 操作是否成功
string return_info # 结果消息
int32 code # 操作结果代码1表示成功0表示失败
---
# Feedback - 实时反馈
string feedback # 操作过程中的反馈信息

View File

@@ -1,8 +1,11 @@
# Goal - 合并工作流+执行 # Goal - 合并工作流+执行参数
string workflow_name # 工作流名称 string workflow_name # 工作流名称
string task_name # 任务名称 string task_name # 任务名称
--- ---
# Result - 操作结果 # Result - 操作结果
bool success # 操作是否成功
string return_info # 结果消息 string return_info # 结果消息
int32 code # 操作结果代码1表示成功0表示失败
--- ---
# Feedback - 实时反馈 # Feedback - 实时反馈
string feedback # 操作过程中的反馈信息

View File

@@ -1,9 +1,12 @@
# Goal - 通量-配置 # Goal - 反应器放入操作参数
string cutoff # 黏度_通量-配置 string cutoff # 黏度设置
string temperature # 温度_通量-配 string temperature # 温度
string assign_material_name # 分液类型_通量-配置 string assign_material_name # 分液类型
--- ---
# Result - 操作结果 # Result - 操作结果
bool success # 操作是否成功
string return_info # 结果消息 string return_info # 结果消息
int32 code # 操作结果代码1表示成功0表示失败
--- ---
# Feedback - 实时反馈 # Feedback - 实时反馈
string feedback # 操作过程中的反馈信息

View File

@@ -0,0 +1,12 @@
# Goal - 反应器取出操作参数
# 反应器取出操作不需要任何参数
---
# Result - 操作结果
# 反应器取出操作的结果
bool success # 要求必须包含success以便回传执行结果
string return_info # 要求必须包含return_info以便回传执行结果
int32 code # 操作结果代码1表示成功0表示失败
---
# Feedback - 实时反馈
# 反应器取出操作的反馈
string feedback # 操作过程中的反馈信息

View File

@@ -1,10 +1,13 @@
# Goal - 固体投料-小瓶 # Goal - 固体投料-小瓶操作参数
string assign_material_name # 固体名称_粉末加样模块-投料 string assign_material_name # 固体名称
string material_id # 固体投料类型_粉末加样模块-投料 string material_id # 固体投料类型
string time # 观察时间_反应模块-观察搅拌结果 string time # 观察时间单位min
string torque_variation #是否观察1否2是_反应模块-观察搅拌结果 string torque_variation # 是否观察1否2是
--- ---
# Result - 操作结果 # Result - 操作结果
bool success # 操作是否成功
string return_info # 结果消息 string return_info # 结果消息
int32 code # 操作结果代码1表示成功0表示失败
--- ---
# Feedback - 实时反馈 # Feedback - 实时反馈
string feedback # 操作过程中的反馈信息