Два порта на 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() );

     }
}}

Изменить: Примечание. Похоже, проблема связана где-то с датчиком, потому что, когда я запускаю его без кода датчика, проблем нет, но когда я добавляю его, проблема начинается снова.

, 👍0

Обсуждение

для тестирования запустите два экземпляра веб-сервера... один на порту 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


1 ответ


Лучший ответ:

0
  • переместить обновление 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.