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
    "
    ?


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

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

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

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

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

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

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