modbus - PyModbus 无法读取保持寄存器
问题描述
我正在尝试使用 PyModbus 2.3.0 从 Siemens S7-1200 PLC 上的一些保持寄存器中读取值。我已经设置了一些梯形逻辑来在 PLC 上进行测试,其中一些寄存器保存着随机浮点测试值。我正在尝试通过 Raspberry Pi 3 上的标准 Raspbian 安装来完成这一切。连接是通过以太网进行的,并且我已经确认 PyModbus 可以连接到 PLC(我已经对 PLC 进行了 ping 操作,并且 PyModbus 状态请求返回是的,你很快就会看到)。有罪的代码是这样的:
import pymodbus
import logging
import logging.handlers as Handlers
from pymodbus.client.sync import ModbusTcpClient
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
client = ModbusTcpClient('192.168.15.16', port = '443', timeout = 10, baudrate = 38400)
connection = client.connect()
print('PLC connection status: ', connection)
response = client.read_holding_registers(address = 50, length = 64, unit = 1)
print(response)
client.close()
结果是这样的:
PLC connection status: True
DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x0 0x1 0x0 0x0 0x0 0x6 0x1 0x3 0x0 0x32 0x0 0x1
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received))
DEBUG:pymodbus.framer.socket_framer:Processing:
DEBUG:pymodbus.transaction:Getting transaction 1
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)
我无法显示我现在使用的梯形逻辑,但是 TIA 为具有测试值的寄存器提供的地址是“%MD50”,我相信这意味着我需要像上面那样做并期待具有 64 位数据的寄存器 50(保持寄存器)。但是,PLC 似乎没有发送任何响应。难道我做错了什么?我很困惑为什么这现在不起作用。
解决方案
您可以使用 Wireshark 来监控客户端和服务器之间的通信。这将帮助您更好地诊断错误。Modbus 的保持寄存器的每个位置都保存 16 位数据。指令:client.read_holding_registers(address = 50, length = 64, unit = 1) 将返回保持寄存器的地址位置 50 到 50+64 的值。
推荐阅读
- python-3.x - Elasticsearch使用批量api python索引多个csv
- unsupervised-learning - Imagenet 是否包含未标记的数据?
- javascript - 如何自动检查两个单选按钮组的单选按钮基础
- sql - 显示 Column1 的数据,其中包含第 2 列中提到的值
- google-apps-script - Apps 脚本:以日/月/年格式为多列增加日期
- flutter - 如何使其影响设备字体大小到 RichText 和 TextSpan
- javascript - 用 React 处理页面中所有状态的最佳方法是什么?
- azure-blob-storage - 为什么我无法使用托管标识连接到我的 Azure Blob 存储帐户?
- mql5 - MQL5 中的无效到期订单发送专家
- scala - Scala Month函数抛出错误没有枚举常量java.time.Month.UNDEFINED