Pymodbus, TypeError ⸺ Слишком много позиционных аргументовPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pymodbus, TypeError ⸺ Слишком много позиционных аргументов

Сообщение Anonymous »

аппаратная и фоновая история < /h3>

python3 с использованием VS-кода в качестве моего ide < /p>
< /li>
Linux Mint 21.3 (Cinnamon) < /p>
< /li>
Попытка последовательной связи, чтобы запросить Pzem-004t (v3) Power

module ("Slave"), который использует RS-485 (modbus) Comms через Pellific® PL2303 TTL-to-USB Converter < /p>
< /li>
Я подтвердил адрес устройства = 0x01, используя Docklight® (запустите отдельно на платформе Windows) < /p>
< /li>
< /ul>
Я начал с кода Python, предоставленного на GitHub в качестве отправной точки. Но, как был предоставлен этот код, он дал несколько ошибок, связанных с «преамбулкой». Я заменил преамбулу /настройку этого предоставленного GitHub кода, который изначально был < /p>

Код: Выделить всё

from pymodbus.client import ModbusSerialClient as ModbusClient

# configure the serial port
client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600)
с первыми 11 строками кода, показанными ниже . Все остальное остается прежним.
Мой измененный код теперь будет запустить < /em>, но бросает сообщение об ошибке (цитируется после моего неисправного кода) < /p>
{ Неисправный} код < /h3>

Код: Выделить всё

from pymodbus.client.sync import ModbusSerialClient
# configure the serial port
client = ModbusSerialClient(
method='rtu',
port='/dev/ttyUSB0',
baudrate=9600,
#timeout=3,
parity='N',
stopbits=1,
bytesize=8
)

#device default address is 0x01. However you can change the address by modifying the register that sets the address
device_address = 0x01

# connect to the PZEM-004T
client.connect()

# read the voltage value
result = client.read_input_registers(0x0000, 1, device_address)
voltage = float(result.registers[0] / 10.0)

# read the current value
result = client.read_input_registers(0x0001, 2, device_address)
current = float(result.registers[0] / 1000.0)

# read the power value
result = client.read_input_registers(0x0003, 2, device_address)
power = float(result.registers[0])

# read energy value
result = client.read_input_registers(0x0005, 2, device_address)
energy = float(result.registers[0])

# read the frequency value
result = client.read_input_registers(0x0007, 1, device_address)
frequency = float(result.registers[0] / 10.0)

#read the power factor value
result = client.read_input_registers(0x0008, 1, device_address)
power_factor = float(result.registers[0] / 100.0)

# print the values
print(f"Voltage: {voltage} V")
print(f"Current: {current} A")
print(f"Power: {power} W")
print(f"Energy: {energy} Wh")
print(f"Frequency: {frequency} Hz")
print(f"Power Factor: {power_factor} ")

# disconnect from the PZEM-004T
client.close()
< /code>
 Ошибка выброшена < /h3>
Traceback (most recent call last):
File "/home/username/Documents/Python_PZEM_Module/another_PZEM_test", line 22, in 
result = client.read_input_registers(0x0000, 1, 0x01)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: ModbusClientMixin.read_input_registers() takes from 2 to 3 positional arguments but 4 were given
< /code>
 может кто -нибудь пролить свет на эту проблему? Результаты там.  
 Обновление, 2025-02-04 
Следующий комментарий от британцев, я изменил «преамбулу» моего кода на 
import asyncio
import time
from pymodbus import FramerType
from pymodbus.client import AsyncModbusSerialClient, ModbusSerialClient

# configure the serial port
client = ModbusClient.ModbusSerialClient(
"/dev/ttyUSB0",
framer=FramerType.RTU,
baudrate=9600,
bytesize=8,
parity="N",
stopbits=1,
)
< /code>
А теперь отбрасываемое сообщение об ошибке: < /p>
username@userplatform:~/Documents/Python_PZEM_Module$  cd /home/username/Documents/Python_PZEM_Module ; /usr/bin/env /bin/python3.11 /home/username/.vscode/extensions/ms-python.debugpy-2024.14.0-linux-x64/bundled/libs/debugpy/adapter/../../debugpy/launcher 39645 -- /home/username/Documents/Python_PZEM_Module/another_PZEM_test
Traceback (most recent call last):
File "/home/username/Documents/Python_PZEM_Module/another_PZEM_test", line 3, in 
from pymodbus import FramerType
ImportError: cannot import name 'FramerType' from 'pymodbus' (/usr/lib/python3/dist-packages/pymodbus/__init__.py)
< /code>
 Обновление, 2025-02-05, после комментариев Brits < /h3>
Я использовал Python3 на моей платформе Linux Mint (V21.3). Здесь Python3 был установлен с использованием менеджера синаптических пакетов (далее, SPM .... то есть официальная «система системы», представленная Mint)
, кажется, что единственная версия Pymodbus, доступная в так называемой современной Пакет Python3 SPM выглядит следующим образом: < /p>
/var/cache/apt/archives/python3-pymodbus_2.1.0+dfsg-2_all.deb
И я предполагаю, что это pymodbus_2.1
as pymodbus3. ** не < /strong> доступен в SPM, я удалял pymodbus (2.1.0) через Spm.
i затем установил Pymodbus3.8.3 с использованием PIP установить pymodbus < /code>.
, к сожалению, к сожалению , pip не устанавливает в той же структуре файлов, используемой версией SPM. Фактически, PIP < /code> установлен в каталоге

Код: Выделить всё

/home/myusername/.local/lib/python3.10/site-packages/pymodbus-3.8.3.dist-info

функциональный >

Код: Выделить всё

ModuleNotFoundError: No module named 'pymodbus'

, который (без сомнения) связан с ошибками в переменных среды .bashrc и т. Д. При попытке исправить .bashrc (и т. Д. и т.д.), у меня не было успеха, и у меня были эти изменения, прежде чем создавать еще больше проблем для себя !!! < /p>
Вопрос: < /h5>
Лучше всего полностью удалить всю установку SPM Python с моей платформы и переустановить все, используя только Pip ?
обновление, 2025-02-08:
После получения дополнительных советов на форуме Mint мое невежество относительно Python и «виртуальных сред» в основном разрешено. Итак, теперь ...
Я очистил предыдущие оплодотворы, пытающиеся установить Pymodbus v3, используя Pip < /code>; и
у меня есть Pymodbus v3.8.3 в такой виртуальной среде; и
я внес необходимые изменения в VS-код, чтобы указать на новую виртуальную среду.
не сообщает о каких -либо «проблемах» (ее терминологии) при запуске кода, он все еще вызывает ту же ошибку, то есть < /p>

Код: Выделить всё

TypeError: ModbusClientMixin.read_input_registers() takes from 2 to 3 positional arguments but 4 were given
< /code>
 _________ Вопросы: < /h5>

 Это все еще выглядит как конфликт из -за (неправильной) версии
Pymodbus? < /Li>
 Что конкретно подразумевается под фразой »,positional arguments< /code> "
? P> В исходном коде GitHub «pzem.py» Синтаксис для чтения из реестра для подчиненного адреса 0x0001 назначается как < /p>
result = client.read_input_registers(0x0000, 1, 0x0001)
< /code>
При использовании Pymodbus v3.8.3, правильный синтаксис - < /p>
result = client.read_input_registers(0x0000,count=1, slave=1)
.e.e., Вы должны [/b] явно использовать count = и slave = в списке "позиционных аргументов".
Также необходимо заменить исходную преамбулу, < /p>

Код: Выделить всё

from pymodbus.client.sync import ModbusSerialClient # configure the serial port
< /code>
с этой преамбулкой: < /p>
from pymodbus.client import ModbusSerialClient as ModbusClient
Конечно (!) Вы должны работать в виртуальной среде, которая предоставляет Pymodbus v3

Подробнее здесь: https://stackoverflow.com/questions/794 ... -arguments
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»