Два порта на Uno с Ethernet-экраном
Я создаю устройство с мод-шиной Arduino, а также хочу создать веб-страницу, которая позволит мне удаленно сбросить настройки устройства в случае возникновения каких-либо проблем. Для этого мне понадобится, чтобы мод-шина работала через порт 502, а веб-страница работала через порт 80. Возможно ли, чтобы Arduino поддерживал два порта? Я использую Uno с экраном Ethernet и стандартный файл ehternet.h с библиотекой Modbus. Есть предложения или идеи?
#include SPI.h
#include VL53L0X.h
#include Ethernet.h
#include Modbus.h
#include ModbusIP.h
#include VL53L0X.h
#include Wire.h
VL53L0X sensor;
EthernetServer server(80);
//Смещения регистров Modbus (0-9999)
const int SENSOR_Hreg0 = 100;
//Объект ModbusIP
ModbusIP mb;
short ts;
void setup() {
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 177 };
Wire.begin();
mb.config(mac, ip);
// Добавляем регистр SENSOR_Ireg — используйте addIreg() для аналоговых входов
mb.addHreg(SENSOR_Hreg0);
ts = millis();
//Настройка датчика
sensor.init();
sensor.setTimeout(500);
sensor.startContinuous();
//удаленный сброс
pinMode(13, INPUT);
digitalWrite(13, LOW);
// Открытие последовательной связи и ожидание открытия порта:
Serial.begin(9600);
while (!Serial) {
; // ждем подключения последовательного порта. Требуется только для собственного порта USB
}
Serial.println("Ethernet WebServer Example");
// запускаем Ethernet-соединение и сервер:
Ethernet.begin(mac, ip);
// Проверка наличия оборудования Ethernet
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");
while (true) {
delay(1); // ничего не делать, нет смысла работать без оборудования Ethernet
}
}
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println("Ethernet cable is not connected.");
}
// запускаем сервер
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
mb.task();
//Веб-страница
// прослушиваем входящих клиентов
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// http-запрос заканчивается пустой строкой
bool currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// если вы дошли до конца строки (получили новую строку
// символ) и строка пуста, http-запрос завершился,
// чтобы вы могли отправить ответ
if (c == '\n' && currentLineIsBlank) {
// отправляем стандартный заголовок ответа http
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // соединение будет закрыто после завершения ответа
client.println("Refresh: 5"); // обновляем страницу автоматически каждые 5 секунд
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// выводим значение каждого аналогового входа
client.print("Distance Measures ");
client.print(sensor.readRangeContinuousMillimeters());
client.print("mm");
client.println("<br />");
client.print("Filter Count:");
client.print(-2.2*sensor.readRangeContinuousMillimeters()+404);
client.println("<br />");
}
client.println("</html>");
break;
}
}
//Модбус
if (millis() > ts + 100) {
ts = millis();
mb.Hreg(SENSOR_Hreg0, sensor.readRangeContinuousMillimeters() );
}
}}
Изменить: Примечание. Похоже, проблема связана где-то с датчиком, потому что, когда я запускаю его без кода датчика, проблем нет, но когда я добавляю его, проблема начинается снова.
@Michael H., 👍0
Обсуждение1 ответ
Лучший ответ:
переместить обновление Modbus из условия
if (client)
mb.begin()
вызываетEthernet.begin()
. Не повторяйте это в setup()- переместить
client.println("</html>"); Break;
внутри блокаif
перед ним скопируйте остальную часть обнаружения пустой строки из примера веб-сервера
stop()
клиент после ответаизмените тип
ts
наunsigned long
Я добавил в код, который использую, мне назначен порт 80, а библиотека Modbus устанавливает порт 502 для Modbus. Когда я использую это, я могу пропинговать устройство, но Modbus и веб-связь отсутствуют., @Michael H.
Когда я проверяю последовательный монитор, я планировал удалить его, как только он заработает, он сообщает IP-адрес как 0.0.0.0., @Michael H.
но это не IP-адрес EthernetServer, это IP-адрес экрана. IP указан неверно или шилд не подключился. попробуйте подключиться по DHCP., @Juraj
когда я комментирую все части веб-страницы, все работает нормально, и я даже могу пропинговать устройство с помощью кода, используя установленный IP-адрес., @Michael H.
Я удалил Ethernet.begin() и опробовал его, но он все еще не работал. Я все еще могу проверить связь с устройством, но получение данных Modbus или веб-страницы по-прежнему не работает., @Michael H.
Давайте [продолжим обсуждение в чате](https://chat.stackexchange.com/rooms/85263/discussion-between-michael-h-and-juraj)., @Michael H.
- Миграция проекта Arduino Uno R3 в Wemos D1 R2 — проблемы с распиновкой
- Подключение Arduino ethernet shield (ip-адрес - 0.0.0.0)
- Отправить SMS Arduino Uno + плата SIM900A
- Не удается загрузить код на плату Arduino на Mac
- Разбор HTTP с аутентификацией в Arduino + Ethernet Shield
- Как подключить устройство SPI к плате Etherntet на Arduino Uno
- Настройка ввода pullup через регистры
- связь между двумя arduino с помощью ENC28J60?
для тестирования запустите два экземпляра веб-сервера... один на порту 80 и один на порту 502.... получите доступ к веб-странице с помощью двух устройств, чтобы вы одновременно обслуживали страницу на двух разных устройствах... Если это сработает, попробуйте добавить тестовый код Modbus (если такой существует) вместо веб-сервера на порту 502., @jsotola
Я попробовал это, и он не принял IP-адрес веб-страницы, а принял его для Modbus, и когда я добавил второй экземпляр IP-адреса, чтобы увидеть, что это сработает, произошла ошибка., @Michael H.
EthernetServer не имеет ничего общего с IP. Серверы должны работать на разных портах на одном IP-адресе., @Juraj
попробуйте распечатать IP перед server.begin(), @Juraj
Тот же результат, когда я переместил Serial.print("сервер находится в "); Serial.println(Ethernet.localIP()); перед сервером.begin(), @Michael H.
Датчика у меня нет, но в остальном скетч работает., @Juraj