Пользовательский элемент управления. Создание клиентского приложения. Развитие серверного проекта, страница 7

Вернемся к поиску ошибки. Помогает тот факт, что до появления сообщения об ошибке мы успеваем увидеть в окне PlotControl вертикальные линии сетки графика, но не видим горизонтальных. Учитывая это, поставим точку останова в той строке кода, где начинается цикл прорисовки горизонтальных линий сетки (см. метод Draw класса Graph). Запустите приложение в режиме отладки (F5).

Первый же пошаговый проход по циклу (F10) позволяет локализовать ошибку. Она возникает при вызове метода MakeLabel, а точнее при выполнении поиска (см. s.IndexOf (".")) разделителя целой и дробной частей вещественного числа. Поиск производится в строке символов (цифровой метке), которая соответствует текущей линии сетки.

Даже зная этот факт, вы, вероятно, не сразу догадаетесь, в чем дело. Дело в том, что .NET Framework (в отличие от MFC) учитывает региональные настройки Windows, которые по умолчанию устанавливают в качестве десятичного разделителя (для России) символ ",". В своей системе я давно сменил эту региональную установку, так как она абсолютно не соответствует давно принятой практике — использовать точку в качестве разделителя целой и дробной частей вещественных чисел.

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

¨  Добавьте директиву:

using System.Globalization;

¨  В параметре вызова IndexOf замените символ точки на следующее длинное выражение:

CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator

Оно добывает строку (переменную типа string), соответствующую тому разделителю, который используется системой в данный момент.

Убедитесь, что теперь сервер графика работает так, как и предполагалось. Общий дизайн графика (композиция, сочетание цветов и т.д.) могут быть значительно улучшены. Полезно обратиться к сайту компании Dundas Software и просмотреть их решения. Если добъетесь успехов в этом направлении, поделитесь результатами. Приветствуется также такое развитие компонента, при котором он смог бы одновременно отобразить график нескольких функций.

Развитие клиентского проекта

Клиентское приложение должно использовать пользовательский элемент PlotControl для отображенияграфиков каких-то функций. Важно то, что координаты точек графика функции, метки осей и его заголовок должны вычисляться на стороне клиента. Допустим, что пользователь клиентского приложения хочет иметь возможность исследовать переходные процессы какого-либо типового звена линейной системы автоматического управления (САУ).

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

Здесь u(t) — входное воздействие, y(t) — выход системы,  — коэффициенты, зависящие от параметров системы управления.

Переходная функция

Одной из основных характеристик как объектов управления, так и целых систем автоматического управления является переходная функция (ПФ). Она представляет собой решение приведенного выше уравнения при входном воздействии, которое имеет вид единичной ступенчатой функции, или функции Хевисайда u(t) = 1(t).

Амплитуда скачка 1(t) в момент времени t = 0 равна единице, а скорость нарастания воздействия бесконечна. На практике входное воздействие такого типа не реализуемо, но оно удобно для анализа систем управления, так как является идеализацией быстро нарастающего входного сигнала. Функция Хевисайла используется для оценки поведения систем во время переходных процессов.