描述和代码:
我正在使用带pymodbus
库的同步 ModbusTcpServer 来创建 Modbus 从站/服务器,代码如下:
from pymodbus.server.sync import StartTcpServer, ModbusTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from twisted.internet.task import LoopingCall
from twisted.internet import reactor
import threading
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
def run_server():
block1 = ModbusSequentialDataBlock(0x00, [717] * 0x0F)
block2 = ModbusSequentialDataBlock(0x10, [323] * 0x1F)
store2 = ModbusSlaveContext(hr=block1, ir=block2)
slaves = {
0x01: store2,
}
context = ModbusServerContext(slaves=slaves, single=False)
identity = ModbusDeviceIdentification()
identity.VendorName = 'Pymodbus'
identity.ProductCode = 'PM'
identity.VendorUrl = 'http://github.com/riptideio/pymodbus/'
identity.ProductName = 'Pymodbus Server'
identity.ModelName = 'Pymodbus Server'
identity.MajorMinorRevision = '1.0'
interval = 2
server = ModbusTcpServer(context,
identity=identity,
address=('0.0.0.0', 5021)) # Problem cause.
thread_ = threading.Thread(target=server.serve_forever, daemon=True)
thread_.start()
loop = LoopingCall(f=update_values, a=server)
loop.start(interval, now=True)
reactor.run()
def update_values(a):
print("-----------START-----------")
rfuncode = 3
wfuncode = 16
slave_id = 0x01
address = 0x00
context_ = a.context[slave_id]
values = context_.getValues(rfuncode, address, count=32)
print(values)
values = [val+1 for val in values]
context_.setValues(wfuncode, address, values)
print("------------END------------")
if __name__ == "__main__":
run_server()
当客户端应用程序连接到此服务器并且我关闭此代码(使用Ctrl+ C)并再次运行时遇到此错误:
OSError: [Errno 98] Address already in use
我知道在创建套接字时我们可以用它socket.SO_REUSEADDR
来克服这个问题。
另外,我可以.close()
在客户端连接来解决这个问题,但我想要一个稳定的服务器。
问题:
有没有内置的方法来克服这个问题?socket.SO_REUSEADDR
我在异步 ModbusTcpServer (in ) 中找到了这个参数 ( ),async.py
但在 Synchronous ModbusTcpServer ( sync.py
) 中没有。
[注意]:
版本
- 蟒蛇:3.6.5
- 操作系统:Ubuntu 16.04
- Pymodbus:1.5.2
- Modbus 硬件(如果使用):否
Pymodbus 特定的
- 服务器:tcp - 同步
- 客户端:tcp - 同步