import os import time import json import ctypes import threading from ctypes import * from datetime import datetime from app.conf.Setting import settings from app.lib.Utils import Utils from app.lib.StaticData import data_lists, StatusDict, Flag from app.lib.Log import logger class VK70xUMCDAQ(): def __init__(self): self.Record ='' # 试验id self.pressure=None # 压力 self.temperature=None # 温度 self.theadPID = None # 采集线程 self.recordFlag = False # 是否开始记录及开启N采集模式 self.recordIndex = 0 # 当前记录数量 self.recordTemp1Data = [] # 温度值,压力值 # self.recordTemp2Data = [] # 压力值 self.origin_data = [] def save_data(self): dir_path = os.path.join(settings.BASE_PATH, f"resource/{self.Record}/") if not os.path.exists(dir_path): os.mkdir(dir_path) with open(os.path.join(dir_path, "temp.json"), 'w', encoding="utf-8") as f: f.write(str(self.recordTemp1Data)) with open(os.path.join(dir_path, "origin_data.json"), "w", encoding="utf-8") as f1: f1.write(str(self.origin_data)) logger.debug("数据保存完成") def start(self): self.theadPID = None time.sleep(1) if not self.theadPID: self.theadPID = threading.Thread(target=self.startThread) self.theadPID.start() def startRecord(self): self.recordTemp1Data = [] # self.recordTemp2Data = [] self.recordIndex = 0 self.recordFlag = True def stopRecord(self): self.recordFlag = False def read(self): return self.pressure, self.temperature def startThread(self): vk70xnhdll = windll.LoadLibrary('./VK70xUMC_DAQ2.dll') ret = vk70xnhdll.USBDev_Open()#打开usb端口 connectedclientnum = c_long(0) keepLoopRunning = c_long(0) if self.recordFlag: SAMPLINGFREQUENCY =settings.SAMPLINGFREQUENCY else: SAMPLINGFREQUENCY =settings.SAMPLINGFREQUENCY1 if ret < 0: logger.error('USB 端口异常或已被占用!') return keepLoopRunning = 1 while keepLoopRunning: time.sleep(0.1) ret = vk70xnhdll.USBDev_Get_ConnectedClientNumbers(byref(connectedclientnum)) # 读取已连接采集卡数量 logger.debug(f'连接到当前服务器的DAQ设备数: {connectedclientnum.value}') if connectedclientnum.value > 0: keepLoopRunning = 0 time.sleep(0.1) if connectedclientnum.value>0: logger.debug('准备安装DAQ') keepLoopRunning = 1 #VK70xUMC_InitializeAll方法参数 paraInitialize = (ctypes.c_int32 * 20)() for i in range(20): paraInitialize[i] = 0 paraInitialize[0] = 0x22 # 采样命令 paraInitialize[1] = SAMPLINGFREQUENCY # 采样率 # paraInitialize[1] = 20000 # 采样率 paraInitialize[12] = 1 # 通道1压力开启IEPE paraInitialize[4] = 1 # 通道1压力-5V~5V paraInitialize[5] = 5 # 通道2温度-100mV~100mV ret = vk70xnhdll.VK70xUMC_InitializeAll(0, paraInitialize, 20) #初始化参数 if ret < 0: keepLoopRunning = 0 logger.error(f'参数初始化失败! {ret}') else: logger.debug(f'参数初始化成功! {ret}') time.sleep(0.1) ret = vk70xnhdll.VK70xUMC_Set_AdditionalFeature(0, 23, 2, 0) #设置IO3为输入状态 if ret < 0: keepLoopRunning = 0 logger.error(f'IO3输入状态设置失败! {ret}') else: logger.debug(f'IO3输入状态设置成功! {ret}') time.sleep(0.1) if self.recordFlag == False: ret = vk70xnhdll.VK70xUMC_Set_AdditionalFeature(0, 21, 1, 0) #设置IO1为高电平 if ret < 0: keepLoopRunning = 0 logger.error(f'设置IO1为高电平失败! {ret}') else: logger.debug(f'设置IO1为高电平成功! {ret}') time.sleep(0.1) ret = vk70xnhdll.VK70xUMC_StartSampling(0)#开始连续采样 else: ret = vk70xnhdll.VK70xUMC_Set_AdditionalFeature(0, 21, 0, 0) # 设置IO1为低电平 if ret < 0: keepLoopRunning = 0 logger.error(f'设置IO1为低电平失败! {ret}') else: logger.debug(f'设置IO1为低电平成功! {ret}') ret = vk70xnhdll.VK70xUMC_StartSampling_NPoints(0,settings.GETPOINTS) # 固定采样总数N if ret < 0: keepLoopRunning = 0 logger.error(f'采集异常! {ret}') else: logger.debug(f'开始采集! {ret}') num = SAMPLINGFREQUENCY * 4 data_buffer = (c_double * num)() warning = 0 ending = 0 while keepLoopRunning and Flag["SHIYAN_Flag"]: time.sleep(0.1) collect_num = vk70xnhdll.VK70xUMC_GetFourChannel(0, data_buffer, SAMPLINGFREQUENCY) # 读取采样数据 datas = [data_buffer[i:i+4] for i in range(0, len(data_buffer), 4)] IO4_buffer = (c_int * 1)(3) ret = vk70xnhdll.VK70xUMC_Get_IO4(0, IO4_buffer) # 读取IO4高低电平 if ret < 0: warning += 1 if warning >= 10: keepLoopRunning = 0 logger.error(f'获取IO4电平异常! {ret}') logger.debug(f"数据长度: {len(datas)}, 采样点数:{collect_num}, IO4电平: {IO4_buffer[0]}, recordFlag: {self.recordFlag}") if IO4_buffer[0] == 0: if self.recordFlag == False:#低电平,连续采集(切换模式) logger.debug("==================== 切换采集模式 ================") keepLoopRunning = 0 self.startRecord() self.start() break if collect_num > 0: for i in range(int(collect_num)): burnTem = datas[i] pressure = burnTem[0] # 压力 temperature = burnTem[1] # 温度 # 转换数据 data, k, b, index, temperature = Utils.binary_search(data_lists, 0, len(data_lists)-1, temperature * 1000) self.temperature = temperature self.pressure = pressure if StatusDict['temperature']: self.temperature = temperature + float(StatusDict['temperature']) self.pressure = pressure / settings.K * 1000 if IO4_buffer[0] == 0 and self.recordFlag == True: self.recordIndex += 1 self.origin_data.append(burnTem) self.recordTemp1Data.append([self.recordIndex, self.temperature, self.pressure]) if self.recordFlag == True and collect_num == 0: # N采集,采集数量0(采集结束关闭) ending += 1 if ending >= 2: logger.debug(f'采集数量: {self.recordIndex}') self.save_data() keepLoopRunning = 0 self.stopRecord() time.sleep(0.1) ret = vk70xnhdll.VK70xUMC_StopSampling(0) # 停止当前采集卡采样 time.sleep(0.1) self.theadPID = None logger.debug('关闭端口!') if __name__ =='__main__': tempCollect=VK70xUMCDAQ() tempCollect.start()