mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2025-12-17 04:51:10 +00:00
Initial commit
This commit is contained in:
0
unilabos/devices/temperature/__init__.py
Normal file
0
unilabos/devices/temperature/__init__.py
Normal file
67
unilabos/devices/temperature/chiller.py
Normal file
67
unilabos/devices/temperature/chiller.py
Normal file
@@ -0,0 +1,67 @@
|
||||
import json
|
||||
import serial
|
||||
|
||||
class Chiller():
|
||||
# def xuanzheng_temp_set(tempset: int):
|
||||
# 设置目标温度
|
||||
def __init__(self, port,rate=9600):
|
||||
self.T_set = 24
|
||||
self.success = True
|
||||
self.ser = serial.Serial(
|
||||
port=port,
|
||||
baudrate=rate,
|
||||
bytesize=8,
|
||||
parity='N',
|
||||
stopbits=1,
|
||||
timeout=1
|
||||
)
|
||||
|
||||
def modbus_crc(self, data: bytes) -> bytes:
|
||||
crc = 0xFFFF
|
||||
for pos in data:
|
||||
crc ^= pos
|
||||
for _ in range(8):
|
||||
if (crc & 0x0001) != 0:
|
||||
crc >>= 1
|
||||
crc ^= 0xA001
|
||||
else:
|
||||
crc >>= 1
|
||||
return crc.to_bytes(2, byteorder='little')
|
||||
|
||||
def build_modbus_frame(self,device_address: int, function_code: int, register_address: int, value: int) -> bytes:
|
||||
frame = bytearray([
|
||||
device_address,
|
||||
function_code,
|
||||
(register_address >> 8) & 0xFF,
|
||||
register_address & 0xFF,
|
||||
(value >> 8) & 0xFF,
|
||||
value & 0xFF
|
||||
])
|
||||
crc = self.modbus_crc(frame)
|
||||
return frame + crc
|
||||
|
||||
def convert_temperature_to_modbus_value(self, temperature: float, decimal_points: int = 1) -> int:
|
||||
factor = 10 ** decimal_points
|
||||
value = int(temperature * factor)
|
||||
return value & 0xFFFF
|
||||
|
||||
def set_temperature(self, command):
|
||||
T_set = json.loads(command)['temperature']
|
||||
self.T_set = int(T_set)
|
||||
self.success = False
|
||||
|
||||
temperature_value = self.convert_temperature_to_modbus_value(self.T_set, decimal_points=1)
|
||||
device_address = 0x01
|
||||
function_code = 0x06
|
||||
register_address = 0x000B
|
||||
frame = self.build_modbus_frame(device_address, function_code, register_address, temperature_value)
|
||||
self.ser.write(frame)
|
||||
response = self.ser.read(8)
|
||||
self.success = True
|
||||
|
||||
def stop(self):
|
||||
self.set_temperature(25)
|
||||
|
||||
if __name__ == '__main__':
|
||||
ch = Chiller(port='COM17')
|
||||
ch.set_temperature(20)
|
||||
69
unilabos/devices/temperature/prototype_sensor.py
Normal file
69
unilabos/devices/temperature/prototype_sensor.py
Normal file
@@ -0,0 +1,69 @@
|
||||
import serial
|
||||
import struct
|
||||
|
||||
class TempSensor:
|
||||
def __init__(self,port,baudrate=9600):
|
||||
|
||||
# 配置串口
|
||||
self.ser = serial.Serial(
|
||||
port=port,
|
||||
baudrate=baudrate,
|
||||
bytesize=serial.EIGHTBITS,
|
||||
parity=serial.PARITY_NONE,
|
||||
stopbits=serial.STOPBITS_ONE,
|
||||
timeout=1
|
||||
)
|
||||
|
||||
def calculate_crc(self,data):
|
||||
crc = 0xFFFF
|
||||
for pos in data:
|
||||
crc ^= pos
|
||||
for i in range(8):
|
||||
if (crc & 0x0001) != 0:
|
||||
crc >>= 1
|
||||
crc ^= 0xA001
|
||||
else:
|
||||
crc >>= 1
|
||||
return crc
|
||||
|
||||
def build_modbus_request(self, device_id, function_code, register_address, register_count):
|
||||
request = struct.pack('>BBHH', device_id, function_code, register_address, register_count)
|
||||
crc = self.calculate_crc(request)
|
||||
request += struct.pack('<H', crc)
|
||||
return request
|
||||
|
||||
def read_modbus_response(self,response):
|
||||
if len(response) < 5:
|
||||
return None
|
||||
data = response[:-2]
|
||||
crc_received = struct.unpack('<H', response[-2:])[0]
|
||||
crc_calculated = self.calculate_crc(data)
|
||||
if crc_received == crc_calculated:
|
||||
return data[3:]
|
||||
return None
|
||||
|
||||
def send_command(self ,command):
|
||||
function_code = 0x04 # 读输入寄存器
|
||||
register_address = 0x0003 # 温度高位寄存器地址
|
||||
register_count = 0x0002 # 读取两个寄存器
|
||||
|
||||
request = self.build_modbus_request(command, function_code, register_address, register_count)
|
||||
self.ser.write(request)
|
||||
response = self.ser.read(9) # 读取9字节的响应
|
||||
|
||||
data = self.read_modbus_response(response)
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
high_value = struct.unpack('>H', data[:2])[0]
|
||||
low_value = struct.unpack('>H', data[2:])[0]
|
||||
|
||||
# 组合高位和低位并计算实际温度
|
||||
raw_temperature = (high_value << 16) | low_value
|
||||
if raw_temperature & 0x8000: # 如果低位寄存器最高位为1,表示负值
|
||||
raw_temperature -= 0x10000 # 转换为正确的负数表示
|
||||
|
||||
actual_temperature = raw_temperature / 10.0
|
||||
return actual_temperature
|
||||
|
||||
|
||||
90
unilabos/devices/temperature/sensor.py
Normal file
90
unilabos/devices/temperature/sensor.py
Normal file
@@ -0,0 +1,90 @@
|
||||
import serial
|
||||
import time
|
||||
import struct
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
|
||||
# 配置串口
|
||||
ser = serial.Serial(
|
||||
port='COM13',
|
||||
baudrate=9600,
|
||||
bytesize=serial.EIGHTBITS,
|
||||
parity=serial.PARITY_NONE,
|
||||
stopbits=serial.STOPBITS_ONE,
|
||||
timeout=1
|
||||
)
|
||||
|
||||
def calculate_crc(data):
|
||||
crc = 0xFFFF
|
||||
for pos in data:
|
||||
crc ^= pos
|
||||
for i in range(8):
|
||||
if (crc & 0x0001) != 0:
|
||||
crc >>= 1
|
||||
crc ^= 0xA001
|
||||
else:
|
||||
crc >>= 1
|
||||
return crc
|
||||
|
||||
def build_modbus_request(device_id, function_code, register_address, register_count):
|
||||
request = struct.pack('>BBHH', device_id, function_code, register_address, register_count)
|
||||
crc = calculate_crc(request)
|
||||
request += struct.pack('<H', crc)
|
||||
return request
|
||||
|
||||
def read_modbus_response(response):
|
||||
if len(response) < 5:
|
||||
return None
|
||||
data = response[:-2]
|
||||
crc_received = struct.unpack('<H', response[-2:])[0]
|
||||
crc_calculated = calculate_crc(data)
|
||||
if crc_received == crc_calculated:
|
||||
return data[3:]
|
||||
return None
|
||||
|
||||
def read_temperature():
|
||||
device_id = 0xC0 # 设备地址
|
||||
function_code = 0x04 # 读输入寄存器
|
||||
register_address = 0x0003 # 温度高位寄存器地址
|
||||
register_count = 0x0002 # 读取两个寄存器
|
||||
|
||||
request = build_modbus_request(device_id, function_code, register_address, register_count)
|
||||
ser.write(request)
|
||||
response = ser.read(9) # 读取9字节的响应
|
||||
|
||||
data = read_modbus_response(response)
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
high_value = struct.unpack('>H', data[:2])[0]
|
||||
low_value = struct.unpack('>H', data[2:])[0]
|
||||
|
||||
# 组合高位和低位并计算实际温度
|
||||
raw_temperature = (high_value << 16) | low_value
|
||||
if raw_temperature & 0x8000: # 如果低位寄存器最高位为1,表示负值
|
||||
raw_temperature -= 0x10000 # 转换为正确的负数表示
|
||||
|
||||
actual_temperature = raw_temperature / 10.0
|
||||
return actual_temperature
|
||||
|
||||
def update_temperature_label():
|
||||
temperature = read_temperature()
|
||||
if temperature is not None:
|
||||
temperature_label.config(text=f"反应温度: {temperature:.1f} °C")
|
||||
else:
|
||||
temperature_label.config(text="Error reading temperature")
|
||||
root.after(1000, update_temperature_label) # 每秒更新一次
|
||||
|
||||
# 创建主窗口
|
||||
root = tk.Tk()
|
||||
root.title("反应温度监控")
|
||||
|
||||
# 创建标签来显示温度
|
||||
temperature_label = ttk.Label(root, text="反应温度: -- °C", font=("Helvetica", 20))
|
||||
temperature_label.pack(padx=20, pady=20)
|
||||
|
||||
# 开始更新温度
|
||||
update_temperature_label()
|
||||
|
||||
# 运行主循环
|
||||
root.mainloop()
|
||||
117
unilabos/devices/temperature/sensor_node.py
Normal file
117
unilabos/devices/temperature/sensor_node.py
Normal file
@@ -0,0 +1,117 @@
|
||||
import json
|
||||
import threading,time
|
||||
|
||||
# class TempSensorNode:
|
||||
# def __init__(self,port,warning,address):
|
||||
# self._value = 0.0
|
||||
# self.warning = warning
|
||||
# self.device_id = address
|
||||
|
||||
# self.hardware_interface = port
|
||||
# # t = threading.Thread(target=self.read_temperature, daemon=True)
|
||||
# # t.start()
|
||||
|
||||
# def send_command(self ,command):
|
||||
# print('send_command---------------------')
|
||||
# pass
|
||||
|
||||
# @property
|
||||
# def value(self) -> float:
|
||||
# self._value = self.send_command(self.device_id)
|
||||
# return self._value
|
||||
# # def read_temperature(self):
|
||||
# # while True:
|
||||
# # self.value = self.send_command(self.device_id)
|
||||
# # print(self.value,'-----------')
|
||||
# # time.sleep(1)
|
||||
|
||||
# def set_warning(self, warning_temp):
|
||||
# self.warning = warning_temp
|
||||
|
||||
|
||||
|
||||
import serial
|
||||
import struct
|
||||
from rclpy.node import Node
|
||||
import rclpy
|
||||
import threading
|
||||
|
||||
class TempSensorNode():
|
||||
def __init__(self,port,warning,address,baudrate=9600):
|
||||
self._value = 0.0
|
||||
self.warning = warning
|
||||
self.device_id = address
|
||||
self.success = False
|
||||
# 配置串口
|
||||
self.hardware_interface = serial.Serial(
|
||||
port=port,
|
||||
baudrate=baudrate,
|
||||
bytesize=serial.EIGHTBITS,
|
||||
parity=serial.PARITY_NONE,
|
||||
stopbits=serial.STOPBITS_ONE,
|
||||
timeout=1
|
||||
)
|
||||
self.lock = threading.Lock()
|
||||
|
||||
def calculate_crc(self,data):
|
||||
crc = 0xFFFF
|
||||
for pos in data:
|
||||
crc ^= pos
|
||||
for i in range(8):
|
||||
if (crc & 0x0001) != 0:
|
||||
crc >>= 1
|
||||
crc ^= 0xA001
|
||||
else:
|
||||
crc >>= 1
|
||||
return crc
|
||||
|
||||
def build_modbus_request(self, device_id, function_code, register_address, register_count):
|
||||
request = struct.pack('>BBHH', device_id, function_code, register_address, register_count)
|
||||
crc = self.calculate_crc(request)
|
||||
request += struct.pack('<H', crc)
|
||||
return request
|
||||
|
||||
def read_modbus_response(self,response):
|
||||
if len(response) < 5:
|
||||
return None
|
||||
data = response[:-2]
|
||||
crc_received = struct.unpack('<H', response[-2:])[0]
|
||||
crc_calculated = self.calculate_crc(data)
|
||||
if crc_received == crc_calculated:
|
||||
return data[3:]
|
||||
return None
|
||||
|
||||
def send_prototype_command(self ,command):
|
||||
# with self.lock:
|
||||
function_code = 0x04 # 读输入寄存器
|
||||
register_address = 0x0003 # 温度高位寄存器地址
|
||||
register_count = 0x0002 # 读取两个寄存器
|
||||
|
||||
request = self.build_modbus_request(command, function_code, register_address, register_count)
|
||||
self.hardware_interface.write(request)
|
||||
response = self.hardware_interface.read(9) # 读取9字节的响应
|
||||
data = self.read_modbus_response(response)
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
high_value = struct.unpack('>H', data[:2])[0]
|
||||
low_value = struct.unpack('>H', data[2:])[0]
|
||||
|
||||
# 组合高位和低位并计算实际温度
|
||||
raw_temperature = (high_value << 16) | low_value
|
||||
if raw_temperature & 0x8000: # 如果低位寄存器最高位为1,表示负值
|
||||
raw_temperature -= 0x10000 # 转换为正确的负数表示
|
||||
|
||||
actual_temperature = raw_temperature / 10.0
|
||||
return actual_temperature
|
||||
|
||||
@property
|
||||
def value(self) -> float:
|
||||
self._value = self.send_prototype_command(self.device_id)
|
||||
return self._value
|
||||
|
||||
def set_warning(self, command):
|
||||
self.success = False
|
||||
temp = json.loads(command)["warning_temp"]
|
||||
self.warning = round(float(temp), 1)
|
||||
self.success = True
|
||||
Reference in New Issue
Block a user