PLRKS - связь с платой датчиков pRKS
====================================

ВЫХОДЫ
Channel 00 .. 3F        Считанные значения (входы платы pDIO). Могут принимать 
                        значения 0 или 1.
Okta 01 .. 07           Значения 8-ми входов, объедененные в байт
ErrorFlag               Флаг отсутствия связи
ErrorCounter            Счетчик отсутствия связи

DipNetAddress           Старший байт - Dip-адрес, младший байт - сетевой адрес.

                        Dip-адрес используется для адресации плат, его значение должно
                        совпадать с установокой dip-переключателей на плате. Если
                        значение dip-адреса не задано (равно нулю),оно приравнивается к 
                        значению сетевого адреса.

                        Сетевой адрес используется для логического связывания программных
                        блоков типа MCHB, MDTA, ZDVA и др. с физическими платами ввода вывода.

                        dip-адрес и сетевой адрес могут не совпадать, но если dip-адрес равен
                        нулю ему присвается значение сетевого адреса.

                        В процессе работы с выхода DipNetAddress считывается значение сетевого
                        адреса. Запись в DipNetAddress невозможна.


Maska                   Разрешение запроса данных для Counter (255-разрешено, 0-запрещено)
Enable                  Разрешение запроса данных для Channel 
                                0-запрещено,
                                1-разрешено по короткому протоколу, 
                                2-разрешено по расширенному протоколу.
                        Описание протоколов см. в приложении.
Divisor                 Делитель принятых значений Counter


По умолчанию используеться порт COM2.

Данное устройство может работать в COM-потоках.

Время обработки данных в основном потоке ~ 115 мс


******************************************************************************

ПРИЛОЖЕНИЕ
==========

Описание контроллера pRks3
==========================

Программа предназначена для обеспечения работы модуля микроконтроллера (MCU) с 
платой ввода информации от датчиков РКС (плата РКС).

MCU выполняет подсчет кол-ва фронтов входного сигнала для каждого входа платы 
РКС, поступивших за установленный период времени (по умолчанию 2 секунды).
При запросе значений набранных фронтов, перед передачей производится деление
каждого значения счетчика на делитель devisor и проверка на превышение
полученого результата максимального передаваемого значения, которое равно 127.

Максимально допустимое значение частоты на входе:
  300 Гц - при средней загруженности платы;
  274 Гц - при полной загруженности платы.

Максимально допустимое значение частоты понижается при обмене данными
MCU с внешним устройством (упраляющим контроллером, компьютером).

Адреса MCU выставляется dip-переключателями на плате РКС (от 0 до 15).


Описание протокола обмена с модулем RKS 2.0
============================================


1. Специальные коды:
   $55 - ключ (key) обращения к модулю
   $AA - преффикс (^) передачи байтов, равных значению специальных ко-
         дов, но не являющихся ими.

   Преффикс предназначен для передачи значения $55 в качестве данных,
а не в качестве ключа. Для этого значение $55 кодируется двумя байтами
$AA и $00. Для передачи значения $AA в качестве данных используется 
последовательность $AA$01.


2. Синтаксис обращения к модулю:
   Следующая последовательность символов посылается компьютером (main)
и принимается всеми модулями сети:

  main:   $55, $xx

Значение символа $xx получается суммированием кода модуля (KOD) и  ко-
да команды. После принятия кода модуля каждый модуль сравнивает его со
своим и тем самым определяет, к нему данный запрос или нет. Если  зап-
рос не к нему, то модуль переходит в режим  ожидания  нового запроса.

После приема команды данные передаются по соответствующей схеме для
каждой  команды.

Основные команды:
--------T-------------------------------T-----------------------------¬
¦ 20    ¦key:KOD+$20:                   ¦Принять массив измеренной    ¦
¦       ¦           :x1..x16:cc.        ¦частоты (1..16 канал)        ¦
+-------+-------------------------------+-----------------------------+
¦ 40    ¦key:KOD+$40:                   ¦Принять массив измеренной    ¦
¦       ¦           :x1..x16:cc.        ¦частоты (17..32 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ 60    ¦key:KOD+$60:                   ¦Принять массив измеренной    ¦
¦       ¦           :x1..x16:cc.        ¦частоты (33..48 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ 80    ¦key:KOD+$80:                   ¦Принять массив измеренной    ¦
¦       ¦           :x1..x16:cc.        ¦частоты (49..64 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ 10    ¦key:KOD+$10:                   ¦Принять значения счетчиков   ¦
¦       ¦           :x1..x12:cc.        ¦фронтов (0..7 канал)         ¦
+-------+-------------------------------+-----------------------------+
¦ 30    ¦key:KOD+$10:                   ¦Принять значения счетчиков   ¦
¦       ¦           :x1..x12:cc.        ¦фронтов (8..15 канал)        ¦
+-------+-------------------------------+-----------------------------+
¦ 50    ¦key:KOD+$10:                   ¦Принять значения счетчиков   ¦
¦       ¦           :x1..x12:cc.        ¦фронтов (16..23 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ 70    ¦key:KOD+$10:                   ¦Принять значения счетчиков   ¦
¦       ¦           :x1..x12:cc.        ¦фронтов (24..31 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ 90    ¦key:KOD+$10:                   ¦Принять значения счетчиков   ¦
¦       ¦           :x1..x12:cc.        ¦фронтов (32..39 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ B0    ¦key:KOD+$10:                   ¦Принять значения счетчиков   ¦
¦       ¦           :x1..x12:cc.        ¦фронтов (40..47 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ D0    ¦key:KOD+$10:                   ¦Принять значения счетчиков   ¦
¦       ¦           :x1..x12:cc.        ¦фронтов (48..55 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ F0    ¦key:KOD+$10:                   ¦Принять значения счетчиков   ¦
¦       ¦           :x1..x12:cc.        ¦фронтов (56..63 канал)       ¦
+-------+-------------------------------+-----------------------------+
¦ EF    ¦key:$EF:........               ¦Дополнительная команда       ¦
¦       ¦               :...            ¦(описание см. ниже)          ¦
L-------+-------------------------------+------------------------------


Команды 20, 40, 60 и 80 перекочевали из первого варианта протокола для
модулей платы РКС и оставлены для совместимости с предыдущими проектами.
Тем не менее, используя данные команды, программа pRKS2 имеет несколько
преимуществ по сравнению с предшествующей прграммой.

Во первых, введен контроль переполнения счетчика фронтов, чего не было в
старой программе. Таким образом, при превышении частоты на входе установ-
ленного лимита, передаваемое значение будет равно 127. Биения возникают
только при большом значении входной частоты (более 2 кГц).

Во вторых, добавлена возможность масштабировать при передаче значение
счетчика фронтов. Для этого предварительно необходимо установить значение
делителя. После этого, для каждого передаваемого значения будет выполнено
целочисленное деление на установленый делитель. Например, при длительности
цикла измерения 2 с и делителе 4 значения будут переданы в Гц. Для работы
со старыми проектами значение делителя должно быть равным 1.

Очевидно, что при помощи масштабирования можно мередавать гораздо больше
информации, однако здесь может возникнуть проблема при работе на низких
частотах. Например, значение счетчика, равное 3, при делителе 4 будет 
нулевым. Для предотвращения потери данных на низких частотах используется
масштабирование со сдвигом. Суть данного метода заключается в том, что
передаваемое значение масштабируется только тогда, когда оно превышает
установленный предел (порог). Иначе значение передается в натуральном 
виде, не подвергаясь делению.

Для того чтобы отличать масштабированное значение от натурального, к 
масштабируемому значению добавляется такое смещение, чтобы полученное
значение было больше порогового значения:

          / x, x<=P
     V = {
          \ (x div D) + Ofs, x>P


     Ofs = P - P/D + 1

     Vmax = 126 - Ofs

     где x    - исходное значение счетчика фронтов
         V    - передаваемое значение
         D    - делитель
         P    - порог
         Ofs  - смещение
         Vmax - максимальное возможное для передачи значение

Например, для получения не масштабированного значения до 5Гц, используются
следующие установки (время цикла=2с, делитель=4):

       P = 5Гц * 2с * 2 = 20

       Ofs = 20 - 20/4 + 1 = 16

       Vmax = 126 - 16 = 110


В старший бит каждого их передаваемых значений записывается логическое
состояние соответствующего входа.


Команды 10, 30, 50, 70, 90, B0, D0 и F0 являются новыми и предназначены
для передачи значения счетчиков фронтов полностью, без масштабирования и
ограничения (более 127). Ответ команды содержит значения по восьми 
каналам и имеет следующий формат:

             x1 x2 x3 x4 x5 x6 x7 x8 Y1 Y2 Y3 Y3 cc

  x - младший байт значения счетчика
  Y - тетрады старших байтов двух счетчиков и логические биты.

  счетчик 1-го канала = (Y1 & 0xF)*256 + x1    лог.бит = (Y1 & 0x8) > 0
  счетчик 2-го канала = (Y1 & 0xF0)*16 + x2    лог.бит = (Y1 & 0x80) > 0

  счетчик 3-го канала = (Y2 & 0xF)*256 + x3    лог.бит = (Y2 & 0x8) > 0
  счетчик 4-го канала = (Y2 & 0xF0)*16 + x4    лог.бит = (Y2 & 0x80) > 0

    и т.д.


Контрольная сумма cc - это сумма байтов команда или ответа модуля,
умноженная логически на 0xFF:

                   cc = (x1 + x2 + ... xN) & 0xFF



3. Дополнительные команды

3.1. READ MODULE NAME
   Чтение имени модуля.
     
   in:   <55><EF>AAM(cr)
   out:  !AARKS 2.0(cr)

     АА - адрес модуля


3.2. READ INPUTS
   Чтение массива входных данных.

   in:   <55><EF>AAZ(cr)
   out:  >FF FF FF FF FF FF FF FF(cr)


3.3. READ CYCLETIME
   Чтение значения длительности цикла

   in:   <55><EF>AAC(cr)
   out:  C=tt(cr)

   Длит[ms] = tt * 32.768 


3.4. SET CYCLETIME
   Установка значения длительности цикла

   in:   <55><EF>AAStt(cr)
   out:  C=tt(cr)

   tt = Длит[ms] / 32.768


3.5. READ DIVISOR
   Чтение значения делителя масштабирования.

   in:   <55><EF>AAD(cr)
   out:  D=dd(cr)


3.6. SET DIVISOR
   Установка значения делителя масштабирования.

   in:  <55><EF>AAW00dd(cr)
   out:  D=dd(cr)

3.7. READ POROG & ScaleOfset
   Чтение значения порога и смещения масштабирования.

   in:   <55><EF>AAP(cr)
   out:  P=pp/oo(cr)
   где pp - значение порога
       oo - значение смещения

3.8. SET POROG & ScaleOfset
   Установка значения порога и смещения масштабирования.

   in:   <55><EF>AAKpp/oo(cr)
   out:  P=pp/oo(cr)
   где pp - значение порога
       oo - значение смещения


4.Пример передачи дополнительной команды

   Запрос имени модуля для MCU с адресом 15:

   in:   Uя0FM
   out:  !0FRKS2.0

   Символьное значение EF:  я - MS-DOS
                            п - Windows

