2016-11-21 3 views
1

Я запускаю приложение на своем микроконтроллере (MSP432), который записывает данные на кабель Ethernet, чтобы отправить его на ПК.Как нумерация портов работает для приема пакетов TCP MODBUS?

Я использую отправителя пакетов для просмотра данных, полученных на порту (502) на ПК от MC. Data received on PC

Как видно из приведенного выше рисунка, номера портов 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(); 
} 
+0

Есть ли способ увидеть все сообщения TCP? Я имею в виду включение трехстороннего рукопожатия? В MC, как вы отправляете сообщения? Использование сокетов TCP? или просто отправка фрейма Ethernet, содержащего IP-датаграмму, содержащую сообщение TCP? – rodolk

+0

Я сделал соединение, используя IP-адрес (Ethernet IP на ПК), номер порта. Это то, что спросил? ». – JKV

+0

Похоже, что для каждого сообщения используется новое соединение, которое довольно плохое.Номера портов будут обернуты, или если они будут использоваться слишком быстро, клиент получит ошибки привязки. – EJP

ответ

0

Кажется, вы используете this Modbus example Я никогда не работал с этим, но я полагаю, что, так как порт назначения в коде то же самое вы имеете в your sniffing image: 502

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

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

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

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

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

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

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

MbmClient.stop() 

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

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

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

+0

Я добавил код в исходное сообщение. Так что всякий раз, когда я делаю соединение, вызывая ** MbmClient.connect (ServerIp, 502) **, я также закрываю соединение. Так почему же он все равно подключается к другому порту каждый раз? Не могли бы вы направить меня на то, как двигаться дальше, используя тот же подход к порту. Спасибо – JKV

+0

@JanakVarma, каждый раз, когда ваше приложение инициирует соединение, он выбирает [эфемерный порт] (https://en.wikipedia.org/wiki/Ephemeral_port). Это часто выбирается случайным образом, но ваша реализация TCP, похоже, не делает этого. Ваше приложение просит TCP выбрать для него порт источника. Вы можете указать TCP, какой порт использовать, а не оставлять его до TCP для выбора порта. –

+0

@JanakVarma, я думаю, что мой ответ ясно объясняет, почему он использует всегда другой порт источника. Он всегда подключается к одному и тому же порту назначения 502. Я добавил больше формулировок, пытаясь сделать его более ясным. Вы также можете посмотреть комментарий Рона Мопина и прочитать ссылку, которую он предоставил. – rodolk