Реліз відкритої SCADA(Supervisory control and data acquisition) системи версіях 0.7.0 є першим стабільним-промисловим релізом, що пов'язано з завершенням стадії бета-тестування, розпочатої з версії 0.6.4.
Основною метою цього релізу є надання співтовариству користувачів та розробників вільного програмного забезпечення (ПЗ) платформи для побудови рішень комплексних систем автоматизації та інших суміжних рішень, а також надання комерційних послуг на основі проекту OpenSCADA.
Цей реліз є першим стабільним релізом, для якого надається технічна підтримка від розробників та для якого планується випуск виправлень протягом довгого проміжку часу.
Цей документ становить обробку(компіляцію) документа "ChangeLog" системи OpenSCADA версії 0.7.0, який прикликано коротко та наочно освітлити нові можливості системи OpenSCADA. Детально ознайомитися зі змінами у системі OpenSCADA можна у файлі "ChangeLog" з дистрибутиву системи або тут: http://wiki.oscada.org/Works/ChangeLog.
Ключовими особливостями даної версії є:
Реалізація планових завдань.
Оптимізація, підвищення стабільності, стійкості та продуктивності системи.
Удосконалення та стабілізація СВК.
Формування та стабілізація API програмування користувача.
Загальносистемні розширення.
Значні покращення та виправлення окремих модулів.
Формування документації та перекладі документації і інтерфейсу.
Уніфікація демонстраційної БД.
Нові та оновлені модулі:
Archive.FSArch - 1.3.1 -> 1.4.1, виправлення та покращення для підвищення продуктивності
Archive.DBArch - 0.9.0 -> 0.9.2, виправлення та деякі покращення
DB.DBF - 2.0.1 -> 2.0.2, виправлення
DB.MySQL - 1.6.1 -> 1.6.2, деякі покращення
DB.SQLite - 1.6.1 -> 1.6.2, покращення
DB.FireBird - 0.9.1 -> 0.9.5, значні покращення
DB.PostgreSQL - 0.9.0, новий модуль
DAQ.DiamondBoards - 1.2.0 -> 1.2.1, адаптація до змін API
DAQ.System - 1.7.0 -> 1.7.2, очищення коду та адаптація до змін API
DAQ.BlockCalc - 1.2.1 -> 1.4.0, покращення та виправлення
DAQ.JavaLikeCalc - 1.5.0 -> 1.8.0, значні покращення, виправлення та оптимізація
DAQ.LogicLev - 1.0.1 -> 1.1.2, покращення та виправлення
DAQ.SNMP - 0.4.0 -> 0.4.1, адаптація до змін API
DAQ.Siemens - 1.2.1 -> 1.2.3, виправлення та адаптація до змін API
DAQ.ModBus - 1.0.1 -> 1.1.1, виправлення та покращення
DAQ.DCON - 0.3.0 -> 0.3.3, виправлення та покращення
DAQ.ICP_DAS - 0.5.0 -> 0.7.2, значні покращення та виправлення
DAQ.DAQGate - 0.8.0 -> 0.9.1, значні покращення та виправлення
DAQ.SoundCard - 0.6.0 -> 0.6.1, адаптація до змін API
DAQ.OPC_UA - 0.6.0, новий модуль
Transport.Sockets - 1.4.0 -> 1.4.5, покращення та виправлення
Transport.SSL - 0.8.2 -> 0.9.5, покращення та виправлення
Transport.Serial - 0.5.0 -> 0.7.1, значні покращення та виправлення
Protocol.HTTP - 1.4.1 -> 1.5.0, значні покращення
Protocol.SelfSystem - 0.9.1 -> 0.9.3, виправлення та адаптація до змін API
Protocol.UserProtocol - 0.6.0, новий модуль
Protocol.ModBus - 0.5.0 -> 0.6.1, виправлення та покращення
Protocol.OPC_UA - 0.6.0, новий модуль
Special.FLibComplex1 - 1.0.4 -> 1.0.6, виправлення та покращення
Special.FLibMath - 0.5.1 -> 0.5.2, адаптація до змін API
Special.FLibSYS - 0.9.0 -> 0.9.2, виправлення та покращення
Special.SystemTests - 1.3.7 -> 1.5.0, переробка та уніфікація тестів
UI.QTStarter - 1.5.3 -> 1.6.0, покращення
UI.QTCfg - 1.8.1 -> 1.9.0, значні покращення та виправлення
UI.WebCfg - 1.5.3 -> 1.5.4, виправлення та адаптація до змін API
UI.WebCfgD - 0.6.2 -> 0.6.5, виправлення
UI.VCAEngine - 0.9.0 -> 1.0.0, значні покращення, виправлення та оптимізація
UI.Vision - 0.9.0 -> 1.0.0, значні покращення, виправлення та оптимізація
UI.WebVision - 0.7.0 -> 0.9.0, значні покращення та виправлення
UI.WebUser - 0.6.0, новий модуль
1 Реалізація планових завдань
У відповідністю з планом релізу було виконано наступні завдання:
Реалізація примітивів "Зв'язок" та "Функція" СВК. - У зв'язку з не принциповістю для промислового релізу та відсутності потреби, на цей час, це завдання було винесено за межі першого промислового релізу.
Стабілізація та випуск промислової гілки OpenSCADA. - Зроблено велику роботу по стабілізації та оптимізації промислового релізу, про що детальніше о у наступному розділі.
Реалізация модуля БД ОДБС, PostgresSQL та транспортного модуля БД. - Максимом Лисенко було виконано реалізацію модуля БД "PostgresSQL". Реалізація модуля БД "ODBC" було визнано не доцільним оскільки технологія "ODBC" фактично є інтерфейсом SQL-запитів, який не враховує особливостей SQL-діалектів реальних БД, а це означає що він не може безпосередньо, без огляду на тип БД, використовуватися у OpenSCADA при вирішенні її основних завдань. Перспектива використання "ODBC" залишається для реалізації доступу до БД у яких немає "рідного" API прямого доступу до БД, але є драйвер ODBC, або для надання простого інтерфейсу SQL-запитів у OpenSCADA. Реалізацію транспортного модуля БД було винесено за межі першого промислового релізу.
Реалізація нового механізму/модуля тестів системи OpenSCADA. - Для виконання внутрі-системних тестів OpenSCADA механізм модуля тестування було виконано у вигляді функції API користувача, що з одного боку зберегло можливість автономного виклику статичних тестів та з іншого боку надало можливість виклику тестів по одному, в ручну, а також з скриптів користувача, у будьякій послідовності та у потрібній кількості окремих завдань.
Переклад триває
2 Оптимізація, підвищення стабільності, стійкості та продуктивності системи.
У процесі робот над цією версією, а також її практичної адаптації, було виявлено та виправлено в загальній складності біля 200 помилок.
Крім виправлення багатьох помилок була зроблена робота по оптимізації різних компонентів OpenSCADA. Особливо помітної оптимізації все ще була піддано середовище візуалізації та керування (СВК) та його візуалізатори.
Перелічимо більш істотні помилки виправлення яких значно відобразилося на підвищені стабільності:
Загальносистемні:
Виправлено не коректне встановлення політики реального часу для потоків. Не було встановлено прапор потоку PTHREAD_EXPLICIT_SCHED.
Виправлено контроль за подвійним захопленням ресурсу у одному потоці та захоплення ресурсу за таймаутом.
Механізм запобігання багаторазового запуску виправлено на предмет перевірки PID заблокованого процесу, по причині видалення системою lock-файлів з директорії /tmp.
Виключено пакування даних структури класів за допомогою #pragma pack(push,1) по причині появи неявної помилки із зависанням одного з потоків та блокування залишених у прошивці OpenSCADA для ПЛК LP8x81.
Код ініціалізації та оновлення модулей оновлено для виключення подвійної ініціалізації поділяємих бібліотек.
Функция создания задачи исправлена для предотвращения падения при создании автоматически-закрываемых задач, при быстром закрытии.
Транспорты:
Serial, DAQ.DCON, DAQ.ModBus: Транспорт последовательного интерфейса оптимизирован, сделан типовым и исправлен на предмет нескольких ошибок. Клиенты транспорта адаптированы для использования нового механизма.
Sockets, SSL: Исправлена возможность не полной записи функцией write(). При записи в сокет эта функция пишет только часть размером в свой буфер ( Для полной записи больших сообщений добавлен повтор записи.
Transport.SSL: Окончательно исправлено ожидание данных ответа сервера путём дожидания обработки данных в функции BIO_read().
Transport.Sockets: Исправлена обработка нулевого результата ожидания хвоста сообщений, для исключения зависания на запросах в DAQ.System.HDDTemp.
Сбор данных:
ModBus: Исправлена потеря ресурса во время сбора данных. По этой причине исключена возможность присвоения строки прямо к объекту ресурсной строки.
JavaLikeCalc: Исправлено использование функций для параметров контроллеров DAQ из IO функций для первого использования.
DAQ, BlockCalc, JavaLikeCalc, LogicLev, Siemens: Исправлено получение ошибочных данных по схеме резервирования в не резервированных задачах и при отсутствии резервных станций.
Protocol.HTTP, UI.WebCfg, UI.WebCfgD, UI.WebUser, UI.Vision: Значение HTTP-параметра "Content-Type" исправлено для элемента "Charset".
UI.VCAEngine: Исправлено падение движка визуализации при изменении мутированных атрибутов, которые многократно унаследованы.
Оптимизация и повышение производительности:
SYS.XML: Функция преобразования дерева XML в строку оптимизирована по времени.
SYS.Archive: Добавлен механизм адаптивной генерации запросов к архивам различного качества, в случае общего запроса. Предотвращает продолжительную обработку в случае запроса больших интервалов времени и наличии менее качественных архивов.
DAQ, DAQ.DAQGate: Выполнена оптимизация запросов между резервными станциями по размеру запросов и по времени. Запрашиваются только архивные атрибуты параметров DAQ и атрибуты запланированные к запросу.
Archive.FSArch: Добавлено создание информационных файлов упакованных архивов, без хранения этих данных в БД. Эта функция позволяет обеспечить быстрое подключение больших архивов к другим станциям.
UI.Vision: В примитиве "ElFigure", для отрисовки, вместо QImage использован QPixmap, что значительно повысило производительность.
UI.Vision: Для построения изображения примитива "Diagram" использован QImage вместо QPicture, что значительно повысило производительность.
TFunction, DAQ.JavaLikeCalc: Добавлен вложенный контекст функций с целью повышения производительности внешних вызовов.
Оптимизации использования памяти:
SYS: Система переключена на использование традиционного "map" вместо "hash_map" во всех объектах с целью уменьшения потребления памяти.
UI.VCAEngine: Объект атрибута "Attr" оторван от объекта "TCntrNode" с целью уменьшения потребления памяти до 25%.
3 Усовершенствование и стабилизация СВУ.
Заметные изменения были выполнены в рамках среды визуализации и управления (СВУ), а именно в модулях движка СВУ UI.VCAEngine, визуализаторов UI.Vision и UI.WebVision. Внесённые изменения были направленны на стабилизацию, оптимизацию потребления памяти и улучшение пользовательских свойств СВУ.
Улучшения СВУ:
Добавлена полная поддержка вертикального масштабирование диаграм.
Добавлена поддержка альфа-канала в атрибуты цвета всех примитивов.
UI.VCAEngine:
Включено и сделано безопасным наследование описания мутирующих атрибутов.
Добавлены новые функции пользовательского API для сеансов wdgAdd(), wdgDel() и link() и linkSet(). Добавление этих функций позволило реализовать концепцию полностью динамического формирования интерфейса пользователя.
Свойства прав доступа к виджету реализованы атрибутами "owner" и "perm" для повышения гибкости управления.
Добавлен механизм автоматического создания и запуска сеанса при загрузке.
UI.Vision:
В инспектор атрибутов добавлена возможность групповой установки одноимённых атрибутов разных виджетов. Установка производится в групповом контейнере свойств инспектора атрибутов, который появляется при выделении одновременно нескольких виджетов.
В примитиве "ElFigure", для отрисовки, вместо QImage использован QPixmap, что значительно повысило производительность.
Для построения изображения примитива "Diagram" использован QImage вместо QPicture, что значительно повысило производительность.
Добавлена поддержка свойств пользовательского интерфейса. Добавлено управление и сохранение размера иконок панелей инструментов.
Добавлена возможность копирования значений атрибутов и связей посредством контекстного меню инспекторов атрибутов и связей.
Добавлена функция поиска по элементу "TextEdit".
UI.WebVision:
Добавлена поддержка поворота примитива "Text".
Добавлена генерация основных событий мыши. Для обработки некоторых событий добавлен стек функций обработчиков.
Для пользователя-отправителя адаптирован доступ и управление к его сеансу.
4 Формирование и стабилизация API пользовательского программирования.
В значительной степени было произведено формирование нового объектного API пользовательского программирования, которое предусматривает интеграцию пользовательских функций в дерево объектов системы OpenSCADA. Кроме этого было внесено ряд изменений
в существующие библиотеки функций пользовательского API.
В частности были осуществлены следующие изменения:
SYS:
SYS, Special.FLibSYS: Объект пользовательского API XMLNodeObj перемещён в ядро OpenSCADA (файлы tvariant.h, tvariant.cpp).
Пользовательское системное API OpenSCADA основанное на объекте TCntrNodeObj расширено для контроля прав доступа пользователя.
Объект TAreaObj переименован в TArrayObj.
Свойства объектов, вызовы функций и обработка исключений пользовательского API унифицировано.
SYS.TVarObj: Добавлена функция propList() для возможности сканирования атрибутов.
DAQ.JavaLikeCalc:
Функции пользовательского API добавлены: insert(), replace(), toReal(), toInt(), parse(), parsePath() и path2sep() в объект значения строкового типа.
Добавлена функция isEVal() к базовым типам, для обнаружения EVAL-значений.
Special.FLibComplex1: Функция ПИД расширена новыми параметрами: Kd, Tzd и followSp. Удалён параметр Tf.
Объектное API пользовательского программирования:
SYS: Функции пользовательского API: system(), message(), XMLNode(), cntrReq(), time(), localtime(), strftime(), strptime(), cron(), messDebug(), messInfo(), messNote(), messWarning(), messErr(), messCrit(), messAlert(), messEmerg() и strFromCharCode() добавлены в корневой объект ядра OpenSCADA.
DB: Функция пользовательского API SQLReq() добавлена в объект БД.
Transport: Функция пользовательского API messIO() добавлена для объекта исходящего транспорта.
UI.VCAEngine:
Функции пользовательского API: user(), alrmSndPlay() и alrmQuittance() добавлены в объект сеанса проекта.
В объект "Widget" добавлены функции пользовательского API: ownerSess(), ownerPage(), ownerWdg(), attrPresent(), attr(), attrSet(), wdgAdd(), wdgDel(), link() и linkSet().
Добавлен специальный атрибут "this" во все скрипты СВУ для доступа к объекту виджета и последующего вызова его функций пользовательского API.
Archives: Функция пользовательского API messGet() добавлена для объекта подсистемы "Архивы".
DAQ.Value: Добавлены функции пользовательского API get() и set() атрибутов.
5 Общесистемные расширения.
В общесистемное API системы OpenSCADA были внесены значительные изменения и расширения с целью повышения функциональности и общей стабилизации:
SYS:
Добавлен механизм предотвращения повторного запуска в скрипты: demo-start и user-start.
Добавлены глобальные функции для создания(регистрации) taskCreate() и закрытия taskDestroy() потоков. Все компоненты OpenSCADA используют новое API.
Добавлены файлы debian/* для поддержки построения Debian пакетов.
Добавлена функция strParse() для расширения функции strSepParse() на предмет поддержки многосимвольных разделителей и объединения односимвольных.
Добавлена инфраструктура счётчиков отладки.
Добавлена возможность назначения процессоров для потоков OpenSCADA на много-процессорных системах и много-ядерных процессорах.
Добавлен менеджер задач. Добавлено поле идентификатора процесса потока в менеджер задач.
Для реализации специфических функций добавлена обёртка над задачами OpenSCADA. Добавлена обработка исключений "TError" для задач внутри обёртки.
Код ядра системы OpenSCADA помещён в область имён "OSCADA". Версия библиотеки ядра OpenSCADA повышена до 1:0:0.
Унифицированы права доступа ко всем элементам интерфейса управления.
Добавлена проверка на версию более 2.0 утилиты сборки libtool. Включена сборка только разделяемых библиотек для модулей.
Идентификатор модуля помещён в класс конструктора для упрощения инициализации перевода текстовых сообщений модулей.
Для всех переводов использовано параметры утилиты xgettext "-C --no-location --no-wrap -k_". Использовано для очистки от мусора файлов переводов.
Версии API всех модульных подсистем установлено в 5.
SYS.Function, DAQ.BlockCalc, DAQ.LogicLev, UI.VCAEngine: Добавлен механизм контроля за изменениями параметров контроллеров подсистемы "Сбор данных".
DB:
Добавлено автоматическое открытие доступных таблиц по запросу к ним.
Добавлено управление транзакциями в функцию sqlReq(), а также добавлена функция transCloseCheck().
TFunction, DAQ.JavaLikeCalc: Добавлен вложенный контекст функций с целью повышения производительности внешних вызовов.
DAQ: Код ошибки добавлен в статус контроллера, что позволяет идентифицировать состояние и отображать его.
Protocol, Transport, DAQ.ModBus, Protocol.UserProtocol: Добавлена функция itemListIn() для выбора элементов протокола. Версия API модулей подсистемы изменена на 3. Добавлен выбор элементов протокола посредством функции TProtocol::itemListIn().
6 Значительные улучшения и исправления отдельных модулей.
В процессе работы над данным промышленным релизом значительных изменений, улучшений и стабилизации претерпели отдельные модули OpenSCADA:
DB.MySQL:
Добавлена поддержка неограниченных значений типов данных "Вещественное" и "Целое".
Добавлено преобразование значения EVAL для вещественного типа.
DB.SQLite: Улучшен механизм транзакций для поддержки внутри пользовательских SQL-запросов и закрытия старых транзакций.
DB.FireBird: Добавлена поддержка многоязыковости текстовых переменных. Унифицирована поддержка транзакций.
DAQ:
DAQGate: Добавлена поддержка возможности запроса отдельных атрибутов. Использовано для запроса архивируемых и часто запрашиваемых атрибутов. Все остальные атрибуты запрашиваются с периодом синхронизации путём полного запроса. Используется для уменьшения нагрузки и времени при обмене DAQGate с удалённой OpenSCADA станцией.
ICP_DAS: Добавлен статус DIP-переключателя для ПЛК LP-8781. Функции отправки сообщений по последовательному интерфейсу перемещены в общую функцию serReq() и все запросы используют её.
ModBus: Добавлены суффиксы "i2,i4,f,b0" к регистрам (R и RI) для гибкого доступа посредством различных типов данных.
JavaLikeCalc:
Добавлена поддержка обзорного цикла для сканирования свойств объекта "for( <i> in <obj> ) <code>;".
Свойства объектов, вызовы функций и обработка исключений пользовательского API унифицировано.
Transport:
Serial:
Добавлена возможность выбора типа управления потоком. Поддерживается аппаратное (CRTSCTS) и программное (IXON IXOFF) управление потоком.
Добавлена поддержка режима модема для всех входных и выходных транспортов.
SSL:
Добавлена поддержка KeepAlive лимитов. Добавлена поддержка переподключения после потери соединения и для предотвращения потери сообщений.
Добавлено получение адреса отправителя.
SSL, Sockets: В исходящий транспорт добавлены тайминги для отдельного управления временем соединения и временем последующих ответов.
Protocol.HTTP:
Добавлена функция исходящего протокола.
Добавлена поддержка автоматического входа.
Archive.FSArch: Добавлено создание информационных файлов упакованных архивов, без хранения этих данных в БД. Эта функция позволяет обеспечить быстрое подключение больших архивов к другим станциям.
UI.QTCfg:
Добавлена подстройка строк для таблиц, после добавления новых строк. Добавлена поддержка копирования содержимого таблицы в буфер обмена.
Добавлена функция поиска по элементу "TextEdit".
Добавлена возможность копирования списка выбранных узлов.
7 Формирование документации и переводы документации и интерфейса.
Поскольку данный релиз позиционируется как промышленный релиз с продолжительным периодом поддержки то к его выходу было закончено написание, на Русском языке, а также перевод на Английский язык, всей основной документации. Кроме того завершён перевод интерфейса программы на Английский, Русский, Украинский и Немецкий языки:
Добавлен перевод README на Украинский.
Добавлен перевод документа DAQ и обобщающего документа на Английский.
Добавлен документ "Быстрый старт".
Выполнен перевод документа "Быстрый старт" на Английский язык.
Общий документ "OpenSCADA" на Английском обновлен для включения частей "Быстрый старт" и DAQ.OPC_UA.
Обновлен перевод интерфейса ядра системы на Русский, Украинский и Немецкий языки.
Для всех переводов использовано параметры утилиты xgettext "-C --no-location --no-wrap -k_". Использовано для очистки от мусора файлов переводов.
8 Унификация демонстрационной БД.
В процессе подготовки промышленного релиза значительное внимание было уделено улучшению демонстрационной БД, как яркой демонстрации функций системы OpenSCADA:
Значительное обновление для поддержки новых возможностей и включения новых улучшений из системы автоматизации шаровых мельниц.
Добавлена поддержка пользовательского вызова демонстрационной БД в полноценном режиме на запись.
Добавлено масштабирование существующих элементов в случае отсутствия строк и колонок для обзорного кадра и сводной таблицы.
Обновлено для включения новых моделей аппаратов технологических процессов и адаптации всех остальных моделей.
Обновлено для:
Добавления объектов сигнализации компрессоров: KM201, KM301, KM202 и KM302.
Поддержки ручного ввода переменных с панели управления.
Обновления перевода.
Исправления нескольких ошибок.
Скрипт главной страницы проекта переписан для использования новых функций пользовательского API.
Использован новый механизм доступа к элементам пользовательского интерфейса. Предоставлен реальный доступ на чтение для простого пользователя ("user").
9 Решения, построенные на основе OpenSCADA
На основе проекта OpenSCADA построен фактически весь спектр решений автоматизации, которые ярко демонстрируют возможности, а также являются сигналом готовности системы для широкого промышленного применения.
В целом на основе OpenSCADA авторами проекта решались задачи: полного динамического моделирования технологических процессов (ТП), управление ТП на уровне программируемого логического контроллера (ПЛК) и формирование человеко-машинного интерфейса ТП.
Моделирование ТП представлено решениями: «Библиотека моделей аппаратов технологических процессов», «Динамическая модель реального времени Анастасиевской ГЛКС» и «Динамическая модель парового котла №9 ДМК». Причём решение «Динамическая модель реального времени Анастасиевской ГЛКС» было положено в основу демонстрационной БД проекта и распространяется со всеми дистрибутивами OpenSCADA.
Сфера управления ТП на уровне программируемого логического контроллера (ПЛК) представлена решениями: «OpenSCADA в программируемом логическом контроллере (ПЛК)» и «Среда исполнения ПЛК LP-8x81 фирмы ICP DAS на основе OpenSCADA».
Сфера формирование человеко-машинного интерфейса ТП представлена решениями: «Библиотеки графических элементов пользовательских интерфейсов» и «АСУ ТП шаровых мельниц ШБМ 287\410 котлоагрегата БКЗ 160–100 ПТ».
Нужно также отметить наличие ряда решений, не вошедших в вышеприведенный перечень, и выполненных разработчиками системы для третьих лиц или непосредственно её пользователями.
Заключение
Система OpenSCADA готова для практического использования в сложных промышленных условиях и выполнения широкого спектра задач автоматического управления технологическими процессами.
С целью предоставления качественного сервиса на основе решений OpenSCADA, а также развития в направлении поддержки специализированного оборудования, протоколов и интерфейсов; разработчиками планируется, и активно ведётся, работа по формированию политики предоставления услуг на коммерческой основе. В число коммерческих услуг будет входить: техническая поддержка, консультации и целевая разработка расширений, интеграция и внедрение решений, а также разработка специализированных решений и продуктов на основе OpenSCADA.
Версия 0.7.0 предоставляет решения OpenSCADA только для платформы Linux x86 и x86_64. Для осуществления поддержки других аппаратных и программных платформ, запланированных проектом, работа будет продолжена. Так к версии 0.8.0 планируется расширить поддержку аппаратных платформ минимум на платформу АРМ, как представителя RISC архитектур.
В появлении первой промышленной версии системы OpenSCADA активное участие приняли:
Савоченко Роман: Основной объём работ по проектированию, разработке, документированию и тестированию.
Лысенко Максим: Разработка примитива "Элементарная фигура" среды визуализации и управления (СВУ), создание модуля поддержки БД PostgreSQL и перевод большей части документации на Английский язык.
Яшина Ксения: Разработка примитива "Элементарная фигура" СВУ.
Попкова Ирина: Перевод интерфейса системы OpenSCADA и её модулей на Немецкий язык.
Алмаз Каримов: Разработка модуля поддержки протокола DCON и активное тестирование.