Files
pqAutomationApp/utils/caSerail.py

181 lines
5.1 KiB
Python
Raw Normal View History

2026-04-16 16:51:05 +08:00
# -*- coding: UTF-8 -*-
import re
import time
from utils.baseSerail import BaseSerial
# from baseSerail import BaseSerial
import colour
class CASerail(BaseSerial):
def __init__(self):
BaseSerial.__init__(self)
def __del__(self):
self.close()
def checkport(self):
if not self.ser.is_open:
self.reOpen()
return self.ser.is_open
def sendcmd(self, cmd:str):
self.write(cmd.encode('utf-8'))
return self.read()
'''开启通讯'''
def startCommunication(self):
self.sendcmd('COM,1\r')
'''结束通讯'''
def endCommunication(self):
self.sendcmd('COM,0\r')
'''设置用于测量的校准通道'''
def setChannel(self, channel:str):
self.sendcmd('MCH,%s\r'%(channel))
'''
设置显示模式
'''
def setDisplayMode(self, mode:int):
return self.sendcmd('MDS,%d\r'%(mode))
'''设置显示模式为XYZ'''
def set_XYZ_Display(self):
return self.sendcmd('MDS,%d\r'%(7))
'''设置显示模式为xyLv'''
def set_xyLv_Display(self):
return self.sendcmd('MDS,%d\r'%(0))
'''设置显示模式为xyLv'''
def set_all_Display(self):
return self.sendcmd('MDS,%d\r'%(0))
def set_Display(self, mode:int):
'''
0: x,y,LV
1: Tcp,duv,LV
5: u,v,LV
7: X,Y,Z
8: λd,Pe,LV
'''
return self.sendcmd('MDS,%d\r'%(mode))
'''
设置同步模式和同步频率
'''
def setSynchMode(self, mode: int, freq: int = None):
if freq == None:
return self.sendcmd('SCS,%d\r'%(mode))
else:
return self.sendcmd('SCS,%d,%d\r'%(mode,freq))
'''
设置测量速度
'''
def setMeasureSpeed(self, speed: int):
return self.sendcmd('FSC,%d\r'%(speed))
'''执行零点校准'''
def setZeroCalibration(self):
return self.sendcmd('ZRC\r')
'''读取当前显示模式下的三值'''
def readDisplay(self):
data = self.sendcmd('MES\r')
x,y,z = self.__get_display_data(data.decode('utf-8'))
return float(x), float(y), float(z)
'''获取当前显示模式值'''
def __get_display_data(self, data):
p = re.compile(r"(\D*)(\d+),P1 (.*);(.*);(.*)", re.DOTALL)
mo = p.search(data)
if mo is None:
print("无匹配正则")
pw = re.compile(r"(\D*)(\d+)", re.DOTALL)
mo = pw.search(data)
if mo is None:
# print("短匹配失败")
return None, None, None
else:
return None, None, None
else:
# print(mo.group(1), mo.group(2), mo.group(3), mo.group(4), mo.group(5))
return mo.group(3), mo.group(4), mo.group(5)
'''读取所有数据'''
def readAllDisplay(self):
data = self.sendcmd('MES,2\r')
x,y,lv,X,Y,Z = self.__get_all_display_data(data.decode('utf-8'))
return float(x), float(y), float(lv), float(X), float(Y), float(Z)
'''获取所有显示模式值'''
def __get_all_display_data(self, data):
p = re.compile(r"(\D*)(\d+),P1,(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)", re.DOTALL)
mo = p.search(data)
if mo is None:
return None, None, None, None, None, None
else:
return mo.group(4), mo.group(5), mo.group(6), mo.group(9), mo.group(10), mo.group(11)
def xyY_to_XYZ( x, y, Y):
X = x * Y / y
Z = (1 - x - y) * Y / y
return X, Y, Z
def XYZ_to_lambda_pe(XYZ, illuminant='D65'):
xy = colour.XYZ_to_xy(XYZ)
white = colour.CCS_ILLUMINANTS['CIE 1931 2 Degree Standard Observer'][illuminant]
λd, comp, xy_intersection = colour.dominant_wavelength(xy, white)
Pe = colour.excitation_purity(xy, white)
return xy, λd, comp, Pe
def test_ca410():
print('\r\rtest ca410\r\r')
ca = CASerail()
ca.open("COM3", 19200, 7, 'E', 2)
ca.startCommunication()
ca.setSynchMode(3)
ca.setMeasureSpeed(2)
ca.setZeroCalibration()
ca.setChannel('01')
ca.set_Display(0)
xyYXYZ = ca.readAllDisplay()
print(f"xyYXYZ: {xyYXYZ}")
XYZ = xyYXYZ[3], xyYXYZ[4], xyYXYZ[5]
xy = colour.XYZ_to_xy(XYZ)
print(f"xy: {xy}")
ca.set_Display(1)
tcpduvlvXYZ = ca.readAllDisplay()
print(f"tcpduvlvXYZ: {tcpduvlvXYZ}")
XYZ = tcpduvlvXYZ[3], tcpduvlvXYZ[4], tcpduvlvXYZ[5]
xy = colour.XYZ_to_xy(XYZ)
TCP = colour.temperature.xy_to_CCT(xy, 'Hernandez 1999')
print(f"TCP: {TCP}K")
ca.set_Display(5)
uvlvXYZ = ca.readAllDisplay()
print(f"uvlvXYZ: {uvlvXYZ}")
XYZ = uvlvXYZ[3], uvlvXYZ[4], uvlvXYZ[5]
xy = colour.XYZ_to_xy(XYZ)
u_prime, v_prime, _ = colour.XYZ_to_CIE1976UCS(XYZ)
print(f"u': {u_prime}, v': {v_prime}")
ca.set_Display(8)
lambdaPeXYZ = ca.readAllDisplay()
print(f"lambdaPeXYZ: {lambdaPeXYZ}")
XYZ = lambdaPeXYZ[3], lambdaPeXYZ[4], lambdaPeXYZ[5]
xy, λd, isComplementary, Pe = XYZ_to_lambda_pe(XYZ)
print(f"xy: {xy}, λd: {λd}, isComplementary: {isComplementary}, Pe: {Pe}")
ca.endCommunication()
# test_ca410()