# peripherial

Модули ввода вывода, работающие через последовательный порт.

## promauto.conf.yml

    module.plci1:
      netaddr:  1
      portnum:  1
      enable:   on
      emulate:  off
      retrial:  3
      type:     promauto.pdio
      descr:    my descr

## Общие настройки

portnum | `0` | номер последовательного порта, который должен быть заранее определен (см. serial)
retrial | `1` | кол-во повторных запросов при ошибке связи
emulate | `off` | on/off - эмуляция работы
netaddr | `0` | сетевой адрес
descr |  | описание (произвольный текст)
systag | `SYSTEM.` | префикс для системных тегов
type |  | тип устройства
logerror | `0` | количество лог записей, производимых при ошибках связи. Данный параметр также можно менять одноименной командой модуля
proxy |  | имя модуля-посредника, предоставляющего значения тегов
delay_ms | `0` | задержка перед отправкой запроса, мс
chmap | `off` | разрешение создания тегов `CHANNELMAP`
chmap.name | `f` | короткое имя модуля, используемое в `CHANNELMAP`. Если не указано, то используется имя модуля
chmap.value | `f` | предопределенный вручную список тегов в `CHANNELMAP`

## Адресация каналов CHANNELMAP

Каждый периферийный модуль содержит в себе множество тегов. В некоторых ситуациях пользователю необходимо вводить имя тега вручную, например, чтобы прописать адрес в канал в roboplant. Чтобы облегчить пользователю процесс установки канала и исключить необходимость помнить имена тегов полностью, нужно предоставить пользователю возможность выбора тега из списка, содержащего только предназначенные для каналов теги. Данную задачу решает `CHANNELMAP`.

`CHANNELMAP` - это карта наиболее подходящих для установки в каналы тегов, сопоставляющая полные имена тегов с их короткими вариантами (адресами), и используемая в программах визуализации (hmi-клиентах). Другими словами, `CHANNELMAP` только подсказывает hmi-клиенту, какие теги модуля могут быть адресами каналов, а также способ их записи, удобный для пользователя. В тоже время `CHANNELMAP` не ограничивает hmi-клиент в выборе любого тега в качестве адреса канала, если это ему необходимо.

При включенном параметре `chmap` некоторые периферийные модули автоматически создают карту часто используемых тегов в виде строкового значения в одном или нескольких тегах `SYSTEM.CHANNELMAP.N` (где N значение от 0), например:

    run>l owen1
    owen1:SYSTEM.CHANNELMAP.0  STRING  = owen1:1 inp00:0 cnt00:cnt0 inp01:1 cnt01:cnt1 inp02:2
                                         cnt02:cnt2 inp03:3 cnt03:cnt3 inp04:4 cnt04:cnt4 inp05:5
                                         cnt05:cnt5 inp06:6 cnt06:cnt6 inp07:7 cnt07:cnt7 inp08:8
                                         cnt08:cnt8 inp09:9 cnt09:cnt9 inp10:10 cnt10 inp11:11 cnt11
                                         inp12:12 cnt12 inp13:13 cnt13 inp14:14 cnt14 inp15:15 cnt15

Если значение строки слишком большое, то тегов `SYSTEM.CHANNELMAP` будет создано несколько, т.е. длинная строка делится на несколько маленьких и помещается в теги SYSTEM.CHANNELMAP.0, SYSTEM.CHANNELMAP.1 и т.д. На стороне клиента нужно просто соединить значения данных тегов (через пробел), чтобы получить единый список.

Формат значения `CHANNELMAP`
Значение состоит из списка пар ключ-значение, разделенных между собой любым количеством пробелов, а между ключом и значением - двоеточием. Если ключ и значение равны, то двоеточие и значение не указываются.

Первая пара в списке преобразует оригинальное имя модуля в адрес модуля (короткое имя модуля). Задать короткое имя модуля можно в параметре `chmap.name`.

Последующие пары преобразуют оригинальное имя тега в адрес тега (короткое имя тега).

Использование CHANNELMAP в HMI
Задача HMI найти все имеющиеся теги, содержащие в имени подстроку `CHANNELMAP`, и построить единую карту тегов, которая будет использоваться элементами управления пользовательского интерфейса. Например, из вышеприведенного примера получится следующее:

Полное имя тега | Адрес модуля | Адрес тега
--- | --- | ---
owen1.inp00 | 1 | 0
owen1.inp01 | 1 | 1
: | : | :
owen1.inp15 | 1 | 15
owen1.cnt00 | 1 | cnt0
owen1.cnt01 | 1 | cnt1
: | : | :
owen1.cnt00 | 1 | cnt15

Примечание: В таблице для примера использована точка для разделения имени модуля и тега. Разделитель может быть любым.

Далее, развивая пример, hmi-клиент дает пользователю возможность выбрать/прописать адрес (короткое имя) модуля из одного выпадающего списка, а затем выбрать/прописать адрес (короткое имя) тега из другого выпадающего списка, в котором будут содержаться только принадлежащие модулю теги.

Задание CHANNELMAP в ручную
Для любого периферийного модуля значение тегов `CHANNELMAP` можно зададать вручную при помощи параметра `chmap.value`, например:

    chmap:        on
    chmap.name:   1
    chmap.value:  inp00:A inp01:B

Карта тегов в hmi-клиенте:

Полное имя тега | Адрес модуля | Адрес тега
--- | --- | ---
owen1.inp00 | 1 | A
owen1.inp01 | 1 | B

## Общие теги

SYSTEM.ErrorCount | Количество ошибок связи
SYSTEM.ErrorFlag | Флаг ошибки связи
SYSTEM.NetAddr | Сетевой адрес
SYSTEM.Port | Номер последовательного порта
SYSTEM.TimePeriod | Время, затраченной на опрос в одном цикле
SYSTEM.UpdateDate | Дата последнего запроса
SYSTEM.UpdateTime | Время последнего запроса