2014-11-03 2 views
1

BACpypes라는 라이브러리를 사용하여 네트워크를 통해 PLC와 통신합니다. 여기서 짧은 버전은 자체 스레드에서 BACpypes 응용 프로그램을 시작한 다음이 별도 스레드에서 plc에 읽기/쓰기를 수행해야한다는 것입니다. 다수의 PLC의 내용 신호 처리기는 (* args)를 받아 들일 수 있습니까? 어떻게 제공합니까?

가 애플리케이션을 생성하는 처리 루프 (PLC의 IP 주소를 제공하는)가, 읽기 수행은 응용 프로그램을 사용하여 PLC에 기록 BACpypes에게 스톱 (* 인수) 코어 모듈로부터를 호출하여 애플리케이션 처치 스레드에서 호출을 호출 한 다음 다시 시작할 때까지 목록의 다음 IP 주소로 이동합니다. 우리가 이것은 많은 IP 주소 (PLC에)에 대한 작동하지만, 곧 우리가 다시 첫 번째 IP 주소 (PLC)에서 한, 나는 오류 얻을 : 여기
socket.error: [Errno 98] Address already in use 

가 짧은 코드를 내 thread 클래스는 BACpypes core에서 stop() 및 run() 함수를 사용합니다.

class BACpypeThread(Thread): 
    def __init__(self, name): 
     Thread.__init__(self) 
     Thread.name = name 
    def run(self): 
     run() 
    def stop(self): 
     stop() 

제대로 응용 프로그램이 종료되지 않는 것 같습니다. 그래서, 나는 stop (* args)이 BACpypes docs에 따라 시그널 핸들러로 등록된다는 것을 안다. 여기에이 링크 내가 다시 IP 주소를 사용할 수 있도록 킬 (kill) -term 신호를 제공해야 같은 느낌 http://bacpypes.sourceforge.net/modules/core.html

core.stop(*args) 
Parameters: args – optional signal handler arguments 
This function is called to stop a BACpypes application. It resets the running boolean value. This function also installed as a signal handler responding to the TERM signal so you can stop a background (deamon) process: 

$ kill -TERM 12345 

에서 가져온 조각이다. 어떻게해야할지 모르겠다. 여기 내 질문이 ...

1)이 예제에서 12345는 내가 믿는 프로세스 번호입니다. 내 스레드의 번호를 어떻게 알 수 있습니까?

2) 번호가 생기면 kill -TERM 신호를 실제로 정지 기능에 전달하는 방법은 무엇입니까? 이 코드 줄을 실제로 작성하는 방법을 모르겠습니다. 누군가가 이것을 설명 할 수 있다면 그것은 위대 할 것입니다.

도움 주셔서 감사합니다.

답변

0

코어를 중지하기 전에 소켓을 해제해야합니다.

내가 사용

try: 
     self.this_application.mux.directPort.handle_close() 
    except: 
     self.this_application.mux.broadcastPort.handle_close() 

을 그 후 나는 다음 thread.join()

을 중지 호출