Основой новой распределенной АСУ БТА является обмен данными и командами между главным управляющим компьютером и периферийными контроллерами, к которым подключена вся аппаратура управления. Обмен выполняется через CAN-шину. В управляющий компьютер установлена карта CAN-интерфейса. Сейчас это ISA-карта PCL841 фирмы Advantech. В ближайшем будущем это вероятно будет карта PCI -7841 фирмы ADLink.
Все известные CAN-драйверы для Linux могут использоваться только в одной программе, поэтому возникает проблема использования CAN-шины из нескольких, параллельно работающих, задач. Проблема совместного доступа к CAN-шине была решена традиционным способом -- написанием специальной программы CAN-обмена bta_can_io_net и разработкой межпрограммного интерфейса, позволяющего другим программам работать через нее с CAN-шиной.
Интерфейс реализован в виде библиотеки can_io.
Будем называть программу bta_can_io_net CAN-сервером, а взаимодействующие с ней программы CAN-клиентами. Сейчас CAN-клиентами являются bta_control_can, bta_sew_can и bta_meteo_can.
Для CAN-карты PCL841 используется универсальный драйвер простых CAN-карт can4Linux фирмы PORT (http://www.port.de). Этот драйвер фиксирует точное время прихода каждого CAN-пакета, что необходимо для решения проблем синхронизации в распределенной системе.
После запуска программа bta_can_io_net делится (fork) на четыре взаимосвязанных процесса:
Библиотека, реализующая межзадачный интерфейс, разработана в двух вариантах:
Первый вариант реализует местную связь CAN-клиентов со вторым и третим процессами CAN-сервера. В сетевой вариант библиотеки добавлены функции связи с CAN-сервером на другом компьютере. Оба варианта библиотеки разработаны таким образом, что они же включаются в сам CAN-сервер. Поэтому возникает несколько вариантов клиент-серверной работы:
Сетевой обмен CAN-пакетами настраивается при помощи файла конфигурации bta_can_net_conf. Он должен располагаться в текущем справочнике (в котором запускается программа). Файл состоит из следующих строк: