Как прочитать данные из Siemens S7-1500 PLC Асинхронно с помощью Python и Snap7?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как прочитать данные из Siemens S7-1500 PLC Асинхронно с помощью Python и Snap7?

Сообщение Anonymous »

Я пытаюсь прочитать данные из Siemens S7-1500 PLC асинхронным образом, используя Python и библиотеку Snap7 . Моя цель - прочитать несколько тегов одновременно. Тем не менее, я сталкиваюсь с ошибкой

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

b'CLI : Job pending'
[/b] во время запуска следующего кода.
Вот сценарий Python, который я пробовал:

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

import snap7
from snap7.util import get_int
import asyncio
from concurrent.futures import ThreadPoolExecutor

PLC_IP = "192.168.0.162"
RACK = 0
SLOT = 0

# Define a global ThreadPoolExecutor
executor = ThreadPoolExecutor()

# Function to create and connect a new client
def create_client():
client = snap7.client.Client()
client.connect(PLC_IP, RACK, SLOT)
if client.get_connected():
print("Connected to the PLC successfully!")
return client
else:
raise ConnectionError("Failed to connect to the PLC.")
client = create_client()

# Synchronous function to read from the PLC
def sync_read_plc(db_number, offset, length):
try:
data = client.db_read(db_number, offset, length)
value = get_int(data, 0)
return value
finally:
client.disconnect()

# Asynchronous wrapper for reading
async def async_read_plc(db_number, offset, length):
loop = asyncio.get_running_loop()
return await loop.run_in_executor(executor, sync_read_plc, db_number, offset, length)

# Asynchronous function to handle multiple PLC reads
async def read_multiple_tags():
# List of tags to read (offsets and lengths)
tags = [
(19, 278, 2),  # (DB number, offset, length)
(19, 280, 2),
(19, 282, 2),
]

# Create tasks for reading all tags asynchronously
tasks = [async_read_plc(db_number, offset, length) for db_number, offset, length in tags]

# Gather results (execute all tasks concurrently)
results = await asyncio.gather(*tasks)

# Display results
for i, value in enumerate(results):
print(f"Tag {i}: {value}")

# Main function to run the asyncio event loop
def main():
asyncio.run(read_multiple_tags())

if __name__ == "__main__":
main()

< /code>
Когда я запускаю этот скрипт, я получаю следующую ошибку: < /p>
Connected to the PLC successfully!
b'CLI : Job pending'
b'CLI : Job pending'
Traceback (most recent call last):
File "async_copy.py", line 63, in 
main()
File "async_copy.py", line 60, in main
asyncio.run(read_multiple_tags())
File "/path/to/python/asyncio/runners.py", line 194, in run
return runner.run(main)
...
RuntimeError: b'CLI : Job pending'

Сообщение об ошибке b'cli: задание ожидает »предполагает, что клиент PLC пытается обработать несколько запросов одновременно, но не поддерживает одновременные задания на одном соединении.
my Понимание: < /h2>

Я использую Asyncio с ThreadPoolexeCutor для запуска синхронных чтений (sync_read_plc) в отдельных потоках. < /li>
Однако, поскольку все задачи используют один и тот же экземпляр клиента Snap7 (клиент), кажется, что библиотека PLC или Snap7 не обрабатывают несколько параллельных запросов правильно. < /li>
< /ul >
Есть ли какой -либо другой способ использовать асинхронные вызовы без использования нескольких потоков, тогда так также ценится. Моя конечная цель - читать из нескольких метров (~ 1000) с низкой задержкой (~ 20 мс).
p.S: я могу читать данные, если я читаю только с одного тега. < /P>

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как прочитать данные из Siemens S7-1500 PLC Асинхронно с помощью Python и Snap7?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Общение о Siemens Plc и кодах C++
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Преобразование реального типа данных из Siemens PLC (S7-1200) для отображения в визуальной форме C# Windows
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как исправить ошибки модуля в snap7
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Abb plc читает данные тегов с помощью Python или любого другого языка
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

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