Инструменты пользователя

Инструменты сайта


использование_преобразований_map

Это старая версия документа!


Использование преобразований map

Внутри контроллера команды и значения между каналами передаются в унифицированном виде (см itemCmd) Но для управления реальными устройствами, данные необходимо конвертировать из унифицированного вида в формат, который понимает устройство и наоборот

Для этого существует механизм преобразований, который может производить как конвертацию значений так и переобразования между командами и значениями

Первое место, где используются преобразования - это интеграция Modbus v2. это обьясняется тем, что в Modbus все взаимодействие с устройством происходит через регистры, в которые пишутся, либо, из которых считываются числовые значения.

Предусмотрено два типа преобразований - преобразования команды и преобразование значения Также, два направления преобразования - прямое (когда из унифицированного вида создается значение для записи в устройство) и обратное - когда считанное из устройства значение преобразуется в унифицированный вид

Преобразование определяется при помощи JSON обьекта «map» который добавляется в описание регистра устройства в разделе конфигурирования modbus. Разберем на примерах:

"fanspeed"  :{"reg":40000,"map":{"val":[1,255,1,5],"cmd":[["OFF",0]]},"id":7},

При управлении fanspeed (напрямую, в нотации <item>/fanspeed/set или через суффикс №7 (fan) в нотации <item>/fan), сперва произойдет попытка преобразования команды

прямое преобразование:

В случае, если передана команда OFF, в регистр 40000 будет записано значение 0 В противном случае, осуществляется попытка преобразовать переданное значение, конвертировав его из шкалы 1-255 в шкалу 1-5 если в результате преобразований будет получено число - произойдет запись в указанный регистр модбас.

при считывании значения из регистра, будет происходить обратное преобразование

При этом, те же правила применяются в обратном направлении. Сначала производится попытка преобразовать полученное из регистра значение в команду. В случае неуспеха - в число.

В примере выше - если считано значение 0 - оно будет преобразовано в команду OFF в случае не успешного преобразования в команду будет осуществлено обратное преобразование значения из шкалы 1-5 в шкалу 1-255

Следует отметить, что если преобразование типа «val» не указано, то число, прочитанное из регистра, будет передано на выход без преобразования - именно в том виде, как оно было прочитано из регистра.

Данное поведение можно отменить, задав null для преобразования значения, как указано в примере ниже.

"acon":{"reg":40003,"map":{"cmd":[1,["OFF",0]],"val":null,"def":40001},"id":8},

Для этого примера преобразования будут действовать следующим образом:

Прямое:

Команда OFF приведет к записи 0 в регистр 40003 Любая длугая команда или значение будут проигнорированы

Обратное:

Если из регистра 40003 считан ноль, он будет преобразован в команду OFF.

любые другие значения будут проигнорированы.

Отдельно следует отметить параметр «def» обьекта «map». Этот параметр (используется только для обратных преобразований modbus) применяется в том случае, если для считанного из регистра значения не удалось применить преобразование. В этом случае, можно использовать значение, считанное из иного регистра.

"acmode" :{"reg":40001,"map":{"cmd":[["FAN_ONLY",1],["HEAT",4],["COOL",2],["AUTO",8]]},"id":8},
"on":{"reg":41,"type":"u8l","id":1,"map":{"cmd":[["OFF",0],["ON",1],["AUTO",1],["HEAT",1],["FAN_ONLY",1]]}},
"fanspeed":{"reg":42,"type":"u8l","id":7,"map":{"cmd":"fan"}}, 
  
"$rain":{"reg":67,"type":"u8l", "map":{"cmd":[null,["OFF",10],["ON",11]],"val":null}},                         
"pwr":{"coil":0,"map":{"cmd":[1,["OFF",0]],"val":null, "def":"acmode"},"id":1},
"fanoff":{"coil":0,"map":{"cmd":[1,["OFF",0]],"val":[0,0,0,0,1,1,null,null], "id":7}},
"acmode":{"reg":1,"map":{"cmd":[["FAN_ONLY",4],["HEAT",2],["COOL",1],["DRY",3],["AUTO",5]],"val":null},"id":1},
использование_преобразований_map.1743947527.txt.gz · Последнее изменение: 2025/04/06 16:52 — Admin