Отлично, тогда давайте в две руки так сказать

1. Определитесь с кодом расчета CRC, там два варианта при беглом взгляде как и у AllenBradley - CRC и CRC1, CRC2 то есть ПЛК настраивается на одну из них (скорее всего, так как в зависимости от ответов и запросов прыгать то с однобайтовой CRC на двухбайтовую это надо быть идиотом)
Если CRC считается так же, как и у Алена, то код на C# у меня есть, хотя по заказу такие вещи меняются на раз и вот вам другой протокол.
2. В зависимости от типа CRC в расчет попадают разные блоки данных, была у Алена такая пакость
3. DLE, STX, ETX спецсимволы например DLE = 0x10 если попадается в блоке данных, он удваивается и при этом удвоение не участвует в расчете CRC
4. из-за удвоения DLE неизвестна длина ответа, так что тут указанием буфера для приема не обойтись, либо брать его заведомо больше и потом искать окончание посылки и принимать решение, в любом случае вы попадаете на timeout
з.ы. вообще наверное проще в личку перейти. От вас будет нужно видео работы с программой, где там переменные для передачи, как это настраивается и т.д. чтобы понять, насколько это близко к AllenBradley и смогу ли я помочь. з.ы. на ПЛК я протокол не писал, делал для RapidScada и там помог разработчик, доработав код остановки по массиву байт при чтении и плюс потом дочитывал 1 или 2 байта CRC. Можно ли такое реализовать в ПЛК даже не представляю...