Как работает нумерация портов для приема TCP-пакетов MODBUS?

На моем микроконтроллере (MSP432) запущено приложение, которое записывает данные в кабель Ethernet для отправки на ПК.

Я использую Packet sender для просмотра данных, полученных через порт (502) на ПК от MC. Данные, полученные на ПК

Как видно из рисунка выше, номера портов MC увеличиваются для каждого отправленного пакета. Что будет, когда он достигнет максимального числа? Будет ли он перезапущен с другого номера порта и продолжит процесс или он остановится?

Edit1: библиотека протокола Modbus, используемая с http://myarduinoprojects.com/modbus.html

Edit2: каждый раз вызывая эту функцию, я получаю новые данные для отправки через MODBUS. Mb.Req (MB_FC_WRITE_MULTIPLE_REGISTERS, 0,11,0);

 if (MbmClient.connect(ServerIp,502)) {
  digitalWrite(GREEN_LED, HIGH);
#if DEBUG
  //Serial.println("connected with modbus slave");
 // Serial.print("Master : ");
  for(int i=0;i<MbmByteArray[5]+6;i++) {
    if(MbmByteArray[i] < 16){
    //Serial.print("0");
  }
    //Serial.print(MbmByteArray[i],HEX);
    if (i != MbmByteArray[5]+5) {
    //Serial.print(".");
  } else {
  //Serial.println();
  }
  }
#endif    
MbmClient.write(MbmByteArray,13+(Count*2));

MbmCounter = 0;
MbmByteArray[7] = 0;
MbmPos = Pos;
MbmBitCount = Count;

*state= true;
MbmClient.stop();
delay(100);
digitalWrite(GREEN_LED, LOW);   
} else {  

  *state= false;
  MbmClient.stop();
}

1 ответ

Кажется, вы используете этот пример Modbus. Я никогда не работал с этим, но я полагаю, что, поскольку порт назначения в коде такой же, как у вас на изображении для сниффинга: 502

Возможно, вы неоднократно вызываете этот метод:

void MgsModbus::Req(MB_FC FC, word Ref, word Count, word Pos)

Внутри этого метода вы можете увидеть эту строку:

if (MbmClient.connect(ServerIp,502)) { 
...

Поэтому каждый раз, когда вы вызываете эту функцию, открывается новое соединение. Когда вы открываете соединение через сокет, операционная система или сетевой стек должны выбрать исходный порт и IP-адрес, с которого отправляется TCP-сообщение.

Вот почему вы всегда видите новый исходный порт, и этот порт увеличивается. Это то, что называется эфемерным портом. То, как исходный порт выбирается используемым стеком TCP, зависит от реализации, хотя очень часто начинать с какого-либо порта и каждый раз, когда соединение открыто, выбирается следующий доступный порт.

Если стек хорошо запрограммирован, то, скорее всего, ваш стек TCP обернется и начнет с какого-то определенного порта с 1024 (первые 1024 порта ограничены). Код, который я видел, похоже, закрывает порт с помощью этой функции:

MbmClient.stop()

Вы должны проверить порты, после использования, закрыты. В противном случае в какой-то момент у вас закончатся доступные порты (утечка ресурсов).

Если вы хотите, чтобы ваш сокет был привязан к определенному порту источника, вам нужно использовать функцию, аналогичную привязке сокетов Linux

Теперь разумнее использовать постоянно одно и то же соединение. Возможно, вам придется изменить этот пример.

Другие вопросы по тегам