Управление контроллером TXT через веб страницу

Обсуждаем модели и конструкции, построенные своими руками
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 996
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление контроллером TXT через веб страницу

Сообщение Mr.Kubikus »

Сообщение "OSError: [Errno 98] Address already in use" означает, что порт 8000 уже занят. Скорее всего у вас уже запущен экземпляр сервера. Остановите его или просто перезагрузите контроллер.
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 27
Зарегистрирован: 19 окт 2021, 12:38

Re: Управление контроллером TXT через веб страницу

Сообщение Muaed »

Заработал. Из папки Python не работает.
Как запустит сервер через экранное меню контроллера.
В экранном меню контроллера не отображает папка cgi-form-simple
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 996
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление контроллером TXT через веб страницу

Сообщение Mr.Kubikus »

Чтобы можно было запускать через экранное меню надо разложить файлы проекта следующим образом:

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

/opt/knobloch/Python
  cgi-form-simple-server.py

/opt/knobloch
  index.html

/opt/knobloch/cgi-bin
  cgi-form.py
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 27
Зарегистрирован: 19 окт 2021, 12:38

Re: Управление контроллером TXT через веб страницу

Сообщение Muaed »

Все работает.
Большое спасибо!!!!!!!!!!!

С уважением, Муаед.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 996
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление контроллером TXT через веб страницу

Сообщение Mr.Kubikus »

Muaed писал(а):
25 дек 2021, 14:28
Все работает.
Большое спасибо!!!!!!!!!!!
Отлично! Поздравляю с победой!
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 27
Зарегистрирован: 19 окт 2021, 12:38

Re: Управление контроллером TXT через веб страницу

Сообщение Muaed »

Как объединит
коды

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

#!/usr/bin/env python3

import cgi


our_form = cgi.FieldStorage()

field_left = our_form.getfirst("left", "не задано")
field_right = our_form.getfirst("right", "не задано")

print("Content-type: text/html;charset=utf-8")
print()
print(f"<p>left = {field_left}</p>")
print(f"<p>right = {field_right}</p>")
print(f'<a href="/">Назад</a>')



И

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

import ftrobopy
import time
txt=ftrobopy.ftrobopy(use_TransferAreaMode=True)
I1=txt.input(1)
MotorL=txt.motor(1)
MotorR=txt.motor(2)
while True:
    k1=I1.state()
 
   if k1==1 and k2==0:
      MotorL.setSpeed(512)

       else:
      MotorR.setSpeed(0)

    time.sleep(0.02)


такое объединение не работает

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

#!/usr/bin/env python3

import cgi


import ftrobopy
import time

txt=ftrobopy.ftrobopy(use_TransferAreaMode=True)


MotorL=txt.motor(1)
MotorR=txt.motor(2)



while True:
our_form = cgi.FieldStorage()
field_left = our_form.getfirst("left", "не задано")
field_right = our_form.getfirst("right", "не задано")
print("Content-type: text/html;charset=utf-8")
print()
print(f"<p>left = {field_left}</p>")
   # Условие для комбинации 1
if field_left == "111":
    MotorL.setSpeed(512)

else:
    MotorL.setSpeed(0)



    time.sleep(0.02)

Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 996
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление контроллером TXT через веб страницу

Сообщение Mr.Kubikus »

Использовать модуль ftrobopy напрямую в обработчике cgi-запросов не получится т.к. после завершения работы обработчика объект txt будет уничтожен и все выходы контроллера перейдут в состояние "ВЫКЛ". Правильное архитектурное решение - реализовать несколько потоков управления и обмен сообщениями между ними:

1. Поток сервера HTTP - принимает и обрабатывает запросы по протоколу HTTP. При обращении к ресурсу CGI запускает соответствующий обработчик в отдельном процессе.
2. Поток менеджера входов/выходов контроллера - принимает команды от обработчика CGI. Выполняется в отдельном потоке.
3. Потоки создаваемые при обработке запросов CGI - принимают и обрабатывают данные из формы и затем отправляют команды в поток менеджера входов/выходов.

Потоки, указанные в п.3 должны обрабатывать данные, поступающие из браузера, и затем отправлять сообщение в поток 2, который будет формировать команды управления выходами. Здесь важно указать, что потоки из п.3 будут создаваться в отдельных от сервера HTTP процессах.

Для обмена сообщениями между потоками и процессами можно использовать классы Listner и Client из модуля multiprocessing.connection. Для управления потоками внутри одного процесса можно использовать модуль threading.

Простой пример обмена сообщениями между двумя потоками в разных процессах. Состоит из двух файлов server.py и client.py.

Файл server.py:

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

from multiprocessing.connection import Listener

listener = Listener(('localhost', 6000), authkey=b'secret password')
running = True
while running:
    conn = listener.accept()
    print('connection accepted from', listener.last_accepted)
    while True:
        msg = conn.recv()
        print(msg)
        if msg == 'close connection':
            conn.close()
            break
        if msg == 'close server':
            conn.close()
            running = False
            break
listener.close()

Файл client.py:

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

from multiprocessing.connection import Client

# Client 1
conn = Client(('localhost', 6000), authkey=b'secret password')
conn.send('MotorR: 100')
conn.send('close connection')
conn.close()

# Client 2
conn = Client(('localhost', 6000), authkey=b'secret password')
conn.send('MotorL: 100')
conn.send('close server')
conn.close()

Отдельно, хочу отметить, что решение с использованием форм и CGI будет очень медленным по сравнению с технологией асинхронных запросов к серверу - AJAX. Причина в том, что на каждый CGI-запрос веб-сервер создает отдельный процесс и инициализирует интерпретатор Python. Для запросов AJAX обработка выполняется в процессе сервера и дополнительная инициализация Python не требуется. Выбор за вами.
С уважением, Григорий
GitHub FB ВК
Ответить