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

創建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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章