geiyao/geiyao.py
WIN-T9V3LPE8NK2\Administrator e3f0663954 最新版给药算法
2025-06-18 14:47:20 +08:00

996 lines
39 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import time
import math
import numpy as np
import pandas as pd
import pymysql
import datetime
from torch import device, cuda, zeros, from_numpy, load
from torch.nn import LSTM,Linear,Module
device = device("cuda" if cuda.is_available() else "cpu")
df = pd.read_csv('./information.txt',sep=',',header=None)
name = df.iloc[0,0]
dbname = str(name)
#####计算BMI,肥胖患者需要调整
def weight(sex, high, weight):
BMI = weight / (high / 100 * high / 100)
if (BMI > 30):
if (sex == "M"):
jiao_weight = high - 100 + 0.4 * (weight - (high - 100))
lixiang_weight = high - 100
else:
jiao_weight = high - 105 + 0.4 * (weight - (high - 105))
lixiang_weight = high - 105
else:
jiao_weight = weight
lixiang_weight = weight
return jiao_weight, lixiang_weight
def ku_patient():
while(1):
try:
conn3 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4', db=dbname,port=3306,connect_timeout= 60)
cur3 = conn3.cursor()
sql = ' SELECT * FROM patienttable ORDER BY id DESC LIMIT 1'
cur3.execute(sql)
results = cur3.fetchall()
if len(results) == 0:
print('PatientTable is None!')
time.sleep(2)
else:
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
global a1
a1 = np.array(results)
a1 = a1.reshape(16)
conn3.commit()
cur3.close()
conn3.close()
return a1
patient = ku_patient()
high = patient[5]
weight1 = patient[4]
sex = patient[2]
weight1, weight2 = weight(sex, high, weight1)
######################################获取featuretable数据#############################################################
def ku_data():
while(1):
try:
conn2 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4', db=dbname,port=3306,connect_timeout= 60)
cur2 = conn2.cursor()
sql = ' SELECT * FROM featuretable ORDER BY id DESC LIMIT 1'
cur2.execute(sql)
results = cur2.fetchall()
id = results[0][0]
ID[1] = id
if ID[0] == ID[1] or len(results) == 0:
pass
elif ID[0] != ID[1]:
ID[0] = ID[1]
ID[1] = 0
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
global a
a = np.array(results)
a = a.reshape(15)
conn2.commit()
cur2.close()
conn2.close()
return a
##############################40<BIS<60时进行调整
def CHO_BIS(CHO, BIS):
if BIS > 60:
CHO_NOW = CHO + 10
elif 0 < BIS < 40:
CHO_NOW = CHO - 10
return CHO_NOW
##############################血压###############
def BP_data(SBP, DBP, MAP):
xy = -1 ##### 0代表正常、1代表高血压、2代表低血压、-1代表血压不在判断范围内
# MAP = (SBP + 2*DBP)/3
if (SBP > 130 and DBP >=60) or (80 <= SBP <= 130 and DBP>90):
xy = 1
elif SBP >=80 and 0 < DBP < 60 :
if MAP > 110 :
xy = 1
elif 0 < MAP < 60:
xy = 2
elif 60 <= MAP <= 110:
xy = 0
elif 80 <= SBP <= 130 and 60 <= DBP <= 90:
xy = 0
elif 0 < SBP < 80 and 0 < DBP <= 90:
xy = 2
return xy
#############################读取连续1min的HR去掉零值判读其趋势
def HR_data(b):
b_flag = 0
while(1):
try:
conn4 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
cur4 = conn4.cursor()
sql = ' SELECT * FROM featuretable ORDER BY id DESC LIMIT %d' % (60)
cur4.execute(sql)
results = cur4.fetchall()
global a
a = np.array(results)
conn4.commit()
cur4.close()
conn4.close()
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
filtered_data = [x for x in a[:, 3] if x != 0]
if len(filtered_data) == 0:
b_flag = 2
if b==1:
for i in range(len(filtered_data)):
if filtered_data[i] > 89:
b_flag=1
else:
b_flag=0
break
else:
for i in range(len(filtered_data)):
if (0 < filtered_data[i] < 46):
b_flag=1
else:
b_flag=0
break
return b_flag
#############################读取连续10条BIS值用于LSTM的BIS预测算法BIS值不足10条时将对已有数据进行复制
def Feature_data():
while(1):
try:
conn9 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
cur9 = conn9.cursor()
sql = ' SELECT BIS FROM featuretable ORDER BY id DESC LIMIT %d ' % (10)
cur9.execute(sql)
results = cur9.fetchall()
global a
a = np.array(results)
if len(a) < 10:
repeat_count = math.ceil((10 - len(a)) / len(a)) + 1
final_results = a.repeat(repeat_count)
final_results = np.array(final_results[:10]).reshape(10, 1)
a = final_results[::-1, :]
a = (a - 40) / 20
a = a.reshape(a.shape[0], a.shape[1], 1)
conn9.commit()
cur9.close()
conn9.close()
break
else:
a = a[::-1, :]
a = (a-40)/20
a = a.reshape(a.shape[0],a.shape[1],1)
conn9.commit()
cur9.close()
conn9.close()
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
return a
# 丙泊酚最大速度与最小速度
CHO_max = 120 # ug/kg/min
CHO_min = 60
# 瑞芬太尼最大速度与最小速度
REM_max = 0.3 # ug/kg/min
REM_min = 0.1
# 顺阿曲库铵最大速度与最小速度
ROC_max = 2 # ug/kg/min
ROC_min = 1 # ug/kg/min
# 罗库溴铵最大速度与最小速度
RB_max = 12 # ug/kg/min
RB_min = 9 # ug/kg/min
# 丙泊酚、瑞芬太尼以及顺阿曲库铵的正常浓度
re_CHO = 90 # ug/kg/min
re_REM = 0.2 # ug/kg/min
re_ROC = 1.5 # ug/kg/min
re_RB = 10 # ug/kg/min
# 7种药的浓度又称规格
CHO_con=10 #mg/ml
REM_con=0.1 #mg/ml
ROC_con=1 #mg/ml
EPH_con=3 #mg/ml 麻黄素
NIC_con=0.5 #mg/ml 尼卡地平
ESM_con=10 #mg/ml 艾司洛尔
ATR_con=0.2 #mg/ml 阿托品
RB_con = 2.5 #mg/ml 罗库溴铵
# 目前速度或剂量,初始化为正常速度
now_CHO = re_CHO
now_REM = re_REM
now_ROC = re_ROC
now_RB = re_RB
now_NIC = 0
now_EPH = 0
now_ESM = 0
now_ATR = 0
# 关于药物时间间隔生效时间的计数或给药次数bi
bis_count = 0
pre_bis_count = 0
NIC_count = 0
EPH_count = 0
TOF_count = 0
HRS_count = 0 #慢心率计数
HRD_count = 0 #快心率计数
ESM_count = 0
ATR_count = 0
REMSS_count = 0 #瑞芬太尼加药时间间隔的计数
REMDD_count = 0 #瑞芬太尼减药时间间隔的计数
REMS_count = 0 #瑞芬太尼加药给药次数
REMD_count = 0 #瑞芬太尼减药给药次数
flag = 0 #判别症状标志 0为正常状态 1为BIS异常当丙泊酚输注速率达到最大速率或最小速率视为BIS异常
bis_flag = 0 #丙泊酚初次判断标志 0为正常状态 1为异常则进入BIS药物间隔时间计数
flag1 = 0 #高血压或低血压两次给药无效则转瑞芬太尼 1为转瑞芬太尼
flag2 = 0 #快心率或慢心率两次给药无效则转瑞芬太尼 1为转瑞芬太尼
flag4 = 0 #TOF 连续两次加药无效,转人工 1代表转人工
xueya_flag = 0 #血压标志: 0为正常 1为高血压 2为低血压
xinlv_flag = 0 #心率标志0为正常 1为快心率 2为慢心率
REM_flag = 0 #瑞芬太尼初次判断标志 0为正常状态 1为异常则进入瑞芬太尼药物间隔时间计数
TOF_flag = 0 #TOF初次判断标志 0为正常状态 1为异常
gaoxue_count = 0 #高血压时间间隔计数(暂关闭)
dixue_count = 0 #低血压时间间隔计数(暂关闭)
gaoxue_cishu = 0 #测得高血压的次数
dixue_cishu = 0 #测得低血压的次数
rem_gaoxue_cishu = 0 #转瑞芬太尼后,测得高血压的次数
rem_dixue_cishu = 0 #转瑞芬太尼后,测得低血压的次数
CHO_unit = 2.5 #40<BIS<60调整单位
ID = [0,0] #判断是否为上一个值
BP_flag = 0 #### 1代表有创 2代表无创
jisong = 2 ##### 1代表罗库溴铵 2代表顺阿曲库铵
#################### 定义 LSTM 模型
class LSTMModel(Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(LSTMModel, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.lstm = LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = Linear(hidden_size, output_size)
def forward(self, x):
h0 = zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
c0 = zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
x = x.float()
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :])
return out
while(1):
try:
conn5 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
#判断手术是否结束1代表手术进行中0代表手术结束
sql = ' SELECT Flag FROM endflagtable ORDER BY id DESC LIMIT 1'
cur5 = conn5.cursor()
cur5.execute(sql)
results = cur5.fetchall()
results = np.array(results)
conn5.commit()
# sql1 = ' SELECT 罗库 FROM selecttable'
# cur5 = conn5.cursor()
# cur5.execute(sql1)
# temp = cur5.fetchall()
# temp = np.array(temp)
# conn5.commit()
# if np.isin(1, temp):
# jisong = 1
# break
# elif np.isin(2, temp):
# jisong = 2
# break
cur5.close()
conn5.close()
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
############### 维持期程序
while(results):
while(1):
try:
conn6 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306,connect_timeout= 60)
cur6 = conn6.cursor()
sql = ' SELECT Flag FROM endflagtable ORDER BY id DESC LIMIT 1'
cur6.execute(sql)
results = cur6.fetchall()
results = np.array(results)
conn6.commit()
if BP_flag == 0:
sql1 = ' SELECT 有创 FROM selecttable ORDER BY id DESC LIMIT 1'
cur6 = conn6.cursor()
cur6.execute(sql1)
temp1 = cur6.fetchall()
temp1 = np.array(temp1)
conn6.commit()
if temp1 == 1:
BP_flag = 1
elif temp1 == 2:
BP_flag = 2
# if np.isin(1, temp1):
# BP_flag = 1
# elif np.isin(2, temp1):
# BP_flag = 2
cur6.close()
conn6.close()
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
while(1):
try:
conn10 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306,connect_timeout= 60)
cur10 = conn10.cursor()
sql = ' SELECT Flag FROM aiflagtable ORDER BY id DESC LIMIT 1'
cur10.execute(sql)
ai_flag = cur10.fetchall()
ai_flag = np.array(ai_flag)
if ai_flag == 0:
# 目前速度或剂量,初始化为正常速度
now_CHO = re_CHO
now_REM = re_REM
now_ROC = re_ROC
now_RB = re_RB
now_NIC = 0
now_EPH = 0
now_ESM = 0
now_ATR = 0
# 关于药物时间间隔(生效时间)的计数或给药次数
bis_count = 0
pre_bis_count = 0
NIC_count = 0
EPH_count = 0
TOF_count = 0
HRS_count = 0 # 慢心率计数
HRD_count = 0 # 快心率计数
ESM_count = 0
ATR_count = 0
REMSS_count = 0 # 瑞芬太尼加药时间间隔的计数
REMDD_count = 0 # 瑞芬太尼减药时间间隔的计数
REMS_count = 0 # 瑞芬太尼加药给药次数
REMD_count = 0 # 瑞芬太尼减药给药次数
flag = 0 # 判别症状标志 0为正常状态 1为BIS异常当丙泊酚输注速率达到最大速率或最小速率视为BIS异常
bis_flag = 0 # 丙泊酚初次判断标志 0为正常状态 1为异常则进入BIS药物间隔时间计数
flag1 = 0 # 高血压或低血压两次给药无效则转瑞芬太尼 1为转瑞芬太尼
flag2 = 0 # 快心率或慢心率两次给药无效则转瑞芬太尼 1为转瑞芬太尼
flag4 = 0 # TOF 连续两次加药无效,转人工 1代表转人工
xueya_flag = 0 # 血压标志: 0为正常 1为高血压 2为低血压
xinlv_flag = 0 # 心率标志0为正常 1为快心率 2为慢心率
REM_flag = 0 # 瑞芬太尼初次判断标志 0为正常状态 1为异常则进入瑞芬太尼药物间隔时间计数
TOF_flag = 0 # TOF初次判断标志 0为正常状态 1为异常
gaoxue_count = 0 # 高血压时间间隔计数(暂关闭)
dixue_count = 0 # 低血压时间间隔计数(暂关闭)
gaoxue_cishu = 0 # 测得高血压的次数
dixue_cishu = 0 # 测得低血压的次数
rem_gaoxue_cishu = 0 # 转瑞芬太尼后,测得高血压的次数
rem_dixue_cishu = 0 # 转瑞芬太尼后,测得低血压的次数
elif ai_flag == 1:
pass
conn10.commit()
cur10.close()
conn10.close()
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
try:
feature = ku_data()
BIS = feature[2]
HR = feature[3]
SBP = feature[4]
DBP = feature[5]
MAP = feature[6]
ST = feature[7]
TEMP = feature[8]
SPO2 = feature[9]
EtCO2 = feature[10]
TOF = feature[13]
##########################BIS值########################################################
if flag == 0 and (0 < BIS <= 35) and bis_flag == 0:
now_CHO = 0
now_REM = 0
elif flag == 0 and (35 < BIS < 40 or BIS > 60) and bis_flag == 0:# 判断此时BIS是否正常如果异常则观察2min进行丙泊酚药量调整调整如果到达最大值转到相应的瑞芬模块
if now_CHO == 0:
now_CHO = re_CHO
now_REM = re_REM
now_CHO = CHO_BIS(now_CHO, BIS)
bis_flag = 1
elif flag == 0 and (40 <= BIS <= 60 or BIS == 0) and bis_flag == 0:
if now_CHO == 0 :
now_CHO = re_CHO
now_REM = re_REM
bis_data = Feature_data()
bis_data = bis_data.copy()
bis_data = from_numpy(bis_data).float()
bis_data = bis_data.to(device)
bis_model = load("./bis_model.pt")
bis_model = bis_model.to(device)
bis_pred = bis_model(bis_data)
bis_pred = bis_pred[-1].item()
bis_pred = bis_pred*20+40
pre_bis_count = pre_bis_count + 1
print("pre_bis_count",pre_bis_count)
if pre_bis_count == 61 and 42 < bis_pred <= 45:
print(bis_pred)
now_CHO = now_CHO + (-2) * CHO_unit
pre_bis_count = 1
elif pre_bis_count == 61 and 45 < bis_pred <= 48:
print(bis_pred)
now_CHO = now_CHO + (-1) * CHO_unit
pre_bis_count = 1
elif pre_bis_count == 61 and 55 < bis_pred <= 58:
print(bis_pred)
now_CHO = now_CHO + 2 * CHO_unit
pre_bis_count = 1
elif pre_bis_count == 61 and 52 < bis_pred <= 55:
print(bis_pred)
now_CHO = now_CHO + CHO_unit
pre_bis_count = 1
elif pre_bis_count == 62:
print(bis_pred)
pre_bis_count = 1
if bis_flag == 1:
bis_count = bis_count + 1
print("bis_count",bis_count)
if 0 < BIS <= 35 :
bis_flag = 0
bis_count = 0
pre_bis_count = 0
if bis_count == 121 and (35 < BIS < 40 or BIS > 60):
now_CHO = CHO_BIS(now_CHO, BIS)
bis_count = 1
pre_bis_count = 0
elif bis_count == 121 and (40 <= BIS <= 60):
bis_flag = 0
bis_count = 0
pre_bis_count = 0
elif bis_count == 121 and BIS == 0:
bis_count = bis_count - 1
if now_CHO > CHO_max:
now_CHO = CHO_max
flag = 1
elif 0 < now_CHO < CHO_min:
now_CHO = CHO_min
flag = 1
else:
flag = 0
##########################BIS值########################################################
##########################无创血压########################################################
print("xueya_flag",xueya_flag)
if BP_flag == 2:
if xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 1:
xueya_flag = 1
elif xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 2:
xueya_flag = 2
elif xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 0 :
NIC_count = 0
EPH_count = 0
if xueya_flag == 1:
if BP_data(SBP,DBP,MAP) == 1:
now_EPH = 0
EPH_count = 0
gaoxue_cishu = gaoxue_cishu + 1
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 2:
now_NIC = 0
now_EPH = 0
NIC_count = 0
EPH_count = 0
xueya_flag = 0
elif xueya_flag == 2:
if BP_data(SBP,DBP,MAP) == 2:
now_NIC = 0
NIC_count = 0
dixue_cishu= dixue_cishu+1
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 1:
now_NIC = 0
now_EPH = 0
NIC_count = 0
EPH_count = 0
xueya_flag = 0
#############################两次异常##################################################
if BP_data(SBP,DBP,MAP) == 1 and (gaoxue_cishu == 2):
now_NIC = 1
now_EPH = 0
gaoxue_count = 1
NIC_count = NIC_count + 1
EPH_count = 0
gaoxue_cishu = 0
elif BP_data(SBP,DBP,MAP) == 2 and (dixue_cishu == 2):
now_NIC = 0
now_EPH = 1
NIC_count = 0
EPH_count = EPH_count + 1
dixue_cishu = 0
##########################有创血压########################################################
elif BP_flag == 1:
if xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 1: # 判断此时血压是否正常,正常则不进行调整,异常则给对应的异常标志
xueya_flag = 1
gaoxue_count = 0
gaoxue_cishu = 1
elif xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 2:
xueya_flag = 2
dixue_count = 0
dixue_cishu = 1
elif xueya_flag == 0 and BP_data(SBP,DBP,MAP) == 0:
gaoxue_count = 0
dixue_count = 0
NIC_count = 0
EPH_count = 0
if xueya_flag == 1:
gaoxue_count = gaoxue_count + 1
if gaoxue_count == 61 and BP_data(SBP,DBP,MAP) == 1:
now_EPH = 0
EPH_count = 0
gaoxue_count = 1
gaoxue_cishu = gaoxue_cishu + 1
elif gaoxue_count == 61 and (BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 2):
now_NIC = 0
now_EPH = 0
NIC_count = 0
EPH_count = 0
xueya_flag = 0
gaoxue_count = 0
elif gaoxue_count == 61 and (SBP == 0 or DBP == 0):
gaoxue_count = gaoxue_count - 1
elif xueya_flag == 2:
dixue_count = dixue_count + 1
if dixue_count == 61 and BP_data(SBP,DBP,MAP) == 2:
now_NIC = 0
NIC_count = 0
dixue_count = 1
dixue_cishu = dixue_cishu + 1
elif dixue_count == 61 and (BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 1):
now_NIC = 0
now_EPH = 0
NIC_count = 0
EPH_count = 0
xueya_flag = 0
dixue_count = 0
elif dixue_count == 61 and (SBP == 0 or DBP == 0):
dixue_count = dixue_count - 1
if BP_data(SBP,DBP,MAP) == 1 and (gaoxue_cishu == 2):
now_NIC = 1
now_EPH = 0
gaoxue_count = 1
NIC_count = NIC_count + 1
EPH_count = 0
gaoxue_cishu = 1
elif BP_data(SBP,DBP,MAP) == 2 and (dixue_cishu == 2):
now_NIC = 0
now_EPH = 1
NIC_count = 0
EPH_count = EPH_count + 1
dixue_cishu = 1
dixue_count = 0
######################血压##################################
if NIC_count > 2 or EPH_count > 2: # 如果两次给药后,还是异常则需要转的瑞芬模块
flag1 = 1
else:
flag1 = 0
##########################心率########################################################
# 心率调节
if HR > 89 and xinlv_flag == 0: # 检测心率,如果心率异常则进行给药,记录给药次数,将心率状态标志赋予对应异常状态
HRD_count = HRD_count + 1
if HRD_count == 61:
xinlv_flag = 1
now_ESM = 1
now_ATR = 0
ESM_count = ESM_count + 1
ATR_count = 0
HRD_count = 0
HRS_count = 0
elif (0 < HR < 46) and xinlv_flag == 0:
HRS_count = HRS_count + 1
if HRS_count == 61:
xinlv_flag = 2
now_ESM = 0
now_ATR = 1
ESM_count = 0
ATR_count = ATR_count + 1
HRD_count = 0
HRS_count = 0
elif (46 <= HR <= 89) and xinlv_flag == 0:
now_ESM = 0
now_ATR = 0
ESM_count = 0
ATR_count = 0
HRD_count = 0
HRS_count = 0
if xinlv_flag == 1: # 检测异常状态说明此时已经给药需要间隔2min查看状态如果状态异常则再给药一次记录给药次数;如果异常状态消失则说明,此时正常,将相应标志置零
HRD_count = HRD_count + 1
if HRD_count == 121 and HR_data(1) == 1:
now_ESM = 1
now_ATR = 0
ESM_count = ESM_count + 1
ATR_count = 0
HRD_count = 1
elif HRD_count == 121 and HR_data(1) == 0:
now_ESM = 0
now_ATR = 0
ESM_count = 0
ATR_count = 0
HRD_count = 0
xinlv_flag = 0
elif HRD_count == 121 and HR_data(1) == 2:
HRD_count = HRD_count - 1
elif xinlv_flag == 2:
HRS_count = HRS_count + 1
if HRS_count == 121 and HR_data(2) == 1:
now_ESM = 0
now_ATR = 1
ESM_count = 0
ATR_count = ATR_count + 1
HRS_count = 1
elif HRS_count == 121 and HR_data(2) == 0:
now_ESM = 0
now_ATR = 0
ESM_count = 0
ATR_count = 0
HRS_count = 0
xinlv_flag = 0
elif HRS_count == 121 and HR_data(2) == 2:
HRS_count = HRS_count - 1
if ESM_count > 2 or ATR_count > 2:
flag2 = 1
else:
flag2 = 0
##########################心率########################################################
##############################肌松_罗库溴铵##################################################
if jisong == 1:
if TOF >= 10 and TOF_flag == 0:
now_RB = now_RB + 1
TOF_flag = 1
elif TOF < 10 and TOF_flag == 0:
now_RB = re_RB
TOF_count = 0
flag4 = 0
if TOF_flag == 1:
TOF_count = TOF_count + 1
if TOF_count == 121 and TOF >= 10:
now_RB = now_RB + 1
TOF_count = 1
elif TOF_count == 121 and 0 < TOF < 10 :
now_RB = re_RB
TOF_count = 0
TOF_flag = 0
flag4 = 0
elif TOF_count == 121 and TOF == 0:
TOF_count = TOF_count - 1
if now_RB > RB_max:
now_RB = RB_max
flag4 = 1
TOF_flag = 0
TOF_count = 0
##############################肌松_顺阿曲库铵##################################################
elif jisong == 2:
if TOF >= 10 and TOF_flag == 0:
now_ROC = now_ROC + 0.25
TOF_flag = 1
elif TOF < 10 and TOF_flag == 0:
now_ROC = re_ROC
TOF_count = 0
flag4 = 0
if TOF_flag == 1:
TOF_count = TOF_count + 1
if TOF_count == 121 and TOF >= 10:
now_ROC = now_ROC + 0.25
TOF_count = 1
elif TOF_count == 121 and 0 < TOF < 10 :
now_ROC = re_ROC
TOF_count = 0
TOF_flag = 0
flag4 = 0
elif TOF_count == 121 and TOF == 0:
TOF_count = TOF_count - 1
if now_ROC > ROC_max:
now_ROC = ROC_max
flag4 = 1
TOF_flag = 0
TOF_count = 0
##################################肌松########################################################
##################################瑞芬太尼调控##################################################
if REM_flag == 0 and (flag1 == 1 or flag2 == 1): # 启动瑞芬模块REM_flag=0 第一次给药之后需要间隔2min 在重新判断
if NIC_count > 2 or ESM_count > 2:
now_REM = now_REM + 0.05
REMS_count = REMS_count + 1
rem_gaoxue_cishu = -1
REMD_count = 0
REM_flag = 1
else:
now_REM = now_REM - 0.05
REMS_count = 0
REMD_count = REMD_count + 1
rem_dixue_cishu = -1
REM_flag = 2
now_NIC = 0
now_EPH = 0
now_ESM = 0
now_ATR = 0
xueya_flag = 0
xinlv_flag = 0
###########################################yo#######瑞芬太尼_无创血压############
if REM_flag == 1 and (BP_flag == 2 or BP_flag == 0) :
now_NIC = 0
now_EPH = 0
now_ESM = 0
now_ATR = 0
if now_REM == 0:
flag = 3
if flag1 == 1 and now_REM != 0:
if BP_data(SBP,DBP,MAP) == 1:
rem_gaoxue_cishu = rem_gaoxue_cishu +1
elif BP_data(SBP,DBP,MAP) == 0 and BP_data(SBP,DBP,MAP) == 2:
now_REM = re_REM
REMS_count = 0
REMD_count = 0
REM_flag = 0
flag1 = 0
rem_gaoxue_cishu = 0
if BP_data(SBP,DBP,MAP) == 1 and rem_gaoxue_cishu == 2:
now_REM = now_REM + 0.05
REMS_count = REMS_count + 1
REMD_count = 0
rem_gaoxue_cishu = 0
REMSS_count = REMSS_count + 1
if REMSS_count == 121:
REMD_count = 0
if flag2 == 1 and now_REM != 0:
if HR_data(1) == 1:
now_REM = now_REM + 0.05
REMS_count = REMS_count + 1
REMD_count = 0
REMSS_count = 1
elif HR_data(1) == 2:
REMSS_count = REMSS_count - 1
elif HR_data(1) == 0:
now_REM = re_REM
REMS_count = 0
REMD_count = 0
REM_flag = 0
flag2 = 0
REMSS_count = 1
elif REM_flag == 2 and (BP_flag == 2 or BP_flag == 0):
now_NIC = 0
now_EPH = 0
now_ESM = 0
now_ATR = 0
if now_REM == 0:
flag = 3
if flag1 == 1 and now_REM != 0:
if BP_data(SBP,DBP,MAP) == 2:
rem_dixue_cishu = rem_dixue_cishu + 1
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 1:
now_REM = re_REM
REMS_count = 0
REMD_count = 0
REM_flag = 0
flag1 = 0
if BP_data(SBP,DBP,MAP) == 2 and rem_dixue_cishu == 2:
now_REM = now_REM - 0.05
REMS_count = 0
REMD_count = REMD_count + 1
rem_dixue_cishu = 0
REMDD_count = REMDD_count + 1
if REMDD_count == 121:
REMS_count = 0
if flag2 == 1 and now_REM != 0:
if HR_data(2) == 1:
now_REM = now_REM - 0.05
REMS_count = 0
REMD_count = REMD_count + 1
REMDD_count = 1
elif HR_data(2) == 2:
REMDD_count = REMDD_count - 1
elif HR_data(2) == 0:
now_REM = re_REM
REMS_count = 0
REMD_count = 0
REM_flag = 0
flag2 = 0
REMDD_count = 1
##################################################瑞芬太尼_有创血压############
if REM_flag == 1 and BP_flag == 1:
now_NIC = 0
now_EPH = 0
now_ESM = 0
now_ATR = 0
if now_REM == 0:
flag = 3
REMSS_count = REMSS_count + 1
if REMSS_count == 121:
REMD_count = 0
if flag1 == 1 and now_REM != 0:
if BP_data(SBP,DBP,MAP) == 1:
now_REM = now_REM + 0.05
REMS_count = REMS_count + 1
REMD_count = 0
REMSS_count = 1
elif SBP == 0 or DBP == 0:
REMSS_count = REMSS_count - 1
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 2:
now_REM = re_REM
REMS_count = 0
REMD_count = 0
REM_flag = 0
flag1 = 0
REMSS_count = 1
if flag2 == 1 and now_REM != 0:
if HR_data(1) == 1:
now_REM = now_REM + 0.05
REMS_count = REMS_count + 1
REMD_count = 0
REMSS_count = 1
elif HR_data(1) == 2:
REMSS_count = REMSS_count - 1
elif HR_data(1) == 0:
now_REM = re_REM
REMS_count = 0
REMD_count = 0
REM_flag = 0
flag2 = 0
REMSS_count = 1
elif REM_flag == 2 and BP_flag == 1:
now_NIC = 0
now_EPH = 0
now_ESM = 0
now_ATR = 0
REMDD_count = REMDD_count + 1
if REMDD_count == 121:
REMS_count = 0
if flag1 == 1 and now_REM != 0:
if BP_data(SBP,DBP,MAP) == 2:
now_REM = now_REM - 0.05
REMS_count = 0
REMD_count = REMD_count + 1
REMDD_count = 1
elif SBP == 0 or DBP == 0:
REMDD_count = REMDD_count - 1
elif BP_data(SBP,DBP,MAP) == 0 or BP_data(SBP,DBP,MAP) == 1:
now_REM = re_REM
REMS_count = 0
REMD_count = 0
REM_flag = 0
flag1 = 0
REMDD_count = 1
elif flag2 == 1 and now_REM != 0:
if HR_data(2) == 1:
now_REM = now_REM - 0.05
REMS_count = 0
REMD_count = REMD_count + 1
REMDD_count = 1
elif HR_data(2) == 2:
REMDD_count = REMDD_count - 1
elif HR_data(2) == 0:
now_REM = re_REM
REMS_count = 0
REMD_count = 0
REM_flag = 0
flag2 = 0
REMDD_count = 1
###############是否转人工#################################
if REMS_count > 2 or REMD_count > 2 or flag4 == 1 or flag == 1 or flag == 3:
print("ai_flag",ai_flag)
while (ai_flag):
try:
conn8 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
cur8 = conn8.cursor()
sql = 'INSERT INTO aiflagtable (Flag,ConvertFlag) VALUES (%2f,%2f)' % (0,1)
cur8.execute(sql)
conn8.commit()
cur8.close()
conn8.close()
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
#########瑞芬太尼速率
if now_REM > REM_max:
now_REM = REM_max
elif 0 < now_REM < REM_min:
now_REM = REM_min
while (ai_flag):
try:
print('维持期给药数据:丙泊酚 %.2f,舒芬太尼 %.2f,瑞芬太尼 %.2f,顺阿曲库铵 %.2f,%2f,%2f,%2f,%2f' % (now_CHO, 0, now_REM, now_ROC, now_EPH, now_ESM, now_ATR, now_NIC))
conn7 = pymysql.connect(host='127.0.0.1', user='root', password='Xg137839', charset='utf8mb4',db=dbname, port=3306, connect_timeout=60)
cur7 = conn7.cursor()
sql = 'INSERT INTO aimedicinetable (Phase,丙泊酚 ,舒芬太尼 ,瑞芬太尼 ,顺阿曲库铵 ,麻黄碱 ,艾司洛尔 ,阿托品 ,尼卡地平 )VALUES (2,%2f,%2f,%2f,%2f,%2f,%2f,%2f,%2f)' % (
(now_CHO * weight2 * 60) / (1000 * CHO_con), 0, (now_REM * weight2 * 60) / (1000 * REM_con),
(now_ROC * weight2 * 60) / (1000 * ROC_con), now_EPH, now_ESM,now_ATR, now_NIC)
cur7.execute(sql)
conn7.commit()
now_NIC = 0
now_EPH = 0
now_ESM = 0
now_ATR = 0
cur7.close()
conn7.close()
break
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")
except Exception as e:
current_time = datetime.datetime.now()
current_time = current_time.strftime("%Y%m%d%H%M%S")
with open("geiyao_error_log.txt", "a") as file:
file.write(f"{current_time} - 错误信息: {str(e)}\n")