83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
from flask import Flask, jsonify
|
||
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
|
||
import threading
|
||
|
||
app = Flask(__name__)
|
||
|
||
# Настройка Modbus
|
||
client = ModbusClient( port='COM4', baudrate=9600, timeout=1)
|
||
client.close()
|
||
client.connect()
|
||
|
||
# Хранилище данных состояния пина
|
||
pin_status = {"state": 0}
|
||
|
||
# Функция для обновления состояния пина с помощью Modbus
|
||
def read_modbus():
|
||
global pin_status
|
||
while True:
|
||
result = client.read_holding_registers(0, 1, unit=1) # Чтение первого регистра
|
||
if result.isError():
|
||
print("Ошибка чтения данных Modbus")
|
||
else:
|
||
pin_status["state"] = result.registers[0] # 0 - это состояние пина (0 или 1)
|
||
print(f"Регистр успешно считан: {result.registers}")
|
||
|
||
# Запуск потока для чтения данных
|
||
modbus_thread = threading.Thread(target=read_modbus)
|
||
modbus_thread.daemon = True
|
||
modbus_thread.start()
|
||
|
||
# Эндпоинт для отдачи состояния пина
|
||
@app.route('/state', methods=['GET'])
|
||
def get_pin_state():
|
||
return jsonify(pin_status)
|
||
|
||
# Главная страница для отображения круга
|
||
@app.route('/')
|
||
def index():
|
||
return '''
|
||
<html>
|
||
<head>
|
||
<style>
|
||
.circle {
|
||
width: 100px;
|
||
height: 100px;
|
||
border-radius: 50%;
|
||
margin: 50px;
|
||
transition: background-color 0.5s ease;
|
||
}
|
||
.green {
|
||
background-color: green;
|
||
}
|
||
.red {
|
||
background-color: red;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div id="circle" class="circle"></div>
|
||
<script>
|
||
function updateCircleColor() {
|
||
fetch('/state')
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
const circle = document.getElementById('circle');
|
||
if (data.state === 0) {
|
||
circle.className = 'circle green'; // Зеленый цвет
|
||
} else {
|
||
circle.className = 'circle red'; // Красный цвет
|
||
}
|
||
});
|
||
}
|
||
|
||
setInterval(updateCircleColor, 1000); // Обновляем состояние каждую секунду
|
||
updateCircleColor(); // Первоначальный вызов
|
||
</script>
|
||
</body>
|
||
</html>
|
||
'''
|
||
|
||
if __name__ == '__main__':
|
||
app.run(host='0.0.0.0', port=5000)
|