最新版给药算法

This commit is contained in:
WIN-T9V3LPE8NK2\Administrator 2025-06-18 14:47:20 +08:00
commit e3f0663954

995
geiyao.py Normal file
View File

@ -0,0 +1,995 @@
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")