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)
Мой измененный код теперь будет запустить < /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
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)
Также необходимо заменить исходную преамбулу, < /p>
Код: Выделить всё
from pymodbus.client.sync import ModbusSerialClient # configure the serial port
< /code>
с этой преамбулкой: < /p>
from pymodbus.client import ModbusSerialClient as ModbusClient
Подробнее здесь: https://stackoverflow.com/questions/794 ... -arguments