You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
7.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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