mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2026-02-04 05:15:10 +00:00
115 lines
4.2 KiB
Python
115 lines
4.2 KiB
Python
import json
|
||
import os
|
||
|
||
import clr
|
||
import pandas as pd
|
||
|
||
|
||
# define class ATR30007
|
||
# this class is used to control the ATR30007 Raman workstation
|
||
|
||
class ATR30007:
|
||
def __init__(self, dll_path: str = r'D:\Raman_RS'):
|
||
self.dll_path = dll_path
|
||
self.machine = None
|
||
self.status = "Idle"
|
||
self._load_dll()
|
||
|
||
def _load_dll(self):
|
||
# 检查ECCore.dll是否存在
|
||
eccore_dll_path = os.path.join(self.dll_path, 'ATRWrapper.dll')
|
||
if not os.path.exists(eccore_dll_path):
|
||
raise FileNotFoundError(f"ATRWrapper.dll不存在于路径 {eccore_dll_path}")
|
||
|
||
# 将DLL路径添加到系统PATH的最前面
|
||
os.environ["PATH"] = self.dll_path + os.pathsep + os.environ["PATH"]
|
||
|
||
# 添加引用
|
||
try:
|
||
clr.AddReference(eccore_dll_path)
|
||
from Optosky.Wrapper import ATRWrapper
|
||
self.machine = ATRWrapper()
|
||
print("成功添加ATRWrapper.dll引用,导入ATRWrapper类,并创建实例")
|
||
except Exception as e:
|
||
raise RuntimeError(f"添加DLL引用或导入ATRWrapper类时出错: {e}")
|
||
|
||
|
||
def get_machineSn(self):
|
||
machineSn = self.machine.GetSn()
|
||
print(f"选择的工作站ID: {machineSn}")
|
||
|
||
def start_Raman(self, IntegTime: int = 5000, LdPower: int = 200,
|
||
Ldwave: int = 1, CCDTemp: int = -5,
|
||
file_name: str = 'test_raman', save_root: str = None):
|
||
#打开仪器
|
||
On_flag = self.machine.OpenDevice()
|
||
print(f"On_flag: {On_flag}")
|
||
#获取仪器SN
|
||
wrapper_Sn = self.machine.GetSn()
|
||
print(f"wrapper_Sn: {wrapper_Sn}")
|
||
#设置当前设备的积分时间, 单位为毫秒
|
||
Integ_flag = self.machine.SetIntegrationTime(IntegTime)
|
||
print(f"Integ_flag:{Integ_flag}")
|
||
#设置激光功率, 单位mW
|
||
LdP_flag = self.machine.SetLdPower(LdPower,Ldwave)
|
||
print(f"LdP_flag:{LdP_flag}")
|
||
#设置 CCD 制冷温度
|
||
SetC_flag = self.machine.SetCool(CCDTemp)
|
||
print(f"SetC_flag:{SetC_flag}")
|
||
#开始采集光谱
|
||
self.status = "Running"
|
||
Spect = self.machine.AcquireSpectrum()
|
||
#开始采集光谱谱图数据转换
|
||
Spect_data = list(Spect.get_Data())
|
||
Spect_suss_flag = Spect.get_Success()
|
||
print(f"Spect_suss_flag:{Spect_suss_flag}")
|
||
#获取波数
|
||
WaveNum = list(self.machine.GetWaveNum())
|
||
#光谱数据基线校正
|
||
Spect_bLC = list(self.machine.BaseLineCorrect(Spect_data))
|
||
#对数据进行boxcar 平滑
|
||
Spect_StB = list(self.machine.SmoothBoxcar(Spect_bLC, 10))
|
||
|
||
self.status = "Idle"
|
||
#关闭仪器
|
||
OFF_flag = wrapper.CloseDevice()
|
||
print(f"OFF_flag: {OFF_flag}")
|
||
|
||
data_to_dataframe = {
|
||
"WaveNum": WaveNum,
|
||
"Spect_data": Spect_data,
|
||
"Spect_bLC": Spect_bLC,
|
||
"Spect_StB": Spect_StB
|
||
}
|
||
# 将数据转换为DataFrame格式
|
||
df = pd.DataFrame(data_to_dataframe)
|
||
self.save_data(df, file_name, save_root)
|
||
self.check_status()
|
||
|
||
|
||
def save_data(self, data: pd.DataFrame, file_name: str, save_root: str):
|
||
if not os.path.exists(save_root):
|
||
os.makedirs(save_root)
|
||
data.to_csv(os.path.join(save_root, f"{file_name}.csv"), index=False)
|
||
print(f"数据已保存到 {save_root}")
|
||
|
||
def opsky_cmd(self, command: str):
|
||
print(f"接收到命令: {command}")
|
||
# replace !=! to "
|
||
command = command.replace("!=!", "\"")
|
||
command = command.replace('\\', '\\\\')
|
||
command = command.replace("True", "true").replace("False", "false")
|
||
try:
|
||
cmd_dict = json.loads(command)
|
||
print(f"命令参数: {cmd_dict}")
|
||
# 解析命令参数
|
||
# file_name = cmd_dict.get("file_name", "test")
|
||
save_root = cmd_dict.get("save_root", r"D:\UniLab\results\250414")
|
||
# FIXME: use EIS for test. Add parameter for other tests
|
||
|
||
self.start_Raman(**cmd_dict) # , file_name=file_name, save_root=save_root
|
||
print(f"实验完成,数据已保存到 {save_root}")
|
||
except Exception as e:
|
||
print(f"命令执行失败: {e}")
|
||
raise f"error: {e}"
|
||
|