Files
Uni-Lab-OS/unilabos/devices/raman_uv/opsky_ATR30007.py

115 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}"