Код: Выделить всё
b'CLI : Job pending'
Вот сценарий 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'
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