基于python2.7安装pymodbus库--ubuntu16.04
对网络公开信息进行整合验证测试后的可行方案
版本介绍
python 2.3
pip 20.3.4
pymodbus 2.5.3
安装过程
1.会遇到的问题
pip版本过低
ubuntu16.04LTS(ubuntu18默认python3并内置pip,不会遇到这个问题)系统自带python分别为2.7和3.5两个版本,不做更改的情况下,默认调用2.7,这个时候我们直接pip安装pymodbus会提示pip版本过低。
终端运行:
curl 'https://bootstrap.pypa.io/pip/2.7/get-pip.py' > get-pip.py
sudo python get-pip.py
另外, 如果想针对python3.5更行安装对应pip,将2.7修改为3.5即可,如下:
curl 'https://bootstrap.pypa.io/pip/3.5/get-pip.py' > get-pip.py
sudo python get-pip.py
通过指令检查,有对应信息显示即可。
which pip
pip #或直接pip
2.安装pymodbus
解决掉1中的问题后,我们就可以顺利指令安装了。
pip install -U pymodbus
pip list #查询pymodbus安装情况和版本
测试
1.没有实际PLC硬件
可以利用pymodbus库来实现一个虚拟的服务端,代码中的ip和端口为虚拟服务端的信息,粘贴运行即可:
'''
* @Author: liuzhao
* @Last Modified time: 2022-10-05 09:56:13
'''
from pymodbus.server.sync import (
StartTcpServer,
)
from pymodbus.datastore import (
ModbusSequentialDataBlock,
ModbusServerContext,
ModbusSlaveContext,
)
from pymodbus.version import version
datablock = ModbusSequentialDataBlock.create()
context = ModbusSlaveContext(
di=datablock,
co=datablock,
hr=datablock,
ir=datablock,
)
single = True
# Build data storage
store = ModbusServerContext(slaves=context, single=single)
if __name__ == '__main__':
address = ("127.0.0.1", 8000)
StartTcpServer(
context=store, # Data storage
address=address, # listen address
allow_reuse_address=True, # allow the reuse of an address
)
终端运行该脚本,即开启了服务端:
python modbus_server.py
2.有实际PLC硬件
设置好与网口同一网段,才能正常连接,后面的测试代码按照实际硬件的IP和端口号设置就行,没什么特别的地方。
3.通讯测试
这里只展示了寄存器的写/读
from pymodbus.client.sync import ModbusTcpClient
from pymodbus.bit_read_message import ReadCoilsResponse
from pymodbus.register_read_message import ReadInputRegistersResponse
from pymodbus.exceptions import ConnectionException
import time
host = '127.0.0.1'
port = 8000
client = ModbusTcpClient(host,port)
for i in range(0,10):
client.write_register(address=0+i,value=i) #写入寄存器地址
request = client.read_holding_registers(address=0+i,count=2) #读取保持寄存器内的值
result = request.getRegister(0)
print('read_holding_registers ', result)
其他更完整的测试代码请参考python使用pymodbus库进行modbus tcp通信