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

67 lines
2.0 KiB
Python

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)