当前位置: 首页 > 工具软件 > Tango > 使用案例 >

Tango Control System 使用(一):创建Device Server

曹凯泽
2023-12-01

创建Device Server

Tango Control System 使用的第一步就是创建Device Server,创建Device Server的方法有2种,一种是通过Pogo创建模板之后进行完善,一种是不通过Pogo直接在代码中实现。此篇介绍不通过Pogo创建Device Server。

直接通过代码实现的优点在于精简和自由,往往代码量轻微,但是其要求对于库的使用要非常熟练,新手建议使用Pogo来创建模板。

一个完整的Device Server要有以下内容:
1.attribute:设备必有的元素,如温度,这是给客户所需要的元素
2.command:设备功能接口,如开机等,提供给客户能够操作的接口
3.state:一般设备都是状态机模式

attribute

完整的Attribute,可以设置其名称,数据类型,单位,上下限,以及其是可读\写权限等。

command

完整的命令,包括是否有参数传递,以及返回值。

state

设备一般最基本有2个状态,OFF和ON,如果设备比较复杂会有其他状态,例如Alarm。

简单的Device Server

import time
import numpy

from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt
from tango.server import Device, attribute, command, pipe, device_property


class PowerSupply(Device):

    voltage = attribute(label="Voltage", dtype=float,
                        display_level=DispLevel.OPERATOR,
                        access=AttrWriteType.READ,
                        unit="V", format="8.4f",
                        doc="the power supply voltage")

    current = attribute(label="Current", dtype=float,
                        display_level=DispLevel.EXPERT,
                        access=AttrWriteType.READ_WRITE,
                        unit="A", format="8.4f",
                        min_value=0.0, max_value=8.5,
                        min_alarm=0.1, max_alarm=8.4,
                        min_warning=0.5, max_warning=8.0,
                        fget="get_current",
                        fset="set_current",
                        doc="the power supply current")

    noise = attribute(label="Noise",
                      dtype=((int,),),
                      max_dim_x=1024, max_dim_y=1024)

    info = pipe(label='Info')

    host = device_property(dtype=str)
    port = device_property(dtype=int, default_value=9788)

    def init_device(self):
        Device.init_device(self)
        self.__current = 0.0
        self.set_state(DevState.STANDBY)

    def read_voltage(self):
        self.info_stream("read_voltage(%s, %d)", self.host, self.port)
        return 9.9, time.time(), AttrQuality.ATTR_WARNING
        
    
    def get_voltage(self):
       # self.info_stream("read_voltage(%s, %d)", self.host, self.port)
       # return 9.99, time.time(), AttrQuality.ATTR_WARNING
        return self.__voltage
        
    def set_voltage(self, voltage):
        # should set the power supply current
        self.__voltage = voltage
        
    def get_current(self):
        return self.__current

    def set_current(self, current):
        # should set the power supply current
        self.__current = current

    def read_info(self):
        return 'Information', dict(manufacturer='Tango',
                                   model='PS2000',
                                   version_number=123)

    @DebugIt()
    def read_noise(self):
        return numpy.random.random_integers(1000, size=(100, 100))

    @command
    def TurnOn(self):
        # turn on the actual power supply here
        self.set_state(DevState.ON)

    @command
    def TurnOff(self):
        # turn off the actual power supply here
        self.set_state(DevState.OFF)

    @command(dtype_in=float, doc_in="Ramp target current",
             dtype_out=bool, doc_out="True if ramping went well, "
             "False otherwise")
    def Ramp(self, target_current):
        # should do the ramping
        return True


if __name__ == "__main__":
    PowerSupply.run_server()

 类似资料: