79996

Разработка кроссплатформенного программного инструментария для работы с платами сбора данных с интерфейсами PCI и USB для ЗАО «Руднев-Шиляев»

Дипломная

Информатика, кибернетика и программирование

В данной дипломной работе был спроектирован и разработан кроссплатформенный программный инструментарий для работы с аппаратной продукцией ЗАО «Руднев-Шиляев». Под этот инструментарий была адаптирована пользовательская программа с графическим интерфейсом, реализующая функции осциллографа и спектроанализатора.

Русский

2015-02-15

1 MB

2 чел.

Правительство Российской Федерации

Федеральное государственное автономное образовательное учреждение

высшего профессионального образования

«Национальный исследовательский университет
«Высшая школа экономики»

Факультет информационных технологий и вычислительной техники

Вычислительные комплексы системы и сети (230101)

Кафедра информационно-коммуникационных технологий

ДИПЛОМНЫЙ ПРОЕКТ

Разработка кроссплатформенного программного инструментария для работы с платами сбора данных с интерфейсами PCI и USB для ЗАО «Руднев-Шиляев»

Выполнил

Студент группы № С-104

Ширяев Дмитрий Алексеввич

Научный руководитель

Ассистент, к.т.н.

Протасов Станислав Игоревич

Москва, 2013


Аннотация

В данной дипломной работе был спроектирован и разработан кроссплатформенный программный инструментарий для работы с аппаратной продукцией ЗАО «Руднев-Шиляев». Под этот инструментарий была адаптирована пользовательская программа с графическим интерфейсом, реализующая функции осциллографа и спектроанализатора.


Содержание

[1] Аннотация

[2] Введение

[3] 1. Обзорно-аналитическая часть

[3.1] 1.1 Обзор российского рынка плат сбора данных

[3.1.1] 1.1.1 Введение

[3.1.2] 1.1.2 ООО «L-Card»

[3.1.3] 1.1.3 ЗАО «Руднев-Шиляев»

[3.1.4] 1.1.4 ЗАО «Электронные технологии и метрологические системы»

[3.1.5] 1.1.5 НПГ R-Technology

[3.1.6] 1.1.6 Итоги

[3.1.7] 1.1.7 Вывод

[3.2] 1.2. Обзор кроссплатформенных инструментариев разработчика для создания приложений с графическим интерфейсом

[3.2.1] 1.2.1. Введение

[3.2.2] 1.2.2. Qt

[3.2.3] 1.2.3. GTK+

[3.2.4] 1.2.4. wxWidgets

[3.2.5] 1.2.5. Выводы

[3.3] 1.3. Исследование архитектурных подходов к созданию инструментария разработчика

[4] 2. Технологическая часть

[4.1] 2.1. Выбор инструментов разработки

[4.1.1] 2.1.1. Обоснование выбора языка разработки

[4.1.2] 2.1.2. Системы управления версиями

[4.1.2.1] 2.1.2.1 Централизованные системы управления версиями

[4.1.2.2] 2.1.2.2 Распределенные системы управления версиями

[4.1.2.3] 2.1.2.3. Subversion

[4.1.2.4] 2.1.2.4. Git

[4.1.2.5] 2.1.2.5. Mercurial

[4.1.2.6] 2.1.2.6. Сравнение Subversion, Git и Mercurial

[4.1.2.7] 2.1.2.7. Вывод

[4.1.3] 2.1.3. Системы автоматической генерации документации

[4.2] 2.2. Разработка программной архитектуры инструментария разработчика

[4.2.1] 2.2.1. Введение

[4.2.2] 2.2.2. Модули разрабатываемого инструментария

[4.2.2.1] 2.2.2.1. RSHSignalSaver

[4.2.2.2] 2.2.2.2. DPA

[4.2.2.3] 2.2.2.3. DM

[4.2.2.4] 2.2.2.4. DC

[4.2.2.5] 2.2.2.5. RSHPCI

[4.2.2.6] 2.2.2.6. RSHUSB

[4.2.2.7] 2.2.2.7. RshDeviceBase

[4.2.3] 2.2.3. Паттерны проектирования

[4.2.3.1] 2.2.3.1. Паттерн «Фасад»

[4.2.3.2] 2.2.3.2. Паттерн «Абстрактная Фабрика»

[4.3] 2.3. Проектирование программных интерфейсов (API) инструментария

[4.3.1] 2.3.1 Введение

[4.3.2] 2.3.2.Требования и общие рекомендации к API

[4.3.3] 2.3.3. Типы данных и структуры

[4.3.3.1] 2.3.3.1. Типы возвращаемых значений

[4.3.3.2] 2.3.3.2. Базовый тип RshBaseType

[4.3.4] 2.3.4. Внутреннее API

[4.3.4.1] 2.3.4.1. Интерфейс IFactory

[4.3.4.2] 2.3.4.2. Программный интерфейс IRSHDeviceBase

[4.3.4.3] 2.3.4.3. Программный интерфейс IRSHUSB

[4.3.4.4] 2.3.4.4. Программный интерфейс IRSHPCI

[4.3.5] 2.3.5. Внешнее API

[4.3.5.1] 2.3.5.1. Интерфейс IRSHDevice

[4.3.5.2] 2.3.5.2. Программный интерфейс IDM

[4.3.5.3] 2.3.5.3. Программный интефейс IDC

[4.3.5.4] 2.3.5.4. Программный интерфейс IDPA

[4.3.5.5] 2.3.5.5. Программный интерфейс IRSHSignalSaver

[4.3.6] 2.3.6. Выводы

[5] 3. Разработка

[5.1] 3.1. Разработка платформонезависимого ядра и программных интерфейсов инструментария разработчика

[5.1.1] 3.1.1. Введение

[5.1.2] 3.1.2. Разработка платформонезависимых модулей инструментария

[5.1.2.1] 3.1.2.1. Модуль RshDllClient

[5.1.2.2] 3.1.2.2. Модули DC и DM

[5.1.2.3] 3.1.2.2. Модуль DPA

[5.1.2.4] 3.1.2.3. Модуль RSHSignalSaver

[5.1.2.5] 3.1.2.4. Библиотеки драйверов высокого уровня для устройств и интерфейс IRSHDevice

[5.1.2.6] 3.1.2.5. Модуль RSHUSB

[5.1.2.7] 3.1.2.6. RSHPCI

[5.1.3] 3.1.3. Выводы

[5.2] 3.2. Разработка USB-драйвера под ОС Linux

[5.2.1] 3.2.1. Основные понятия USB

[5.2.1.1] 3.2.1.1. Дескриптор устройства

[5.2.1.2] 3.2.1.2. Дескриптор конфигурации

[5.2.1.3] 3.2.1.3. Дескриптор интерфейса

[5.2.1.4] 3.2.1.4. Конечные точки

[5.2.1.5] 3.2.1.5. Блоки запроса USB

[5.2.2] 3.2.2 Разработка драйвера USB

[5.2.2.1] 3.2.2.1 Инициализация устройства

[5.2.2.2] 3.2.2.2 Обмен данными с устройством

[5.2.3] 3.2.3. Наименование файлов устройств

[5.2.4] 3.2.4. Заключение

[6] 4. Экспериментальная часть

[6.1] 4.1. Разработка методики испытания

[6.2] 4.2. Разработка тестового стенда

[6.3] 4.3. Проведение натурного эксперимента

[7] 5. Охрана труда

[7.1] 5.1. Выявление опасных и вредных факторов при эксплуатации ЭВМ и их влияния на пользователей

[7.1.1] 5.1.1. Опасные и вредные факторы при работе с ВДТ и ПЭВМ

[7.1.1.1] 5.1.1.1. Повышенные статические и динамические нагрузки

[7.1.1.2] 5.1.1.2. Повышенные нервно-психические нагрузки

[7.1.1.3] 5.1.1.3. Воздействие ВДТ на органы зрения

[7.1.1.4] 5.1.1.4. Воздействие электрического тока

[7.1.1.5] 5.1.1.5. Влияние статического электричества

[7.1.1.6] 5.1.1.6. Влияние электромагнитного излучения низких частот

[7.2] 5.2. Методы и средства защиты пользователей от воздействия на них опасных и вредных факторов при эксплуатации ЭВМ

[7.2.1] 5.2.1. Основные требования к видеодисплейным терминалам

[7.2.1.1] 5.2.1.1. Цветовые параметры ВДТ

[7.2.1.2] 5.2.1.2. Основные требования к конструкции ВДТ

[7.2.2] 5.2.2. Организация рабочего места пользователя ВДТ и ПЭВМ

[7.2.3] 5.2.3. Режим работы операторов ВДТ и ПЭВМ

[7.2.4] 5.2.4. Помещение для работы с ВДТ и ПЭВМ

[7.2.5] 5.2.5. Защитные меры электробезопасности

[7.2.5.1] 5.2.5.1. Защитное заземление и зануление

[7.2.5.2] 5.2.5.3. Двойная изоляция

[7.2.5.3] 5.2.5.4. Разделяющие трансформаторы

[7.2.5.4] 5.2.5.5. Блокировки и быстроотключающие устройства

[7.2.6] 5.2.6. Требования к электропроводкам

[7.2.7] 5.2.6 Требование к освещению для работы с ВДТ и ПЭВМ

[7.2.7.1] 5.2.6.1. Естественное освещение

[7.2.7.2] 5.2.6.2. Внутренне искусственное освещение

[7.2.7.3] 5.2.6.3. Особенности устройства освещения в помещениях для работы с ВДТ и ПЭВМ

[7.3] 5.3. Выводы

[8] Заключение

[8.1] Итоги

[8.2] Выводы

[9] Список литературы


Введение

Актуальность. Разработка программных продуктов в рамках одного предприятия зачастую сводится к решению типовых задач. Для экономии времени на разработку целесообразно применить методологию повторного использования кода и реализовать часто требующийся функционал в виде программного инструментария. В таких сферах как разработка компьютерных игр или веб-сайтов существует множество готовых сторонних решений. Но сама специфика производимой предприятием ЗАО «Руднев-Шиляев» продукции (платы сбора данных) требует разработки индивидуального программного инструментария, учитывающего специфику конкретной аппаратной продукции.

Требование кросс-платформенности было мотивировано увеличением доли ОС Linux в Росcии среди потенциальных клиентов предприятия. Но, пожалуй, самым важным аргументов для включения этого пункта в список требований послужило сотрудничество между ЗАО «Руднев-Шиляев» и Военно-промышленным комплексом, в структурах которого используется МСВС – операционная система на базе Linux.

Анализ кроссплатформенных инструментариев для построения пользовательского интерфейса, поддерживающих в том числе мобильные платформы iOS и Android позволит оценить перспективы добавления кроссплатформенности в клиентское программное обеспечение. Наличие такого программного обеспечения даст возможность ЗАО “Руднев-Шиляев” занять пустующую в настоящее время на российском рынке нишу плат сбора данных для мобильных устройств (планшетных компьютеров и смартфонов) и создать аналоги таких западных продуктов как OsciPrime (http://www.osciprime.com/) и iMSO-104 (http://www.oscium.com/products/mixed-signal-oscilloscope-imso-104).

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


Задачи, которые были решены в этой работе:

  •  Анализ современных технологий и подходов используемых при разработке ПО.
  •  Анализ типовых сценариев использования (use-case'ов) продукции и выявление на основе полученной информации требований к разрабатываемому ПО.
  •  Проектирование и разработка программного инструментария, адаптация под него программы осциллографа-спектроанализатора.
  •  Анализ сущетсвующих кроссплатформенных программных инструментариев для построения графического интерфейса пользователя и выбор ниаоболее соответсвующего поставленным требованиям инструментария для портирования на него в дальнейшем приложения осциллографа-спектроанализатора.
  •  Тестирование и внедрение разработанного ПО на предприятии.

Практическая значимость данной работы подтверждена успешным внедрением разработанного программного инструментария в работу организации ЗАО «Руднев-Шиляев».

Апробация работы

Программный инструментарий успешно протестирован и функционирует на предприятии ЗАО «Руднев-Шиляев».


1. Обзорно-аналитическая часть

1.1 Обзор российского рынка плат сбора данных

1.1.1 Введение

Современные технологии позволяют получить как мобильную и компактную, так и стационарную систему измерения из готовых, серийно выпускаемых компонентов в кратчайшие сроки. Основой любой системы компьютерных измерений является АЦП. Как микросхема, АЦП мало пригоден для быстрого построения системы, поэтому рассмотрим его как составную часть устройств сбора данных. Кроме АЦП на большинстве плат имеются цифровые входы и выходы, опционально — пара каналов ЦАП. Каждый производитель в комплект поставки включает программное обеспечение, как минимум с функцией осциллографирования. Помимо штатного ПО фирм, существует стороннее - самые известные это ACTest и PowerGraph, поддерживающие ОС Windows.

В данном обзоре анализируются крайние точки спектра выпускаемой на российском рынке продукции плат сбора данных с интерфейсами PCI и USB: высокоточные низкочастотные и высокочастотные. Будут рассмотрены 14 плат от 4-х отечественных производителей. Платы могут быть выполнены как специальное устройство, с цифровыми входами и выходами и опционально ЦАП, так и в виде модуля только с аналоговыми входными каналами для масштабируемой системы.

1.1.2 ООО «L-Card»

Сайт: http://www.lcard.ru/

Фирма предлагает два варианта подходящих под заданные требования USB-плат: E20-10 (14 бит, 10 МГц на 4 канала) и LTR114 (24 бита, 4 кГц суммарно для всех опрашиваемых каналов). Наличие у E20-10 цифрового сигнального процессора и возможность загрузки прикладных программ позволяют реализовать различные функциональные алгоритмы и специализированные режимы работы модуля. Есть опция установки двухканального ЦАП на плату. Недостатком LTR114 является отсутствие цифровых портов входа/выхода, большие габариты и необходимость внешнего питания. Из плат с PCI-интерфейсом были рассмотрены два продукта: L-780M (14 бит, 400 кГц, 32 канала) и L-783M (12 бит, 3 МГц, 32 канала). Главное преимущество L-Card — масштабируемые модульные системы.

Продукция фирмы поддерживается собственным штатным бесплатным ПО LGraph2, а также сторонними ACTest и PowerGraph. Есть ПО для разработчика и драйвера под Linux.

1.1.3 ЗАО «Руднев-Шиляев»

Сайт: http://www.rudshel.ru/

У данной фирмы были рассмотрены следующие продукты: высокоточная плата с разрядностью АЦП 24 бита и частотой 800 Гц и не имеющая близких аналогов среди продукции других рассматриваемых фирм плата «Сириус» с частотой 5 ГГц. Это касается плат с интерфейсом USB. Рассмотренные две PCI-платы имеют такие характеристики: Леонардо-II с частотой 104,4 кГц и 24 разрядами точности и ЛАн10-12PCI-у, двухканальная с 12-разрядным АЦП и 100 МГц на канал.

Продукция поддерживается собственным штатным бесплатным ПО ADCLab с функуциями самописца, осциллографа-спектроанализатора, программы для просмотра собранных данных и конвертации их в форматы .txt и .cvs, а также совместима со сторонними ACTest и PowerGraph. Софт поддерживает только ОС Windows. Фирма предоставляет возможность модификации своего оборудования или создания на его основе измерительных комплексов по техническим заданиям заказчиков.

1.1.4 ЗАО «Электронные технологии и метрологические системы»

Сайт: http://www.zetms.ru/

Фирма предлагает в рассматриваемом диапазоне 24-битную плату ZET 220 с суммарной частотой преобразования 8 кГц на 16 каналов и двухканальный осциллограф ZET 302 с 50-мегагерцовым 8-разрядным АЦП. PCI-платы имеют неоправданно высокую стоимость для своих характеристик, даже несмотря на то, что в них встроен генератор сигнала: 24-битная 2-канальная плата с частотой дискретизации 1 кГц и одноканальная с частотой 10 МГц и разрядностью 14 бит. Цена аналогичного комплекта (АЦП-ЦАП) с такими же характеристиками у других рассматриваемых фирм в среднем в два раза меньше.

В качестве программного обеспечения используется только своё бесплатное и набор дополнительного платного программного обеспечения также собственной разработки. Все ПО поддерживает только ОС Windows. Фирма предлагает широкий набор ПО по трем направлениям: ZETView — среда графического программирования (наподобие LabVIEW) для построения сложных измерительных систем, ZETLab Studio — SDK для работы с продукцией фирмы и ZETLab — набор виртуальных приборов и средств для работы с ними.

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

Из особенностей стоит выделить набор любопытных опций: передача данных по Bluetooth, Ethernet и Wi-Fi или запись их на карту памяти SD в автономном режиме, что существенно расширяет круг решаемых задач.

1.1.5 НПГ R-Technology

Сайт: http://www.r-technology.ru/

Продукция данной фирмы состоит из набора модулей, устанавливаемых в единый корпус. Сочетание модулей в одном корпусе может быть любым, что позволяет подобрать подходящую конфигурацию для решения любой задачи. Продукция фирмы скорее ориентирована на создание масштабируемых измерительных комплексов и представляет интерес при наличии 2, 3 и 8 модульной архитектуры, с набором различных модулей. Важно отметить, что данная фирма не имеет продукции с интерфейсом PCI.

Поддержка ПО: В комплект поставки продукции фирмы входит программный пакет QMLab с функциями самописца, осциллографа, спекроанализатора и математической обработки собранных данных. Программа поддерживает только семейство ОС Windows. Ее большим минусом является неудобный графический интерфейс, отсутствие встроенной справки или хотя бы всплывающих подсказок к элементам управления. На сайте фирмы выложен пакет SDK под ОС Windows и примеры программирования. Продукция фирмы поддерживается сторонними пакетами ПО: PowerGraph и ACTest.

Из интересующей нас продукции фирмой представлены два устройства: USB3000 — высокочастотный 8-канальный 14-битный АЦП, с частотой 3 МГц на канал и самая высокочувствительная плата из выпускаемых этой фирмой — QMBox15-16 со следующими характеристиками: 500 кГц, 32 канала, 16 разрядов.

1.1.6 Итоги

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

Подводя итоги, стоит отметить, что несмотря на узкий диапазон характеристик рассматриваемых устройств, которые мы выбрали изначально, наши отечественные производители предлагают четырнадцать вариантов реализации. Учитывая наличие штатного программного обеспечения и ПО сторонних разработчиков, конечные потребители могут построить как мобильную, так и стационарную систему измерений, решающую широкий круг задач в кратчайшие сроки.

Таблица 1

Сравнение плат сбора данных представленных на российском рынке

Продукты

Частота

Разрядность

Цена, руб.

L-Card

LTR114 (USB)

4 кГц

24

18696

E20-10 (USB)

10 МГц

14

16892

L-780M (PCI)

400 кГц

14

11152

L-783M (PCI)

3 МГц

12

14104

ЗАО «Руднев-Шиляев»

ЛА-И24USB

800 Гц

24

14000

Сириус (USB)

5 ГГц

8

150000

Леонардо-II (PCI)

102,4 кГц

24

34800

ЛАн10-12PCI-у

100 МГц

12

42000

ЗАО «Электронные технологии и метрологические системы»

ZET 220 (USB)

8 кГц

24

27890

ZET 302 (USB)

50 МГц

8

12000

АЦП ЦАП 24/4 (PCI)

1 кГц

24

60960

АЦП ЦАП 14/2 (PCI)

10 МГц

14

72960

R-Technology

QMBox15-16 (USB)

500 кГц

16

19730

USB3000

3 МГц

14

18780

1.1.7 Вывод

Из проведенного обзора был сделан вывод, что ЗАО «Руднев-Шиляев» производит конкурентноспособную аппаратную продукцию. Для дальнейшего развития фирмы целесообразным является обеспечение своей продукции хорошей программной поддержкой в виде пользовательских приложений и SDK, предоставляющих отсутствующие у конкурентов возможности: поддержка Linux и мобильных платформ.

1.2. Обзор кроссплатформенных инструментариев разработчика для создания приложений с графическим интерфейсом

1.2.1. Введение

В данной работе требуется провести анализ кроссплатформенных программных инструментариев для создания пользовательских приложений с графическим интерфейсом и выбрать из них наиболее подходящий для портирования на него клиентского программного обеспечения ЗАО «Руднев-Шиляев». Для данных задач используется такой класс сторонних продуктов как фреймворки и библиотеки виджетов.

В рамках данной работы были сформулированы следующие требования к фреймворку:

  •  Кросс-платформенность;
  •  Написан на C/C++;
  •  Поддержка мобильных платформ (iOS, Android);
  •  Наличие встроенной или сторонней библиотеки для отрисовки графиков;
  •  Элементы интерфейса должны выглядеть нативными (native) для каждой из поддерживаемых операционных систем;
  •  Лицензия распространения, совместимая с проприетарной лицензией;
  •  Совместимость снизу вверх (forward-compatibility);

Первые четыре требования к фреймворку не нуждаются в пояснениях, а три последних следует рассмотреть подробнее.

Разработка графического пользовательского интерфейса для приложения является очень трудной задачей, поскольку в большинстве случаев только front-end часть видна конечному пользователю. Не важно насколько продуманный, «красивый» и оптимизированный код используется в back-end части приложения — если оно не будет выглядеть удобным и привлекательным для клиента, ничто не заставит его им пользоваться. Это является проблемой многих хороших с программной точки зрения продуктов свободного программного обеспечения, не получивших широкой популярности из-за того, что разработчики не уделили достаточного внимания созданию удобного, продуманного интерфейса. Особенно остро стоит проблема создания графического интерфейса пользователя для кроссплатформенного приложения. Графическое окружение каждой ОС имеет свой набор правил по созданию интерфейсов: Windows User Experience Interaction Guideline, KDE User Interface Guideline, Gnome HID. Каждое из этих руководств содержит рекомендации по построению пользовательских интерфейсов для конкретного окружения. Кроссплатформенные фреймворки для построения ГИП решают эту проблему разными способами. Самым очевидным из них является отрисовка элементов интерфейса через обращение к соответствующим функциям API конкретной ОС. Минусом такого подхода является то, что некоторые элементы интерфейса, присутствующие на одной платформе, могут не иметь аналогов на другой или вести себя по-разному. Другим вариантом является реализация элементов интерфейса, которые отрисовываются с помощью графических примитивов функциями самого фреймворка, а не ОС (примером подобного решения является интерфейс программы Adobe Photoshop — он имеет одинаковый интерфейс на всех ОС и одновременно не выглядит нативным ни для одной из них).


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

Рассмотрим подробнее наиболее распространенные современные лицензии программных продуктов:

GPL (General Public License) - обязывает публиковать весь код проекта под GPL (из-за чего эта лицензия получила неофициальное название «вирусной» лицензии). Тем не менеее использование ПО под данной лицензией в проектах с закрытым исходным кодом возможно, если связь между открытыми и закрытыми компонентами программы происходит не путём загрузки в адресное пространство, а, например, через запуск GPL-программы как отдельного процесса и общения с ней через пайпы. Также эта лицензия запрещает поставлять программу в одном пакете (установщике) вместе с проприетарным ПО.

LGPL (Lesser GPL) - является менее строгой модификацией GPL-лицензии. Позволяет не раскрывать исходные коды модулей, написанных без использования LGPL-кода, и требует динамического связывания (dynamic linking) с LGPL - библиотеками.

Требование совместимости снизу вверх (forward-compatibility) является важным при нынешнем стремительном развитии технологий. Многие технологии очень быстро устаревают и заменяются новыми. Особенно это следует учитывать при проектировании мульти-платформенного приложения, одной из целевых платформ которого является ОС Linux. Эта платформа активно развивается в последнее время, ее дистрибутивы обновляются по модели роллинг-релизов (rolling-release).

Конкретным примером ситуации, при которой может возникнуть проблема совместимости снизу вверх, является переход таких популярных дистрибутивов, как Fedora и Ubuntu, с устаревшего графического сервера X.org на Wayland. Поэтому фреймворк должен позволять запускать написанное с его использованием приложение на системах, использующих любую из указанных технологий.

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

После анализа различных ресурсов для разработчиков программного обеспечения, были выявлены следующие наиболее популярные и часто упоминаемые кросс-платформенные фреймфорки для создания пользовательских приложений: Qt, GTK+, wxWidgets. Ниже приведен детальный обзор всех их по каждому из пунктов списка выявленных требований.

1.2.2. Qt

Последние версии этого фреймворка используют нативное графическое API каждой поддерживаемой платформы для отрисовки элементов пользовательского интерфейса [1].

В комплект поставки Qt входит WYSIWYG-редактор — Qt Creator для генерации кода пользовательского интерфейса приложения на языках С++ и QML. QML является декларативным языком программирования, по синтаксису схожим с JavaScript, на котором, начиная с версии Qt 4.7, описываются все элементы а также простая логика пользовательской (front-end) части приложения. Более того, функционал элементов, описанных на QML, может быть расширен путем подключения файлов на JavaScript. Виджеты загружаются из .qml-файла при запуске приложения. В Qt реализована поддержка графического сервера Wayland. Фреймворк поддерживает мобильные платформы Android и iOS. Существует сторонняя библиотека Qwt (http://qwt.sourceforge.net/) для отрисовки графиков и добавляющая дополнительные элементы управления (контролы).

Qt значительно расширяет базовый функционал C++ за счет введения концепции слотов и сигналов для обработки пользовательских событий.

В качестве преимуществ Qt стоит также упомянуть наличие подробной документации, примеров программирования и обучающих статей на официальном сайте, а исходные коды фреймворка снабжены подробными комментариями. На официальном сайте проекта есть активный форум для разработчиков. Проект поддерживается большим количеством как коммерческих, так и некоммерческих организаций — Trolltech, Nokia, Digia, KDE, Qt Project.

Конечному пользователю Qt поставляется в виде открытых исходных кодов, под лицензий LGPL.

1.2.3. GTK+

В первую очередь надо отметить, что изначально GTK+ разрабатывался не как универсальный графический фреймворк, а как инструментарий исключительно для графического редактора GIMP и был написан на языке Си для Unix-систем, а мульти-платформенность и официальная привязка к C++ — gtkmm, были добавлены позже. В нем отсутствуют платформонезависимые реализации функций, обычно требуемых при создании пользовательского приложения — многопоточность, работа с динамическими библиотеками, работа с файловой системой. Но, несмотря на такие изначальные дефекты дизайна и очевидные недостатки в плане функционала, он удовлетворяет выдвинутым выше требованиям и подходит для решения задачи создания приложения с ГИП.

Для отрисовки всех виджетов в GTK+ используется сторонняя кросс-платформенная графическая библиотека cairo, поддерживающая аппаратное ускорение. Пользовательский интерфейс приложения может быть описан как на C++, так и на языке XML в отдельном файле, из которого виджеты будут загружены при запуске программы по мере необходимости. Существует официальный графический редактор Glade для конструирования пользовательских интерфейсов. Минусом использования языка разметки XML является его избыточность и сложность восприятия человеком (по сравнению с существующими альтернативами XML).

Единственным разработчиком проекта является некомерческая организация GNOME Foundation. Отсутствует поддержка мобильных платформ. Графический сервер Wayland поддерживается. Отрисовываемые им виджеты не выглядят нативными для поддерживаемых платформ. Есть множество библиотек для отрисовки графиков и диаграмм.

GTK+ является бесплатным программным обеспечением, исходные коды которого находятся в открытом доступе. Он распространяется под лицензией LGPL, позволяющей использовать данный продукт для создания ПО не предоставляя его код в открытом виде.

1.2.4. wxWidgets

Является полноценным кроссплатформенным фреймворком на языке C/C++, а не только лишь инструментарием для построения ГИП. Кроссплатформенная реализация множества функций, таких как: потоки и многопоточность, работа с файлами и т. д.

Фреймворк использует нативные элементы графического интерфейса. Разработчиками было заявлено о работе над внедрением поддержки мобильных платформ — iOS в 2011, а в 2012 — Android, однако к 2013 году поддержка обеих платформ по-прежнему отсутствует. Также нет какой-либо информации о работе по внедрению поддержки графического сервера Wayland. Для данного фреймворка отсутствует возможность вынести описание элементов интерфейса в отдельный файл, тем самым увеличивая количество кода, не связанного непосредственно с логикой разрабатываемого приложения.

Разработка осуществляется командой энтузиастов, насчитывающей 20 человек (http://wxwidgets.org/about/whowhat.htm). На сайте проектов присутствует подробная документация по всем компонентам фремворка, есть примеры программирования.

WxWidgets является бесплатным программным обеспечением с открытым исходным кодом, распространяемым под модифицированным лицензионным соглашением LGPL – wxWindows License, позволяющим разработчикам ПО не раскрывать исходные коды своего приложения.

1.2.5. Выводы

Сравнительные данные рассмотренных фреймворков приведены в следующей таблице:

Таблица 2

Сравнение графических фреймворков

Кросс-платформенность

Язык C/C++

Библиотека отрисовки графиков

“Нативные” виджеты

Лицензия

Совместимость снизу вверх

Qt

Да - полная, поддержка iOS и Android

Да

Да

Да

Да

Да

GTK+

Частичная – поддерка только Linux и Windows

Да

Да

Нет

Да

Да

wxWidgets

Частичная – поддержка только Linux и Windows

Да

Да

Да

Да

Не

После анализа всех преимуществ и недостатков данных фреймворков, выбор был сделан в пользу Qt, как наиболее подходящего решения.

1.3. Исследование архитектурных подходов к созданию инструментария разработчика

Компьютерная инженерия с момента своего образования сразу столкнулась с проблемами, связанными со сложностью программных систем. Ранее проблемы высокой сложности решались разработчиками путем правильного выбора структур данных и разработки алгоритмов. Но все возроставшая сложность программных систем привела к удорожанию разработки и необходимости поиска новых подходов к проектированию программных продуктов. Существовал высокий риск ошибок, заложенных при дизайне системы из-за недостаточного опыта исполнителя или высокой степени сложности ПО. Одним из способов снижения риска таких ошибок на стадии разработки архитектуры является ее моделирование. В этом случае можно говорить о визуализации разрабатываемой архитектуры посредством некоторого программного средства и методологии моделирования. Такие средства и модели имели независимое развитие и получили широкое распространение не только в сфере разработки ПО, но и за ее рамками. В области разработки ПО средства моделирования постепенно эволюционировали от средств визуального представления к инструментам с поддержкой автоматической генерации кода и далее к комплексным интегрированным средам.

В итоге для решения проблем, связанных с проектированием архитектуры программного обеспечения, выделился ряд архитектурных подходов, отражающих концепцию построения сложного ПО и соответствующие практические рекомендации. Эти подходы не являются взаимоисключающими и дополняют друг друга. Разработка программных инструментариев является одним из частных случаев разработки программного обеспечения. Поэтому рассмотрим современные архитектурные подходы, применяемые при разработке программного обеспечения. Существует три таких подхода:

  •  Model Driven Architecture - в основе этого подхода лежит идея о полном разделении этапов общего проектирования (моделирования) и последующей реализации приложения на конкретной программной платформе. Сначала при помощи специальных средств проектирования создается общая и независимая от способов реализации модель приложения, а затем осуществляется реализация программы на каком-либо языке программирования . При этом процесс разработки полностью основан на модели, которая должна содержать всю необходимую для программирования информацию.
  •  Event Driven Architecture - это архитектурный подход, основанный на понятиях события и его обработке. Система, построенная по EDA, представляет собой совокупность слабосвязанных компонентов, обменивающихся сообщениями. Действие в системе выполняется как реакция на такое сообщение. Отправитель сообщения может не знать о том, какой компонент системы будет его обрабатывать.
  •  Service Oriented Architecture - это принцип разработки программного обеспечения, основанный на использовании отдельных сервисов, выполняющих в совокупности функции какого-либо сложного приложения.

Model Driven архитектурный подход к разработке программы представляет собой модификацию нисходящей разработки, при которой модульная структура программы формируется от модуля самого верхнего уровня, переходя к программированию модуля следующего уровня и так далее до самого низкого уровня. Таким образом при проектировании ПО выделяются и специфицируются основные, главные функции создаваемого программного продукта, а затем программируются отдельные модули, реализующие более простые функции, которые используются модулями стоящими выше по иерархии. В связи с этим программные модули, создаваемые в рамках нисходящего подхода, обычно параметризуются для того, чтобы усилить применимость таких модулей путем настройки их на параметры. Нисходящее проектирование эффективно, потому что оно позволяет одновременно сосредоточиться на меньшем количестве деталей. При движении сверху вниз на каждой из последующих стадий проекта уменьшается уровень сложности (степени интеграции). Такой набор модулей создается в расчете на то, что при разработке той или иной программы в заданной предметной области могут потребоваться функции некоторых из них. Это позволяет существенно сократить трудозатраты на разработку конкретной программы путем подключения к ней заранее заготовленных и проверенных на практике модульных структур высокого уровня. Такие структуры могут многократно использоваться в разных конкретных программах, поэтому архитектурный подход может рассматриваться как путь борьбы с дублированием в программировании.

Для проектирования инструментария разработчика в соответствии с выявленными требованиями модульной структуры с высокой связанностью модулей, наиболее рациональным является выбор Model Driven Architecture.

2. Технологическая часть

2.1. Выбор инструментов разработки

2.1.1. Обоснование выбора языка разработки

При разработке кроссплатформенного программного продукта, когда встает вопрос о выборе языка программирования, обычно рассматривают такие наиболее популярные языки как Java и C/C++. В Java кросс-платформенность заложена в самом дизайне языка. Этот язык обладает большим количеством как встроенных в него (AWT, Swing), так и сторонних (SWT) библиотек для создания графического интерфейса. К тому же Java является основным языком для разработки приложений под мобильную платформу Android. А в рамках данной работы совместимость с Android является одним из требований к разрабатываемому ПО. Но несмотря на все вышеуказанные плюсы Java, согласно данным, опубликованным Google, в тестах производительности Java проигрывает по времени исполнения программного кода в 6 раз по сравнению с C/C++ [10]. Время исполнения программного кода является наиболее приоритетным показателем при выборе языка разработки прикладного ПО [20]. Учитывая это, а также то, что в команде разработчиков подавляющее большинство имели значительно больший опыт разработки ПО на C/C++ чем на Java, выбор был сделан в пользу C/C++.

2.1.2. Системы управления версиями

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

Специально для командной работы над проектом были разработаны системы управления версиями - класс ПО для работы с изменяющейся информацией. Существует две принципиально разные модели систем управления версиями: централизованная и распределенная.

2.1.2.1 Централизованные системы управления версиями

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

Рисунок 1. - Устройство централизованных систем управления версиями

2.1.2.2 Распределенные системы управления версиями

Основная особенность распределенных систем контроля версий — отсутствие центрального сервера. Вместо одного центрального репозитория, каждый разработчик имеет свою версию проекта на компьютере. Такой подход позволяет разработчикам обмениваться между собой отдельными, только нужными в данный момент наборами изменений, избавляя их от необходимости вникать в структуру всего проекта. С одной стороны такой подход обеспечивает гибкость, но если не производить периодические синхронизации между локальными версиями разных разработчиков, то потом объединение всех внесенных изменений может стать весьма затруднительным и занять много времени. Помимо этого желательно наличие основного репозитория, в котором будут храниться сведенные вместе изменения.

Рисунок 2. - Устройство распределенных систем управления версиями.

На данный момент самыми популярными системами контроля версий являются Subversion, Git и Mercurial. Далее будут рассмотрены ключевые возможности этих систем, достоинства, недостатки и примеры команд для взаимодействия с ними.

2.1.2.3. Subversion

Subversion (SVN) — свободная централизованная система управления версиями, выпущенная компанией CollabNet Inc. в 2004 году.

В настоящее время Subversion довольно популярна среди разработчиков открытого программного обеспечения. Вот лишь некоторые известные проекты, разработчики которых используют данную систему: Apache, GCC, Python, Ruby, FreeBSD, Boost. Subversion также широко используется в закрытых проектах и корпоративной сфере.

Возможности:

  •  Копирование объектов с разветвлением истории — при копировании в хранилище появляются два отдельных объекта с общей историей.
  •  Поддержка ветвления:
    •  Создания ветвей (копированием директорий) и работы с ними.
    •  Слияние ветвей (переносом изменений).
  •  История изменений и копии объектов (в том числе ветви и метки) хранятся в виде связанных разностных копий — не требующих больших временных и дисковых ресурсов при создании и хранении.
  •  Поддержка конкурентной (в том числе одновременной, с изоляцией транзакций) многопользовательской работы с хранилищем и, в большинстве случаев, автоматическим слиянием изменений различных разработчиков (в рабочей копии).
  •  Фиксации изменений в хранилище (в том числе многообъектные) организуются в виде атомарных транзакций.
  •  Сетевой обмен между сервером и клиентом предусматривает передачу только различий между рабочей копией и хранилищем.
  •  Обеспечивается одинаково эффективная работа как с текстовыми, так и с двоичными файлами.
  •  Различные варианты доступа к хранилищу, в том числе:
    •  Непосредственный доступ на локальной файловой системе.
    •  По собственному сетевому протоколу.
    •  Через веб-сервер по протоколу WebDAV/DeltaV.
  •  Два возможных внутренних формата хранилища: база данных или набор обычных файлов.

Примеры команд:

  1.  Checkout – создание локальной копии хранилища.
  2.  Update – обновление состояния локальной копии хранилища до последней зафиксированной в удаленном хранилище ревизии.
  3.  Add – добавление нового ресурса в хранилище.
  4.  Commit – фиксирование изменений локальной копии в хранилище, то есть создание новой ревизии.

2.1.2.4. Git

Git – распределённая система управления версиями файлов. Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux, первая версия выпущена 7 апреля 2005 года. Проекты, использующие систему: ядро Linux, Drupal, Cairo, GNU Core Utilities, Wine, Chromium, Compiz Fusion, jQuery, PHP.

Возможности:

  •  Поддержка нелинейной разработки. Основная концепция Git заключается в том, что разработчику чаще придется объединять код, чем писать его.
  •  Поддержка множества протоколов. А именно HTTP, FTP, rsync или же собственный протокол.
  •  Эффективен при работе над большими проектами. Проект может становиться больше и тяжелее, но Git будет всё так же быстр, в отличии от других систем.
  •  Надёжная история изменений. В Git невозможно вносить изменения в старые версии файлов, без создания нового состояния.
  •  Git спроектирован как набор программ, специально разработанных с учётом их использования в скриптах.
  •  Гибкий функционал для объединения предлагает пользователю системы несколько способов автоматического объединения конфликтных файлов.
  •  Очистка от мусора. В процессе работы с системой в ней может накапливаться мусор – некорректные версии файлов, которые появились в результате откатов на предыдущие версии. Git может отследить и удалить подобный мусор.

Примеры команд:

  •  Clone – создание локальной копии хранилища.
  •  Pull – обновление состояния локальной копии хранилища до последней зафиксированной в удаленном хранилище ревизии.
  •  Add – добавление нового ресурса в хранилище.
  •  Commit – фиксирование изменений, проделанных с локальной копией.
  •  Push – отправка изменений из локальной копии хранилища в удаленное хранилище.

2.1.2.5. Mercurial

Mercurial — распределенная система контроля версий, выпущенная в 2005 году. Основной функционал реализован на языке Python, а требующие высокой производительности части (например, своя реализация diff) написаны на Си. Проекты использующие эту систему: Vim, Xen, OpenSolaris, NetBeans, OpenJDK, OpenOffice.org.

Возможности:

  •  Простота освоения. У Git больше команд и опций. Документация Mercurial выглядит более законченной и простой.
  •  Полностью кроссплатформенная, лучше и полнее поддержка Windows.
  •  Большое количество графических клиентов, интегрирующихся в графическую оболочку системы.
  •  В отличии от Git не требуется операция по техническому обслуживанию репозитория (Git требует частых ручных переупаковок своих метаданных, иначе падает производительность и увеличивается занимаемое репозиторием дисковое пространство).

Примеры команд:

  1.  Clone — создание копии репозитория.
  2.  Add — добавляет существующий файл в следующий коммит.
  3.  Commit — фиксирование набора изменений.
  4.  Push — получение измененией из удаленного репозитория.
  5.  Pull — отправка изменений в удаленный репозиторий.

2.1.2.6. Сравнение Subversion, Git и Mercurial

Преимущества Subversion:

  •  Это централизованная система контроля версий, что позволяет иметь небольшую рабочую копию.
  •  Совместима c Windows, не имеет проблем с кириллицей (у GIT проблемы с кириллицей под Windows).
  •  Позволяет держать в рабочей копии часть репозитория.
  •  Subversion имеет удобную нумерацию ревизий.

Преимущества Git:

  •  Это распределенная система контроля версий. В случае сбоя можно взять локальный репозиторий без потери истории изменений (При этом локальная копия меньше по размеру, в сравнении с Mercurial).
  •  Быстрее, чем Subversion. При сравнении разница была очень заметна (до 20 раз быстрее).
  •  Позволяет делать локальные коммиты без доступа к центральному серверу.

Преимущества Mercurial:

  •  Распределенная система контроля версий.
  •  Поддержка Windows (В отличии от Git который имеет для Windows только MinGW-порт).
  •  Большее количество графических клиентов.
  •  Наличие системы плагинов, при необходимости расширяющей базовый функционал.

2.1.2.7. Вывод

После оценки возможностей и особенностей представленных систем в качестве системы управления версиями был выбран Mercurial, как наиболее современное и подходящее решение.

2.1.3. Системы автоматической генерации документации

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

Поскольку написание документации по завершении проекта – дело трудоемкое, следует составлять ее в процессе написания, «по горячим следам». К тому же никто не сможет продокументировать программный код лучше, чем сам его автор.

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

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

  •  Поддержка синтаксиса языка C/C++
  •  Кроссплатформенность (система работает на всех платформах на которых ведется разработка: Linux, Windows)
  •  Бесплатность

Всем этим требованиям отвечает Doxygen – одна из старейших (разрабатывается с 1997 года, изначально была частью проекта Qt) бесплатных кроссплатформенных систем документирования исходных кодов с консольным интерфейсом. Имеет встроенную поддержку генерации документации в форматах HTML, CHM, PDF, man. Для документации в виде html-файла, размещаемого на веб-серверах, существует удобный способ организации поиска с помощью автоматически сгенерированнного Doxygen'ом PHP-модуля. Есть возможность добавлять математические выражения любой сложности, используя синтаксис языка разметки LaTeX. Doxygen применяется в таких известных проектами как KDE, Mozilla, Drupal.

2.2. Разработка программной архитектуры инструментария разработчика

2.2.1. Введение

Была поставлена задача спроектировать и разработать программный инструментарий для работы с платами сбора данных с интерфейсами PCI и USB. Перед проектированием программного инструментария был проведен анализ типовых use-case'ов для продукции ЗАО «Руднев-Шиляев». Диаграмма сценариев использования приведена на рисунке 3.

Рисунок 3. - Диаграмма сценариев использования

На основании этого анализа были выявлены следующие функции, которые должны быть реализованы в разрабатываемом программном инструментарии:

  •  Непрерывный сбор данных с плат
  •  Покадровый режим сбора данных
  •  Запись собранных данных в файл, снабженный требуемой пользователю мета-информацией
  •  Применение следующих математических алгоритмов как к собираемым данным в режиме реального времени, так и к уже собранным данным:
    •  поиск разрывов в сигнале
    •  поиск фронта сигнала
    •  расчет среднеквадратичного отклонения
    •  быстрое преобразование Фурье.

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

2.2.2. Модули разрабатываемого инструментария

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

2.2.2.1. RSHSignalSaver

Программный модуль для работы с данными, полученными при аналогово-цифровом преобразовании. Также позволяет осуществлять работу с метаданными — любой требуемой пользователю информацией о записанных в файле данных, предоставляя функции для их записи в файл, чтения из файла и внесения в них изменений. Модуль поддерживает файловый формат HDF5 (подробнее см. пункт 3.1.2.3.), с которым могут работать многие популярные математические пакеты. Этот формат данных не ограничивает пользователя применением только клиентского ПО ЗАО «Руднев-Шиляев».

2.2.2.2. DPA

Data Processing Algorithms — модуль для математической обработки данных в реальном времени или уже собранных данных. В этом модуле реализованы следующие математические алгоритмы:

  •  Нахождение переднего и заднего фронта в сигнале;
  •  Поиск разрывов в сигнале;
  •  Быстрое преобразование Фурье;
  •  Расчет основной погрешности и коэффициента согласия ряда измеренных значений. Об этом подробнее см. [6];

2.2.2.3. DM

Device Manager — модуль, управляющий всеми находящимися в системе устройствами ЗАО. Производит подключение к устройствам по VID и PID, а также по их названиям, загружая соответствующую динамическую библиотеку, создавая экземпляр класса и предоставляя указатель на интерфейс IRSHDevice.

2.2.2.4. DC

Device Controller — реализует упрощенный высокоуровневый интерфейс для сбора, обработки и сохранения данных. Скрывает от пользователя детали работы с классами DPA, RSHSignalSaver и интерфейсом устройства IRSHDevice.

2.2.2.5. RSHPCI

Все платы производства ЗАО «Руднев-Шиляев» с интерфейсом PCI выполнены на базе чипов PLX9050/PLX9054, для которых от производителя есть официальные драйвера под Windows и Linux, а также кроссплатформенное API с низкоуровневыми функциями для работы с драйвером. RSHPCI представляет собой класс-обертку над функциями этого API.

2.2.2.6. RSHUSB

Класс для низкоуровневой работы со всеми платами с интерфейсом USB. Содержит функции записи, чтения и контроля ввода-вывода (ioctl) для отправки команд и получения данных от платы, реализацию кольцевого буфера для непрерывного сбора данных и потоки сбора данных для двух режимов: непрерывного и покадрового. Работа с файлом устройства осуществляется через кроссплатформенные функции-обертки над функциями Windows API и системными вызовами Linux.

2.2.2.7. RshDeviceBase

Базовый класс для всех устройств. Содержит функции загрузки низкоуровневых библиотек в зависимости от интерфейса платы (RSHPCI, RSHUSB) и получения экземпляров соответствующих классов. Также в нем содержатся функции получения информации об устройстве: количество каналов, минимальная и максимальная частота, коэффициенты усиления. Соответствующие поля этого базового класса заполняются после подключения к устройству и получения его ревизии.

Спроектированная структура программного инструментария представлена на рисунке 4.

Рисунко 4. - Компонентная диаграмма инструментария

2.2.3. Паттерны проектирования

Архитектура программного продукта, а в особенности программного инструментария должна быть универсальной и легко расширяемой. Это достигается благодаря паттернам проектирования.

В сфере разработки ПО паттерном (или шаблоном) проектирования называется описание некоторой типовой, часто встречающейся проблемы проектирования архитектуры ПО и оптимальный способ ее решения [17].

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

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

В данной работе были применены следующие паттерны проектирования

2.2.3.1. Паттерн «Фасад»

Данный паттерн представляет собой упрощенный интерфейс вместо набора интерфейсов компонентов некоторой подсистемы. Иными словами “Фасад” является интерфейсом более высокого уровня, упрощающим взаимодействие с подсистемой, который скрывает взаимодействие с компонентами подсистемы за единым интерфейсом, но не лишает пользователя возможности при необходимости обратиться к каждому из компонентов скрываемой им подсистемы в отдельности.

Подробнее о реализации паттерна проектирования «Фасад» в данной работе см. пункт 3.1.2.2.

2.2.3.2. Паттерн «Абстрактная Фабрика»

В ситуации, когда существует один интерфейс и несколько классов его реализующих, возникает необходимость получать экземпляр конкретной реализации вышеупомянутого интерфейса. Поскольку интерфейсный класс является абстрактным и класс, реализующий интерфейс, неизвестен пользователю, то для создания объектов, наследующих этот интерфейс требуется наличие «Абстрактной Фабрики». Этот шаблон сам является интерфейсом, который в свою очередь наследуют фабрики, каждая из которых производит конкретную реализацию требуемого интерфейса. Такая архитектурная конструкция значительно упрощает получение конкретной реализации некоего общего интерфейса, при этом оставляя детали его реализации скрытыми от конечного пользователя.

Подробнее о реализации данного паттерна проектирования см пункт 3.1.2.1.

2.3. Проектирование программных интерфейсов (API) инструментария

2.3.1 Введение

Одна из главных целей разработки SDK – создать удобный инструмент, который в дальнейшем позволит сэкономить время на разработку прикладного прогаммного обеспечения на его основе. Обычно SDK состоит из нескольких модулей, выполняющих определенные функции. При использовании этих модудей для написания ПО подробности того как они функционируют не существенны, имеет значение только что эти модули делают. Для взаимодействия модулей SDK с внешними программными продуктами используется API (Application Programming Interface) – интерфейс программирования приложений.

API позволяет реализовать ключевую для программирвоания концепцию “черного ящика”, когда внутреннее устройство функционального модуля (динамической или статической библиотеки, сервиса и т.д.) неизвестно пользователю. API является средством для взаимодействия пользователся с функциональным модулем, описывая какие действия этот модуль может выполнить, какие ему труебуются данные от пользователся и в каком виде пользователь получит результат выполненных действий. Это позволит пользователю применить модуль при разработке собственных приложений. Можно сказать что API (Application Programming Interface) схож с GUI (Graphical User Interface) в том что оба обеспечивают посредничество между пользователем и некоторым программным функциональным блоком, с разницей в том что API это “текстовый интерфейс” рассчитаный на пользователя-программиста.

Проектируя API для SDK следует сделать его таким, чтобы сторонний разработчик его использующий мог сконцетрироваться на том какие ему нужны функции, не вникая как они реализованы. В идеале API должен отражать только лишь логику предметной области.

С одной стороны API должен быть простым и удобным для пользователя, но и не слишком упрощенным – не сводиться к минимальному количеству высокопараметризованных, “универсальных” функций.

Также следует учитывать что любой успешный программный продукт будет постоянно улучшаться. При разработке API должна быть предусмотрена возможность улучшения и развития программного продукта. Если это не будет учтено, то изменение одного компонента, а затем и API для него, потребует изменений реализации других компонентов и их API. А если продукт используется сторонним пользователем, то при таких изменениях, все его программы, использующее API, также потребуют модификации.

2.3.2.Требования и общие рекомендации к API

Существует ряд рекомендаций, которых стоит придерживаться при проектировании API [8, 14, 16]. Хороший API должен:

  1.  Содержать как можно меньше открытых методов на класс и как можно меньше классов. Это позволит пользователю API быстро его освоить, а разработчику - поддерживать и изменять его.
  2.  Покрывать всю функциональность требуемую в рамках предметной области, при этом не конфликтуя с первым требованием.
  3.  Быть понятным и легкозапоминающимся. Названия классов, методов и их параметров должны быть краткими и в тоже время информативными, делая обращения к документации минимальными, а код – читаемым.
  4.  Минимизировать возможность ошибок при написании кода. Хорошо спроектированный API в самом своем дизайне минимизирует риск неправильного использования, ошибок времени компиляции (compile-time errors) и времени исполнения программы (run-time errors).

Распространненой ошибкой при написании программного продукта является следующая последовательность этапов проектирования и разработки: реализация функционала, проектирование API и релиз продукта. Спроектированное таким образом API будет отражать то какие функции реализованны в компоненте, а не то какой функционал хотел бы получить пользователь API от этого компонента. Требования к функционалу модулей должны быть получениы из анализа сценариев использования(use-case'ов) модуля – реализация должна подстраиваться под пользователя, а не наоборот.

Еще одно немаловажное требование: лучшее API – это то которое не требует от пользователя написания большого количества кода. Не стоит использовать высокопараметризованные конструкторы класса, или создавать класс, требующий перед его использованием в программе вызова множества методов. Не стоит использовать методы с множетсвом параметров – лучше чтобы они предоставляли более общий функциционал. API всегда может быть расширено в дальнейшем если это необходимо.

2.3.3. Типы данных и структуры

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

2.3.3.1. Типы возвращаемых значений

В разработанном программном инструментарии было принято решение не используются исключения. Любой публичный метод класса возвращает беззнаковое 32-битное число с кодом ошибки, при этом 4 младшие тетрады остаются зарезервированными под системные коды ошибок, получаемые через вызовы GetLastError() (Windows) и errno() (Linux).

2.3.3.2. Базовый тип RshBaseType

В API разрабатываемого инструментария у многих классов есть многофункциональные геттеры(getter - получатель) и сеттеры(setter – установщик) – методы, служащие для получения или изменения данных, доступ к которой напрямую ограничен. Многофункциональность этого метода означает что в него передаются переменные различных типов, в зависисмости от получаемых или изменяемых данных. Если тип данных передается в другом параметре, использование указателя на void-тип делает риск ошибки очень высоким и нарушает четвертую из перечисленных выше рекомендаций к хорошему API. К тому же это идет вразрез с сильной типизацией в C++.

Для решения этой проблемы был создан базовый класс RshBaseType. Класс имеет приватное поле перечислимого типа (enumeration) enum RshDataTypes, в котором перечисленны типы данных, используемые в инструментарии. В конструкторе типа данных наследованного от RshBaseType это поле заполняется соответствующим значением из RshDataTypes. Передача такого типа данных в сеттер- или геттер-метод, вместе с кодом, определяющим тип запроса (что пользователь хочет получить от класса или какие данные отправить), по указателю на RshBaseType позволит определить, соответствует ли переданый тип коду запроса.

Интерфейсами компонентов программного инструментария являются чистые виртуальные классы (pure virtual class).

2.3.4. Внутреннее API

Эти программные интерфейсы служат для взамодействия компонентов SDK между собой и недоступны пользователю.

2.3.4.1. Интерфейс IFactory

class IFactory {

public:

virtual U32 CreateInstance(const char* IFaceName, void**)=0;

virtual U32 Release(void**)=0;

virtual U32 Free()=0;

virtual U32 Get(U32 code, RshBaseType*)=0;

};

Интерфейс для класса-фабрики. Предоставляет пользователю методы для создания экземпляра класса (CreateInstance()), освобождения всех ресурсов, занимаемых созданным фабрикой объектом(Release()), удаления всех созданных фабрикой объектов(Free()) и получения информации(названия, версии, описания, пути к файлу и т.д.) о библиотеке из которой загружена фабрика (Get()).

2.3.4.2. Программный интерфейс IRSHDeviceBase

class IRSHDeviceBase {

public:

virtual U32 Connect(U16 VID, U16 PID, U8 DeviceNumber)=0;

virtual U32 Connect(const char* deviceName, U8 DeviceNumber)=0;

virtual U32 CloseConnection()=0;

virtual U32 Get(U32 mode, RshBaseType*)=0

};

Интерфейс для подключения к драйверу устройства. Наследуется интерфейсами библиотек IRSHUSB и IRSHPCI для низкоуровневой работы с устройствами. Содержит методы для подключения к устройству по его VID и PID, а также по его имени (Connect(U16 VID, U16 PID, U8 DeviceNumber) и Connect(const char* deviceName, U8 DeviceNumber)), освобождения занятых ресурсов (CloseConnection()) и геттер-метода для получения версии библиотеки, статусной информации об устройстве и т.д.

2.3.4.3. Программный интерфейс IRSHUSB

class IRSHUSB : public IRSHDeviceBase {

public:

  virtual U32 ReadData(void* Buffer, U64 Size)=0;

  virtual U32 WriteData(const void* Buffer, U64 Size)=0;

  virtual U32 Dio(S32 CtrlCode,

          void* InBuffer, U64 InBufferSize,

          void* OutBuffer, U64 OutBufferSize)=0;

  virtual U32 StopGathering()=0;

  virtual U32 InitSingleGathering(RshGatheringParameters*)=0;

  virtual U32 GetSingleBuffer()=0;

  virtual U32 InitPersistentGathering(RshGatheringParameters*)=0;

  virtual U32 StartPersistentGathering()=0;

};

Программный интерфейс для библиотеки низкоуровневой работы с USB-устройствами. Предоставляет методы для обмена данными с устройством (ReadData()/WriteData()), контроля ввода-вывода (Dio()), инициализации параметров сбора данных, выделения памяти и старта потока сбора данных для покадрового режима (InitSingleGathering() и GetSingleBuffer()) и непрерывного (InitPersistentGathering() и StartPersistentGathering()), остановки процесса сбора и освобождения памяти (StopGathering()).

2.3.4.4. Программный интерфейс IRSHPCI

class IRSHPCI : public IRSHDeviceBase {

public:

  virtual U32 WritePLXreg(U32 offset, U32 value)=0;

  virtual U32 ReadPLXreg(U32 offset, U32* value)=0;

  virtual U32 WriteBOARDreg(U32 offset, U32 value)=0;

  virtual U32 ReadBOARDreg(U32 offset, U32* value)=0;

  virtual U32 StopGathering()=0;

  virtual U32 InitSingleGathering(RshGatheringParameters*)=0;

  virtual U32 GetSingleBuffer(RshRegister startReg)=0;

  virtual U32 InitPersistentGathering(RshGatheringParameters*)=0;

  virtual U32 StartPersistentGathering(RshRegister startReg)=0;

};

По аналогии с IRSHUSB – IRSHPCI является программным интерфейсом для библиотеки низкоуровневой работы с PCI-платами. В реализации самой библиотеки используется в основном PLX API, а библиотека лишь служит оберткой для его унификации с API разрабатываемого инструментария. Предоставляет методы для работы с регистрами контроллера шины PCI от фирмы PLX (WritePLXreg()/ReadPLXreg()), регистрами самой платы (WriteBOARDreg()/ReadBOARDreg()), инициализации параметров сбора данных, выделения памяти и старта потока сбора данных для покадрового режима (InitSingleGathering() и GetSingleBuffer()) и непрерывного (InitPersistentGathering() и StartPersistentGathering()), остановки процесса сбора и освобождения памяти (StopGathering()).

2.3.5. Внешнее API

Это API через которое пользователь обращается к комонентам SDK из своего приложения.

2.3.5.1. Интерфейс IRSHDevice

class IRSHDevice {

public:

virtual U32 Connect(U8 index)=0;

virtual U32 Init(RshInitBaseType*, U32 mode)=0;

virtual U32 Start()=0;

virtual U32 Stop()=0;

virtual U32 GetData(RshBufferBaseType*, U32 flag)=0;

virtual U32 Get(U32 mode, RshBaseType*)=0;

};

Описывает единый интерфейс для программного взаимодействия с любым устройством ЗАО «Руднев-Шиляев». Реализован в библиотеках для каждой конкретной платы. Метод Connect() позволяет пользователю “подключиться” к опредленному устройству в системе через хэндл соотвествующего файла устройства.

Метод Init() дает пользователю возможность установить параметры (частоту дискретизации, дифференциальный режим АЦП, количество активных каналов АЦП, коэффициенты усиления и множество других) сбора данных.

Start() запускает АЦП на плате, метод Stop() останавливает его.

GetData() предоставляет пользователю возможность получить оцифрованную информацию в разных форматах (МЗР с приведением к разным типам данных, вещественные числа с разной точностью).

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

2.3.5.2. Программный интерфейс IDM

class IDM {

U32 Get(U32 code, RshBaseType*)=0;

U32 GetDevice(RshDeviceKey*, IRSHDevice* device)=0;

};

Интерфейс библиотеки DM – Device Manager. В сответсвии со своим названием является менеджером всех находящихся в системе устройств ЗАО «Руднев-Шиляев», предоставляя пользователю о них информацию (характеристики, ревизию, версию библиотек), список находящихся в системе устройств(всех или только соотвествующих какому то параметру) (Get()). GetDevice() позволяет получить интерфейсный IRSHDevice для выбранного пользователем устройства. 

2.3.5.3. Программный интефейс IDC

class IDC {

public:

virtual U32 InitGathering(RshDCGatheringParameters*)=0;

virtual U32 CollectData()=0;

virtual U32 StopDevice()=0;

virtual U32 Get(U32 mode, RhsBaseType*)=0;

};

IDC – интерфейсный класс библиотеки DC. Библиотека Device Controller предоставляет пользователю возможность более общего, менее детального подхода к сбору данных, их анализу и сохранению, избавляя его от взаимодействия с большим числом компонентов напрямую.

InitGathering() предоставляет метод для инициализации всех параметров сбора, настройки платы, алгоритмов для обработки собранных данных и их сохранения.

CollectData() - запускает отдельный поток, в котором идет процесс сбора данных.

StopDevice() - останавливает процесс сбора данных.

Get() - получить информацию о состоянии сбора данных (сколько собранно, ожидание события о завершении) и стандартное применение для этого метода – получение информации о библиотеке (версия, путь к файлу и т.д.).

2.3.5.4. Программный интерфейс IDPA

class IDPA {

public:

virtual U32 Process(RshDPABaseType*)=0;

virtual U32 Get(U32 mode, RshBaseType*)=0;

};

Интерфейс для работы с алгоритмической библиотекой DPA. Предоставляет унифицированный интерфейс для обработки данных с помощью различных алгоритмов.

Метод Process() производит обработку переданных данных. В зависимости от алгоритма в метод передаются разные структуры с параметрами для этого алгоритма, наследованные от RshDpaBaseType.

Get() позволяет получить информацию о библиотеке (версия, реализованные алгоритмы и т.д.).

2.3.5.5. Программный интерфейс IRSHSignalSaver

class IRSHSignalSaver {

virtual U32 OpenFile(const char* fileName) = 0;

virtual U32 CreateFile(const char* fileName) = 0;

virtual U32 CloseFile() = 0;

vitual U32 ReadMetadata(RshSignalMetadata*, U32) = 0;

virtual U32 WriteMetadata(RshSignalMetadata*, U32) = 0;

virtual U32 WriteData(RshBufferBaseType* data, U32) = 0;

virtual U32 ReadData(RshBufferBaseType* data, U32) = 0;

virtual U32 Get(U32, RshBaseType*) = 0;

virtual U32 Release() = 0;

}

Интерфейс библиотеки для работы с файлом собранных с плат данных и сопровождающей их метаинформации.

Методы CreateFile(), OpenFile(), CloseFile() предоставляют пользователю функции для создания файла с данными, открытия существуюшего и закрытия файла с которым библиотека работает в данный момент.

ReadMetadata() и WriteMetadata() вычитывают и записывают метаинформацию.

Методы WriteData() и ReadData() записывают в файл полученные с АЦП данные.

Get() получает информацию о самой библиотеке (версия, путь к файлу), Release() выгружает ее из памяти.

2.3.6. Выводы

На основании анализа сценариев использования, рассмотренных п. 2.2.1., и требований к функционалу модулей, описанных в п. 2.2.2., а также учитывая общие рекомендации и требования к проектированию программных интерфейсов, рассмотренные в 2.3.2., было спроектировано простое и одноверменно гибкое API для разрабатываемого инструментария, предоставляющее весь требуемый функционал.


3. Разработка

3.1. Разработка платформонезависимого ядра и программных интерфейсов инструментария разработчика

3.1.1. Введение

После проектирования программных интерфейсов были разработаны реализующие их платформонезависимые модули. Для обеспечения платформонезависимости модулей в основном были использованны сторонние решения. Наиболее известным из них является библиотека boost, позволяющая решить большинство проблем связанных с написанием платформонезависимых программных продуктов на языке С++.

3.1.2. Разработка платформонезависимых модулей инструментария

3.1.2.1. Модуль RshDllClient

Основной класс для работы с описываемым программным инструментарием. Через него пользователь загружает остальные бибилиотеки инструментария и получает интерфейсы для работы с ними. Класс описан в заголовочном файле предоставляемом конечному пользователю.

Модули программного инструментария представлены в виде динамических библиотек, содержащих единственный экспортируемый объект — класс фабрики.

При установке программного инструментария директория установки записывается в реестр (ОС Windows) или в системную переменную среды (Linux).

Загрузка модуля, требуемого пользователю, и инстанциирование его класса реализовано с помощью паттерна «Абстрактная Фабрика»: RshDllClient определяет директорию установки компонентов инструментария и загружает из требуемой пользователю библиотеки класс-фабрику, которая реализует общий для всех фабрик интерфейс IFactory. Через вызов метода класса-фабрики RshDllClient передает пользователю экземпляр нужного ему класса, как указатель на его интерфейс. Схема реализации шаблона проектирования «Абстрактная Фабрика» в рассматриваемой работе показана на рисунке 5.

Рисунок 5. - Реализация шаблона проектирования «Абстрактная Фабрика»

3.1.2.2. Модули DC и DM

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

DM управляет всеми подключенными к компьютеру платами ЗАО «Руднев-Шиляев». Поддерживает горячее подключение (hot-plug) USB-плат с помощью функций libusb (http://www.libusb.org/) — кроссплатформенной сторонней библиотеки [8]. Для получения информации о PCI-платах используется функционал PlxSDK.

DC реализует интерфейс IDC, предоставляет пользователю возможность сбора данных с платы, их анализа и записи в файл.

Тем не менее программный инструментарий не навязывает пользователю использование лишь класса DC как основного. С помощью модуля DllClient пользователь может самостоятельно взаимодействовать с другими модулями программного инструментария.

DC в данной работе является примером реализации шаблона проектирования «Фасад», упрощающим сбор, обработку и запись данных в файл, скрывая от пользователя детали работы с классом DPA, классами устройств через их интерфейс IRSHDevice и классом RSHSignalSaver. Детали реализации показаны на рисунке 6.

Рисунок 6. - Реализация шаблона проектирования «Фасад»

3.1.2.2. Модуль DPA

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

Алгоритмы и реализующие их классы:

  •  DPAApplyWindow – алгоритм наложения оконной функции;
  •  DPACalculateError – рассчет основной погрешности и коэффициента согласия ряда измеренных значений;
  •  DPAFFT – реализует алгоритм быстрого преобразования Фурье (прямого и обратного). Использована кроссплатформенная бибилотека на Си - FFTW (http://www.fftw.org);
  •  DPAFindInterestPoint – функция нахождения определенных точек в сигнале. Реализован поиск разрывов в непрерывноим сигнале и поиск фронта импульса;

Каждый из этих классов наследует общий интерфейсный класс IDPA.

3.1.2.3. Модуль RSHSignalSaver

Модуль RSHSignalSaver предоставляет возможности сохранять в один файл и читать из него данные, собранные с плат в непрерывном и покадровом режиме; добавлять и изменять пользовательские данные, такие как timestamp, модель платы, с которой собраны данные и любая текстовая информация, требуемая пользователю.

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

Этим требованиям удовлетворяет HDF (Hierarchical Data Format, иерархический формат данных) – формат данных для хранения численной информации, успешно применяемый в NASA. Сайт проекта: http://www.hdfgroup.org.

Внутренняя структура такого файла похожа на структуру файловой системы в Unix-подобных ОС: наборы данных (datasets) хранят однородную информацию (аналог файла), группы (groups) являются контейнерами для других групп и наборов данных (аналог директорий), при этом сам файл с его содержимым является своего рода корневой директорией. Для доступа к требуемому массиву данных применяются пути с POSIX-синтаксисом. Такая древовидная структура неограниченной разветвленности и вложенности позволяет хранить в одном файле много разной информации. Такая структура файла решает проблему с хранением данных, полученных с высокочастотных плат, работающих в покадровом режиме, сохраняя каждый собранный с платы буфер в одной группе.

Библиотека для работы с данным форматом имеет официальное API для C/C++ и является кроссплатформенной. HDF является основным форматом для файлов в математических пакетах Scilab и MATLAB. Сжатие данных происходит по алгоритму szip. Это решение идеально отвечает всем требованиям для модуля сохранения данных. Функционал данного модуля основан на библиотеке HDF5.

3.1.2.4. Библиотеки драйверов высокого уровня для устройств и интерфейс IRSHDevice

IRSHDevice - интерфейсный класс для всех плат сбора данных. Все классы для работы с платами ЗАО «Руднев-Шиляев» наследуются от IRSHDevice, реализуя данный интерфейс. Он описывает функции, которые должны быть реализованы в классах устройств (высокоуровневых драйверах), не специфицируя реализацию этих функций. Были разработаны библиотеки высокоуровневых драйверов для каждой из плат ЗАО «Руднев-Шиляев» с интерфейсами PCI и USB, учитывающие аппаратные особенности каждой платы. Всего было разработанно 16 модулей.

3.1.2.5. Модуль RSHUSB

Библиотека для работы с драйверо м (о разработке которого написано в пункте 3.2.). Осуществляет всю низкоуровневую работу, не зависящую от конкретного устройства: подключение к драйверу через файл устройства, отправка команд, выделение памяти для буфера и чтение данных, управление потоками сбора данных, получение списка подключенных к системе поддерживаемых USB-устройств.

Платформнонезависимость работы с потоками и событиями обеспечивается библиотекой Boost.Thread и Boost.Signals. Работа с файлами устройства осуществляется через кроссплатформеннаую обертку над функциями ОС для работы с файлами: open()/close(), read()/write() для Linux и CreateFile()/CloseFile(), WriteFile()/ReadFile() для Windows.

3.1.2.6. RSHPCI

Библиотека для работы с PCI-платами. Фирма PLX, контроллеры которой используются на всех изделиях ЗАО «Руднев-Шиляев» с PCI-интерфейсом, предоставляет для своей продукции кроссплатформенный программный инструментарий и драйверы как для ОС Linux, так и для Windows. Эта библиотека предоставляет функционал подобный библиотеке RSHUSB, используя в основном программные интерфейсы (API) инструментария PLX. Через эти программные интерфейсы осуществляется работа с регистрами платы, управление DMA. Для организации единой с библиотекой RSHUSB логики сбора данных также используются библиотеки Boost.Thread и Boost.Signals.

3.1.3. Выводы

Были разработаны модули, реализующие весь фукционал, требуемый от программного инструментария. Для реализации платформо-зависимого функционала были использованы готовые кроссплатформенные сторонние решения, в основном библиотека Boost.

3.2. Разработка USB-драйвера под ОС Linux

Universal Serial Bus (USB, универсальная последовательная шина) служит для соединения компьютера и периферийных устройств. Важной особенностью USB является то, что в какую бы сторону ни передавалась информация, запрос на передачу всегда приходит от контроллера USB хоста, и только тогда периферийное устройство, отвечая на этот запрос, начинает передавать или принимать информацию.

USB-устройство — очень сложная вещь, но для упрощения работы с ним в ядре Linux есть подсистема USB core. Далее будут рассмотрены базовые понятия, связанные с устройством USB: конфигурация, интерфейс, конечная точка, а также функции USB core, с помощью которых драйвер обращается к устройству.

Рисунок 7. - Схема взаимодействия пользовательского приложения с USB-устройством

3.2.1. Основные понятия USB

Все устройства USB имеют иерархию дескрипторов, которые содержат различную информацию об устройстве для хоста. Подробнее рассмотрим эту иерархию дескрипторов и информацию, которую они содержат.

3.2.1.1. Дескриптор устройства

Устройство USB может иметь только один дескриптор устройства. В нем содержатся его VID и PID (для определения драйвера соответствующего этому устройству), поддерживаемая ревизия USB и количество конфигураций устройства. В ядре Linux он представлен структурой usb_device. Некоторым функциям USB core требуется доступ к полям этой структуры. Обычно для этого используется функция interface_to_usbdev() чтобы конвертировать переданную функции структуру интерфейса в структуру struct usb_device.

3.2.1.2. Дескриптор конфигурации

Показывает величину потребляемой устройством мощности, питается ли устройство от шины, либо от собственного источника питания и количество интерфейсов, которые есть у этой конфигурации. Например, у устройства может быть две конфигурации — одна с высоким потреблением мощности от шины, другая с собственным источником питания. Если устройство подключено к стационарному компьютеру, драйвер может выбрать конфигурацию с питанием от шины, а в случае подключения к ноутбуку — конфигурацию с собственным источником питания. Также конфигурация позволяет иметь несколько интерфейсов устройства с разными наборами конечных точек. Хотя спецификация USB предоставляет такую возможность, очень немногие устройства имеют более одной конфигурации.

3.2.1.3. Дескриптор интерфейса

Каждый интерфейс устройства определяет некоторую его функцию. Например, многофункциональное устройство факс/сканер/принтер имеет три интерфейса для каждого из режимов работы. В отличии от конфигурации, устройство не имеет ограничений на количество одновременно предоставляемых интерфейсов, но каждый интерфейс требует отдельного драйвера. В ядре Linux интерфейсы представлены структурой struct usb_interface. Эта структура передается драйверу от USB core и через нее драйвер взаимодействует с устройством.

3.2.1.4. Конечные точки

Обмен данных с устройством USB происходит с помощью так называемых endpoints («конечных точек»). Endpoint передает данные только в одном направлении — либо от компьютера к устройству (OUT endpoint), либо от устройства к компьютеру (IN endpoint). Можно сравнить endpoints с однонаправленными пайпами.

Endpoint может быть одного из следующих типов:

  •  CONTROL — Управляющая конечная точка. Используется для конфигурации устройства, получения информации о нем и получения статусной информации от устройства. У каждого устройства есть управляющая конечная точка «endpoint 0», которая используется USB core для получения информации об устройстве, его конфигурациях, интерфейсах и конечных точках.
  •  INTERRUPT — Конечная точка прерываний. Передает небольшие объемы данных с фиксированной частотой. Отличие от аппаратных прерываний в том, что требуется постоянный опрос от хоста.
  •  BULK — Эти конечные точки передают большие объемы данных. Передача через такую конечную точку гарантирует что данные будут переданы без потерь, но не гарантирует завершения передачи в определенный интервал времени.
  •  ISOCHRONOUS — Изохронные конечные точки. Служат для передачи больших объемов данных. Гарантируют время доставки данных, но не их целостность.

Конечные точки USB описаны в ядре Linux структурой struct usb_endpoint_descriptor, содержащей следующее поля:

  •  bEndpointAddress — однобайтовый адрес конечной точки. 7-й двоичный разряд определяет направление конечной точки.
  •  bmAttributes — тип конечной точки (bulk, isochronous, interrupt, control).
  •  wMaxPacketSize — максимальный размер в байтах, которые эта конечная точка может передать за один раз. Драйвер может передать или получить объем данных больше этого значения, но при фактической передаче данные будут разделены на куски размером по wMaxPacketSize.
  •  bInterval — Для конечной точки типа Interrupt, интервал в миллисекундах между запросами прерываний.

Суммируя все сказанное в разделе 4.2.1. структуру USB-устройства можно представить как иерархию дескрипторов, что наглядно представлено на Рисунке 5.

Рисунок 8. - Структура USB-устройства

3.2.1.5. Блоки запроса USB

USB-драйвер обменивается данными с USB-устройством с помощью механизма называемого urb (USB request block, блок запроса USB). Urb осуществляет асинхронный обмен данных с устройством через одну из его конечных точек. Можно провести аналогию между urb и пакетом в сетевой передаче данных. Каждая конечная точка имеет очередь из urb, что позволяеет отправить устройству одновременно множество запросов.

Urb описывается структурой struct urb:

  •  struct usb_device *dev – устройство которому послан urb.
  •  unsigned int pipe – пайп для передачи данных. Этот параметр хранит в себе: тип передачи данных (bulk, control и т.д.), направление и номер конечной точки. Для инициализации этого поля существует набор макросов для каждого типа конечной точки:

unsigned int usb_[snd/rcv][ctrl/bulk/int/isoc]pipe(

                                   struct usb_device *dev,

                                   unsigned int endpoint).

  •  void *transfer_buffer – указатель на буфер который будет использоваться для обмена данными с устройством.
  •  int transfer_buffer_length – размер буфера на который указывает переменная transfer_buffer.
  •  usb_compete_t complete – указатель на функцию, вызываемую USB core после завершения передачи urb или при возникновении ошибки.
  •  void *context – указатель на blob (Binary Large Object), который может быть использован в обработчике завершения передачи.

После определения основных понятий перейдем непосредственно к описанию разработки USB-драйвера.

3.2.2 Разработка драйвера USB

3.2.2.1 Инициализация устройства

Прежде всего нужно указать, работу с какими устройствами будет поддерживать разрабатываемый драйвер.

static const struct usb_device_id lausb_table[] = {

{ USB_DEVICE(RSH_VID, LA2USB_PID) },

{ USB_DEVICE(RSH_VID, LAN10_12USB_PID},

//...

{}

};

MODULE_DEVICE_TABLE(usb, lausb_table);

Значения VIP и PID устройств объявлены в заголовочном файле драйвера. Макрос USB_DEVICE(VID, PID) создает структуры с соответствующими VID и PID для поддержки драйвером только устройств ЗАО «Руднев-Шиляев». Макрос MODULE_DEVICE_TABLE() позволяет сообщить USB core о том, какие устройства поддерживает данный драйвер.

static struct usb_driver lausb_driver = {

.name  = «lausb»,

.probe  = lausb_probe,

.disconnect = lausb_disconnect,

.id_table  = lausb_table,

};

Эта структура описывает драйвер UBS-устройсва: его название, с какими устройствами он работает и callback'и вызываемые USB core при подключении (поле .probe) и отключении (поле .disconnect) устройств, поддерживаемых драйвером.

Также требуются callback'и вызываемые при загрузке и выгрузке модуля USB-драйвера:

static int __init lausb_init(void) {

int result = usb_register(&lausb_driver);

//...

}

static int __exit lausb_exit(void) {

usb_deregister(&lausb_driver);

}

module_init(lausb_init);

module_exit(lausb_exit);

Функции usb_register и usb_deregister используются для регистрации и удаления драйвера из USB core. Макросы module_init() и module_exit() объявляют эти функции как точки входа при загрузке и выгрузке данного модуля.

static struct usb_class_driver lausb_class = {

.name  = «lausb%d»,

.fops  = &lausb_fops,

.minor_base = LAUSB_MINOR_BASE,

};

Поле .name служит в качестве имени файла устройсва, %d – значит что к имени файла будет добавлен порядковый номер устройства. В поле .fops передается указатель на структуру, содержащую адреса функций, вызываемых при выполнении операции с файлом устройства.

static const struct file_operations lausb_fops = {

.read   = lausb_read,

.write   = lausb_write,

.unlocked_ioctl = lausb_ioctl,

.open   = lausb_open,

.release   =  lausb_release,

};

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

struct lausb {

struct usb_device  *udev;

struct usb_interface *interface;

struct urb   *in_urb;

struct urb    *out_urb;

unsigned char   *bulk_in_buffer;

unsigned int    buffer_size;

//...

};

Описание функции probe:

static int lausb_probe(struct usb_interface *interface,

      const struct usb_device_id *id)

{

struct lausb *dev  = kzallock(sizeof(*dev), GFP_KERNEL);

dev->udev   = interface_to_usbdev(interface);

dev->interface  = interface;

dev->in_urb  = usb_alloc_urb(0, GFP_KERNEL);

dev->out_urb  = usb_alloc_urb(0, GFP_KERNEL);

dev->bulk_in_buffer =  NULL;

dev->buffer_size  = 0;

//...

usb_set_intfdata(interface, dev);

retval = usb_register_dev(interface, &lausb_class);

//...

}

В этой функции выделяется память под структуру lausb, соответствующие поля этой структуры заполняются указателями на структуры struct usb_device и struct usb_interface. Инициализируются две структуры struct urb — для записи и чтения данных. Функция usb_set_intfdata() позволяет сохранить данные для конкретного устройства в поле структуры struct usb_interface, которая в дальнейшем будет передаваться в остальные функции драйвера. Функция usb_register_dev() регистрирует символьное устройство, не связанное ни с одной из подсистем обработки пользовательского взаимодействия (таких как: input, tty, video и т. д.). После вызова этой функции будет зарегистрировано символьное устройство с major-номером USB и выделен наименьший свободный minor-номер начиная с указанного в поле .minor_base. В sysfs будут созданы все необходимые файлы, затем демон udev создает файл устройства в директории /dev/.

static void lausb_disconnect(struct usb_interface *iface)

{

struct lausb *dev = usb_get_intfdata(iface);

usb_set_intfdata(iface, NULL);

usb_deregister_dev(iface, &lausb_class);

//...

usb_free_urb(dev->in_urb);

usb_free_urb(dev->out_urb);

usb_put_dev(dev->udev);

kfree(dev);

//...

}

Функция lausb_disconnect() выполняет действия, обратные действиям функции lausb_probe(): получает из struct usb_interface структуру struct lausb с информацией об отключенном устройстве и освобождает выделенную под нее память, удаляет структуры urb и struct usb_device. usb_deregister_dev() возвращает занятый minor-номер, удаляя файл устройства.

3.2.2.2 Обмен данными с устройством

По завершении регистрации устройства в подсистеме USB core, обращение к нему происходит через файл устройства. После системного вызова, такого как, например, read(), write(), open(), close() или ioctl() из пользовательского приложения драйвер вызывает соответсвующую процедуру, указатель на которую харанится в struct file_operations.

static int lausb_open(struct inode *inode, struct file *file) {

int subminor = iminor(inode);

struct usb_interface *iface;

iface = usb_find_interface(&lausb_driver, subminor);

//...

struct lausb *dev = usb_get_intfdata(iface);

//...

file->private_data = dev;

//...

}

При открытии файла будет вызвана вышеописанная функция в которую в качестве параметров передаются структуры inode и file. C помощью struct file в Linux описывается любой открытый файл (в т.ч. и файл устройства), а в struct inode содержится информация об этом открытом файле. С помощью функции iminor() будет получен minor-номер файла устройства который был открыт из user-space'а. С помощью usb_find_interface() происходит доступ к соответствующему интерфейсу устройства, из которого извлекается дескриптор struct lausb. Далее дескриптор устройства связывается со структурой открытого файла записывая указатель на struct lausb в поле .private_data структуры file, чтобы иметь к ней доступ из функций в lausb_fops.

static int lausb_release (struct inode *inode, struct file *file) {

//...

struct lausb *dev = file->private_data;

//...

usb_autopm_put_interface(dev->interface);

//...

kref_put(&dev->kref);

//...

}

При закрытии файла устройства, функция lausb_release() уменьшает количество ссылок на struct usb_interface и struct lausb.

static ssize_t lausb_write(struct file *file, const char *user_buffer, size_t count, loff_t *offp) {

//...

struct lausb *dev = file->private_data;

//...

char buf;

buf = usb_alloc_coherent(dev->udev, count,                GFP_KERNEL,

     &dev->out_urb->transfer_dma);

//...

copy_from_user(buf, user_buffer, count);

//...

usb_fill_bulk_urb(dev->out_urb, dev->udev,

      usb_sndbulkpipe(dev->udev, LAUSB_CMD_EP),

      buf, count, lausb_write_bulk_callback, dev);

urb->transfer_flag |= URB_NO_TRANSFER_DMA_MAP;

//...

usb_submit_urb(dev->out_urb);

}

Функция lausb_write() позволяет отправлять данные (в данном конкретном случае — пакеты команд) устройству. Она принимает в качестве аргументов дескриптор файла устройства file, буфер с пользовательскими данными user_buffer, которые нужно отправить в устройство, размер этого буфера count и offset для записи offp (в данной реализации драйвера не используется).

Из поля .private_data структуры file извлекается указатель на структуру lausb. Функция usb_alloc_coherent() выделяет буфер buf под размер переданных в драйвер данных. Функция copy_from_user() копирует данные из буфера в user-space'е в буффер buf в kernel-space'е. usb_fill_bulk_urb() заполняет структуру struct urb и отправляет urb-запрос подсистеме USB core (подробнее см. 4.2.1.5.).

Callback-функция lausb_write_bulk_callback() будет вызвана асинхронно при успешном или ошибочном завершении запроса. В ней проводится проверка статуса, с которым завершился запрос, и освобождение выделенной памяти занятой буфером, который был отправлен устройству.

static ssize_t lausb_read(struct file *file, chat *buffer, size_t count, loff_t *ppos) {

//...

struct lausb *dev = file->private_data;

lausb_do_read(dev, count);

copy_to_user(buffer, dev->bulk_in_buffer, count)

//...

}

static int lausb_do_read(struct lausb *dev, size_t count) {

//...

usb_fill_bulk_urb(dev->in_urb, dev->udev,

      usb_rcvbulkpipe(dev->udev, LAUSB_DATA_EP),

      dev->bulk_in_buffer, count,

      lausb_read_bulk_callback, dev);

//...

usb_submit_urb(dev->in_urb, GFP_KERNEL);

//...

}

В функции чтения происходит обычная последовательность действий: из struct file извлекается указатель на struct lausb. В функции lausb_do_read() происходит сам процесс чтения. Поскольку выделения памяти стоит избегать в time-critical задачах (чтение в большинстве случае означает что АЦП на плате уже запущен и начал преобразования) то функция lausb_do_read() делает проверку на размер выделенной памяти в dev->bulk_in_buffer, высвобождает и заново выделяет память только если размер буфера изменился. Затем выполняется заполнение структуры struct urb и отправка запроса на получение данных к USB core. lausb_read_bulk_callback() асинхронно вызывается при успешном или неудачном завершении запроса. Полученные от USB-устройства данные копируются в пользовательский буфер buffer из dev->bulk_in_buffer с помощью функции copy_to_user(buffer, dev->bulk_in_buffer, count).

3.2.3. Наименование файлов устройств

Разработанный драйвер поддерживает все USB-устройства ЗАО «Руднев-Шиляев». У этой универсальности есть два недостатка. Первый из них - файлы устройств будут иметь одинаковые названия (за исключением номера), независимо от того какие устройства подключены к системе. Это сильно затрудняет пользовательскому приложению подключение к определенному устройству. Второй недостаток — файлы устройств, созданные драйвером, будут доступны только суперпользователю (root), и при запуске приложений работающих с устройствами, потребуется ввод его пароля. Для устранения этих проблем было решено воспользоваться возможностями предоставляемыми udev — менеджером устройств Linux. Udev отслеживает события связанные с добавлением и отключением устройств из системы. У udev есть механизм правил (udev rules) позволяющий связать подключение определенного устройства с конкретным действием. Так при подключении устройства udev может запустить приложение, передать ему аргумент, а вывод приложения использовать для создания символьной ссылки (symlink) на файл устройства. Пример:

KERNEL==«lausb*», ATTRS{idVendor}==«534b» ATTRS{idProduct}==«c373», PROGRAM=«/usr/local/bin/device_namer c373», SYMLINK=«RSH/%c», GROUP= «users», MODE=«0666»

В этом правиле при подключении устройства его PID передается программе device_name в качестве аргумента. Программа device_namer — утилита, написанная на Си, которая по PID'у определяет название подключенного устройства, считает количество уже существующих в директории /dev/RSH ссылок с таким же названием. Вывод программы состоит из строки с названием устройства и его порядкового номера в системе. Эта строка будет использована для символьной ссылки на файл устройства в /dev. При этом символьная ссылка будет иметь права доступа для обычного пользователя.

3.2.4. Заключение

Разработанный драйвер предоставляется конечному пользователю в ввиде исходных кодов самого драйвера, программы для именования файлов устройств, файла правил udev и установочного скрипта. Для работы драйвера требуется ОС Linux с ядром версии 2.6.35 и выше с установленным udev.


4. Экспериментальная часть

4.1. Разработка методики испытания

Для тестирования модулей программного инструментария были разработаны функциональные тесты. Была протестирована работоспособность программного инструментария со всей аппаратной продукцией ЗАО «Руднев-Шиляев».

Испытание работоспособности драйвера проводилось со всеми платами сбора данных производства ЗАО «Руднев-Шиляев» с интерфейсом USB. Поданный на входы платы сигнал записывался в файл и анализировался на предмет разрывов с помощью модулей разработанного программного инструментария.

4.2. Разработка тестового стенда

Для тестирования работоспособности разработанного программного инструментария был использован персональный компьютер с установленными ОС Windows и Linux.

Для тестирования работоспособности драйвера использовались генераторы сигналов — Г3-118 и Г4-158.

4.3. Проведение натурного эксперимента

К персональному компьютеру с ОС Linux была подключена плата, на аналоговые входы которой с помощью генератора сигналов подавался синусоидальный сигнал заданной частоты. На персональном компьютере была запущенна программа, использующая модули разработанного программного инструментария, ведущая сбор данных с платы и анализ сигнала на предмет наличия в нем разрывов. В ходе испытаний была подтверждена работоспособность драйвера и компонентов программного инструментария.


5. Охрана труда

5.1. Выявление опасных и вредных факторов при эксплуатации ЭВМ и их влияния на пользователей

Компьютеры начали активно внедряться в жизнь людей с конца 80-х годов. Сейчас их в мире уже работает сотни миллионов. Почти сразу же стало ясно что ВДТ и ПВЭМ следует отнести к источникам вредного воздействия на человека. В некоторых странах Европы работа за дисплеем входит в список 40 наиболее вредных и опасных профессий.

Поскольку комплекс монитор-системный блок-сканер-принтер и другие устройства с которыми приходится работать оператору или программисту питается от сети переменного тока с напряжением 220 В / 380 В то он рискует подвергнуться поражающему воздействию электрического тока.

В 90-е годы Всемирная Организация Здравоохранения (ВОЗ) выявили специфические заболевания, связанные с работой на компьютере — это синдром стресса оператора дисплея (VODS) и синдром запястного канала (CTS). По данным ВОЗ этими заболеваниями в той или иной степени страдает около половины всех операторов. В этих условиях очень важно знать все возможные риски, которым подвергается человек, работающий с ВДТ и ПВМ и меры безопасности, которые необходимо соблюдать при работе с ними.

Поэтому сразу с началом «компьютерного бума» в нашей стране были разработаны и утверждены требования к организации рабочих мест с использованием ВДТ и ПВЭМ. Эти требования изложены в следующих документах:

  1.  Санитарные правила и нормы (СанПиН 2.2.2/2.4. 1340-03) «Гигиенические требования к видеодисплейным терминалам и персональным электронно-вычислительным машинам. Организация работы.»
  2.  ГОСТ Р50948-96 «Средства отображения информации индивидуального использования. Общие эргономические требования и требования безопасности»

5.1.1. Опасные и вредные факторы при работе с ВДТ и ПЭВМ

5.1.1.1. Повышенные статические и динамические нагрузки

Большую часть времени оператор сидит за столом почти неподвижно. Это приводит к тому, что у него часто возникает чувство онемения и боли в спине, плечах и шее (особенно если рабочее место устроено неудобно). Из всех недомоганий, которые встречаются у операторов ЭВМ чаще распространены те, которые связаны с работой на клавиатуре и с мышью. За сутки работник делает до 60000 мелких движений кистями и пальцами рук. Каждое нажатие на клавишу связано с напряжением мышц и сухожилий. Это может приводить к болезненным воспалительным процессам (тенденитам). Недомогания, связанные с долгой малоподвижной работой получили название «синдром длительных статических нагрузок (СДСН)». Однообразные движения рук при работе с мышью и клавиатурой приводят к развитию синдрома запястного канала (по международной классификации CTS). Непрерывное сидение за компьютером ведет к гиподинамии, ослаблению мышц всего тела. Мышцы теряют свою упругость — это ведет к нарушениям осанки (сколиозу, сутулости), а в сочетании с постоянными «перекусами» - к ожирению.

5.1.1.2. Повышенные нервно-психические нагрузки

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

Кроме того при повышенных нервных нагрузках происходит «выброс» из организма витаминов и минеральных веществ (особенно селена, железа, магния). Их недостаток ведет к ослаблению организма и обостряет восприимчивость ко всем вредным воздействиям.

5.1.1.3. Воздействие ВДТ на органы зрения

Общеизвестно, что 90% всей информации мы получаем через органы зрения, следовательно, глаза надо беречь «как зеницу ока». Работа оператора (пользователя) ВДТ и ПЭВМ требует огромного перенапряжения зрения.

Нагрузка на зрение оператора ЭВМ имеет свои особенности:

  1.  Многократный перевод глаз с бумаги, лежащей на столе (горизонтальная плоскость) на экран монитора (вертикальная плоскость)
  2.  Недостаточная четкость изображения на экране
  3.  Постоянные мелькания, блики и отражения светового потока
  4.  При считывании с экрана глаза смотрят непосредственно на источник света

Зрительное утомление проявляется в жалобах на затуманенное зрение, на трудности при переводе взгляда с ближних на дальние предметы, двоение предметов, чувство жжения или «песка» в глазах, покраснение глаз вследствие перенапряжения сосудов. Работа на компьютере ведет к снижению зрения, чаще всего к близорукости.

5.1.1.4. Воздействие электрического тока

Питание всего комплекса устройств с которыми работает оператор (системный блок, монитор, принтер, сканер и т.д.) производится от сети переменного тока напряжением 380 В / 220 В и частотой 50 Гц, а безопасным для человека является напряжение не выше 40 В и частота не более 20 Гц. Следовательно, самым опасным фактором при работе оператора является поражение электрическим током.

Поражение электрическим током приводит к различным травмам. Это могут быть:

  1.  Общие травмы (судорожные сокращения мышц, потеря сознания, нарушение дыхания и кровообращения и даже клиническая смерть)
  2.  Местные травмы (электрические ожоги, электрические знакия, электроофтальмия)
  3.  Более глубокие разрушения (термический нагрев тканей и крови, электролитическое разложение крови и плазмы)

Тяжесть поражения электрическим током зависит от:

  1.  величины тока
  2.  времени протекания, рода и частоты тока
  3.  индивидуальных особенностей человека
  4.  состояния окружающей среды (температура, влажность)

5.1.1.5. Влияние статического электричества

Во время работы ЭВМ могут возникать разрядные токи статического электричества. Вследствие этого происходит электризация пыли и других мелких частиц и их притягивание к экрану дисплея. Собравшаяся на экране пыль ухудшает видимость изображения. А если в помещении повышается подвижность воздуха, то наэлектризованная пыль попадает в глаза и дыхательные пути человека. При повышении напряженности поля E > 15 кВ/м статическое электричество может привести к сбою в работе ПЭВМ вплоть до исчезновения информации с ячеек памяти. Особенно электростатически эффект велик в помещениях с синтетическим покрытием полов и пониженной влажность воздуха.

5.1.1.6. Влияние электромагнитного излучения низких частот

При работе с ЭВМ за счет кадровой и строчной разверток образуется электромагнитное излучение низких частот. Электромагнитные поля с частотой 60 Гц и выше могут приводить к изменениям в клеточном строении живых существ вплоть до изменения синтеза ДНК. Электромагнитные поля с частотой 60 Гц вовлекают в аналогичные колебания молекулы любого типа. Результатом действия низкочастотных колебаний становится снижение активности ферментов и иммунитета. Это, в свою очередь, может приводить к таким опасным заболеваниям как катаракта, меланомный рак и др.

5.2. Методы и средства защиты пользователей от воздействия на них опасных и вредных факторов при эксплуатации ЭВМ

В этой главе рассматриваются способы организации рабочего места оператора ВДТ и ПЭВМ так, чтобы все вредные факторы, рассмотренные в предыдущей главе, были сведены к минимуму.

5.2.1. Основные требования к видеодисплейным терминалам

Эти требования сформулированы в разделе 4 ГОСТ 50948-96 «Средства отображения информации индивидуального пользования. Общие эргономические требования и требования безопасности» и в п. 6.2 — 6.4 ГОСТ Р 50923-96 «Дисплеи. Рабочее место оператора. Общие эргономические требования к производственной среде». В этих документах установлены значения оптимальных и предельно допустимых диапазонов: яркость знака (яркости фона), внешняя освещенность экрана, угол наблюдения экрана. При отсутствии в технической документации на ВДТ данных об оптимальных и допустимых значениях эргономических параметров — их эксплуатация запрещена [4]. Наиболее важные параметры приведены в таблице:

Таблица 3

Пределы изменений визуальных эргономических параметров и оптимальные допустимые диапазоны их значений

Наименование параметров

Пределы значений параметров

Диапазон значений параметров

Минимум (не менее)

Максимум (не более)

Яркость знака (яркость фона), кд/м²

35

120

10-150

Внешняя освещенность экрана, лк

100

250

100-500

Угловой размер экрана, угл. мин.

16

60

16-60

Угол наблюдения, град.

-

Не более +40º от нормали в любой точке экрана дисплея

5.2.1.1. Цветовые параметры ВДТ

Количество цветов, воспроизводимых монохромным дисплеем, должно быть не менее двух (включая цвет невозбужденного экрана), а цветным — не менее 16. Для монохромных дисплеев предпочтительнее желтый, зеленый, белый или серый фон свечения экрана. Для многоцветных дисплеев не рекомендуется воспроизводить на темном фоне изображения в синем участке спектра [3].

5.2.1.2. Основные требования к конструкции ВДТ

Основная задача конструкции ВДТ — обеспечить комфортное считывание информации. Экран должен поворачиваться в горизонтальной плоскости вокруг вертикальной оси в пределах ± 30º. Корпус должен быть окрашен в спокойные тона и быть матовым. Клавиатура должна свободно перемещаться по столу, иметь опорные приспособления. Угол наклона должен быть от 5º до 15º [2].

5.2.2. Организация рабочего места пользователя ВДТ и ПЭВМ

Рабочие места операторов, если они сидят друг за другом, должны располагаться так, чтобы от тыла одного дисплея до экрана другого было расстояние не меньше 2 метров, а расстояние между боковыми поверхностями дисплеев — не меньше 1,2 метра. ВДТ и ПЭВМ должны располагаться ниже глаз оператор, но угол наблюдения экрана относительно горизонтальной оси взгляда не должен превышать 60º. Расстояние экрана от глаз оператора должно быть в пределах 600-700 мм. Клавиатура должна располагаться на расстоянии 100-300 мм от переднего края стола [2].

Рабочий стол может быть регулируемым и нерегулируемым по высоте. У регулируемого стола высота должна изменяться от 680 до 800 мм. Нерегулируемый стол должен быть высотой 720 мм. Рабочая поверхность стола должна иметь следующие размеры: глубина не менее 600 мм (лучше 800 мм), ширина не менее 1200 мм [2].

Рабочий стул должен быть подъемно-поворотным и регулироваться по высоте от 400 до 500 мм. У стула обязательно должна быть спинка шириной 380 мм и высотой 320 мм [2].

Параметры положения тела оператора на рабочем месте указаны на рисунке 9.

Рисунок 9. - Допустимые параметры положения тела оператора ПЭВМ

5.2.3. Режим работы операторов ВДТ и ПЭВМ

Определяя режим работы и отдыха оператора надо учитывать все опасные и вредные факторы.

Деятельность человека в течении рабочего дня проходит через несколько фаз:

  •  предрабочее состояние (настраивание)
  •  врабатываемость (от состояния покоя до высокопроизводительной деятельности)
  •  устойчивая работоспособность (период максимальной эффективности), продолжительность этой фазы составляет 2/3 от всего рабочего времени

На графике (рисунок 10а) показана зависимость работоспособности от длительности рабочего дня.

Еще один важный показатель зависимости работоспособности от времени суток (график 10б). Работоспособность изменяется по нескольким интервалам:

  •  Первый интервал: от 6 до 15 часов, с пиком работоспособности в 10-12 часов
  •  Второй интервал: с 15 до 22 часов, с пиком в 18 часов
  •  Третий интервал: с 22 до 6 часов, с пиком в 3 часа (этот ночной пик меньше средних показателей двух других интервалов)

Эти показатели надо учитывать при организации перерывов в работе. При 8-ми часовом рабочем дне надо делать дополнительные перерывы по 15 минут за 2 часа до обеденного перерыва и через 2 часа после него. При ночной работе суммарная длительность перерывов должна увеличиваться на 60 минут. Причем в эти перерывы нужно отдыхать активно — выполнять физические упражнения и гимнастику для глаз [7].

Работоспособность зависит и от дней недели (рисунок 10в). На первый день приходится врабатываемость; второй - четвертый дни — период высокой работоспособности; на пятый день развивается утомление.

Рисунок 10. - Графики зависимости работоспособности: а — в течение 8-ми часового рабочего дня; б — в течение суток; в — в течение недели

5.2.4. Помещение для работы с ВДТ и ПЭВМ

К таким помещениям Санитарные нормы и правила предъявляют целый ряд жестких требований. Площадь одного рабочего места должна быть не менее 6 м², а объем — не меньше 20 м³. Помещения не должны соседствовать с помещениями, где уровень шума и вибраций превышает допустимые значения. Температура воздуха в этих помещениях должна быть в холодный период года 21-23 градуса, а в теплый — не более 22-24 градусов. Относительная влажность воздуха должна быть 40-60%. Увлажнители воздуха, используемые для повышения влажности должны ежедневно заправляться кипяченой водой. Проветривания должны проводиться перед началом рабочего дня и во время обеденного перерыва. Каждый день должна проводиться влажная уборка полов [7].

5.2.5. Защитные меры электробезопасности

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

  •  Заземление
  •  Зануление
  •  Двойная изоляция
  •  Разделяющие трансформаторы
  •  Блокировки и быстроотключающие устройства

Чаще всего используются заземление и зануление. В ряде случаев применение только этих мер является достаточным для безопасной работы [5].

5.2.5.1. Защитное заземление и зануление

Защитное заземление служит для создания между корпусом защищаемого устройства и землей надежного электрического соединения с малым сопротивлением. Сопротивление заземления должно быть во много раз меньше сопротивления тела человека. Только в этом случае при прикосновении к корпусу поврежденного устройства по телу пройдет неопасный ток.

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

В сетях напряжением до 1000 В переменного тока получили наибольшее распространение схемы с заземленной и изолированной нейтралью. В сетях с заземленной нейтралью обязательно применять зануление, при котором повторно заземляется и зануляющий провод (рисунок 11а). Наибольшее распространение получили четырехпроводные сети с заземленной нейтралью и заземленным нулевым проводом на напряжение 380 В / 220 В. При такой схеме металлические корпуса через нулевой провод соединяются электрически заземленной нейтралью трансформатора и землей. При замыкании одной из фаз на зануленный корпус происходит короткое замыкание и поврежденный участок отключается предохранителем или автоматом. В сетях с заземленной нейтралью нельзя заземлять корпуса без соединения с нейтралью. Соединение корпуса с нейтралью и одновременно с землей повышает безопасность.

Сети с изолированной нейтралью трехфазного тока чаще всего применяются при повышенных требованиях безопасности (рисунок 11б). В сетях с изолированной нейтралью изоляция всех трех фаз пропускает небольшой ток утечки и емкостной ток. Чем протяженней сеть тем эти оба тока выше. В исправной сети эти токи замыкаются через все три фазы (A, B, C) на землю и в сумме равны нулю. Если из-за повреждения изоляции одной из фаз корпус аппарата окажется под напряжением, то через человека пройдет ток опасный для жизни. Для обеспечения безопасности в этих случаях используют пробивной предохранитель.

Рисунок 11. - Схема зануления электрооборудования: а — с заземленной нейтралью; б — заземление с изолированной нейтралью

Особые требования предъявляют к устройствам заземления электроустановок вычислительных центров. Для защиты ЭВМ от электрошумов выполняются две системы заземления: рабочая (для уменьшения наводок электропомех) и защитная (для обеспечения безопасности людей и защиты от шумов высокой частоты). Для электробезопасности обе системы связываются в одной точке — в опорном узле заземления.

5.2.5.3. Двойная изоляция

Безопасность электроустановок зависит от качества изоляции. Сейчас широко распространены электроприемники (особенно переносные) с двойной изоляцией, корпус и основные части которых выполнены из диэлектриков, а токопроводящие детали соединены через промежуточные изолирующие детали. Важнейшим показателем безопасности электроустановки является сопротивление изоляции. Сопротивление изоляции электромашин и аппаратов напряжением до 1000 В должно быть не менее 0,5 МОм.

5.2.5.4. Разделяющие трансформаторы

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

Рисунок 12. - Схема включения разделяющих трансформаторов

5.2.5.5. Блокировки и быстроотключающие устройства

Эффективным средством защиты от поражения электрическим током является быстрое отключение (не более 0,1 — 0,2 секунды) аварийного участка специальными аппаратами. В первую очередь к ним относят устройства защитного отключения (УЗО). Применение этих устройств предписывается ГОСТ Р 50807-95. На рисунке 13 показана одна из схем такого устройства.

Рисунок 13. - Схема включения УЗО

5.2.6. Требования к электропроводкам

При их выборе учитывают следующие факторы:

  •  В какой среде будут проводки эксплуатироваться (сухие, влажные, сырые, жаркие, пожароопасные и т. д.)
  •  Степень возгораемости строительных материалов

Большое значение для безопасности имеет правильный выбор сечения проводов и кабелей. Для этого нужно рассчитать нагрузку электроустановки. Провода и кабели подбираются по следующим параметрам:

  •  Допустимый нагрев
  •  Допустимое отклонение напряжения
  •  Механическая прочность
  •  Соответствие сечений номинальным токам срабатывания защитных аппаратов

Эффективной защитой от коротких замыканий и чрезмерного нагрева проводов являются плавкие предохранители и автоматические выключатели. К электропроводкам вычислительных центров предъявляют следующие требования:

  •  Питание вспомогательного оборудования должно осуществляться самостоятельными линиями через распределительные пункты от щита 0,4 КВт трансформаторной подстанции
  •  Электропроводки в помещениях вычислительных центров должны быть скрытыми, кабели и провода должны быть из негорючих материалов
  •  Запрещается применять провода с изоляцией из вулканизированной резины и других серасодержащих материалов, выделения из которых вызывают коррозию контактов в схемах ЭВМ
  •  Запрещается прокладывать через помещения вычислительных комплексов транзитные электропроводки

5.2.6 Требование к освещению для работы с ВДТ и ПЭВМ

Освещение играет едва ли не решающую роль в организации рабочего места оператора, поэтому его основные паратметры нормирутся по ГОСТу Р 50949-96 и по СанПиН 2.2.2./2.4. 1340-03.

К параметрам освещения относят освещенность, яркость, блесткость и коэффициент пульсации.

Освещенность измеряется в люксах, замеряется в контрольных точках на горизонтальной и на вертикальной поверхностях.

Яркость измеряется в канделлах на квадратный метр (кд/м²), причем как повышенная так и пониженная яркость недопустимы. За меры проводят на растояни равном рассторянию от глаз до рабочей поверхности.

Блесткость подразделяется на слепящую (прямую) и отраженную:

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

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

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

5.2.6.1. Естественное освещение

Величина естественного освещения характиризуется КЕО (коэффициентом естественного освещения). Определяется КЕО (l) относительной величиной, показывающей во сколько раз освещение внутри помещения (Eвн) меньше освещенности поверхности земли снаружи здания (Енар) и определяется по формуле:

Величина КЕО нормируется СНиП 23-05-95, 02.08.95, № 18-78. Для поддержания нормального естественного освещения окна надо мыть не реже одного раза каждые полгода.

5.2.6.2. Внутренне искусственное освещение

Подразделеяется на две системы: систему общего освещения и систему комбинированного освещения.

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

Система комбинированного освещения представляет собой общее равномерное освещение, дополненное местным, непосредственно на рабочих местах. При этой системе освещенность рабочего места от светильников общего освещения должна быть не менее 10% от всего освещения, а остальные 90% дает местное освещение. Для местного освещения предпочтительнее применять люминисцентные лампы типа ЛБ (Л – люминсцентная, Б – белой цветности). Они экономичнее ламп накаливания на 55%. Допустимо применять металлогаллогеновые лампы мощностью до 250 Ватт. Но при этом на рабочеее место должен падать не прямой а отраженный свет. У таких ламп расход электроэнергии на 10%ниже чем у ламп типа ЛБ.

5.2.6.3. Особенности устройства освещения в помещениях для работы с ВДТ и ПЭВМ

Для освещения этих помещения применяют лампы типа ЛБ, создающие равномерное освещение. Рекомендуется применять многоламповые светильники с поочередным включением по схемам опережающего и отстающего тока. Это делается для исключения пульсации освещенности. Больше всего подходят для освещения рабочих мест с ПЭВМ светильники серии ЛПО36 с зеркальными решетками или аналогичные им. Коэффициент пульсации не должен превышать 5%. Пульсации можно избежать подключая все светильники на разны фазы трехфазной сети. Светильники должны иметь рассеиватели.

5.3. Выводы

Знание всех вредных и опасных факторов, воздействующих на человека при работе с ВДТ и ПЭВМ помогает обеспечить всестороннюю защиту от них. В свою очередь, правильно обеспеченная безопасность, позволяет свести это вредное воздействие к минимуму.


Заключение

Итоги

В результате проделанной работы были выполнены следующие задачи:

  •  проведен анализ российского рынка аппаратно-программных решений для плат сбора данных;
  •  на основании анализа рынка было принято решение о разработке кроссплатформенного программного инструментария, поддерживающего работу с аппартаной продукцией ЗАО «Руднев-Шиляев»;
  •  проанализированы сценарии использования аппаратной продукции ЗАО «Руднев-Шиляев»;
  •  на основании анализа сценариев использования были сформулированы требования к  программному инструментарию;
  •  на основании требований к функционалу программного инструментария была разработана его модульная структура;
  •  проанализированы существующие технологии и методы в области разработки программных продуктов;
  •  проведен анализ требований и рекомендаций к программным интерфейса;
  •  спроектированы программные интерфейсы для компонентов инструментария;
  •  разработаны кроссплатформенные модули программного инструментария, реализующие требуемый функционал;
  •  разработан драйвер под ОС Linux для аппаратной продукции ЗАО «Руднев-Шиляев» с интерфейсом USB;
  •  разработан комплекс функциональных тестов, покрывающих основные функции для всех модулей программного инструментария;
  •  клиентское программное обеспечение было адаптрировано под разработанный программный инструментарий;
  •  произведен анализ кроссплатформенных программных инструментариев для создания приложений с графическим интерфейсом для дальнейшего их применения в разработке клиентского программного обеспечения;
  •  произведено внедрение системы в рабочий процесс компании ЗАО «Руднев-Шиляев»;

Выводы

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

Сценарии использования позволяют упростить этап анализа требований к программному продукту. Использование нисходящей модели позволяет избежать ошибок при проектировании и разработке программного продукта.


Список литературы

  1.  Бланшет, Жасмин. QT4: программирование GUI на C++ / Жасмин Бланшет. - М.: КУДИЦ-Пресс, 2008.
  2.  ГОСТ, Р 50923-96, Дисплеи. Рабочее место оператора. Общие эргономические требования и требования к производственной среде. Методы измерения, 1996.
  3.  ГОСТ, Р 50948-96, Средства отображения информации индивидуального пользования. Общие эргономические требования и требования безопасности, 1996.
  4.  ГОСТ, Р 50949-96, Средства отображения информации индивидуального пользования. Методы измерения и оценки эргономических параметров и параметров безопасности, 1996.
  5.  Ктиторов А. Ф. Безопасность использования видеотреминалов и персональных ЭВМ / М.: 1997.
  6.  МИ 2916 — 2005. Государственная система обеспечения единства измерений. Идентификация распределений вероятности при решении измерительных задач. М.: 2005.
  7.  САНП, САНП и Н 1340-03 Гигиенические требования к персональным ЭВМ и организация работы, 20-3.
  8.  Blanchette, Jasmin. The Little Manual of API Design / Jasmin Blanchette. - Trolltech, 2008.
  9.  Corbet, Jonathan. Linux Device Drivers, 3rd Edition / Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman. - O'Reilly Media, 2005.
  10.  Hundt, Robert. C++, Go, Java and Scala Performance Benchmarks / Robet Hundt. - Google, 2011.

https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf

  1.  Love, Robert. Linux Kernel Development, 3rd Edition / Robert Love. - Pearson Education, Inc., 2010.
  2.  Matthew, Neil. Beginning Linux Programming / Neil Matthew, Richard Stones. - Wiley Publishing, Inc., 2008.
  3.  Tschater, Michael. Платформонезависимая разработка программ / Michael Tschater. - LinuxFocus Magazine, 2004,

http://www.linuxfocus.org/Russian/October2004/article350.shtml

  1.  Habrahabr, сборник аналитических статей на тему ITтехнологий, Принципы проектирования API, 2011,

http://habrahabr.ru/post/121111/

  1.  Habrahabr, сборник аналитических статей на тему ITтехнологий, Разработка USB class-driver под Linux, 2012,

http://habrahabr.ru/post/163861/

  1.  Qt, Официальный сайт, Designing Qt-Style C++ APIs, 2005,

http://doc.qt.digia.com/qq/qq13-apis.html

  1.  СitForum, портал об информационных технологиях, Обзор паттернов проектирования, 2005,

http://citforum.ru/SE/project/pattern/

  1.  СitForum, портал об информационных технологиях, Руководство по программированию модулей ядра Linux, 2004,

http://citforum.ru/operating_systems/linux/lkmpg/

  1.  СitForum, портал об информационных технологиях, Программирование для системного реестра на С++, 2005,

http://citforum.ru/operating_systems/windows/registry_c/

  1.  СitForum, портал об информационных технологиях, Сравнение C++\Qt и Java, 2003,

http://citforum.ru/programming/application/java_qt.shtml

  1.  CITKIT, аналитические статьи об информационных технологиях, Gtk vs. Qt: сравнительный анализ, 2005,

http://citkit.ru/articles/22/

  1.  BeyondLogic, USB in a NutShell, 2010,

http://www.beyondlogic.org/usbnutshell/usb1.shtml

  1.  Официальный сайт проекта libusb, Libusb-1.0 API documentation, 2012,

http://libusb.sourceforge.net/api-1.0/

  1.  Matthias Vallentin, personal blog, Writing a Linux Kernel Driver for an USB Device, 2011,

http://matthias.vallentin.net/blog/2007/04/writing-a-linux-kernel-driver-for-an-  unknown-usb-device/

  1.  OpenNET, портал по открытому ПО, Разработка драйверов для USB-устройств под Linux, 2006,

http://www.opennet.ru/base/dev/write_linux_driver.txt.html

  1.  Free Electrons, Slides for training sessions, 2009,

http://free-electrons.com/docs/linux-usb/


 

А также другие работы, которые могут Вас заинтересовать

78575. Охрана природы 10.03 MB
  Много животных там стало водиться: Змеи слоны черепахи и птицы. За 1000 лет наша Земля изменилась до неузнаваемости: обмелевшие реки вырубленные леса нефтяные пятна на поверхности морей и океанов сотни исчезнувших растений и животных.
78576. Допоможемо природі 37 KB
  На мелодію з мультфільму Бременські музики Весь світ у нас в руках Керують ним лиш люди Дізнатись хочем ми Що завтра з світом буде Ось ми прийшли сюди до Вас Привіт Бонжур Хеллоу Те що розкажемо в цей час Хвилює всіх давно Нумо в цей час Слухайте нас Загітувати...
78577. Водойми рідного краю. Охорона водойм 64.5 KB
  Виховувати любов до природи та дбайливе ставлення до водойм. Формувати в учнів поняття «водойми». З’ясувати значення водойм рідного краю у житті людини. Ознайомити з різноманітністю водойм рідного краю. Розвивати пізнавальний інтерес, уміння аналізувати, порівнювати, робити висновки.
78578. Водойми України 67.5 KB
  Мета: розкрити значення води в житті людини та природи; ознайомити учнів із поняттями водойми, джерела, річки, озера, болота, моря та їх значенням в житті людини; розвивати вміння спостерігати, робити висновки, узагальнювати; виховувати дбайливе ставлення до водойм.
78579. Які бувають рослини? 184 KB
  Ознайомити учнів з різноманітним світом рослин; навчати порівнювати дерева кущі трав’янисті рослини; розкрити значення рослин у житті людини; розвивати зв’язне мовлення мислення дітей; виховувати дбайливе ставлення до рослин бажання доглядати охороняти природу.
78580. Сонце, сонечко та соняшник 51 KB
  Мета: формувати в учнів уявлення про Сонце про залежність життя рослин і тварин від сонячного світла і тепла; розвивати мовленнєві здібності уміння декламувати; виховувати інтерес до знань. Сонце Девіз уроку: Веди нас сонечко в політ Більше дізнаємось про світ.
78581. Почва. Почва – это место, где живут мелкие животные 84 KB
  Цель: продолжить формировать представление о предметах неживой природы, сформировать понятие о почве и её значении в жизни живых существ, познакомить с составом почвы; развивать логическое мышление, внимание, связную речь, навыки исследовательской работы, познавательный интерес...
78582. Різноманітність рослин. Значення рослин у житті людини 87 KB
  Навчати учнів розпізнавати рослини найближчого оточення. Плакат із записом шифрограми; малюнки із зображенням листяних і хвойних дерев; матеріали для ігор; пов’язки із зображенням квітів; дитяча енциклопедія Рослини.
78583. Тварини. Різноманітність тварин 14.53 MB
  Мета: розширити і уточнити знання учнів про різноманітність тварин середовище їхнього існування; про тварин які живуть поряд з людиною; розкрити цінність тварин для людини; розвивати вміння спостерігати за тваринами порівнювати тварин групувати їх; виховувати шанобливе ставлення до тварин.