Управление контроллером TXT через веб страницу
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Управление контроллером TXT через веб страницу
Сообщение "OSError: [Errno 98] Address already in use" означает, что порт 8000 уже занят. Скорее всего у вас уже запущен экземпляр сервера. Остановите его или просто перезагрузите контроллер.
Re: Управление контроллером TXT через веб страницу
Заработал. Из папки Python не работает.
Как запустит сервер через экранное меню контроллера.
В экранном меню контроллера не отображает папка cgi-form-simple
Как запустит сервер через экранное меню контроллера.
В экранном меню контроллера не отображает папка cgi-form-simple
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Управление контроллером TXT через веб страницу
Чтобы можно было запускать через экранное меню надо разложить файлы проекта следующим образом:
Код: Выделить всё
/opt/knobloch/Python
cgi-form-simple-server.py
/opt/knobloch
index.html
/opt/knobloch/cgi-bin
cgi-form.py
Re: Управление контроллером TXT через веб страницу
Все работает.
Большое спасибо!!!!!!!!!!!
С уважением, Муаед.
Большое спасибо!!!!!!!!!!!
С уважением, Муаед.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Управление контроллером TXT через веб страницу
Как объединит
коды
И
такое объединение не работает
коды
Код: Выделить всё
#!/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
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Управление контроллером TXT через веб страницу
Использовать модуль 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:
Файл client.py:
Отдельно, хочу отметить, что решение с использованием форм и CGI будет очень медленным по сравнению с технологией асинхронных запросов к серверу - AJAX. Причина в том, что на каждый CGI-запрос веб-сервер создает отдельный процесс и инициализирует интерпретатор Python. Для запросов AJAX обработка выполняется в процессе сервера и дополнительная инициализация Python не требуется. Выбор за вами.
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()
Код: Выделить всё
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()