ЖУРНАЛ СТА 1/2012
который используется при выполне- нии запросов системного API, напри- мер open(), на локальном компьютере. QNet обеспечивает обмен сообщения- ми между процессами на удалённых узлах прозрачно, как если бы они нахо- дились на одном узле сети, – в резуль- тате вся сеть превращается в единый компьютер с общими ресурсами и за- дачами. Каждый процесс, реализуемый в контроллере, представляет собой цикл, в котором происходит приём и обработка сообщений от процессов уровнем выше. Построение цикла вид- но из листинга 1. Все процессы яв- ляются потомками абстрактного клас- са Active, в котором представлены все основные функции: создание канала, по которому идёт приём сообщений, приём сообщений по каналу, обработ- ка сообщений, ответ на сообщения (листинг 2). Функция MsgReceive является бло- кирующей. На ней процесс ждёт со- общения, которое предназначено для него. Как только такое сообщение по- ступает, выполняются анализ сообще- ния и дальнейшая обработка. Функция MsgReply производит ответ на присы- 54 СТА 1/2012 СИС Т ЕМНА Я ИН Т Е Г Р АЦИЯ / КОСМОНА В Т ИКА www.cta.ru лаемые сообщения. Ответ может как содержать сообщение с полезными данными, запрашиваемыми клиентом, так и быть пустым. Процесс уровнем выше посылает со- общения с помощью функции MsgSend. Но для удобства создан класс IActive (листинг 3). В этом классе реа- лизованы функции для посылки со- общений классу Active. Построение процессов с использованием классов Active и IActive позволяет упростить и ускорить разработку процессов, так как в этих классах уже реализованы ос- новные наборы функций, а разработка каждого процесса (написание соответ- ствующего программного кода) может вестись различными людьми. Процессы, реализующие основные задачи управляющих контроллеров и обеспечивающие формирование управляющих воздействий для испол- нительных устройств нижнего уровня, взаимодействуют между собой через программу Coordinator, которая рас- пределяет ресурсы контроллера меж- ду процессами и синхронизирует их работу. Такая орга- низация позволяет нижнему уровню системы функционировать независимо от второго управляющего уровня и не блокировать задачи, выполняемые си- стемами второго уровня. С ИСТЕМНЫЙ КООРДИНАТОР На втором уровне системы управле- ния МАПК находятся: ● система управления комплексом ан- тенных систем; ● система анализа и сбора данных; ● система питания и диагностики обо- рудования; ● система управления контрольно-из- мерительным оборудованием. Каждая система, кроме первой из пе- речисленных, решает свой круг задач и может работать независимо от других. Система управления комплексом ан- тенных систем фактически является системным координатором, менедже- ром программно-аппаратных средств описываемого радиотехнического ком- плекса. ЛИСТИНГ 1 while (is_srr_running) { rcvid = MsgReceive (chid, r_msg, rsize, &info); if (rcvid == -1) { warn ("MsgReceive error"); continue; } if (rcvid != 0) { ProcessMsg (rcvid, r_msg, &info, &status, p_msg, &psize); if (status != -1) { rc = MsgReply (rcvid, status, p_msg, psize); if (rc == -1) warn ("MsgReply error"); } } else ProcessPulse (r_msg, &info); } ЛИСТИНГ 2 class Active { public: Active (); virtual ~Active (); void Run (int argc, char** argv); protected: virtual void ProcessMsg (int rcvid, void* r_msg, struct _msg_info* info, int* status, void* p_msg, int* psize); virtual void ProcessPulse (void* r_msg, struct _msg_info* info); void MsgEmpty (int rcvid, void* r_msg, struct _msg_info* info, int* status, void* p_msg, int* psize); void PulseEmpty (void* r_msg, struct _msg_info* info); private: void MainLoop (void* r_msg, void* p_msg, int chid, int rsize); void MsgQuit (int rcvid, void* r_msg, struct _msg_info* info, int* status, void* p_msg, int* psize); void PulseDisconnect (void* r_msg, struct _msg_info* info); void PulseQuit (void* r_msg, struct _msg_info* info); }; ЛИСТИНГ 3 class IActive { public: IActive (int ssize, int lsize); ~IActive (); int Open (const char* name, int flags); int Close (); int Completing (); int PulseCompleting (); }; ЛИСТИНГ 4 class Device { public: Device(); Device(<список параметров>); //Выбор частоты опроса устройства unsigned int requestInterval() const; void setrequestInterval (unsigned int interval); //Установка и запрос сетевого адреса устройства string hostAddress() const; void setHostAddress (const string &address); //Установка и запрос порта устройства unsigned int port(); void setPort (unsigned int port); /*Здесь описываются методы для установки специфичных для устройств параметров */ private: string hostAddress; //Сетевой адрес устройства unsigned int port; //Порт устройства int socket; //Дескриптор сокета /*Описание остальных параметров устройства */ void initialize(); //Инициализировать устройство void sendCommand(const char *) //Отправить команду устройству char *response(); //Прочитать ответ от устройства void getData(); //Считать данные (значение) void start(); //Запустить цикл опроса void stop(); //Завершить цикл опроса }; © СТА-ПРЕСС
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy