Содержание


Справка по &RS485Proxy

Здесь приводится справка по RS485Proxy - прокси-драйверу для устройств на шине RS-485.

RS-485 является общей шиной данных (data bus), т.е. обеспечивает доступ к множеству устройств через одну линию связи. По этой причине доступ драйверов устройств к шине RS-485 должен быть упорядочен, т.е. запросы устройств должны быть выстроены в очередь. Такой упорядоченный (последовательный) доступ к общему ресурсу (шине данных) называется сериализацией. Сериализация гарантирует, что устройства будут опрашиваться последовательно (по очереди) и не будут мешать друг другу в процессе опроса. Сериализацию выполняет драйвер - посредник или прокси (proxy), который взаимодействует с клиентскими драйверами устройств и выстраивает их запросы в очередь.

Таким образом, &RS485Proxy - это прокси-драйвер для сериализации доступа устройств к шине данных RS-485.

Перейти к Содержанию


Назначение

Драйвер &RS485Proxy реализует обмен данными по интерфейсу RS485.

&RS485Proxy полностью основан на коде &ModBusProxy. В текущей версии поддерживается до 16 логических портов. Это число легко изменить, задав константу MaxPortNum. При этом значение не должно превышать 250.

Драйвер &RS485Proxy является универсальным посредником (proxy), связующим звеном между подчиненными драйверами и устройствами на шине RS-485. Драйвер &RS485Proxy ничего не делает сам по себе, он лишь обеспечивает прием и передачу данных через порты по интерфейсу RS485, выстраивая опросы от драйверов в очередь и предотвращая конфликты при наличии множества устройств на каждом порте. В то же время подчиненные драйверы напрямую не работают с физическими портами (TCP,COM), они работают с логическими портами (номерами 1..16). Всю работу, связанную с физическими портами, берет на себя драйвер &RS485Proxy.

Подчиненные драйверы периодически посылают в консоль &RS485Proxy команду @RS485.Poll которая помещается в очередь для последующего выполнения. Когда приходит очередь, драйвер &RS485Proxy инициирует опрос физического порта, связанного с указанным в запросе логическим портом и по результатам опроса посылает драйверу результат в виде консольной команды @RS485.Reply, @RS485.Refuse или @RS485.TimeOut.

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

Перейти к Содержанию


Конфигурирование

Конфигурирование прокси-драйвера &RS485Proxy состоит из двух действий:

Перейти к Содержанию


Стандартная конфигурация

Наиболее простой и рекомендуемый в общем случае способ создания конфигурации устройства прокси-драйвера &RS485Proxy - это включение в файл DAQ-конфигурации стандартного (default) файла конфигурации:

[ConfigFileList]
ConfigFile = ~~\resource\daqsite\default\rs485proxy.cfg
[]

Кроме этого в секцию [&RS485Proxy.StartupScript] необходимо поместить команды для подключения портов RS485, тегов счётчиков и частот опроса.

Стандарная конфигурация объявляет устройство с именем &RS485Proxy, которое является стандартным именем для клиента RS485Proxy. Поскольку этот клиент обслуживает много портов, в обычном случае в конфигурации достаточно иметь один прокси-драйвер, который будет работать со всеми устройствами на портах RS-485/422/232. При необходимости максимальное число портов можно увеличить.

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

Перейти к Содержанию


Шаблон конфигурации

Если же вы захотите сделать полностью свою настройку &RS485Proxy, используйте такой шаблон:

[DeviceList]
&RS485Proxy = device software program
[&RS485Proxy]
Comment       = RS485 PROXY MASTER.
InquiryPeriod = 0
DevicePolling = 4, tpTimeCritical
ProgramSource = ~~\resource\daqsite\rs485proxy\rs485proxy.pas
DebugFlags    = 3
OpenConsole   = 2
StdInFifo     = 512
StdOutFifo    = 512
StartingOrder = -1024
StoppingOrder = +1024
StartupScript = [&RS485Proxy.StartupScript]
FinallyScript = [&RS485Proxy.FinallyScript]
[]

Кроме этого в секцию [&RS485Proxy.StartupScript] необходимо поместить команды для подключения портов RS485, тегов счётчиков и частот опроса.

Перейти к Содержанию


Секция [&RS485Proxy.StartupScript]

Таблица логических портов RS485Proxy задается в секции [&RS485Proxy.StartupScript] через консольные команды, описанные ниже. Поэтому эта секция обязательно должна быть описана. Хотя, строго говоря, все описание может генерироваться и динамически, через посылку сообщений. При этом размер буфера StdInFifo должен быть достаточным для размещения таблиц из секции StartupScript.

Перейти к Содержанию


Команды конфигурации портов

В секции [&RS485Proxy.StartupScript] используются такие команды, служащие для конфигурации портов, тегов и других параметров:

@Reset
@View
@View port
@Port port decl
@PortErrorRates port Rx Tx
@PortErrorCounters port Rx Tx
@PortPollRates port Rx Tx
@PortPollCounters port Rx Tx
@PortByteRates port Rx Tx
@PortByteCounters port Rx Tx
@TimeGap port gap

где

Перейти к Содержанию


Команда @Reset

Команда @Reset очищает все таблицы портов и приводит клиент RS485Proxy в исходное состояние.

С этой команды рекомендуется начинать описание таблиц портов клиента в секции StartupScript.

Перейти к Содержанию


Команда @View

Команда @View port служит для отображения (в консоли) таблицы данных для данного порта. Если порт не указан, то в консоли отображается таблица всех портов.

Эта команда применяется для контроля задания таблиц при отладке.

Перейти к Содержанию


Команда @ZeroPortCounters

Команда @ZeroPortCounters очищает (обнуляет) все теги со счётчиками ошибок.

Эту команду можно дать при старте, после инициализации всех таблиц портов.

Перейти к Содержанию


Команда @Port

Команда @Port port decl задает (декларирует, добавляет) порт таблицу логических портов.

Логический порт - это просто номер (индекс в таблице физических портов) для последующего подключения к нему устройств. Каждый логический порт имеет номер port и определение decl. В данной версии номера логических портов port занимают диапазон (1..16). Определение decl может содержать описание порта TCP или COM, как описано в справке по функции pipe_init. При этом TCP подключение должно быть клиентским.

Например:

@port 1 tcp port 5300 client localhost
# логический порт №1 использует TCP порт №5300
# TCP клиент соединяется с сервером localhost.

@port 2 com port 4 baudrate 9600 parity even databits 8 stopbits 1
# логический порт №2 использует COM порт №4, скорость 9600 бит/сек,
# контроль четности EVEN, 8 бит данных, 1 стоповый бит.

Перейти к Содержанию


Команда @PortPollRates

Команда @PortByteRates

Команда @PortErrorRates

Команда @PortPollCounters

Команда @PortByteCounters

Команда @PortErrorCounters

Эти команды задают теги для счётчиков (counters) или частот (rates) для числа опросов (poll), байтов (bytes) или ошибок (errors).

Здесь

Аналогично задаются теги для подсчёта траффика:

Теги счётчиков могут иметь тип Integer или Real (лучше Real). При необходимости общего счётчика допустимо многократно ссылаться на один и тот же тег, в этом случае счёта из разных источников будут складываться.

Использование тегов счётчиков является необязательным. Если счётчики не нужны, их можно не описывать.

В случае, если теги ошибок не указаны, будут инкрементироваться стандартные счётчики ошибок, общие для всех портов. Эти стандартные ошибки влияют на статус DAQ-системы (улыбающийся человечек пожелтеет и покраснеет). В случае, когда теги ошибок указаны, они будут инкрементироваться при ошибках на данном порте, но при этом стандартные счётчики задействованы не будут (поэтому статус DAQ-системы при ошибках не изменится). Это позволяет делать индивидуальную обработку ошибок, по выбору прикладного программиста.

Перейти к Содержанию


Пример секции StartupScript

Например:

[&RS485Proxy.StartupScript]
;--- Задание таблицы портов (порт,протокол,описание)
;--- Задание счётчиков приема/передачи/ошибок
;--- Логический порт 1
@Port 1 tcp port 5300 client localhost
@PortByteCounters 1 BYTECOUNT.RX BYTECOUNT.TX
@PortPollCounters 1 POLLCOUNT.RX POLLCOUNT.TX
@PortErrorCounters 1 BUGSCOUNT.RX BUGSCOUNT.TX
@PortByteRates 1 BYTERATE.RX BYTERATE.TX
@PortPollRates 1 POLLRATE.RX POLLRATE.TX
@PortErrorRates 1 BUGSRATE.RX BUGSRATE.TX
@TimeGap 1 0
;--- Логический порт 2
@Port 2 com port 4 baudrate 9600 parity even databits 8 stopbits 1
@PortByteCounters 2 BYTECOUNT.RX BYTECOUNT.TX
@PortPollCounters 2 POLLCOUNT.RX POLLCOUNT.TX
@PortErrorCounters 2 BUGSCOUNT.RX BUGSCOUNT.TX
@PortByteRates 2 BYTERATE.RX BYTERATE.TX
@PortPollRates 2 POLLRATE.RX POLLRATE.TX
@PortErrorRates 2 BUGSRATE.RX BUGSRATE.TX
@TimeGap 2 10
;--- Очистка счётчиков ошибок
@ZeroPortCounters
;--- Просмотр состояния
@View
[]

При этом не забудьте объявить теги для счётчиков в секции [TagList].

Перейти к Содержанию


Логика работы RS485Proxy

Взаимодействие посредника RS485Proxy с клиентскими драйверами осуществляется через команды (сообщения). Клиентские драверы не общаются с физическими портами напрямую, они посылают сообщения посреднику RS485Proxy. Посредник в цикле опроса обрабатывает ссообщения, выстраивает их в очередь, посылает запросы в физические порты и затем пересылает ответы клиентским драйверам - тоже в виде сообщений.

Перейти к Содержанию


Команда @RS485.Poll

Работа клиента &RS485Proxy происходит в пассивном режиме ожидания запросов со стороны подчиненных драйверов. Предполагается, что драйверы периодически посылают сообщение @RS485.Poll … и ждут ответа. При этом драйверы формируют полный запрос для устройства согласно протоколу обмена данных на него. Клиент &RS485Proxy помещает принятый запрос в очередь для отправки в физический порт. Для отказоустойчивости драйверы должны периодически (скажем, раз в минуту) проверять наличие ответа на посланный запрос и генерировать новый запрос, если ответ все еще не пришел (эта ситуация возможна при перезапуске клиента &RS485Proxy).

Команда @RS485.Poll ref cid tot port uid $$dat//eol служит для инициирования операции опроса данных для данного порта.

@RS485.Poll ref cid tot port uid $$dat//eol

# ref  - Числовая ссылка Reference или имя драйвера &Sender, инициировавшего опрос.
#        Ответное сообщение будут послано ему.
# cid  - Пользовательская команда (command id) - любое число,
#        идентифицирующее команду, которая возвращается в ответе.
# tot  - максимальное время ожидания ответа, ms, (0..MaxInt).
#        Если ответа на запрос не требуется, то следует указать 0.
#        В противном случае время ожидания должно быть положительным числом.
# port - Номер логического порта, (1..16).
#        Порт должен быть открыт командой @Port.
# uid  - идентификатор (адрес) устройства, (1..247).
# dat  - данные запроса (request).
# eol  - символ конца сообщение в двухсимвольном ASCII HEX-коде,
#        например: 0D - _CR, 0A - _LF или 0D0A - CRLF.
#        В качестве eol может использоваться сколько угодно символов,
#        например 26270D0A = &'CRLF, главное чтобы каждый символ был
#        закодирован в двухсимвольном ASCII HEX-коде.

Например:

@RS485.Poll &demo.driver 33 200 1 5 $$@01//0D

# Инициировать опрос модуля с адресом 5, подключенного к порту 1,
# ждать не более 200 ms, ответ переслать драйверу &demo.driver.
# В запросе передается номер команды 33 для использования драйвером.
# Сообщение для отправки в устройство: @01CR.

Перейти к Содержанию


Команда @RS485.Reply

Команда @RS485.Refuse

Команда @RS485.TimeOut

В результате выполнения команды @RS485.Poll в ответ устройству &sender посылается одно из следующих сообщений:

@RS485.Refuse  ref cid tim port uid   msg
@RS485.Reply   ref cid tim port uid $$ans
@RS485.TimeOut ref cid tim port uid $$dat

# ref    - reference, имя или ссылка устройства, пославшего ответ; значение должно быть ссылкой _&RS485Proxy_
# cid    - command id, идентификатор команды; значение должно совпадать с посланным
# tim    - измеренное время выполнения цикла запрос-ответ, ms; значение должно быть неотрицательным
# port   - логический порт, значение должно быть неотрицательным и совпадать с посланным
# uid    - адрес устройства, значение должно быть (1..247) и совпадать с посланным
# ans    - ответ устройства, возвращаемый при Reply
# req    - исходный запрос, возвращаемый при TimeOut
# msg    - строка с описанием причины, по которой запрос был отклонен - например, "Bad Port"= неверный номер порта

например:

@RS485.Reply   1049090 33 10 1 5 $$@05
@RS485.TimeOut 1049090 33 210 1 5 $$@05
@RS485.Refuse &RS485Proxy 33 0 1 5 Bad Timeout 0

# здесь 1049090 - ссылка устройства &RS485Proxy

Перейти к Содержанию


Библиотека NetRS485

Библиотека NetRS485 содержит

для включения в драйверы устройств, чтобы облегчить создание этих драйверов.

Шаблон для включения NetRS485 в код драйверов устройств

Библиотека NetRS485 включается аналогично другим модулям.

program DemoDriver485;
const
 {------------------------------}{ Declare uses program constants:  }
 {$I _con_StdLibrary}            { Include all Standard constants,  }
 {------------------------------}{ And add User defined constants:  }
 {$I _con_NetRS485}              { NetRS485 constants               }
 ...
var
 {------------------------------}{ Declare uses program variables:  }
 {$I _var_StdLibrary}            { Include all Standard variables,  }
 {------------------------------}{ And add User defined variables:  }
 {$I _var_NetRS485}              { NetRS485 variables               }
 ...
 {------------------------------}{ Declare procedures & functions:  }
 {$I _fun_StdLibrary}            { Include all Standard functions,  }
 {------------------------------}{ And add User defined functions:  }
 {$I _fun_NetRS485}              { NetRS485 functions               }
 ...
 {
 Clear user application strings...
 }
 procedure ClearApplication;
 begin
  ClearNetRS485;
  ...
 end;
 {
 User application Initialization...
 }
 procedure InitApplication;
 begin
  InitNetRS485;
  ...
 end;
 {
 User application Finalization...
 }
 procedure FreeApplication;
 begin
  FreeNetRS485;
  ...
 end;
 {
 User application Polling...
 }
 procedure PollApplication;
 begin
  PollNetRS485;
  ...
 end;
...

Кроме того, обработчик команд консоли StdIn_Processor должен, в соответствии с логикой работы опрашиваемого устройства,

Перейти к Содержанию


RS485Proxy Copyright (c) 2024-2025 DaqGroup daqgroup@mail.ru

CRW-DAQ Copyright (c) 2001-2025 DaqGroup daqgroup@mail.ru.