Django / Python - параллелизм последовательной линии - PullRequest
0 голосов
/ 24 апреля 2018

В настоящее время я работаю над шлюзом со встроенным Linux и веб-сервером. Цель шлюза - получать данные с электрических устройств через линию RS485 / Modbus и отображать их на сервере.

Я использую Nginx и Django, а веб-интерфейс поставляется с "статическими" файлами. Неоднократно файл сценария Javascript выполняет вызовы AJAX, которые отправляют запросы CGI в Nginx. На эти CGI-запросы отвечает JSON, благодаря Django. Ответы в основном представляют собой данные, которые были прочитаны на соответствующем устройстве Modbus.

Точный путь следующий: Случайно синхронизированный вызов CGI -> urls.py -> ModbusCGI.py (импортируйте другой скрипт ModbusComm.py) -> ModbusComm.py создайте клиент Modbus и сразу попытайтесь прочитать его.

Кроме того, я хотел реализовать регистратор данных, чтобы регулярно хранить данные в БД. Я создал скрипт, который также импортирует скрипт ModbusComm.py, но он не работает: иногда несколько фреймов Modbus отправляются одновременно (скрипты datalogger и cgi вызывают одну и ту же функцию в "файлах" ModbusComm.py одновременно ), что приводит к ошибке.

Я уверен, что эта проблема также возникнет, если на сервере будет много пользователей (запросы CGI отправляются одновременно). Или нет ? (система очередей уже управляет запросами CGI? Я немного растерялся)

Так что моей целью было бы создать систему очередей, которая могла бы обрабатывать вызовы из нескольких скриптов python => заставить их ждать, пока не их очередь => вызвать функцию с правильными аргументами, когда наступит их очередь (фактически используя строку modbus) ) и отправьте ответ обратно скрипту python, чтобы он мог сгенерировать ответ JSON.

Я действительно не знаю, как этого добиться, и я уверен, что есть лучший способ сделать это.

Если я не достаточно ясен, не стесняйтесь, чтобы я знал об этом:)

1 Ответ

0 голосов
/ 30 апреля 2018

У меня была такая же проблема, когда мне нужно было разрешить нескольким процессам считывать некоторые данные Modbus (и не только Modbus) через последовательный порт.Я получил автономный процесс («сервер последовательного порта»), который работает исключительно с последовательным портом.Все другие процессы работают с этим портом через этот автономный процесс через некоторый механизм взаимодействия между процессами (мы использовали сокеты Unix).

Таким образом, когда приложение хочет прочитать регистр Modbus, оно подключается к «серверу последовательного порта»., отправляет запрос и получает ответ.Вся фактическая связь через последовательный порт осуществляется «сервером последовательного порта» последовательно для обеспечения согласованности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...