Tango Control System 之 自定义客户端

客户端

Tango Control System的客户端有很多形式,可以通过Taurus,Sardana等插件来实现,也可以通过web端实现。
1.插件形式实现客户端可以参考如下文章:
Tango Control System 使用(五):简易客户端测试Device Server
2.网页客户端可以参考:
Tango demo
3.自定义客户端

自定义客户端

通过QT来自定义客户端界面,然后通过API实现与Device Server连接。
1.通过QT自定义客户端界面结构
在这里插入图片描述
2.完善客户端代码,以下是当前示例代码。
QT文件必须和代码文件在同一目录下

from taurus.external.qt import Qt
import taurus
import tango
import sys
import os
from taurus.qt.qtgui.util.ui import UILoadable
from taurus.qt.qtgui.application import TaurusApplication
from taurus.qt.qtgui.panel import TaurusForm

data=0
a = 0


@UILoadable(with_ui="_ui")
class panel(Qt.QMainWindow):

    def __init__(self, parent=None):
        Qt.QWidget.__init__(self, parent)
        path = os.path.join(os.path.dirname(__file__))
        self.loadUi(filename="HV_motor.ui", path=path)
        
        #taurusForm模块放到Qt圈好的widget里
        layout3 = Qt.QHBoxLayout()
        panel = TaurusForm()
        layout3.addWidget(panel)
        props = [ 'state', 'Position', 'Rotation', 'LimitMin', 'LimitMax', 'speed', 'target' ]
        model = [ 'tango://127.0.0.1:10000/test/HV_motor/1/%s' % p for p in props ]
        panel.setModel(model)
        #panel.removeModels(model)  # removeModels to releas rom
        self._ui.widget_3.setLayout(layout3) 
        
        #绑定button的信号和槽
        motor = 'tango://127.0.0.1:10000/test/HV_motor/1'
        hvmotor = tango.DeviceProxy(motor)
        self._ui.move_button.clicked.connect(lambda:self.update_target(hvmotor,int(self._ui.target_data.text())))
        self._ui.speed_button.clicked.connect(lambda:self.write_speed(hvmotor,int(self._ui.speed_data.text())))
        self._ui.limitmin_button.clicked.connect(lambda:self.write_limitmin(hvmotor,int(self._ui.limitmin_data.text())))
        self._ui.limitmax_button.clicked.connect(lambda:self.write_limitmax(hvmotor,int(self._ui.limitmax_data.text())))
    def update(self, label,data):
        if label == 'tango://DESKTOP-DEPQL70.localdomain:10000/test/HV_motor/1/Position':
            self._ui.position1.setText(data)
            self._ui.rotation1.setText(data)
           # self._ui.position2.setText(data)
        elif label == 'tango://DESKTOP-DEPQL70.localdomain:10000/test/HV_motor/1/target':
            self._ui.target1.setText(data)
        elif label == 'tango://DESKTOP-DEPQL70.localdomain:10000/test/HV_motor/1/speed':
            self._ui.speed1.setText(data)
        elif label == 'tango://DESKTOP-DEPQL70.localdomain:10000/test/HV_motor/1/LimitMin':
            self._ui.limitimin1.setText(data)
        elif label == 'tango://DESKTOP-DEPQL70.localdomain:10000/test/HV_motor/1/LimitMax' :
            self._ui.limitmax1.setText(data)
    def update_target(self, device,data):
        device.target = data
        device.command_inout('move')
    def write_speed(self, device , data) :
        device.speed = data
    def write_limitmin(self, device , data) :
        device.LimitMin = data
    def write_limitmax(self, device , data) :
        device.LimitMax = data

    #重写 窗口关闭事件
    def closeEvent(self, event):        #窗口关闭 移除监听器
        props = [ 'Position', 'LimitMin', 'LimitMax', 'speed', 'target' ]
        model = [ 'tango://127.0.0.1:10000/test/HV_motor/1/%s' % p for p in props ]
        for m in model:
            taurus.Attribute(m).removeListener(myListener)  #移除轮询
        
        
def myListener(evt_src, evt_type, evt_value):
    #print 'myListener: entering…'
    print 'evt_src = ', evt_src
    #print 'evt_type = ', evt_type
    #print 'evt_value = ', evt_value
    print 'evt_value = ', evt_value.rvalue
    #print '\n'
    a = evt_value.rvalue
    pe.update(str(evt_src),str(a))   
    #return a
if __name__ == "__main__":
    app = TaurusApplication(sys.argv)
    pe = panel()
    props = [ 'Position', 'LimitMin', 'LimitMax', 'speed', 'target' ]
    model = [ 'tango://192.168.119.131:10000/test/HV_motor/1/%s' % p for p in props ]
    for m in model:
        taurus.Attribute(m).addListener(myListener)  #轮询
    pe.show()
    
    sys.exit(app.exec_())

3.运行结果
在这里插入图片描述
通过与ATKPanel进行比较,发现所有数据正常,命令执行正常。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/youngdianfeng/article/details/105543377