我正在使用一个名为BACpypes的库通过网络与PLC通信。这里的简短版本是,我需要在自己的线程中启动BACpypes应用程序,然后在这个单独的线程中执行对plc的读/写。
对于多个PLC,有一个处理循环,它创建一个应用程序(提供PLC ip地址),使用应用程序在PLC上执行读写操作,通过从核心模块调用BACpypesstop(*args)来终止应用程序,在线程上调用join,然后移动到列表中的下一个ip地址,直到我们重新开始。这适用于尽可能多的ip地址(PLC),但一旦我们再次回到第一个ip地址(PLC),我就会得到错误:
socket.error: [Errno 98] Address already in use
这是我的线程类的简短代码,它使用BACpypes核心的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文档注册为信号处理程序的。这是我从这个链接中提取的一个片段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信号传递给停止函数?我只是不知道如何写这行代码。所以,如果有人能解释这一点,那就太好了。
谢谢你的帮助!
在停止内核之前,您需要释放套接字。
我使用:
try:
self.this_application.mux.directPort.handle_close()
except:
self.this_application.mux.broadcastPort.handle_close()
之后我叫停止则CCD_ 1