Здравствуйте.
Подтолкните в правильном направлении для решения следующей задачи:
Есть некоторое устройство общающееся с PC посредством com-порта. Протокол у этого устройства ModbusRTU.
Написал тестовую программу обмена с этим устройством без использования классов. Данные принимаю и отправляю в виде массива Byte. Все работает (т.е. значения из регистров я получаю и вывожу на форму).
Теперь встала задача оформить это все в виде класса. Почитал книги по ООП , но до конца так и не понял как это реализовать. Из всего протокола Modbus RTU меня интересует пока только 2 функции это- 3 ( Read holding registers) и 6 (Preset Holding registers). Вот начало как я это вижу.
Родитель
Код:
TModbus =class (TObject)
private
FID:Byte; // адрес устройства используется при запросе и ответе
FCodeFunction:Byte; // номер функции используется при запросе и ответе
FRegistr: Byte; // адрес регистра используется при запросе
FSizeDataField:Byte // Размер поля данных используется при запросе и ответе
FCRC: Word; // Контрольная сумма используется при запросе и ответе
Дальше определить 2 наследника это класса TWriteModbusRTU и TReadModbusRTU и уже в них производить необходимые действия по заполнению массива байтов для чтения и запроса из, в ком порт. Что еще нужно учесть в базовом классе что будет общим для всех классов наследников? Может кто-то помочь кусочком кода без реализации класса TWriteModbusRTU?
Сейчас без класса обмен происходит так: для записи из edit_ов берется значение ID,функции (3 или 6), адрес регистра, размер поля и загоняется в глобальные переменные, а потом в процедуре собирается в массив array of byte к которому прикручиваются 2 байта CRC и отправляется в порт. Далее в отдельном потоке при приходе данных в буфер проверяется CRC пакета если рассчитанное значение совпадает с значением в пакете то передается в главный модуль. Далее они анализируется на ошибку следующим образом: проверяется адрес устройства, проверяется код функции в ответе если они совпадают с отправленными то пакет передается по ссылке в процедуру определения из какого регистра были получены данные ( сравнение по номеру запроса) эта процедура отправляет пакет еще в одну процедуру где происходит извлечения из пакета значения регистра, его расшифровка и выводится на форму в edit. Собственно почему и хочу переделать под класс из за наличия кучи глобальных переменных .
Заранее благодарен всем кто откликнется. С уважением Юрий.