Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
… и показала свою 142% работоспособностьНе стоит так — Вы же техническую статью пишите, а не протокол результатов голосования. Тем более для MODBUS, спецификации которого с тех пор, как он вышел за пределы контроллеров MODICON, стали трактоваться очень вольно. Сами же довольно вольно пишите о паузе, которая в спецификации MODBUS RTU оговорена строго в 3.5 символа, а на практике отнюдь не любой слейв откликается через такую задержку после чужой посылки, иногда и десятки миллисекунд приходится вводить. Так что я бы и 100% постеснялся писать.
int24А разве так бывает???
А вот я памятью все интереснее. Во-первых, процессоры обычно оперируют не единичными байтами, а машинными словами, поэтому за раз именно 24 бита из памяти вы не скопируете, придется копировать все 32. Но это, в принципе, не проблема, достаточно сделать сдвиг или битовую маску (в зависимости от того какая у нас endianness), тут ничего сложного.При чтении памяти понятно, но как быль при записи в память?
//если неправильный адрес и количество
if((AdresBit+KolvoBit)>(ModBusMaxOutBit) || KolvoBit>ModBusMaxOutBitTX || KolvoBit==0)
{
//неправильный адрес и количество
CRCmodbus=0xFFFF; //установить начальное значение CRC
return;//повторный запрос не требуется
}
А, мне это не надо...
ModBus точно не из тех протоколов, для которых надо (и стоит) из главного цикла запускать ModBusRTU/ASCII(). Так как ModBus (почти?) всегда не единственная функция устройства, то времена начинают плавать. А это не здорово.
if(CRCmodbus==0)
{//проверка на длинные пакеты
if(PaketRX[1]==15 || PaketRX[1]==16)
{//если длинные команды (15,16) , проверяем "Счетчик байт"
if((PaketRX[6]+9)!=UkPaket) continue;
}
break; //Ура! Пакет принят!!!
}
ModBus Slave RTU/ASCII без смс и регистрации