
Отправлено спустя 20 минут 24 секунды:
На сколько я понимаю , при работе через штатные блоки вывода на монитор данных(уарт) не используется вообще протокол модбас...имхо.
Тут во первых надо поправить, что это не относится например к RTU (если ставим галочку), соотв. там вообще быть не может номера транзакции.Sancho писал(а): 19 сен 2020, 08:33 В каскаде, при использовании облака, номер пакета в заголовке вообще не инкриминируется. Поэтому в то, что Вы получили ответ на тот пакет запроса, на который ждёте, уверенности 100% нет совсем.
Надеюсь, я ответил на Ваш вопрос.KaScada писал(а): 20 сен 2020, 22:19 КаСкада знает КАК должен выглядеть пакет, проверяется все, длина, функция и другого пакета тут быть не может по логике ну никак.
Сервер не Ваш. При работе через облако сервером является моё устройство, потому-что:KaScada писал(а): 20 сен 2020, 22:19 А теперь про уверенность, какой может еще прийти ответ от нашего сервера?
Или не так?KaScada писал(а): 20 сен 2020, 22:19 КаСкада запросила с определенной функцией, определенной длиной данные.
Наругайте меня не в Вашей теме и поставьте в угол
Вам же ответил программист -есть факты не 100% достоверности приема данных при работе с облаком ,выкладывайте их ,а не голословные теоретические утверждения, Спасибо.
вам же написали ,что проверяется в том числе общее число . Я же не против предположений и вопросов .Одну и туже задачу можно решить разными способами.Sancho писал(а): 21 сен 2020, 17:02 Я указал на явную уязвимость при опросе регистров поштучно без сверки номера пакета.
Анатолий, Вы сами понимаете, что вообще написали?
Serg_Grn писал(а): 21 сен 2020, 18:04 Господаа, господааа, тут проблемку бы решить с обменом модбас... Бог с ним, с остальным![]()
Код: Выделить всё
byte _modbusMasterGetRxBuffer()
{
_modbusMasterBufferSize = 0;
byte currentByte = 0;
byte currentByteIndex = 0;
int temp_ans_id= 0; // новое
byte _890_1 = 0; // новое
byte _890_2 = 0; // новое
while (_ModbsTCPMasterClient.available() ) {currentByte = _ModbsTCPMasterClient.read();
if (currentByteIndex > 5) {
_modbusMasterBuffer[ _modbusMasterBufferSize ] = currentByte; _modbusMasterBufferSize ++;}
// новое ->
else{
if(currentByteIndex == 0)_890_1=currentByte; // новое
if(currentByteIndex == 1)_890_2=currentByte; // новое
}
// <-новое
currentByteIndex++;
}
// новое ->
temp_ans_id= word(_890_1,_890_2);
if(temp_ans_id != 0){ // возможно, при приёме пакета с номером 0, возможна будет ошибка :)
if(temp_ans_id != (_modbusTelegramm.answerId & 0x0000FFFF)) {_modbusMasterBufferSize = 0;}
}
// <-новое
return _modbusMasterBufferSize;
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость