Project

General

Profile

Приложение 4: Макроязык CML

Общие сведения

Макроязык используется для написания конфигурационных файлов системы, описания реакции системы на различные события: получение сетевых сообщений, сигналов от устройств GPI, срабатывание таймера. CML представляет собой описания в формате XML, которое имеет ряд правил и ограничений. Все описания, конфигурации или их группа находятся внутри тэгов , которые определяют также и версию CML:

cml version=XX.XX>

!— … описания, конфигурации … —>

/cml>

Затем это описание моежет храниться как в отдельном файле, так и в любом другом хранилище данных. Для добавления комментария используются стандартные тэги XML !— и —>.

Общий вид отдельной конфигурации CML

Конфигурация состоит из набора тэгов, заключённых в между тэгами :

config name=XXXXXX type=XXXXXXX>

!— … описание конфигурации … —>

/config>

Каждая конфигурация обязательно имеет уникальное имя name и тип конфигурации type, который может быть:

  • NET - описание сетевой конфигурации
  • CONTROL - описание контролов часовой машины
  • MACRO - макрореестр с макросами
  • SIGNAL - описание таблицы событий
  • LOG - описание конфигурации журнала
  • COMPONENT - описание специфической конфигурации отдельной компоненты или приложения.

Описание компоненты

Конфигурация типа COMPONENT всегда располагается в файле CCConfig.xml, который находится в одном фолдере с выполняемым файлом. Она загружается первой, сразу после запуска компоненты. По содержимому этой конфигурации определяются остальные конфигурации компоненты, после чего они могут быть загружены.

configuration name= XXXXXX type=COMPONENT>

__

_CONF_NAME_

_STORAGE_NAME_

/config>

_VALUE_

/configuration>

CONF_NAME определяет уникальное имя конфигурации.
CONF_TYPE идентифицирует тип конфигурации, описанный в предыдущем пункте.
STORAGE_TYPE определяет тип хранилища, где хранится данная конфигурация. В настоящий момент поддерживается один тип - FILE, но в дальнейшем может быть расширен, например, DB - для хранения в базе данных и т.д.
STORAGE_NAME - строка для доступа к хранилищу. Для FILE это имя файла.

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

Компонента может также сохранить какие-то необходимые ей для запуска параметры внутри этой же конфигурации.

Описание конфигурации журнала компоненты

configuration name=XXXXXX type=LOG>

_STORAGE_NAME_

strategy turned=XXX>

condition type=XXXX>XXXX

onexpire type=XXXXXX>[XXXXXXXXXXXXXX]

/strategy>

/configuration>

Эта конфигурация задаёт политику ведения журнала системы. Она содержит 2 основных элемента:

  • storage - задаёт хранилище, где хранится журнал. В настоящий момент поддерживается STORAGE_TYPE типа FILE, для которого STORAGE_NAME должно содержать имя файла журнала.
  • strategy определяет стратегию ведения журнала. Аттрибут turned может быть установлен в ON для включения, или в OFF - тогда журнал будет дописываться с конца непрерывно, а манипуляции с журналом и его сервис должны проводиться вручную.

Когда стратегия ведения журнала включена, она описывается следующими параметрами:

* condition определяет время жизни текущего журнала, при этом type определяет, в чём оно измеряется:

* SIZE означает предельный размер журнала в Мб

* TIME означает предельную длительность ведения журнала в днях.

* onexpire определяет, что нужно делать с журналом по истечении его времени жизни (размера или длительности). При этом type определяет вид операции:

* ARCHIVE означает сохранение текущего журнала. Для этого задаётся имя фолдера, где будет сохраняться журнал под уникальным именем

* DELETE - журнал будет просто удаляться

* COMMAND позволяет запустить некоторую команду OS, которая будет производить какие-то манипуляции с журналом.

Описание сетевой конфигурации

config name=XXXXXX type=NET>

mode>MULTICAST | PING

interval>XXXX

self>

ID>XXXXX

[XXXXXXXXXX]

/self>

server>

ID>XXXXX

[XXX.XXX.XXX.XXX]

[XXXXXXXXX]

/server>

clocks>

clock>

ID>XXXXXXX

[XXXXXXXXX]

/clock>

!— … другие часовые машины … —>

/clocks>

applications>

application>

ID>XXXXXXX

[XXXXXXXXX]

/application>

!— … другие серверы и приложения … —>

/applications>

protocols>

protocol type=CCP|ENMP|STREAM|XXXXXXX>

port>XXXX

[XXXXXX]

[XXXXXXXX]

/protocol>

!— … другие протоколы … —>

/protocols>

/config>

* mode - режим работы. Для работы в режиме одноранговой сети пишем MULTICAST, для работы в режиме с фиксированным IP пишем PING.

* interval - интервал времени в секундах, через который сервер рассылает CCP GETID в режиме MULTICAST, или через который часовая машина пытается установить соединение с сервером в режиме PING.

* self - описание собственных сетевых параметров компоненты. Содержит идентификатор ID в сети Caps-Clock и может включать необязательное текстовое описание descr.

* server - описание сервера, с которым устанавливается связь. В основном, используется в конфигурациях часовых машин, но может применяться в конфигурациях приложений. Описание включает:

* ID - идентификатор сервера в сети Caps-Clock.

* IP - может указываться адрес сервера (для работы в режиме PING)

* descr - необязательное текстовое описание.

  • clocks - список подключенных к серверу часовых машин. Имеет смысл только в конфигурациях серверов, потому что во всех остальных это описание игнорируется. Каждое описание машины clock содержит идентификатор машины ID в сети Caps-Clock и необязательное текстовое описание descr.
  • applications - список приложений и серверов, от которых разрешено получение сообщений ENMP, сообщения от остальных приложений будут игнорироваться. Данный список не применим к конфигурациям часовой машины, потому что там не поддерживается протокол ENMP. Каждое описание application содержит идентификатор машины ID в сети Caps-Clock и необязательное текстовое описание descr.
  • protocols - список настроек протоколов. Каждое описание протокола protocol содержит тип протокола type и номер порта port, через который осуществляется обмен по данному протоколу. Если в качестве type используется одно из ключевых слов CCP или ENMP, то в этом случае используются встроенные модули соответствующего протокола. Если используется имя обработчика, то он и вызывается для обработки данных по этому порту. В этом случае можно дополнительно указать, к какому контролу CID он прикреплён (например, для передачи потоковых данных), и ввести необязательное текстовое описание descr.

Описание контролов часовой машины

config name=XXXXXX type=CONTROL>

stylesheet name=XXXXX default=true>

parameter name=XXXXX type=RGBT>

R>0

G>0

B>0

Transp>1.0

/parameter>

parameter name=XXXXX type=composite>

parameter name=name type=string>XXXXXX

parameter name=size type=integer>XXX

parameter name=typeface type=string>XXXXX

parameter name=color type=color>XXXXX

/parameter>

/stylesheet>

control CID="BACK" type="BACK">

parameter name="picture" type="string">XXXXXXX

parameter name="deffont" type="composite">

parameter name="name" type="string">XXXXXXX

parameter name="size" type="integer">XXX

parameter name="typeface" type="string">XXXXXXXX

parameter name="color" type="RGBT">

R>XXX

G>XXX

B>XXX

_X.X

/parameter>

/parameter>

/control>

control CID=XXXXXXX type=XXXXXXX>

parameter name="x" type="float">XX.XX

parameter name="y" type="float">XX.XX

parameter name="height" type="float">XX.XX

parameter name="width" type="float">XX.XX

parameter name="visible" type="bool">TRUE|FALSE

parameter name="streamable" type="bool">TRUE|FALSE

[XXXXXXX]

states>

!—Описание состояний—>

state name=XXXXXX [default=XXXXX]>

parameter name=XXXXX type=XXXX>XXXX

/state>

state name=XXXXXX>…

/control>

/config>

Внутрь конфигурации могут включаться различные таблицы стилей, заключённые в тэги …, которые могут содержать описания цветов и шрифтов. Эти описания помещаются внутри тэгов …. В дальнейшем вместо описания конкретного цвета типа RGBT или конкретного шрифта типа composite можно будет использовать соответственно тип color или font. Для этого указывается его имя в виде stylename.colorname, где stylename - это имя таблицы стилей, а colorname - это название цвета или шрифта. Если stylename не указывается, то соответствующий параметр берётся из таблицы, в которой аттрибут default установлен в true.

Описание каждого контрола находится внутри тэгов …. Каждый контрол имеет несколько обязательных атрибутов и параметров:

* CID - уникальный идентификатор контрола внутри конфигурации. Другие конфигурации, отличные от данной, могут использовать этот же CID для других контролов.

* type - тип контрола. В настоящее время поддерживаются:

* BACK - фон, подложка, корневой контрол CDS, поверх которого располагаются все остальные контролы.

* CLOCK - часы. могут быть мнемоническими или стрелочными.

* PROGRESS - прогресс-индикатор, круглый или прямоугольный.

* TIMER - разновидность прогресс-индикатора, в качестве внешних сигналов использующая таймер.

* TRANSPARENCY - транспарант. Индикатор некоторой геометрической формы, содержащий текст или изображение.

* CONNECTION - вид транспаранта, который в качестве внешнего сигнала использует факт наличия или отсутствия какого-либо сетевого соединения.

* CALENDAR - текстовая строка, отображающая текущую дату.

* MARQUEE - бегущая строка. В режиме "СТОП" может использоваться просто в качестве надписи.

* TEXT - текстовое окно с прокруткой. В режиме "СТОП" поддерживает страничную организацию.

* LEVEL - индикатор уровня.

* TABLE - таблица с текстовыми данными.

* MEDIA - проигрыватель мультимедиа.

  • origin - координаты верхнего левого угла контрола в процентах от полного размера экрана. Для контрола типа BACK игнорируются и считаются всегда равными 0,0. Тип point.
  • width,height - размеры контрола в процентах от полного размера экрана. Для контрола типа BACK игнорируются и считаются всегда равными 100.0,100.0. Тип float.
  • visible - признак видимости контрола. Тип bool. Для фона игнорируется и считается всегда TRUE.
  • streamable - признак того, поддерживает данный контрол поточные данные или нет. Тип bool. Для фона и других контролов, не поддерживающих поточные данные, игнорируется и считается всегда FALSE.

Наборы всех остальных параметров могут быть разными для разных типов контролов. Каждый параметр внутри контрола должен иметь уникальное имя name и определённый тип type.
В настоящее время поддерживаются следующие типы параметров:

  • integer - целое число
  • float - число с плавающей точкой
  • bool - булевское значение: TRUE | FALSE
  • string - строка
  • RGBT - цвет, содержит значения красной, зелёной и синей составляющих, а также прозрачности
  • point - координата, содержит внутри значения x и y
  • color - имя цвета в таблице стилей
  • font - имя шрифта в таблице стилей
  • composite - составной тип, который состоит из нескольких простых типов
  • collection - список однотипных элементов item, тип которых определяется аттрибутом itemtype. Обращение к отдельному элементу - по индексу
  • table - таблица, состоящая их строк row, каждая из которых содержит набор ячеек cell.

Контрол также может содержать один или несколько наборов параметров, называемых состоянием state. Каждое состояние имеет имя name, и признак default. При начальном запуске и перезапуске загружается состояние по умолчанию. Затем состяния переключаются командой CCP SST, при этом устанавливаются значения всех параметров, внесённых в state.

Макрореестр

configuration name=XXXXXX type=MACRO>

macro name=XXXXX>

!—Параметры—>

param name=XXXXX type=XXXXX/>

!—Переменные—>

_XXXXXX

!—Тело макроса—>

body>

block name=XXXXX>

check>

exist label=XXXXX name=XXXXX/>

eq label=XXXXX name=XXXXX>XXXXXXX</[n]eq>

[gt | le] label=XXXXX name=XXXXX>XXXXXXX</[gt | le]>

/check>

set name=XXXXX>XXXXXX

[ccp | enmp]>

cmd>

component type=XXXXX kind=XXXXX>XXXXXXXXX

command name=XXXXX>

param type=XXXXX name=XXXXX>XXXXXXXX

/command>

/cmd>

[

param name=XXXXX>XXXXXX

/onresponse>]

/[ccp | enmp]>

os>

cmd>

part type=XXXXXXX [name=XXXXX]>XXXXXXXX

/cmd>

onresponse name=XXXXX macro=XXXXX>

param name=XXXXX>XXXXXXXX

/onresponse>

/os>

file>

cmd>

operation>XXXXX

filename type=XXXXXX>XXXXX

buffer>XXXXXXX

/cmd>

onresponse name=XXXXX macro=XXXXX>

param name=XXXXX>XXXXXXXX

/onresponse>

/file>

goto>XXXXX

exit/>

/block>

/body>

/macro>

/configuration>

В настоящее время макропроцессором оснащён только сервер Caps-Clock, поэтому макрореестр используется только на сервере. Он представляет собой набор макросов, каждый из которых представляет собой набор действий, которые выполняются при возникновении тех или иных событий или по явному вызову их при помощи команды ENMP CALLMACRO.

Макрос представляет собой набор элементов, заключённых в тэги macro name=XXXXX>/macro>, где в name указывается имя макроса, по которому к нему будет производиться обращение. Элементы внутри макрса делятся на 3 группы:

  • param - параметры, с которыми макрос вызывается
  • var - внутренние переменные макроса, если есть
  • body - описание выполняемых действий

Элементы типа param содержат только описание имени name и типа type параметра, Значение же его передаётся только при вызове макроса. Если параметр при вызове будет опущен, то его наличие можно будет проверить в теле макроса.

Элементы типа var похожи на элементы типа param, за исключением того, что в них указывается значением, которым переменная будет инициализироваться при вызове макроса. Инициализация будет производиться при каждом вызове, т.е. значения в них не сохраняются между вызовами. Имена макросов и переменных будут уникальными только внутри макроса.

Тело макроса body состоит из выполняемых блоков block name=XXXXX>/block>, первый из которых может не иметь имени и является блоком по умолчанию. Он выполняется при вызове макроса. Остальные блоки выполняются только при их явном вызове. Блок содержит внутри себя описание выполняемых действий, которые могут быть следующего типа:

  • check - проверка различных параметров и переменных
  • set - установка значений переменных
  • ccp - команда CCP
  • enmp - команда ENMP
  • os - команда операционной системы
  • file - файловая операция
  • goto - переход в другой блок
  • exit - завершение работы макроса

Проверка check представляет собой набор элементов, который в общем виде можно представить как:

_<OPERATION_NAME label=LABEL_NAME name=PARAMETER_OR_VAR_NAME>EXPRESSION</_OPERATION_NAME_>

OPERATION_NAME здесь представляет собой имя выполняемой операции сравнения, которое может быть:

  • exist, nexist - проверка параметра на существование. Для переменных особого смысла не имеет.
  • eq, neq - проверка переменной или параметра на равенство. Могут сравниваться параметры любых типов.
  • gt, le - арифметическое сравнение.

LABEL_NAME - имя блока, на который производится переход в случае положительного результата операции.

PARAMETER_OR_VAR_NAME - имя параметра или переменной. ПЕременные не могут быть перепутаны с параметрами, потому что они все имеют уникальные имена внутри макроса.

EXPRESSION - выражение, значение котрого будет сравниваться со значением переменной ил параметра. Оно имеет вид:
EXPRESSION_::_LITERAL

+EXPRESSION_::%VAR_OR_PARAM_NAME%

+EXPRESSION_::EXPRESSION[OPERATION EXPRESSION]_

Здесь в качестве OPERATION могут использоваться + - / | & ^*.

Т.е. запись типа

check>

exist label="BLOCK2" name="!ExtStatus"/>

eq label="BLOCK3" name="Status">StatusH & 0x0E

/check>

означает, что если макрос вызван с параметром ExtStatus, то обработка должна производиться в блоке BLOCK2. Если ExtStatus отсутствует, а Status == StatusH & 0x0E, то обработка будет производится в блоке BLOCK3. В противном случае будут выполняться действия, следующие за проверкой.

Элемент перехода goto означает переход на начало влока с именем BLOCK_NAME:

_BLOCK_NAME_

Элемент exit завершает работу макроса.

Присваивание значения EXPRESSION переменной с именем VAR_NAME производится при помощи элемента set:

_EXPRESSION_

Например,

set name="Status">StatusH ^ 0xE0

эквивалентно Status = StatusH ^ 0xE0.

Все остальные элементы имеют схожую структуру. Они содержат элемент с выполняемой операцией cmd и необязательный элемент обработки состояния выполнения onresponse. Элемент onresponse имеет одинаковую для всех структуру и позволяет вызвать какой-либо макрос.

__

_EXPRESSION_

/onresponse>

RESPONSE_NAME будет специфическим для каждого типа операции, а все остальные - общими:

  • MACRO_NAME - имя вызываемого макроса
  • PARAM_NAME - имена параметров, с которыми будет вызываться этот макрос.
  • EXPRESSION - значения параметров.

Для операций CCP имя RESPONSE_NAME будет представлять собой название возвращаемой команды с таким же RID, как и отосланная. Оно может быть ERR | ID | VRS | CFG | DAT | STT | STM. Команда NFY не входит в этот список, потому что она всегда приходит асинхронно, без RID. При этом для передачи получееной информации целиком в +EXPRESSION_ можно использовать встроенную переменную RESP. В случае с командами CCP и ENMP можно также передавать и отдельные параметры команды. Для этого нужно указать имя параметра Pname в RESP.Pname.

Например,

onresponse name="STM" macro="!SetHandler">

param name="HandlerID">RESP.p[HNDLR1].hid

/onresponse>

означает, что при получении ответ на команду сообщения CCP STREAM будет вызван макрос !SetHandler с параметром HandlerID, через который будет передан идентификатор обработчика с именем HNDLR1.

Для операций ENMP имя RESPONSE_NAME будет представлять собой название возвращаемой команды с таким же RID, как и отосланная. Оно может быть ERROR | VERSION | LIST | STREAM.

Для операций os и file это будет просто возвращаемый код ошибки. Никаких полей внутри RESP в этом случае не будет.

Элемент cmd для CCP и ENMP выглядит так:

_VALUE_

__

_VALUE_

/command>

Он содержи 2 элемента - элемент component, в котором указывается, для какой из компонент системы предназначается команда, и элемент command, в котором содержится непосредственно отсылаемая команда.

VALUE_TYPE определяет, что именно представляет собой VALUE. Это может быть:

  • DIRECT - непосредственное значение VALUE
  • PARAMETER - значение внутри параметра с именем VALUE
  • VAR - значение внутри переменной с именем VALUE

VALUE_PURPOSE означает, имя чего указывает значение +VALUE_. Это может быть:

  • ID - идентификатор компоненты в сети Caps-Clock
  • IP - IP-адрес компоненты

COMMAND_NAME - это имя команды CCP или ENMP.

В описании параметров VALUE_TYPE определяет, что именно представляет собой VALUE, и может иметь значение:

  • типа параметра STRING,BYTE,INTEGER,FLOAT,LONG,BOOL
  • PARAMETER - имя параметра команды, через которое передаётся значение VALUE. В этом случае тип значения будет таким же, как и тип параметра.
  • VAR - имя поля, через которое передаётся значение VALUE. В этом случае тип значения будет таким же, как и тип поля.

Например,

component type="DIRECT" kind="ID">CLK_1

command name="SST">

param type=DIRECT name=CID>MIC_ST

param type=DIRECT name=SID>ON

/command>

будет означать отсылку команды SETSTATE траспаранту MIC_ST часовой машины CLK_1 для установки состояния ON.

Элемент cmd для os будет состоять из набора элементов part, каждый из которых описывает часть командной строки:

cmd>

_<part type=VALUE_TYPE [name=PART_NAME]>VALUE_

/cmd>

Все части part при выполнении преобразуются в строки и собираются при помощи конкатенации в командную строку, которая выполняется в среде OS. Необязательное имя PART_NAME может использоваться в дальнейшем для обращения к этому элементу ’part_.

Например, предположим, что переменная CurTime содержит значение 16:15, а через параметр Msg передаётся сообщение "Hello, world!". Тогда при выполнении

cmd>

part type="DIRECT">calendar.exe -n -t

part type="VAR">!CurTime

part type="DIRECT">-m"

part type="PARAM">Msg

part type="DIRECT">"

/cmd>

будет выполнена команда

calendar.exe -n -t16:15 -m"Hello, world!"

В элементе cmd для file содержатся 3 элемента:

  • operation - название файловой операции WRITE или READ
  • filename - имя файла, с которым будет проводиться операция. Если это имя передаётся через параметр или переменную, то можно использовать запись типа PARAM_NAME.
  • buffer - имя переменной в которую/из которой будет производиться чтение/запись.

Описание таблицы событий

config name=XXXXXX type=SIGNAL>

protocol type=XXXXX>

signal SID=XXXXX>

settings>

CID>XXXXX

[XXXXX]

[

[XX:XX:XX.XXX]

[XXXXX]

/timer>]

/settings>

[

[

parameter name=XXXX>[XXXXX]

/parameters>]

/command>]

packet [parameter=XXXXXXX]>

fields [name=XXXXX]>

length type=XXXXX>XXX

field name=XXXXX>

length type=XXXXX>XXX

[XXXXXXX]

/field>

field name=XXXXXX>…

/fields>

fields name=XXXXX>…

receive>

select fields=XXXXX/>

get fields=XXXXX>

eq field=XXXXX type=XXXXX>

XXXXX

/eq>

neq field=XXXXX type=XXXXX>…

/get>

/receive>

/packet>

actions name=XXXXXXXX>

action type=DIRECTCALL>

component type=XXXXXX kind=XXXXXX>XXXXXXX

method name=XXXXXXXX>

[XXX]

/method>

/action>

action type=CALLMACRO>

macro name=XXXXXXXX>

param name=XXXXXX type=XXXXXX>XXXXX

/macro>

/action>

action type=CCP>

component type=XXXXXX kind=XXXXX>XXXXXX

command name=XXXXX>

param type=XXXX name=XXXX>XXX

/command>

/action>

action type="ENMP">

component type=XXXXX kind=XXXX>XXXXXX

command name=XXXXXX>

param type=XXXXX name=XXXXX>XXXXX

/command>

/action>

action type=STREAM>

component type=XXXXX kind=XXXXX>XXXX

control type=XXXXX>XXXXXX

packet>

fields>

field type=XXXXX>XXXXX

length type=XXXXX>XXXX

/field>

/fields>

/packet>

/action>

action type=VCOM>

port>COMX

send type=XXXXXX>XXXXX

/action>

eq field=XXXXX type=XXXXX [check=XXXXXXX]>

XXXX

[

and>XXXXX

or>XXXXX

xor>XXXXX

/check>]

action type=XXXXXX>…

/eq>

neq field=XXXXX type=XXXXX [check=XXXXXXX]>…

gt field=XXXXX type=XXXXX [check=XXXXXXX]>…

lt field=XXXXX type=XXXXX [check=XXXXXXX]>…

exist type=XXXXX name=XXXXX>…

nexist type=XXXXX name=XXXXX>…

break/>

/actions>

/signal>

signal SID=XXXXX>…

/protocol>

protocol type=XXXXX>…

/config>

Эта конфигурация является наиболее сложной из всех конфигураций, потому что включает в себя реакцию на различные типы событий, приём данных разного формата и их анализ. Она состоит из элементов типа protocol type=XXXXXXX>…, каждый из которых описывает сигналы, сообщения или события, получаемые согласно данного протокола. В настоящее время поддерживаются следующие протоколы:

  • CCP - Caps-Clock Communication Protocol, предназначенный для передачи внутренних команд сиситемы. В разделе этого протоколя описываются те сообщения, которые приходят асинхронно и не являются ответами на посылаемые запросы, т.е. не перехватываются обработчиками макросов и команд CCP. К ним относятся команды типа NFY и ERR.
  • ENMP - Enhanced Network Message Protocol, предназначенный для общения с внешними компонентами системы. В разделе этого протоколя описываются те сообщения, которые приходят асинхронно и не являются ответами на посылаемые запросы, т.е. не перехватываются обработчиками макросов и команд ENMP. К ним относятся команды типа ERROR.
  • VCOMM - протокол обмена по виртуальному COM-порту с устройством типа ТР-312/314.
  • TIMER - протокол обработки событий и передачи информации при срабатывание таймеров.
  • STREAM - протокол передачи и обработки информации потоковых данных.

Каждый обработчик внутри протокола описывается элементом signal SID=XXXXXX>…. Описание обработчика содержит специфическую информацию протокола, описание принимаемых данных и выполняемые действия:

  • settings - специфическая для протокола информация
  • packet - описание принимаемых данных
  • actions - выполняемые действия.

Элемент settings содержит следующие данные:

* для протокола с потоковыми данными STREAM в него заносится информация о том, к какому контролу относится данный обработчик сигнала. Для этого добавляется элемент CID - идентификатор контрола. В сетевой конфигурации (типа NET) указывается, к какому порту подключен данный контрол. В данной конфигурации (SIGNAL) к этому контролу может быть приписано несколько разных обработчиков, обрабатывающих разные форматы потоковых данных. Нужный обработчик выбирается с помощью потоковых команд CCP/ENMP при установлении поточного соединения.

* для протокола VCOMM записывается номер COM-порта (виртуального COM-порта) port. Поскольку протокол определяется устройством, то и данные при подключении его к разным портам всё-равно будут приходить в том же формате. Т.е. настройка обработчиков (как в потоковом протоколе) не производится.

* для обработчиков сигнала от таймера TIMER существенным является информация об установках таймера при старте/стопе timer. В неё входит:

* type - тип таймера. Он может быть однократным или циклическим (SINGLE | CYCLIC)

* start - описание старта. Оно может быть выравнено align на границу SECOND | MINUE | HOUR | NOTALIGNED. Если указывается конкретное время, то старт производится точно в указанное время.

* period - время цикла. Для однократного таймера по его окончании таймер останавливается. Время цикла может указываться в различных единицах unit - SECOND | MINUTE | HOUR | DAY.

  • для обработчиков протокола CCP и ENMP указывается, какую команду command должен обрабатывать данный обработчик. Для этого указывается её имя name. Далее идёт список параметров parameters команды. Если в параметре указано какое-либо значение, то обработчик будет срабатывать только в случае, если полученное значение параметра соответствует этому заданному значению.

Элемент packet используется, если есть какие-либо сериализованные данные, для распознавания их структуры. Если такие данные передаются через параметр команды CCP/ENMP, то его имя parameter указывается в аттрибутах элемента packet. Структура данных описывается в элементе fields. Если может приходить несколько разных структур (как, например, в протоколе ТР-312/314), то они именуются при помощи аттрибута name, а порядок их получения описывается элементом receive. Если же порядок получения данных и и их структура не меняется, то обычно используется неименованный элемент fields без элемента receive.

В элементе fields указывается:

* length - общая длина пакета в единицах type BYTE | WORD | DWORD.

* field - описание каждого поля в порядке следования:

* name - имя поля, по которому к нему дальше можно будет обращаться.

* length - длина поля в единицах type BYTE | WORD | DWORD.

* description - необязательное текстовое описание поля (для облегчения понимания структуры данных).

В элементе receive используются три типа олисателей:

  • get - побайтное сканирование/получение данных до достижения выполнения какого-либо условия
  • select - получение целой структуры данных
  • eq, neq - сравнение полученных данных.

Сканирование и сравнение могут включать в себя все другие типы описателей, в отличие от select.

get имеет следующий формат:

_<get [fields=STRUCT_NAME]>_

_<[n]eq field=FIELD_NAME type=VALUE_TYPE>_VALUE+

!— Другие сравнения и выбор структур —>

/[n]eq>

/get>

Такая запись означает, что от начала данные будут рассматриваться как сруктура STRUCT_NAME. Её поле FIELD_NAME будет проверяться на равенство/неравенство значению VALUE типа VALUE_TYPE. Если сравнение не выполняется, то происходит сдвиг начала на байт, и сравнение повторяется. Если сравнение выполняется, то происходит выполнение операторов внутри элемента eq.

select имеет следующие аттрибуты

  • fields - имя структуры
  • actions - имя блока выполняемых действий

Запись типа __ означает, что будет произведён выбор структуры STRUCT_NAME, после чего выполнен блок действий ACTIONS_NAME.

Блок действий actions состоит из нескольких типов описателей:

  • eq, neq - операции проверки на равенство/неравенство
  • gt, lt - операции арифметического сравнения
  • exist, nexist - проверка на существование параметров команды
  • break - завершение блока операций
  • action - описание собственно выполняемого действия

Операции сравнения и арифметического сравнения имеют одинаковый формат:

_<OP_CODE field=FIELD_NAME type=VALUE_TYPE [check=CHECK_NAME]>_

VALUE

[

_<OP_NAME>VALUE</_OP_NAME

!— Другие логические операции —>

/check>]

!— Любые другие выполняемые действия —>

/eq>

Здесь:

  • OP_CODE - это код операции сравнения eq | neq | gt | lt
  • FIELD_NAME - это имя поля, над которым производится сравнение
  • VALUE_TYPE - означает тип значения, с которым будет сравниваться поле. Может быть BYTE | WORD | DWORD, для eq и neq может быть ещё и STRING
  • CHECK_NAME - имя блока дополнительных логических операций (на случай, когда требуется анализ наличия/отсутствия отдельных битов в полях)
  • VALUE - непосредственное значение или имя поля. Если используется имя поля, то оно заключается в (например, FIELD_NAME)
  • OP_NAME - имя дополнительной логической операции. Может быть and | or | xor

Например, запись вида

eq field="GPIH" type="BYTE" check="GPI678">0

check name="GPI678">

and>0x0E

/check>

action>…

означает, что действие должно быть выполнено в случае, когда поле GPIH & 0x0E == 0, т.е. сброщены 2, 3 и 4 биты в поле GPIH.

Операции exist и nexist настоящее время используются только для проверки факта наличия параметров в команде CCP или ENMP. Поэтому тип type всегда равен PARAMETER, а в name указывается имя этого параметра:

exist type=PARAMETER name=XXXXX>

Все опреации в блоке actions выполняются последовательно, пока не встретится конец блока или break. После этого выполнение блока заканчивается.

В настоящее время поддерживаются следующие типы операций action:

  • DIRECTCALL - непосредственный вызов метода в коде
  • CALLMACRO - вызов макроса
  • CCP - отправка команды CCP
  • ENMP - отправка команды ENMP
  • STREAM - отправка поточных данных
  • VCOMM - отправка команды управления ТР-312/314

Непосредственный вызов метода DIRECTCALL может использоваться в целях повышения производительности или для непосредственного управления различными внутренними модулями системы. Эта операция сильно зависит от исходного кода компоненты, где она используется, а потому должна применяться с осторожностью. Она содержит внутри себя описание вызываемого модуля component и вызываемого метода method этого модуля.

_VALUE_

VALUE_TYPE определяет, что именно представляет собой VALUE. Это может быть:

  • DIRECT - непосредственное значение VALUE
  • PARAMETER - значение внутри параметра с именем VALUE
  • FIELD - значение внутри поля с именем VALUE

VALUE_PURPOSE означает, имя чего указывает значение +VALUE_. Это может быть:

  • CID - идентификатор контрола
  • NAME - имя вызываемого компонента

__

_[VALUE]_

METHOD_NAME - это имя вызываемого метода. VALUE_TYPE определяет, что именно представляет собой VALUE, и может иметь значение:

  • типа параметра STRING,BYTE,INTEGER,FLOAT,LONG,BOOL
  • PARAMETER - имя параметра команды, через которое передаётся значение VALUE. В этом случае тип значения будет таким же, как и тип параметра.
  • FIELD - имя поля, через которое передаётся значение VALUE. В этом случае тип значения будет таким же, как и тип поля.

Запись типа

component type="PARAMETER" kind="CID">ControlID

method name="!TimerEvent">

param type="FIELD" name="Time">CURTIME

/method>

будет означать, что будет вызываться метод !TimerEvent контрола, имеющего идентификатор, название которого передаётся через параметр ControlID с параметром Time, значение которого находится в поле CURTIME.

Вызов макроса CALLMACRO в настоящее время работае только на стороне сервера, т.к. часовая машина не имеет макропроцессора. При вызове макроса указывается его имя MACRO_NAME и список его параметров. Для каждого параметра указывается его имя PARAM_NAME, значение VALUE и VALUE_TYPE, показывающий, что именно представляет собой VALUE. Это может быть:

  • DIRECT - непосредственное значение VALUE
  • PARAMETER - значение внутри параметра с именем VALUE
  • FIELD - значение внутри поля с именем FIELD

Запись типа

macro name="Alarm">

param name="Clock" type="FIELD">ClockID

будет означать вызов макроса Alarm с единственным параметром Clock, значение которого содержится в поле ClockID.

Отправка команд CCP и ENMP описывается одинаково, в описании присутствует элемент component, в котором указывается, для какой из компонент системы предназначается команда, и элемент command, в котором содержится непосредственно отсылаемая команда. Описание component аналогично такому же в операции DIRECTCALL, за исключением того, что VALUE_PURPOSE может принимать значения:

  • ID - идентификатор компоненты в сети Caps-Clock
  • IP - IP-адрес компоненты

Олисание command аналогично описанию method в DIRECTCALL или macro в CALLMACRO, только вместо method_/_macro записывается command.

Например,

action type="CCP">

component type="DIRECT" kind="ID">CLK_1

command name="SST">

param type=DIRECT name=CID>MIC_ST

param type=DIRECT name=SID>ON

/command>

/action>

будет означать отсылку команды SETSTATE траспаранту MIC_ST часовой машины CLK_1 для установки состояния ON.

Отсылка пакета поточных данных STREAM, например, c сервера или внешней компоненты на поточный контрол часовой машины содержит 3 элемента:

  • component - полностью идентичен этим же элементам в командах CCP и ENMP
  • control - идентификатор поточного контрола, содержит аттрибут type, позволяющий передавать этот идентификатор также через параметры и поля.
  • packet - описание пересылаемого пакета поточных данных

В описателе packet задаются последовательно поля, как они будут следовать одно за другим:

packet>

fields>

__VALUE+

_NUMBER_OF_UNITS_

/field>

VALUE_TYPE может иметь значение:

  • DIRECT - непосредственное значение VALUE
  • PARAMETER - значение внутри параметра с именем VALUE
  • FIELD - значение внутри поля с именем FIELD

NUMBER_OF_UNITS - длина поля в единицах UNIT_TYPE (BYTE | WORD | DWORD).

Так запись:

action type="STREAM">

component type="DIRECT" kind="ID">CLK_2

control type="DIRECT">CR_LEVEL

packet>

fields>

field type="FIELD">LEVEL2

length type="WORD">1

/field>

field type="FIELD">PICK2

length type="WORD">1

/field>

/fields>

/packet>

/action>

означает, что на поточный контрол CR_LEVEL часовой машины CLK_2 будет отослан пакет, состоящий из двух полей, каждое длиной 1 WORD. Значение первого поля будет взято из поля LEVEL2, а значение второго - из PICK2.

Отсылка команд на утройство типа ТР-312/314 по протоколу VCOMM в настоящее время доступна только с сервера Caps-Clock, но в дальнейшем, возможно, может быть использована и на часовой машине.

port>COMX

_VALUE_

COMX означает номер COM-порта, в который должны быть отосланы данные VALUE. VALUE_TYPE определяет, что именно представляет собой VALUE, и может иметь значение:

  • типа параметра STRING,BYTE,WORD, DWORD
  • PARAMETER - имя параметра команды, через которое передаётся значение VALUE. В этом случае тип значения будет таким же, как и тип параметра.
  • FIELD - имя поля, через которое передаётся значение VALUE. В этом случае тип значения будет таким же, как и тип поля.

Запись

action type="VCOM">

port>COM5

send type="BYTE">0x80

/action>

будет означать посылку байта 0x80 в порт COM5.

Add picture from clipboard (Maximum size: 742 MB)