Exemplo n.º 1
0
class QFellesController(QFellesWidgetBaseClass):
    """
    @brief: Widget representing a PID controller
    """
    proportional = pyqtSignal(float)
    integral = pyqtSignal(float)
    derivative = pyqtSignal(float)
    MV_sp = pyqtSignal(float)
    CV_sp = pyqtSignal(float)

    def initUi(self, parent=None):
        """ Generates the user interface """
        #Update widget meta data
        self.meta["type"] = "Controller"
        self.meta["name"] = "foobar"
        self.meta["unit"] = "--"

        self.label = QLabel(parent)
        self.label.setObjectName("PID Controller")

        #Group box
        group_box = QGroupBox('Controller Settings')
        #Spin button Labels
        gain = "K<sub>c</sub>"
        Kc = gain.decode('utf-8')
        self.gain_label = QLabel(Kc)
        self.gain_label.setStyleSheet("font:25pt")
        time1 = "&#964;<sub>i</sub>"
        taui = time1.decode('utf-8')
        self.taui_label = QLabel(taui)
        self.taui_label.setStyleSheet("font:25pt ")
        time2 = "&#964;<sub>d</sub>"
        taud = time2.decode('utf-8')
        self.taud_label = QLabel(taud)
        self.taud_label.setStyleSheet("font:25pt")

        #Spin buttons
        self.gain = QDoubleSpinBox()  #Controller gain
        self.taui = QDoubleSpinBox()  #Controller integral time constant
        self.taud = QDoubleSpinBox()  #Controller derivative time constant
        self.GAIN_0 = self.gain.value()
        self.TAUI_0 = self.taui.value()
        self.TAUD_0 = self.taud.value()
        self.gain.setKeyboardTracking(False)
        self.taui.setKeyboardTracking(False)
        self.taud.setKeyboardTracking(False)
        #self.gain.setRange(minimum, maximum)
        self.gain_label.setBuddy(self.gain)
        self.taui_label.setBuddy(self.taui)
        self.taud_label.setBuddy(self.taud)
        self.gain.valueChanged.connect(self.controllersettings)
        self.taui.valueChanged.connect(self.controllersettings)
        self.taud.valueChanged.connect(self.controllersettings)
        self.setpoint = QDoubleSpinBox()  #Controlled variable setpoint
        self.setpoint.setHidden(True)
        self.setpoint_label = QLabel('CV Setpoint')
        self.setpoint_label.setBuddy(self.setpoint)
        self.setpoint.valueChanged.connect(self.CVSetPoint)

        #On-Off Buttons
        self.on = QRadioButton("Controller On")
        self.on.setChecked(False)  #Default to have controller off
        self.on.toggled.connect(self.btnstate)

        #Slider
        self.MV_manual = QSlider(Qt.Horizontal)
        self.MV_manual_label = QLabel('MV Setpoint')
        self.MV_manual.sliderReleased.connect(self.mv_state)
        #self.MV_manual.setRange(minimum, maximum)

        #Layout
        controlsLayout = QGridLayout()
        controlsLayout.addWidget(self.gain_label, 0, 0)
        controlsLayout.addWidget(self.gain, 0, 1)
        controlsLayout.addWidget(self.setpoint_label, 0, 2)
        controlsLayout.addWidget(self.setpoint, 0, 3)
        controlsLayout.addWidget(self.taui_label, 1, 0)
        controlsLayout.addWidget(self.taui, 1, 1)
        controlsLayout.addWidget(self.MV_manual_label, 1, 2)
        controlsLayout.addWidget(self.MV_manual, 1, 3)
        controlsLayout.addWidget(self.taud_label, 2, 0)
        controlsLayout.addWidget(self.taud, 2, 1)
        controlsLayout.addWidget(self.on, 2, 2)
        controlsLayout.setRowStretch(3, 1)

        layout = QHBoxLayout()
        layout.addLayout(controlsLayout)
        self.setLayout(layout)

    @pyqtSlot()
    def CVSetPoint(self, event=None):
        self.setpoint_value = self.setpoint.value()
        self.CV_sp.emit(self.setpoint_value)

    #print self.setpoint_value

    @pyqtSlot()
    def controllersettings(self, event=None):
        if self.gain.value() != self.GAIN_0:
            self.GAIN_0 = self.gain.value()
            self.gain_value = self.gain.value()
            self.proportional.emit(self.gain_value)  #Emitting Gain value
        #print self.gain_value
        elif self.taui.value() != self.TAUI_0:
            self.TAUI_0 = self.taui.value()
            self.taui_value = self.taui.value()
            self.integral.emit(self.taui_value)
        #print self.taui_value
        elif self.taud.value() != self.TAUD_0:
            self.TAUD_0 = self.taud.value()
            self.taud_value = self.taud.value()
            self.derivative.emit(self.taud_value)

    #print self.taud_value

    @pyqtSlot()
    def btnstate(self, event=None):
        if self.on.isChecked() == True:
            self.setpoint.setHidden(False)
            self.MV_manual.setHidden(True)
            #print "Controller is on"
        else:
            self.setpoint.setHidden(True)
            self.MV_manual.setHidden(False)
            #print "Controller is off"

    @pyqtSlot()
    def mv_state(self, event=None):
        MV_setpoint = self.MV_manual.value()
        self.MV_sp.emit(MV_setpoint)
        #print MV_setpoint

    def closeEvent(self, event=None):
        print("Shutting down %s" % self.__class__.__name__)
        self.onQuit()
Exemplo n.º 2
0
class ControllerWidget(QWidget):

    proportional = pyqtSignal(float)
    integral = pyqtSignal(float)
    derivative = pyqtSignal(float)
    MV_sp = pyqtSignal(float)
    CV_sp = pyqtSignal(float)

    def __init__(self, parent):
        super(ControllerWidget, self).__init__()
        #        self._controllerstate = 1 #default off
        self.initUI()
        self.on.toggled.connect(self.btnstate)
        self.setpoint.valueChanged[str].connect(self.CVSetPoint)
        self.gain.valueChanged[str].connect(self.controllersettings)
        self.taui.valueChanged[str].connect(self.controllersettings)
        self.taud.valueChanged[str].connect(self.controllersettings)
        self.MV_manual.sliderReleased.connect(self.mv_state)


#    @property
#    def controllerstate(self):
#        return self._controllerstate
#
#    @controllerstate.setter
#    def controllerstate(self, value):
#        self._controllerstate = value

    def initUI(self):
        #Group box
        group_box = QGroupBox('Controller Settings')

        #Spin button Labels
        gain = "K<sub>c</sub>"
        Kc = gain.decode('utf-8')
        self.gain_label = QLabel(Kc)
        self.gain_label.setStyleSheet("font:25pt")
        time1 = "&#964;<sub>i</sub>"
        taui = time1.decode('utf-8')
        self.taui_label = QLabel(taui)
        self.taui_label.setStyleSheet("font:25pt ")
        time2 = "&#964;<sub>d</sub>"
        taud = time2.decode('utf-8')
        self.taud_label = QLabel(taud)
        self.taud_label.setStyleSheet("font:25pt")

        #Spin buttons
        self.gain = QDoubleSpinBox()  #Controller gain
        self.taui = QDoubleSpinBox()  #Controller integral time constant
        self.taud = QDoubleSpinBox()  #Controller derivative time constant
        self.GAIN_0 = self.gain.value()
        self.TAUI_0 = self.taui.value()
        self.TAUD_0 = self.taud.value()
        self.gain.setKeyboardTracking(False)
        self.taui.setKeyboardTracking(False)
        self.taud.setKeyboardTracking(False)
        #self.gain.setRange(minimum, maximum)
        self.gain_label.setBuddy(self.gain)
        self.taui_label.setBuddy(self.taui)
        self.taud_label.setBuddy(self.taud)
        self.setpoint = QDoubleSpinBox()  #Controlled variable setpoint
        self.setpoint.setHidden(True)
        self.setpoint_label = QLabel('CV Setpoint')
        self.setpoint_label.setBuddy(self.setpoint)

        #On-Off Buttons
        self.on = QRadioButton("Controller On")
        self.on.setChecked(False)  #Default to have controller off

        #Slider
        self.MV_manual = QSlider(Qt.Horizontal)
        self.MV_manual_label = QLabel('MV Setpoint')
        #self.MV_manual.setRange(minimum, maximum)

        #Layout
        controlsLayout = QGridLayout()
        controlsLayout.addWidget(self.gain_label, 0, 0)
        controlsLayout.addWidget(self.gain, 0, 1)
        controlsLayout.addWidget(self.setpoint_label, 0, 2)
        controlsLayout.addWidget(self.setpoint, 0, 3)
        controlsLayout.addWidget(self.taui_label, 1, 0)
        controlsLayout.addWidget(self.taui, 1, 1)
        controlsLayout.addWidget(self.MV_manual_label, 1, 2)
        controlsLayout.addWidget(self.MV_manual, 1, 3)
        controlsLayout.addWidget(self.taud_label, 2, 0)
        controlsLayout.addWidget(self.taud, 2, 1)
        controlsLayout.addWidget(self.on, 2, 2)
        controlsLayout.setRowStretch(3, 1)

        layout = QHBoxLayout()
        layout.addLayout(controlsLayout)
        self.setLayout(layout)

    @pyqtSlot()
    def CVSetPoint(self, event=None):
        self.setpoint_value = self.setpoint.value()
        self.CV_sp.emit(self.setpoint_value)
        #print self.setpoint_value

    @pyqtSlot()
    def controllersettings(self, event=None):
        if self.gain.value() != self.GAIN_0:
            self.GAIN_0 = self.gain.value()
            self.gain_value = self.gain.value()
            self.proportional.emit(self.gain_value)  #emitting Gain value
            #print self.gain_value
        elif self.taui.value() != self.TAUI_0:
            self.TAUI_0 = self.taui.value()
            self.taui_value = self.taui.value()
            self.integral.emit(self.taui_value)
            #print self.taui_value
        elif self.taud.value() != self.TAUD_0:
            self.TAUD_0 = self.taud.value()
            self.taud_value = self.taud.value()
            self.derivative.emit(self.taud_value)
            #print self.taud_value

    @pyqtSlot()
    def btnstate(self, event=None):
        if self.on.isChecked() == True:
            self.setpoint.setHidden(False)
            self.MV_manual.setHidden(True)
            #print "Controller is on"
        else:
            self.setpoint.setHidden(True)
            self.MV_manual.setHidden(False)
            #print "Controller is off"

    @pyqtSlot()
    def mv_state(self, event=None):
        MV_setpoint = self.MV_manual.value()
        self.MV_sp.emit(MV_setpoint)