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> установлен в каталоге
, который (без сомнения) связан с ошибками в переменных среды .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
аппаратная и фоновая история < /h3> [list] [*] 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> [code]from pymodbus.client import ModbusSerialClient as ModbusClient
# configure the serial port client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600) [/code] с первыми 11 строками кода, показанными ниже . Все остальное остается прежним. Мой измененный код теперь будет запустить < /em>, но бросает сообщение об ошибке (цитируется после моего неисправного кода) < /p> { Неисправный} код < /h3> [code]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)
# 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 [/code] И я предполагаю, что это [b] pymodbus_2.1 [/b] as [b] pymodbus3. [/b] ** не < /strong> доступен в SPM, я удалял pymodbus (2.1.0) через Spm. i затем установил Pymodbus3.8.3 с использованием PIP установить pymodbus < /code>. , к сожалению, к сожалению , pip не устанавливает в той же структуре файлов, используемой версией SPM. Фактически, PIP < /code> установлен в каталоге [code]/home/myusername/.local/lib/python3.10/site-packages/pymodbus-3.8.3.dist-info[/code] функциональный > [code]ModuleNotFoundError: No module named 'pymodbus'[/code] , который (без сомнения) связан с ошибками в переменных среды .bashrc и т. Д. При попытке исправить .bashrc (и т. Д. и т.д.), у меня не было успеха, и у меня были эти изменения, прежде чем создавать еще больше проблем для себя !!! < /p> Вопрос: < /h5> Лучше всего полностью удалить всю установку SPM Python с моей платформы и переустановить все, используя только Pip ? обновление, 2025-02-08: После получения дополнительных советов на форуме Mint мое невежество относительно Python и «виртуальных сред» в основном разрешено. Итак, теперь ... Я очистил предыдущие оплодотворы, пытающиеся установить Pymodbus v3, используя Pip < /code>; и у меня есть Pymodbus v3.8.3 в такой виртуальной среде; и я внес необходимые изменения в VS-код, чтобы указать на новую виртуальную среду. не сообщает о каких -либо «проблемах» (ее терминологии) при запуске кода, он все еще вызывает ту же ошибку, то есть < /p> [code]TypeError: ModbusClientMixin.read_input_registers() takes from 2 to 3 positional arguments but 4 were given < /code> _________ Вопросы: < /h5>
Это все еще выглядит как конфликт из -за (неправильной) версии Pymodbus? < /Li> Что конкретно подразумевается под фразой »,positional arguments[/code] " ? [/list]