Вот пример того что я пытаюсь сделать.
И да тело функций приема и отправки выглядят как большой case.Если не считать запись в регистры (что в основ используется только в начале), то циклы запроса и ответа выглядят так:
1. Послать запрос на чтение из регистра текущего напряжения на канале 1 (значение Float32). запрос выглядит как (const Channel: array of byte, ReguestN:byte) где Reguest - номер запроса (используется в case для определения номера запроса), увеличивается на 1 при отправке.
2. Запустить таймер (если за отведеное время нет ответа от ком порта повторить 10 раз эту же команду после чего отключить ком порт и выдать ошибку в окно ).
3 При приеме проверяется СRC в принятом пакете и код функции если рассчитанное СRC не совпадает с значение в пакете или код функции =80 (последняя цифра это сообщение какая именно ошибка) то повторяется пункт 2.
4. Если принятый пакет (read: array of byte, ReguestN:byte) проходит соответствующую проверку то он отправляется в процедуру получения значения в (по номеру Reguest в case) свою переменную Single и вывода на форму.
5. То же самое проходит для 3 других каналов и цикл повторяется.
Дело в том что в протоколе Modbus не передается значение из какого регистра были получены данные поэтому использую Reguest (номер запроса ни как не меняется в потоке опроса порта). Т.е. например если Reguest=1 в принятом пакете то это значение 1 канала в Flaot32, если 2 то соответственно 2 и т.д.
|