half done. Don't know why cannot switch power on, and Pw has memeory, not the actual value

This commit is contained in:
Ryan Tang 2024-07-27 18:42:57 -04:00
parent 4649664b55
commit 760e2387d7
3 changed files with 270 additions and 15 deletions

192
HVGUI.py
View File

@ -2,8 +2,200 @@
import HVLibrary as hv
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QCheckBox, QLineEdit, QLabel, QVBoxLayout, QWidget, QTabWidget, QGridLayout, QMessageBox, QFileDialog, QProgressBar
from PyQt6.QtCore import Qt, QThread, QTimer, QObject, pyqtSignal
from functools import partial
ColStrList = ["Name", "Ch", 'On/Off', "Set V [V]", "Set I [uA]", "Out V [V]", "Out I [uA]"]
nMod = 2
nChPerMod = [48, 48]
updateTime = 3 #sec
bd = []
for k in range(nMod):
bd.append(hv.Board(3 + k))
V0SetList = []
I0SetList = []
OnOffList = []
outVList = []
outIList = []
for k in range(nMod):
V0SetList.append(bd[k].GetPV('V0Set'))
I0SetList.append(bd[k].GetPV('I0Set'))
OnOffList.append(bd[k].GetPV('Pw'))
outVList.append(bd[k].GetPV('VMon'))
outIList.append(bd[k].GetPV('IMon'))
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Iseg Controller")
self.setGeometry(100, 100, 500, 200)
widget = QWidget()
layout = QVBoxLayout()
widget.setLayout(layout)
self.setCentralWidget(widget)
self.txtName = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod]
self.txtV = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod]
self.txtI = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod]
self.txtVOut = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod]
self.txtIOut = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod]
self.chkON = [[QCheckBox() for _ in range(rows)] for rows in nChPerMod]
self.timer = QTimer(self)
self.timer.timeout.connect(self.updateTimer)
self.timer.start(updateTime*1000)
self.time = 0
#=========== set tab
self.tabWidget = QTabWidget(self)
layout.addWidget(self.tabWidget)
for k in range(0, nMod):
tab = QWidget(self)
layout_tab = QGridLayout()
layout_tab.setAlignment(Qt.AlignmentFlag.AlignTop)
tab.setLayout(layout_tab)
for index, lb in enumerate(ColStrList):
qlb = QLabel(lb, tab)
layout_tab.addWidget(qlb, 0, index)
for i in range(nChPerMod[k]) :
for j, lb in enumerate(ColStrList) :
#------------ name
if j == 0:
layout_tab.addWidget(self.txtName[k][i], 1+i, j)
#------------ Ch
if j == 1:
qlb = QLabel(str(i), tab)
layout_tab.addWidget(qlb, 1+i, j, alignment=Qt.AlignmentFlag.AlignCenter)
#------------ On/Off
if j == 2:
self.chkON[k][i].setChecked( OnOffList[k][i] == 1)
layout_tab.addWidget(self.chkON[k][i], 1+i, j, alignment=Qt.AlignmentFlag.AlignCenter)
self.chkON[k][i].clicked.connect(partial(self.SetOnOff, k, i))
# #------------ V set
if j == 3:
self.txtV[k][i].setText(str(V0SetList[k][i]))
self.txtV[k][i].setAlignment(Qt.AlignmentFlag.AlignRight)
layout_tab.addWidget(self.txtV[k][i], 1+i, j)
self.txtV[k][i].returnPressed.connect(partial(self.SetHV, k, i) )
self.txtV[k][i].returnPressed.connect(partial(self.UnSetTextColor, self.txtV[k][i]))
self.txtV[k][i].textChanged.connect(partial(self.TextChange, self.txtV[k][i]))
# #------------ I set
if j == 4:
self.txtI[k][i].setText(str(I0SetList[k][i]))
self.txtI[k][i].setAlignment(Qt.AlignmentFlag.AlignRight)
layout_tab.addWidget(self.txtI[k][i], 1+i, j)
self.txtI[k][i].returnPressed.connect(partial(self.SetI, k, i) )
self.txtI[k][i].returnPressed.connect(partial(self.UnSetTextColor, self.txtI[k][i]))
self.txtI[k][i].textChanged.connect(partial(self.TextChange, self.txtI[k][i]))
# #------------ V out
if j == 5:
self.txtVOut[k][i].setText("{:.2f}".format(outVList[k][i]))
self.txtVOut[k][i].setAlignment(Qt.AlignmentFlag.AlignRight)
layout_tab.addWidget(self.txtVOut[k][i], 1+i, j)
self.txtVOut[k][i].setReadOnly(True)
self.txtVOut[k][i].setStyleSheet("background-color: lightgrey; color: black;")
# #------------ I out
if j == 6:
self.txtIOut[k][i].setText("{:.2f}".format(outIList[k][i]))
self.txtIOut[k][i].setAlignment(Qt.AlignmentFlag.AlignRight)
layout_tab.addWidget(self.txtIOut[k][i], 1+i, j)
self.txtIOut[k][i].setReadOnly(True)
self.txtIOut[k][i].setStyleSheet("background-color: lightgrey; color: black;")
self.tabWidget.addTab(tab, "Mod-" + str(k))
#=================================
def UnSetTextColor(self, qLineEdit : QLineEdit):
qLineEdit.setStyleSheet("")
def TextChange(self, qLineEdit : QLineEdit):
qLineEdit.setStyleSheet("color : darkgreen;")
#---------------------------------
def SetOnOff(self, mod, ch):
state = self.chkON[mod][ch].checkState()
if state == Qt.CheckState.Checked:
bd[mod].Channel[ch].SetPowerOnOff(1)
else:
bd[mod].Channel[ch].SetPowerOnOff(0)
value = bd[mod].Channel[ch].GetPowerOnOff()
OnOffList[mod][ch] = value
print("mod : " + str(mod) + ", ch : " + str(ch) + " | " + str(state) + " | " + str(value))
self.chkON[mod][ch].setChecked(value == 1)
#---------------------------------
def SetHV(self, mod, ch):
value = float(self.txtV[mod][ch].text())
print("mod : " + str(mod) + ", ch : " + str(ch) + " | " + str(value))
bd[mod].Channel[ch].SetV0Set(value)
newValue = bd[mod].Channel[ch].GetV0Set()
V0SetList[mod][ch] = newValue
self.txtV[mod][ch].setText("{:.1f}".format(newValue))
#---------------------------------
def SetI(self, mod, ch):
value = float(self.txtI[mod][ch].text())
print("mod : " + str(mod) + ", ch : " + str(ch) + " | " + str(value))
bd[mod].Channel[ch].SetI0Set(value)
newValue = bd[mod].Channel[ch].GetI0Set()
I0SetList[mod][ch] = newValue
self.txtI[mod][ch].setText("{:.1f}".format(newValue))
#---------------------------------
def updateTimer(self):
self.time += 1
print(f'Time: {self.time}')
# outVList = mpod.GetAllOutputHV()
# outIList = mpod.GetAllLC()
# # print(outVList)
for k in range(2):
outVList.append(bd[k].GetPV('VMon'))
outIList.append(bd[k].GetPV('IMon'))
# if self.chkDB.checkState() == Qt.CheckState.Checked:
# points = []
for k in range(0, nMod):
for i in range(bd[k].numCh) :
self.txtVOut[k][i].setText("{:.2f}".format(outVList[k][i]))
self.txtIOut[k][i].setText("{:.2f}".format(outIList[k][i]))
# if self.chkDB.checkState() == Qt.CheckState.Checked:
# points.append(Point("Voltage").tag("Ch",int(chList[i] + 100 * k)).field("value",float(outVList[i])))
# points.append(Point("LeakageCurrent").tag("Ch",int(chList[i] + 100 * k)).field("value",float(outIList[i])))
# if self.chkDB.checkState() == Qt.CheckState.Checked:
# write_api.write(bucket=bucket, org=org, record=points)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())

View File

@ -29,9 +29,9 @@ def get_value(pv_name : str, show : bool = False):
return value
def set_value(pv_name : str, value):
def set_value(pv_name : str, value) -> None:
pv = epics.PV(hostName + ":" + pv_name, connection_timeout=0.1)
return pv.put(value)
pv.put(value)
#======= general
@ -88,7 +88,7 @@ class Channel:
def GetStatus(self) -> str:
return get_value(self.bdCh + "Status")
def GetPowerOnOff(self) -> str:
def GetPowerOnOff(self) -> int:
return get_value(self.bdCh + "Pw")
def GetPowerOnOption(self) -> str:
@ -122,14 +122,14 @@ class Channel:
def SetMaxVoltage(self, volt: float):
set_value(self.bdCh + "SVMax", volt)
def GetPowerOnOff(self, onOff : bool): # off = 0, on = 1
return get_value(self.bdCh + "Pw", onOff)
def SetPowerOnOff(self, onOff): # off = 0, on = 1
set_value(self.bdCh + "Pw", onOff)
def GetPowerOnOption(self, disEn : bool): #disable = 0, enable = 1, if enable, restart will restore in same condition
return get_value(self.bdCh + "POn", disEn)
def SetPowerOnOption(self, disEn : bool): #disable = 0, enable = 1, if enable, restart will restore in same condition
set_value(self.bdCh + "POn", disEn)
def GetPowerDownOptionWhenTrip(self, killRamp) : # kill = 0, Ramp = 1
return get_value(self.bdCh + "PDwn", killRamp)
def SetPowerDownOptionWhenTrip(self, killRamp) : # kill = 0, Ramp = 1
set_value(self.bdCh + "PDwn", killRamp)
####################################################
@ -158,3 +158,9 @@ class Board:
def GetTemp(self) -> float:
return get_value(self.id + ":" + 'Temp')
def GetPV(self, PV_Name : str):
pvList = []
for i in range(48):
pvList.append('solarisHV:' + self.id + ":" + f"{i:03d}" + ":" + PV_Name)
return epics.caget_many(pvList)

69
test.py
View File

@ -2,17 +2,74 @@
import HVLibrary as hv
#set_value('03:000:' + Ch_PV_List[1], 5)
#hv.get_value('03:000:' + hv.Ch_PV_List[1])
#hv.get_value('03:000:' + hv.Ch_PV_List[0])
# hv.get_value('03:000:' + hv.Ch_PV_List[1])
# hv.get_value('03:000:' + hv.Ch_PV_List[0])
# index = 14
# hv.get_value('03:000:' + hv.Ch_PV_List[index], True)
# cf = hv.get_CtrlField('03:000:' + hv.Ch_PV_List[index])
# print(cf)
bd = hv.Board(3)
# bd = []
print( bd.GetTemp())
# for k in range(2):
# bd.append(hv.Board(3 + k))
print( bd.Channel[0].GetName() )
# print( bd[0].GetTemp())
# print( bd[0].Channel[15].GetName() )
# bd[0].Channel[15].SetPowerOnOff(1)
# print(bd[0].Channel[15].GetPowerOnOff())
# print(bd[0].Channel[15].GetVMon())
# print(bd[0].Channel[15].GetPowerOnOff())
# for k in range(2):
# print("==========================")
# for i in range(bd[k].numCh):
# print("{:.2f}".format(bd[k].Channel[i].GetVMon()))
# hv.set_value('03:015:Pw', 1)
# haha = hv.get_value('03:015:Status')
# print(haha)
# haha = hv.get_value('03:015:Pw')
# print(haha)
# haha = hv.get_value('03:015:V0Set')
# print(haha)
# haha = hv.get_value('03:015:VMon')
# print(haha)
# haha = hv.get_value('03:BdStatus')
# print(haha)
# hv.epics.caput('solarisHV:03:015:Pw', 1)
# hv.epics.cainfo('solarisHV:03:015:Pw')
# m1 = hv.epics.caget('solarisHV:03:015:Pw', use_monitor= False)
# print(m1)
# m1 = hv.epics.caget('solarisHV:03:015:VMon')
# print(m1)
# m1 = hv.epics.caget('solarisHV:03:015:Pw')
# print(m1)
# hv.epics.camonitor('solarisHV:03:015:Pw')
pvList = []
for i in range(48):
pvList.append('solarisHV:03:' + f"{i:03d}" + ":VMon")
haha = hv.epics.caget_many(pvList)
print(haha)