Доделал последнюю версию
This commit is contained in:
parent
465df94f07
commit
b156930709
40
1/1.ino
Normal file
40
1/1.ino
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include <ModbusMaster.h>
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
|
||||||
|
// Создание объектов для Modbus
|
||||||
|
SoftwareSerial modbusSerial(10, 11); // RX, TX пины для Modbus
|
||||||
|
ModbusMaster node; // Объект Modbus для работы с клиентом
|
||||||
|
|
||||||
|
const int pinState = 7; // Пин для состояния
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Настройка пина
|
||||||
|
pinMode(pinState, INPUT);
|
||||||
|
|
||||||
|
// Инициализация Modbus
|
||||||
|
modbusSerial.begin(9600); // Скорость обмена по серийному порту для Modbus
|
||||||
|
node.begin(1, modbusSerial); // Адрес устройства (Slave ID)
|
||||||
|
|
||||||
|
// Устанавливаем тайм-аут для Modbus
|
||||||
|
node.preTransmission(preTransmission);
|
||||||
|
node.postTransmission(postTransmission);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Считываем состояние пина (0 или 1)
|
||||||
|
int pinStatus = digitalRead(pinState);
|
||||||
|
|
||||||
|
// Отправляем состояние пина на клиентскую сторону через Modbus
|
||||||
|
node.writeSingleRegister(0, pinStatus); // Пишем в регистр 0
|
||||||
|
|
||||||
|
delay(100); // Задержка для предотвращения перегрузки
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функции для обработки передачи данных
|
||||||
|
void preTransmission() {
|
||||||
|
digitalWrite(8, 1); // Например, управление RE/DE пинами (если используется RS-485)
|
||||||
|
}
|
||||||
|
|
||||||
|
void postTransmission() {
|
||||||
|
digitalWrite(8, 0); // Отключение передачи
|
||||||
|
}
|
@ -1,29 +1,19 @@
|
|||||||
#include <SimpleModbusSlave.h>
|
#include <SimpleModbusSlave.h>
|
||||||
|
|
||||||
|
#define PIN1 7 // Контролируемый пин
|
||||||
#define PIN1 7 // Пин для проверки состояния
|
|
||||||
|
|
||||||
// Настройка регистров
|
// Настройка регистров
|
||||||
#define TOTAL_REGS 1
|
#define TOTAL_REGS 1
|
||||||
uint16_t regs[TOTAL_REGS] = {0}; // Один регистр для хранения статуса
|
uint16_t regs[TOTAL_REGS] = {0}; // Один регистр для хранения состояния пина
|
||||||
|
|
||||||
SimpleModbusSlave slave(1); // Инициализация Slave с ID 1
|
SimpleModbusSlave slave(1); // Инициализация устройства с ID 1
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
// Настройка пина как вход
|
pinMode(PIN1, INPUT); // Настроим пин как вход
|
||||||
pinMode(PIN1, INPUT);
|
slave.setup(115200); // Установим скорость передачи данных 115200 бод
|
||||||
|
|
||||||
// Настройка скорости передачи данных
|
|
||||||
slave.setup(115200); // Установка скорости передачи данных 115200
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
// Чтение состояния пина
|
regs[0] = digitalRead(PIN1); // Читаем состояние пина и записываем в регистр
|
||||||
int pinState = digitalRead(PIN1);
|
slave.loop(regs, TOTAL_REGS); // Обрабатываем Modbus-запросы
|
||||||
|
|
||||||
// Установка регистра в 1, если пин HIGH, иначе 0
|
|
||||||
regs[0] = (pinState == HIGH) ? 1 : 0;
|
|
||||||
|
|
||||||
// Запуск цикла Modbus slave
|
|
||||||
slave.loop(regs, TOTAL_REGS);
|
|
||||||
}
|
}
|
||||||
|
77
Версия_1.0/Server.py
Normal file
77
Версия_1.0/Server.py
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#pip install pymodbus flask
|
||||||
|
#pip install pymodbus==2.5.3
|
||||||
|
#python d:\Антоше\Универ\Гит\Software_and_hardware\Версия_1.0\Server.py
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import serial
|
||||||
|
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
|
||||||
|
from flask import Flask, render_template
|
||||||
|
import serial.tools.list_ports
|
||||||
|
import time
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Настройка Modbus
|
||||||
|
def find_arduino_port():
|
||||||
|
ports = list(serial.tools.list_ports.comports())
|
||||||
|
for port in ports:
|
||||||
|
if "Arduino" in port.description or "CH340" in port.description:
|
||||||
|
return port.device
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Поиск порта Arduino
|
||||||
|
arduino_port = find_arduino_port()
|
||||||
|
|
||||||
|
if arduino_port is None:
|
||||||
|
print("Arduino не подключено или не найдено")
|
||||||
|
else:
|
||||||
|
print(f"Подключено к порту: {arduino_port}")
|
||||||
|
|
||||||
|
# Настройка клиента Modbus
|
||||||
|
modbus_client = ModbusClient(method='rtu', port=arduino_port, baudrate=9600)
|
||||||
|
modbus_client.connect()
|
||||||
|
|
||||||
|
# Состояние пина (будет обновляться через Modbus)
|
||||||
|
modbus_register = 0 # Регистор Modbus для состояния пина
|
||||||
|
|
||||||
|
# Функция для вывода состояния пина в консоль
|
||||||
|
def print_pin_state():
|
||||||
|
result = modbus_client.read_holding_registers(modbus_register, 1, unit=1)
|
||||||
|
if result.isError():
|
||||||
|
print("Ошибка чтения состояния")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Состояние пина: 0 - OFF, 1 - ON
|
||||||
|
state = result.registers[0]
|
||||||
|
print(f"Состояние пина: {'Включен' if state == 1 else 'Выключен'}")
|
||||||
|
|
||||||
|
# Обновление состояния пина каждую секунду
|
||||||
|
def update_state_periodically():
|
||||||
|
while True:
|
||||||
|
print_pin_state()
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
# Запуск обновления состояния в фоновом режиме
|
||||||
|
import threading
|
||||||
|
state_thread = threading.Thread(target=update_state_periodically)
|
||||||
|
state_thread.daemon = True
|
||||||
|
state_thread.start()
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
return render_template('index.html', arduino_port=arduino_port)
|
||||||
|
|
||||||
|
@app.route('/state')
|
||||||
|
def get_state():
|
||||||
|
# Чтение состояния пина через Modbus
|
||||||
|
result = modbus_client.read_holding_registers(modbus_register, 1, unit=1)
|
||||||
|
if result.isError():
|
||||||
|
return "Ошибка чтения состояния", 500
|
||||||
|
|
||||||
|
# Состояние пина: 0 - OFF, 1 - ON
|
||||||
|
state = result.registers[0]
|
||||||
|
return str(state)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(debug=True)
|
20
Версия_1.0/circle.html
Normal file
20
Версия_1.0/circle.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Modbus Circle</title>
|
||||||
|
<style>
|
||||||
|
.circle {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: {{ color }};
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Circle Color Controlled via Modbus</h1>
|
||||||
|
<div class="circle"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
20
Версия_1.0/sketch/sketch.ino
Normal file
20
Версия_1.0/sketch/sketch.ino
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include <ModbusMaster.h>
|
||||||
|
|
||||||
|
// Параметры Modbus
|
||||||
|
ModbusMaster node;
|
||||||
|
const int slaveID = 1; // ID устройства
|
||||||
|
const int modbusRegister = 0; // Регистр для передачи состояния
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
node.begin(slaveID, Serial); // Инициализация Modbus связи
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
int state = digitalRead(2); // Читаем состояние пина 2
|
||||||
|
|
||||||
|
// Отправляем состояние на регистр Modbus
|
||||||
|
node.writeSingleRegister(modbusRegister, state); // Записываем в регистр
|
||||||
|
|
||||||
|
delay(1000); // Ждем 1 секунду
|
||||||
|
}
|
45
Версия_1.0/templates/index.html
Normal file
45
Версия_1.0/templates/index.html
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Arduino State</title>
|
||||||
|
<style>
|
||||||
|
#circle {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
border-radius: 50%;
|
||||||
|
margin: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Состояние пина Arduino</h1>
|
||||||
|
<p>Подключено к порту: <strong>{{ arduino_port }}</strong></p>
|
||||||
|
<div id="circle"></div>
|
||||||
|
<p>Текущее состояние: <span id="pin-state">Загрузка...</span></p>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function updateCircleColor() {
|
||||||
|
fetch('/state')
|
||||||
|
.then(response => response.text())
|
||||||
|
.then(state => {
|
||||||
|
let circle = document.getElementById('circle');
|
||||||
|
let pinStateText = document.getElementById('pin-state');
|
||||||
|
|
||||||
|
if (state == '1') {
|
||||||
|
circle.style.backgroundColor = 'green';
|
||||||
|
pinStateText.innerHTML = 'Включено';
|
||||||
|
} else {
|
||||||
|
circle.style.backgroundColor = 'red';
|
||||||
|
pinStateText.innerHTML = 'Выключено';
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => console.log('Error fetching state:', error));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обновляем состояние каждые 1000 мс
|
||||||
|
setInterval(updateCircleColor, 1000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
53
Версия_2.0/Server.py
Normal file
53
Версия_2.0/Server.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#python d:\Антоше\Универ\Гит\Software_and_hardware\Версия_2.0\Server.py
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import serial
|
||||||
|
import serial.tools.list_ports
|
||||||
|
import minimalmodbus
|
||||||
|
import time
|
||||||
|
|
||||||
|
def find_arduino_port():
|
||||||
|
ports = list(serial.tools.list_ports.comports())
|
||||||
|
for port in ports:
|
||||||
|
if "Arduino" in port.description or "CH340" in port.description:
|
||||||
|
return port.device
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Настройки порта
|
||||||
|
port = find_arduino_port() # Укажите порт, к которому подключен Arduino
|
||||||
|
slave_id = 1 # ID устройства (адрес Arduino)
|
||||||
|
baudrate = 9600
|
||||||
|
timeout = 1 # Время ожидания в секундах
|
||||||
|
|
||||||
|
# Настроим модбас клиента
|
||||||
|
client = minimalmodbus.Instrument(port, slave_id) # Создаем объект клиента Modbus
|
||||||
|
client.serial.baudrate = baudrate # Устанавливаем скорость
|
||||||
|
client.serial.timeout = timeout # Время ожидания ответа
|
||||||
|
client.mode = minimalmodbus.MODE_RTU # Используем RTU
|
||||||
|
|
||||||
|
# Ожидаем получения данных от Arduino
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
# Чтение 4 регистров с адреса 0
|
||||||
|
result = client.read_registers(0, 1, functioncode=3)
|
||||||
|
print(f"Полученные данные: {result}")
|
||||||
|
break # Выход из цикла, если данные получены
|
||||||
|
except minimalmodbus.NoResponseError:
|
||||||
|
print("Ошибка: Нет ответа от устройства. Повторяем...")
|
||||||
|
time.sleep(1) # Подождать 1 секунду и попробовать снова
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Ошибка: {e}")
|
||||||
|
break
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("Программа остановлена пользователем")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
21
Версия_2.0/sketch/sketch.ino
Normal file
21
Версия_2.0/sketch/sketch.ino
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include <ModbusRtu.h>
|
||||||
|
|
||||||
|
#define ID 1 // ID устройства (нужно для адресации в сети Modbus)
|
||||||
|
#define PIN 7 // Пин, состояние которого мы хотим читать
|
||||||
|
|
||||||
|
Modbus slave(ID, Serial); // Создание объекта Modbus для Serial
|
||||||
|
uint16_t au16data[1]; // Массив данных для хранения состояния пина
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(PIN, INPUT); // Устанавливаем пин 7 как вход
|
||||||
|
Serial.begin(9600); // Инициализация последовательного порта
|
||||||
|
slave.start(); // Запуск Modbus slave
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Чтение состояния пина и запись в массив данных
|
||||||
|
au16data[0] = digitalRead(PIN); // Чтение состояния пина (0 или 1)
|
||||||
|
|
||||||
|
// Обработка запросов от мастера Modbus
|
||||||
|
slave.poll(au16data, 1); // Проверка входящих запросов и отправка состояния пина
|
||||||
|
}
|
52
Версия_3.0/Server.py
Normal file
52
Версия_3.0/Server.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#python d:\Антоше\Универ\Гит\Software_and_hardware\Версия_3.0\Server.py
|
||||||
|
|
||||||
|
|
||||||
|
import serial
|
||||||
|
import serial.tools.list_ports
|
||||||
|
import minimalmodbus
|
||||||
|
import time
|
||||||
|
from flask import Flask, jsonify, render_template
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
def find_arduino_port():
|
||||||
|
ports = list(serial.tools.list_ports.comports())
|
||||||
|
for port in ports:
|
||||||
|
if "Arduino" in port.description or "CH340" in port.description:
|
||||||
|
return port.device
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Настройки порта
|
||||||
|
port = find_arduino_port() # Укажите порт, к которому подключен Arduino
|
||||||
|
slave_id = 1 # ID устройства (адрес Arduino)
|
||||||
|
baudrate = 9600
|
||||||
|
timeout = 1 # Время ожидания в секундах
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
return render_template('index.html') # Отдача HTML файла
|
||||||
|
|
||||||
|
# Настроим модбас клиента
|
||||||
|
client = minimalmodbus.Instrument(port, slave_id) # Создаем объект клиента Modbus
|
||||||
|
client.serial.baudrate = baudrate # Устанавливаем скорость
|
||||||
|
client.serial.timeout = timeout # Время ожидания ответа
|
||||||
|
client.mode = minimalmodbus.MODE_RTU # Используем RTU
|
||||||
|
|
||||||
|
@app.route('/status', methods=['GET'])
|
||||||
|
def get_status():
|
||||||
|
try:
|
||||||
|
# Чтение 4 регистров с адреса 0
|
||||||
|
result = client.read_registers(0, 1, functioncode=3)
|
||||||
|
pin_state = result[0] # Состояние пина
|
||||||
|
return jsonify({
|
||||||
|
'port': port,
|
||||||
|
'pinState': pin_state
|
||||||
|
})
|
||||||
|
except minimalmodbus.NoResponseError:
|
||||||
|
return jsonify({'error': 'Нет ответа от устройства'})
|
||||||
|
except Exception as e:
|
||||||
|
return jsonify({'error': str(e)})
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(host='0.0.0.0', port=5000)
|
21
Версия_3.0/sketch/sketch.ino
Normal file
21
Версия_3.0/sketch/sketch.ino
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include <ModbusRtu.h>
|
||||||
|
|
||||||
|
#define ID 1 // ID устройства (нужно для адресации в сети Modbus)
|
||||||
|
#define PIN 7 // Пин, состояние которого мы хотим читать
|
||||||
|
|
||||||
|
Modbus slave(ID, Serial); // Создание объекта Modbus для Serial
|
||||||
|
uint16_t au16data[1]; // Массив данных для хранения состояния пина
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(PIN, INPUT); // Устанавливаем пин 7 как вход
|
||||||
|
Serial.begin(9600); // Инициализация последовательного порта
|
||||||
|
slave.start(); // Запуск Modbus slave
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Чтение состояния пина и запись в массив данных
|
||||||
|
au16data[0] = digitalRead(PIN); // Чтение состояния пина (0 или 1)
|
||||||
|
|
||||||
|
// Обработка запросов от мастера Modbus
|
||||||
|
slave.poll(au16data, 1); // Проверка входящих запросов и отправка состояния пина
|
||||||
|
}
|
54
Версия_3.0/templates/index.html
Normal file
54
Версия_3.0/templates/index.html
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Modbus Status</title>
|
||||||
|
<style>
|
||||||
|
#statusCircle {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: gray;
|
||||||
|
margin: 20px;
|
||||||
|
}
|
||||||
|
#portInfo {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Modbus Slave Status</h1>
|
||||||
|
<div id="portInfo">Номер порта: <span id="portNumber">Не подключено</span></div>
|
||||||
|
<div id="statusCircle"></div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
async function fetchStatus() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/status');
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
if (data.error) {
|
||||||
|
console.log('Ошибка: ', data.error);
|
||||||
|
} else {
|
||||||
|
document.getElementById("portNumber").innerText = data.port;
|
||||||
|
const statusCircle = document.getElementById("statusCircle");
|
||||||
|
|
||||||
|
// Обновляем цвет круга в зависимости от состояния пина
|
||||||
|
if (data.pinState === 1) {
|
||||||
|
statusCircle.style.backgroundColor = "green"; // Зеленый если состояние 7 пина HIGH
|
||||||
|
} else {
|
||||||
|
statusCircle.style.backgroundColor = "red"; // Красный если состояние 7 пина LOW
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('Ошибка при получении данных: ', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Получать данные каждую секунду
|
||||||
|
setInterval(fetchStatus, 1000);
|
||||||
|
fetchStatus(); // Вызвать сразу для начальной загрузки
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
43
Проверка портов.py
Normal file
43
Проверка портов.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
from flask import Flask, jsonify
|
||||||
|
from pymodbus.client import ModbusSerialClient
|
||||||
|
import serial.tools.list_ports
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Определяем доступные COM-порты
|
||||||
|
def find_arduino_port():
|
||||||
|
ports = list(serial.tools.list_ports.comports())
|
||||||
|
for port in ports:
|
||||||
|
if "Arduino" in port.description or "CH340" in port.description:
|
||||||
|
return port.device
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Ищем подключенный Arduino
|
||||||
|
port = find_arduino_port()
|
||||||
|
if not port:
|
||||||
|
print("Не найден Arduino, проверьте подключение!")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
# Настройка подключения к Modbus
|
||||||
|
client = ModbusSerialClient(port=port, baudrate=115200, timeout=1, stopbits=1, bytesize=8, parity='N')
|
||||||
|
|
||||||
|
# Проверка подключения
|
||||||
|
if not client.connect():
|
||||||
|
print(f"Ошибка подключения к {port}")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
print(f"Подключение успешно: {port}")
|
||||||
|
|
||||||
|
@app.route('/modbus-status', methods=['GET'])
|
||||||
|
def modbus_status():
|
||||||
|
try:
|
||||||
|
# Читаем 1 регистр, начиная с адреса 0
|
||||||
|
response = client.read_holding_registers(0, 1, slave=1)
|
||||||
|
if response.isError():
|
||||||
|
return jsonify({"error": "Ошибка чтения Modbus"}), 500
|
||||||
|
return jsonify({"pin_status": response.registers[0]})
|
||||||
|
except Exception as e:
|
||||||
|
return jsonify({"error": str(e)}), 500
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(host='0.0.0.0', port=5000, debug=True)
|
43
Проверка_портов.py
Normal file
43
Проверка_портов.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
from flask import Flask, jsonify
|
||||||
|
from pymodbus.client import ModbusSerialClient
|
||||||
|
import serial.tools.list_ports
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Определяем доступные COM-порты
|
||||||
|
def find_arduino_port():
|
||||||
|
ports = list(serial.tools.list_ports.comports())
|
||||||
|
for port in ports:
|
||||||
|
if "Arduino" in port.description or "CH340" in port.description:
|
||||||
|
return port.device
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Ищем подключенный Arduino
|
||||||
|
port = find_arduino_port()
|
||||||
|
if not port:
|
||||||
|
print("Не найден Arduino, проверьте подключение!")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
# Настройка подключения к Modbus
|
||||||
|
client = ModbusSerialClient(port=port, baudrate=115200, timeout=1, stopbits=1, bytesize=8, parity='N')
|
||||||
|
|
||||||
|
# Проверка подключения
|
||||||
|
if not client.connect():
|
||||||
|
print(f"Ошибка подключения к {port}")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
print(f"Подключение успешно: {port}")
|
||||||
|
|
||||||
|
@app.route('/modbus-status', methods=['GET'])
|
||||||
|
def modbus_status():
|
||||||
|
try:
|
||||||
|
# Читаем 1 регистр, начиная с адреса 0
|
||||||
|
response = client.read_holding_registers(0, 1, slave=1)
|
||||||
|
if response.isError():
|
||||||
|
return jsonify({"error": "Ошибка чтения Modbus"}), 500
|
||||||
|
return jsonify({"pin_status": response.registers[0]})
|
||||||
|
except Exception as e:
|
||||||
|
return jsonify({"error": str(e)}), 500
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(host='0.0.0.0', port=5000, debug=True)
|
114
Сервер.py
114
Сервер.py
@ -1,79 +1,53 @@
|
|||||||
|
|
||||||
|
#python d:\Антоше\Универ\Гит\Software_and_hardware\Сервер.py
|
||||||
|
#python d:\Антоше\Универ\Гит\Software_and_hardware\Проверка_портов.py
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
from flask import Flask, jsonify
|
from flask import Flask, jsonify
|
||||||
from pymodbus.client.serial import ModbusSerialClient
|
from pymodbus.client.serial import ModbusSerialClient
|
||||||
|
import serial.tools.list_ports
|
||||||
|
|
||||||
|
# Определяем порт Arduino (ищем доступные порты)
|
||||||
|
def find_arduino_port():
|
||||||
|
ports = serial.tools.list_ports.comports()
|
||||||
|
for port in ports:
|
||||||
|
if "Arduino" in port.description or "CH340" in port.description:
|
||||||
|
return port.device
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Настройки Modbus
|
||||||
|
PORT = find_arduino_port() or "COM3" # Если не нашли, используем COM3
|
||||||
|
BAUDRATE = 115200
|
||||||
|
TIMEOUT = 1
|
||||||
|
|
||||||
|
# Подключение к Modbus
|
||||||
|
client = ModbusSerialClient(port=PORT, baudrate=BAUDRATE, timeout=TIMEOUT, stopbits=1, bytesize=8, parity='N')
|
||||||
|
client.unit = 1
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
# Настройка Modbus клиента
|
@app.route("/modbus-status", methods=["GET"])
|
||||||
port_Arduino = 'COM3' # Убедитесь, что это правильный порт для вашего компьютера
|
def get_modbus_status():
|
||||||
baudrate = 115200
|
|
||||||
|
|
||||||
client = ModbusSerialClient(port=port_Arduino, baudrate=115200, timeout=1, stopbits=1, bytesize=8, parity='N')
|
|
||||||
|
|
||||||
# Попытка подключения к Modbus клиенту
|
|
||||||
try:
|
|
||||||
if client.connect():
|
if client.connect():
|
||||||
print("Подключение успешно!")
|
print(f"Подключение успешно к {port}")
|
||||||
|
|
||||||
|
# Чтение катушек (биты, например, с адреса 0)
|
||||||
|
result = client.read_coils(0, 1) # Чтение одного бита (катушки) с адреса 0
|
||||||
|
|
||||||
|
if result.isError():
|
||||||
|
print("Ошибка при чтении катушек")
|
||||||
|
else:
|
||||||
|
print(f"Значение катушки: {result.bits}")
|
||||||
|
|
||||||
|
client.close()
|
||||||
else:
|
else:
|
||||||
print("Не удалось подключиться к порту.")
|
print("Не удалось подключиться к порту.")
|
||||||
except PermissionError as e:
|
|
||||||
print(f'Ошибка доступа к порту: {e}')
|
|
||||||
except Exception as e:
|
|
||||||
print(f'Ошибка подключения: {e}')
|
|
||||||
|
|
||||||
STATUS_REGISTER = 0 # Адрес регистра, где хранится статус
|
if __name__ == "__main__":
|
||||||
|
print(f"Сервер запущен на порту {PORT}")
|
||||||
@app.route('/modbus-status', methods=['GET'])
|
app.run(host="0.0.0.0", port=5000, debug=True)
|
||||||
def modbus_status():
|
|
||||||
try:
|
|
||||||
result = client.read_holding_registers(STATUS_REGISTER, 1)
|
|
||||||
if result.isError():
|
|
||||||
return jsonify({'error': 'Не удалось прочитать данные с Arduino'}), 500
|
|
||||||
else:
|
|
||||||
connected = bool(result.registers[0])
|
|
||||||
return jsonify({'connected': connected})
|
|
||||||
except Exception as e:
|
|
||||||
return jsonify({'error': str(e)}), 500
|
|
||||||
|
|
||||||
@app.route('/')
|
|
||||||
def index():
|
|
||||||
return '''
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="ru">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Статус пина</title>
|
|
||||||
<style>
|
|
||||||
#status-circle {
|
|
||||||
width: 100px;
|
|
||||||
height: 100px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: red;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="status-circle"></div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
function updateStatus() {
|
|
||||||
fetch('/modbus-status')
|
|
||||||
.then(response => response.json())
|
|
||||||
.then(data => {
|
|
||||||
const circle = document.getElementById('status-circle');
|
|
||||||
if (data.connected) {
|
|
||||||
circle.style.backgroundColor = 'green';
|
|
||||||
} else {
|
|
||||||
circle.style.backgroundColor = 'red';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
setInterval(updateStatus, 1000); // Проверка статуса каждую секунду
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
'''
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
app.run(debug=True, host='0.0.0.0')
|
|
||||||
|
82
Сервер1.py
Normal file
82
Сервер1.py
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
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)
|
Loading…
Reference in New Issue
Block a user