Сори, что получаеться как статья (возможно в будущем из этого и получиться статья ), итак...
Беру частный случай - есть шасси робота (корпус, тело, и т.д - "Устройство"), которое всё выполняет, есть програма, которая им управляет. Кроме того, есть програма-транслятор команд для шасси. Задача разработать язык взаимодействия Программа<->Шасси посредством програмы-транслятора.
Програма получает информацию от шасси (с датчиков), и выдаёт команды на шасси (на исполнительные механизмы). Получаеться, что для взаимодействия програмы и шасси достаточно двух команд - запись и чтение:
- Код: Выделить всё
...
{Device}:=Value ;запись
Value:={Device} ;чтение
...
Для перемещаемости кода, положим, что 0≤Value≤1 всегда, и для любого устройства ( Value может быть дробным числом! ). Так напр.:
- для концевика: 0 - отпущен, 1 - нажат (или наоборот, как удобнее);
для привода: 0 - выключен; 1 - включён (или наоборот, как удобнее);
для серва: 0 - крайнее левое положение, 1 - крайнее правое положение (или наоборот, как удобнее)
для датчика: 0 - минимум измеряемой величины, 1 - максимум измеряемой величины (или наоборот, как удобнее)
и т.д.
Предположим, по направлению информации устройства бывают трёх типов (конструктивая особенность устройства):
- 1) Доступные непосредственно только для чтения (префикс RD_);
2) Доступные непосредственно только для записи (префикс WD_);
3) Доступные непосредственно для записи и чтения. (те-же префиксы но по контексту команды)
Кроме того, если учитывать конструктивные особенности узлов шасси (включая шасси в целом как узел), то применяя законы физики, можно получить дополнительные (косвенные) параметры (устройства). Будем обозначать их префиксом RI_ (Read Indirect), WI_ (Write Indirect). Устройства типов RI, WI формируються програмистом на базе Direct-устройств и/или програмой-транслятором в процессе автокалибровки (то есть, самоизучения).
Теперь, как этим пользоваться.
Опишу на простенькой модели.
Предположим, есть колёсная тележка, ходовой двигатель (WD_Engine), которой управляеться пропорционально, и только в одном направлении, таким образом, что 0 - двигатель отключён, 1 - полный вперёд;
На тележке установлен сервопривод руля (WD_Direction), таким образом, что 0 - влево на максимум, 1 - вправо на максимум, 0.5 - прямо);
Также установлен двухосевой акселлерометр (RD_AccTangential, RD_AccNormal),
RD_AccTangential=0 - торможение на максимум
RD_AccNormal=0 - выполнение поворота влево с макс. ускорением.
RD_AccTangential=1 - торможение на максимум
RD_AccNormal=1 - выполнение поворота вправо с макс. ускорением.
RD_AccNormal=0.5 - прямолинейное движение
RD_AccTangential=0.5 - равномерное движение
На ведущем мосту установлен тахометр (RD_Rotation), таким образом, что 0 - оси не вращаеться, 1 - ось вращаеться на макс. оборотах;
Обладая таким набором параметров, можно сформировать несколько Indirect устройств/параметров.
Т.к. WD_Engine доступно только для записи, формируем копию поданой на мотор команды как непрямой датчик (теперь то что записали в WD_Engine, можно прочитать из RI_Engine).
Напр. Датчик достижения заданой скорости ведущим мостом (RI_WheelDone):
RI_WheelDone:=(RI_Engine=RD_Rotation)
Примечание: в результате выполнения логических операций ("<", ">", "<>","=", "<=", ">=") возвращаеться 0 - если ложь, 1 - если истина.