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)
|