|
|
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()
|