알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

설비쪽 기본 샘플 secs gem 코드 작성 본문

산업용 프로토콜/secs gem open api

설비쪽 기본 샘플 secs gem 코드 작성

백곳 2017. 8. 10. 19:26

설비 secs/gem 코드 작성 


이번 코드는 간단하게 secs/gem 통신 표준에서 설비쪽 코드를 작성하는 것을 해보겠습니다. 


import logging
import code
import secsgem

#전에 통신 로그 남기는 게시물 에서 만들었던 모듈
#http://idlecomputer.tistory.com/17  (참고)
from communication_log_file_handler import CommunicationLogFileHandler

#여기 secsgem.GemEquipmentHandler 에서는 SVID와 ECID 등을 등록하면 S1F11 등과 같은 표준에 매치 시켜 자동으로 응답을 주소 셋팅을 해줍니다.
class SampleEquipment(secsgem.GemEquipmentHandler):
    def __init__(self, address, port, active, session_id, name, custom_connection_handler=None):
        secsgem.GemEquipmentHandler.__init__(self, address, port, active, session_id, name, custom_connection_handler)

        self.MDLN = "gemequp"
        self.SOFTREV = "1.0.0"

        # 여기에서 SVID를 등록 해 준다.
        self.status_variables.update({
            #딕셔너리 구조로 10 : secsgem.StatusVariable(svid,"변수 설명","단위",허용 자료구조 단위)
            10: secsgem.StatusVariable(10, "sample1, numeric SVID, SecsVarU4", "meters", [secsgem.SecsVarU4,secsgem.SecsVarI2]),
            "SV2": secsgem.StatusVariable("SV2", "sample2, text SVID, SecsVarString", "chars", secsgem.SecsVarString),
        })
        # 여기에서 SVID값을 써준다
        self.status_variables[10].value = 123
        self.status_variables["SV2"].value = "sample sv"
        #ECID 또한 같은 구조로 사용 할수있다.
        self.equipment_constants.update({
            20: secsgem.EquipmentConstant(20, "sample1, numeric ECID, SecsVarU4", 0, 500, 50, "degrees", secsgem.SecsVarU4),
            "EC2": secsgem.EquipmentConstant("EC2", "sample2, text ECID, SecsVarString", "", "", "", "chars", secsgem.SecsVarString),
            30: secsgem.EquipmentConstant(30, "sample2, text ECID, SecsVarString", 0, 500,50, "degrees",secsgem.SecsVarU4),
        })
        self.equipment_constants[20].value = 321
        self.equipment_constants["EC2"].value = "sample ec"
        self.equipment_constants[30].value = 3211

#통신 로그 남기는 모듈 소스
commLogFileHandler = CommunicationLogFileHandler("C:/", "e")
commLogFileHandler.setFormatter(logging.Formatter("%(asctime)s: %(message)s"))
logging.getLogger("hsms_communication").addHandler(commLogFileHandler)
logging.getLogger("hsms_communication").propagate = False
logging.basicConfig(format='%(asctime)s %(name)s.%(funcName)s: %(message)s', level=logging.DEBUG)

#h=SampleEquipment("장비주소",포트,PASSVIE=Flase or ACTIVE=true,DEVICEID,"로그이름"
#설비의 경우 보통 접속당하는 쪽의 PASSVIE 모드을 쓰는 편입니다. 
h = SampleEquipment("127.0.0.1", 7000, False, 1, "sampleequipment")

h.enable()

#파이선에서 실행한뒤에 인터프리터 코드 창을 남겨주기위해서 아래 코드를 실행합니다.
code.interact("equipment object is available as variable 'h'", local=locals())

h.disable()





테스트 


secs/gem 통신 시뮬레이터를 통해 실험해 보겠습니다. 




secs/gem 시뮬레이터 프로그램에서 실제로 통신이 잘 이루어 졌습니다. 


이번에는 통신 로그를 보겠습니다. 

C:/ecom_sampleequipment.log


2017-08-10 19:21:51,700: < 'header': {sessionID:0x0001, stream:01, function:11, pType:0x00, sType:0x00, system:0x000027d3, requireResponse:True}

S1F11 W

  <L [1]

    <I2 10 >

  > .

2017-08-10 19:21:51,704: > 'header': {sessionID:0x0001, stream:01, function:12, pType:0x00, sType:0x00, system:0x000027d3, requireResponse:False}

S1F12

  <L [1]

    <L [3]

      <U1 10 >

      <A "sample1, numeric SVID, SecsVarU4">

      <A "meters">

    >

  > .


로그 또한 정상적으로 잘 기록 되었음을 알수가 있습니다. 





위의 코드에 API 문서에서 필요한 부분들을 발췌 하겠습니다. 

SampleEquipment의 부모가 되는 secsgem.GemEquipmentHandler



secsgem.GemEquipmentHandler

http://secsgem.readthedocs.io/en/latest/reference/gem/handler.html


Handler

classsecsgem.gem.handler.GemHandler(addressportactivesession_idnamecustom_connection_handler=None)[source]

Bases: secsgem.secs.handler.SecsHandler

Baseclass for creating Host/Equipment models. This layer contains GEM functionality. Inherit from this class and override required functions.

Parameters:
  • address (string) – IP address of remote host
  • port (integer) – TCP port of remote host
  • active (boolean) – Is the connection active (True) or passive (False)
  • session_id (integer) – session / device ID to use for connection
  • name (string) – Name of the underlying configuration
  • custom_connection_handler (secsgem.hsms.connections.HsmsMultiPassiveServer) – object for connection handling (ie multi server)


secsgem 자료 구조 타입 

http://secsgem.readthedocs.io/en/latest/reference/secs/variables.html



http://secsgem.readthedocs.io/en/latest/reference/gem/equipmenthandler.html


status_variables


status_variables

The list of the status variables

Returns:Status variable list
Return type:list of secsgem.gem.equipmenthandler.StatusVariables


에 관한 정보도 있지만 콜백 함수에 대한 정보 도 API 문서에 있습니다. 


on_sv_value_request(svidsv)[source]

Get the status variable value depending on its configuation.

Override in inherited class to provide custom status variable request handling.

Parameters:
Returns:

The value encoded in the corresponding type

Return type:

secsgem.secs.variables.SecsVar





기존에 secs/gem 통신 프로토콜을 하셧던 분들을 아마 느낌이 바로 오실것 같습니다. 


만약 여기나오는 용어들 대부분이 secs/gem 표준을 알아야 이해가 되는 부분들이니 API 를 사용하시면서 공부 하시는것도 좋고 


따로 secs/gem 프로토콜 문서만 보고 공부를 하셔도 좋습니다만 표준 문서를 또는 프로토콜을 공부해야 하는것은 피할수가 없습니다


이외에도 관련된 API 문서가 많아서 기본 샘플 코드를 토대로 필요한 부분들을 발췌하여 사용하면 매우 효울적인 공부법이 될것 같습니다. 


이후에도 계속 해서 secs/gem API 를 틈틈히 업로드 하고 표준 문서 분석도 업로드 해야 할것 같네요.

 


Comments