Files
Uni-Lab-OS/unilabos/devices/heaterstirrer/dalong.py
Junhan Chang c78ac482d8 Initial commit
2025-04-17 15:19:47 +08:00

198 lines
6.0 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 serial
import time as systime
class HeaterStirrer_DaLong:
def __init__(self, port: str = 'COM6', temp_warning = 50.0, baudrate: int = 9600):
try:
self.serial = serial.Serial(port, baudrate, timeout=2)
except serial.SerialException as e:
print("串口错误", f"无法打开串口{port}: {e}")
self._status = "Idle"
self._stir_speed = 0.0
self._temp = 0.0
self._temp_warning = temp_warning
self.set_temp_warning(temp_warning)
self._temp_target = 20.0
self.success = False
@property
def status(self) -> str:
return self._status
def get_status(self) -> str:
self._status = "Idle" if self.stir_speed == 0 else "Running"
@property
def stir_speed(self) -> float:
return self._stir_speed
def set_stir_speed(self, speed: float):
try:
# 转换速度为整数
speed_int = int(speed)
# 确保速度在允许的范围内
if speed_int < 0 or speed_int > 65535:
raise ValueError("速度必须在0到65535之间")
except ValueError as e:
print("输入错误", str(e))
return
# 计算高位和低位
speed_high = speed_int >> 8
speed_low = speed_int & 0xFF
# 构建搅拌控制指令
command = bytearray([0xfe, 0xB1, speed_high, speed_low, 0x00])
# 计算校验和
command.append(sum(command[1:]) % 256)
# 发送指令
self.serial.write(command)
# 检查响应
response = self.serial.read(6)
if len(response) == 6 and response[0] == 0xfd and response[1] == 0xB1 and response[2] == 0x00:
print("成功", "搅拌速度更新成功")
self._stir_speed = speed
else:
print("失败", "搅拌速度更新失败")
def heatchill(
self,
vessel: str,
temp: float,
time: float = 3600,
stir: bool = True,
stir_speed: float = 300,
purpose: str = "reaction"
):
self.set_temp_target(temp)
if stir:
self.set_stir_speed(stir_speed)
self.status = "Stirring"
systime.sleep(time)
self.set_stir_speed(0)
self.status = "Idle"
@property
def temp(self) -> float:
self._temp = self.get_temp()
return self._temp
def get_temp(self):
# 构建读取温度的指令
command = bytearray([0xfe, 0xA2, 0x00, 0x00, 0x00])
command.append(sum(command[1:]) % 256)
# 发送指令
self.serial.write(command)
# 读取响应
systime.sleep(0.1)
num_bytes = self.serial.in_waiting
response = self.serial.read(num_bytes)
try:
high_value = response[8]
low_value = response[9]
raw_temp = (high_value << 8) + low_value
if raw_temp & 0x8000: # 如果低位寄存器最高位为1表示负值
raw_temp -= 0x10000 # 转换为正确的负数表示
temp = raw_temp / 10
return temp
except:
return None
@property
def temp_warning(self) -> float:
return self._temp_warning
def set_temp_warning(self, temp):
self.success = False
# temp = round(float(warning_temp), 1)
if self.set_temp_inner(float(temp), "warning"):
self._temp_warning = round(float(temp), 1)
self.success = True
@property
def temp_target(self) -> float:
return self._temp_target
def set_temp_target(self, temp):
self.success = False
# temp = round(float(target_temp), 1)
if self.set_temp_inner(float(temp), "target"):
self._temp_target = round(float(temp), 1)
self.success = True
def set_temp_inner(self, temp: float, type: str = "warning"):
try:
# 转换为整数
temp_int = int(temp*10)
except ValueError as e:
print("输入错误", str(e))
return
# 计算高位和低位
temp_high = temp_int >> 8
temp_low = temp_int & 0xFF
# 构建控制指令
if type == "warning":
command = bytearray([0xfe, 0xB4, temp_high, temp_low, 0x00])
elif type == "target":
command = bytearray([0xfe, 0xB2, temp_high, temp_low, 0x00])
else:
return False
# 计算校验和
command.append(sum(command[1:]) % 256)
print(command)
# 发送指令
self.serial.write(command)
# 检查响应
systime.sleep(0.1)
response = self.serial.read(6)
print(response)
if len(response) == 6 and response[0] == 0xfd and response[1] == 0xB4 and response[2] == 0x00:
print("成功", "安全温度设置成功")
return True
else:
print("失败", "安全温度设置失败")
return False
def close(self):
self.serial.close()
if __name__ == "__main__":
import tkinter as tk
from tkinter import messagebox
heaterstirrer = HeaterStirrer_DaLong()
# heaterstirrer.set_mix_speed(0)
heaterstirrer.get_temp()
# heaterstirrer.set_warning(17)
print(heaterstirrer.temp)
print(heaterstirrer.temp_warning)
# 创建主窗口
# root = tk.Tk()
# root.title("搅拌速度控制")
# # 创建速度变量
# speed_var = tk.StringVar()
# # 创建输入框
# speed_entry = tk.Entry(root, textvariable=speed_var)
# speed_entry.pack(pady=10)
# # 创建按钮
# set_speed_button = tk.Button(root, text="确定", command=heaterstirrer.set_mix_speed)
# # set_speed_button = tk.Button(root, text="确定", command=heaterstirrer.read_temp)
# set_speed_button.pack(pady=5)
# # 运行主事件循环
# root.mainloop()
# 关闭串口
heaterstirrer.serial.close()