2014-11-03 3 views
1

Я использую библиотеку под названием BACpypes для связи по сети с ПЛК. Краткая версия здесь заключается в том, что мне нужно запустить приложение BACpypes в своем собственном потоке, а затем выполнить чтение/запись в plc в этом отдельном потоке.Обработчик сигналов принимает (* args), как мне их предоставить?

Для множественного ПЛК, существует цикл обработки, который создает приложение (предоставление адреса PLC IP), выполняет чтения записывает на ПЛК с помощью приложения, убивает приложения, вызвав BACpypes стоп (* арг) из модуля ядра, вызывает соединение в потоке, а затем переходит к следующему ip-адресу в списке, пока мы не начнем заново. Это работает как многие IP-адреса (ПЛК), как у нас, но как только мы вернулись в первый IP-адрес (PLC) снова, я получаю ошибку:

socket.error: [Errno 98] Address already in use 

Вот короткий код для моего класс thread, который использует функции stop() и run() из ядра BACpypes.

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

Похоже, что я неправильно убиваю приложение. Итак, я знаю, что stop (* args) зарегистрирован как обработчик сигналов в соответствии с документами BACpypes. Вот отрывок я вытащил из этой ссылки 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 

Я чувствую, что мне нужно, чтобы обеспечить убийство -ной сигнал, чтобы сделать адрес IP снова доступен. Я не знаю, как это сделать. Вот мой вопрос ...

1) В этом примере 12345 - это номер процесса, который я считаю. Как мне определить этот номер для моего потока?

2) Как только у меня есть номер, как я могу передать сигнал kill -TERM функции остановки? Я просто не знаю, как на самом деле написать эту строку кода. Так что, если кто-то может это объяснить, это будет здорово.

Спасибо за помощь!

ответ

0

Перед тем как остановить сердечник, вам необходимо освободить разъем.

Я использую:

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

После того, что я называю остановки затем thread.join()