Дата публикации статьи: 29.07.2006 15:52

Глава 13. Пример построения тренажера и SCADA системы

    Человек управляющий технологическим процессом может воздействовать на объект управления с помощью самых разнообразных органонов управления. Например пилот изменяет положение самолета с помощью штурвала. Если положение штурвала вводить в компьютер и при этом на мониторе отображается графическая информация, отображающая воздушную обстановку получится летный тренажер. Конечно настоящий полетный симулятор может создать только серьезный научный коллектив и его ценность заключается не в графическом отображении, а в математическом описании процесса полета и реакции но изменении летной обстановки. Однако часто требуется представить лишь последовательность действий оператора по управлению технологическим процессом (своего рода инструкцию по управлению), при этом последовательность действий известна заранее. В папке /N27 находится программа, написанная на С# в которой положение штурвала задается с помощью регулируемого сопротивления. При вращении рукоятки надетой на вал сопротивления штурвал перемещается в право или в лево. Программа в работе представлена на рисунке 1.


Рис. 1

    Для правильной работы приложения установите регулируемое сопротивление в средние положение, которое соответствует среднему положению штурвала. Я изменил формат команды %00000D0600 на %00000D0601 это значит, что контролер будет выдавать данные не в диапазоне 0-20мА, а в процентах 0-100%. Путем подбора ограничивающего резистора среднее положение штурвала получилось 72%, крайнее левое около 40%, а крайние правое 100%. Это значит, что полный ход вала регулируемого резистора от 40% до !00% (при максимальном заряде батарейки 9V). Диапазон можно выбрать калибровкой или более строгим подбором ограничивающего резистора. Не пытайтесь добиться точного диапазона поскольку при столь примитивной схеме этого не получится. По большому счету для корректной работы необходима серьезная схема со стабилизированным источником питания.
Если вы запустите программу без контроллера управлять штурвалом можно с помощью кнопок. Для начала работы с подключенным контроллером необходимо нажать кнопку связь с контроллером – загорится зеленая лампочка, затем нажмите кнопку включить тренажер – загорится красная лампочка. В событии кнопки “Связь с контролером” определяется формат данных:

private void button3_Click(object sender, System.EventArgs e)
{
string MyStr;
MyStr =	"%00000D0601";
MSNET.Output = MyStr + Environment.NewLine;// + Chr$(13);
label3.Visible = true;
label4.Visible = false;
}

В событии кнопки “Включить тренажер” проверяется по ответному сообщению от контроллера его готовность к работе:

private void button2_Click(object sender, System.EventArgs e)
{
string MyStr;
string MyStr1;
MyStr1 = (string)MSNET.Input;//.ToString();
MyStr = "!00\r";
if (MyStr == MyStr1)
{
label2.Visible = false;
label1.Visible = true;
}
timer1.Start();
}

Так же в конце этого событии запускается таймер, в событии которого и происходит вся основная работа по взаимодействию с контролером:

private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
string MyStr;
string MyStrFin;
string MyStr1;
MyStr = "#001";
MSNET.Output = MyStr + Environment.NewLine;
//задержка
for(int i = 0;i<=10;i++)
{
i = i+1;
}
//
MyStrData.Append((string)MSNET.Input);//
if(MyStrData.Length < 2) return;
MyStr1 = MyStrData.ToString().Remove(4,3);
MyStrFin = MyStr1.Remove(0,2).Trim();
textBox3.Text = MyStrFin; 
MyStrData.Length = 0;
a = int.Parse(MyStrFin);
textBox4.Text = a.ToString();
//лево-право
if (xs >= 60 || xs <= -60) return;
MyAngle = -(a - 72);
xs = a - 72;
}

    В выходной буфер порта отправляется строка "#001", дополненная символами конца и перевода строки - Environment.NewLine. После небольшой задержки на обработку цикла читается входной буфер, который заносится в динамическую строку. Дальнейший код демонстрирует применение строковых операций, для интерпретации данных из строки (string)MSNET.Input. Промежуточные результаты преобразования для наглядности выводятся в элементы управления textBox3 и textBox4.
    Вращая ручкой вал регулирующего сопротивления штурвал поворачивается в право и лево. При нажатии кнопок верх и низ штурвал отодвигается или приближается к пилоту. Кроме работы с портами пример демонстрирует, как можно трансформировать спрайты. Штурвал это спрайт, который можно вращать, перемещать и масштабировать. Все эти операции осуществляются при помощи матриц в следующем коде из функции Render() :

//
sprite1.Begin(SpriteFlags.AlphaBlend);
t.Translate(220,317,0);
r.RotateZ((float)(Math.PI/180*MyAngle));
s.Scale(skalx,skaly,0);
r.Multiply(s);
r.Multiply(t);
sprite1.Transform = r; 
sprite1.Draw(spriteTexture, new Rectangle(135,385,180,120),new Vector3(90,65,0),new Vector3(0,0,0),Color.White);
sprite1.Flush();
sprite1.End();
//

    Каждое устройство I-7017RC способно обрабатывать восемь каналов аналогового ввода. Это устройство выбрано для демонстрации ввода аналогового сигнала в компьютер, так как оно на данный момент самое дешевое на рынке. К одному пору персонального компьютера с учетом протокола RS-485/RS-232 допускается подключить 256 таких устройств, удаленных на расстояние до километра. Вы можете задействовать 256 * 8 = 2048 сигналов. Если вы будите подавать на входы I-7017RC стабилизированный откалиброванный сигнал в диапазоне 0-20мА и при этом напишите (лучше универсальные) обработчики и интерпретаторы этих сигналов, возможно создание довольно сложных систем управления. Однако эта задача не из простых. Возможно потребуется вместо таймеров для отслеживания состояния залезать в дебри многозадачного программирования. Вместе с тем для решения относительно простых задач многозадачную систему можно построить на трех четырех таймерах.
    Тренажеры создают, как правило для подготовки персонала сложных технических объектов. Такая работа требует подготовки математического аппарата, описывающего объект управления (можно разместить в DLL) и как правило нестандартное подключение органов управления, например штурвала к контроллеру. В отличии от тренажеров для систем управляющих технологическим процессом в промышленности очень важна стандартизация. В настоящие время для этих целей применяются системы сбора и управления данными (SCADA) в связке с человеко-машинным интерфейсом (HIM). Такие системы имеют свой стандарты и правила построения, их легко изучать и использовать. Стандартизация является сильной стороной этих систем. Вам предлагается готовый набор графических элементов для построения HIM и часто OPC сервер (очень похож на элемент управления AciveX MSComm, только “заточен” под аппаратуру конкретного производителя). Но если вам надо что то нестандартное, то как правило в арсенале таких программ этого может и не оказаться. Предположим, что вы хотите воплотить в вашем человеко-машинном интерфейсе трехмерные элементы. В папке /N28 находится программа, написанная на C#, которая демонстрирует простой пример трехмерного интерфейса. Возьмем гипотетическую систему, состоящую из двух баков, двух клапанов и насоса. С лево трехмерная сцена, которую можно вращать вокруг своей оси, а справа ее мнемосхема. Если поместить мышь над элементом на мнемосхеме, на трехмерной схеме красным цветом будет выделен соответствующий элемент. Условимся, что при щелчке левой кнопки мыши на элементе мнемосхемы происходит пуск/открытие насоса или клапана, а правой остановка/закрытие. Программа узнает о том, что мышь находится над элементом мнемосхемы из следующего кода:

private void pictureBox2_MouseMove(object sender, 
System.Windows.Forms.MouseEventArgs e)
{
Graphics g = Graphics.FromHwnd(pictureBox2.Handle);
if (true == Myrc2.Contains(e.X,e.Y))
flag3 = 0;
else if (true == Myrc.Contains(e.X,e.Y))
flag2 = 0;
else if (true == Myrc1.Contains(e.X,e.Y))
flag1 = 0;
else
{
flag1 = 1;
flag2 = 1;
flag3 = 1;
}
}

    Переменные Myrc, Myrc1 и Myrc2 описывают прямоугольные области в которые вписаны элементы мнемосхемы. Если координаты мыши попадают в описанные области устанавливаются флаги сигнализирующие об этом другие части программы.
Связь с контролером I-7017RC организована почти, как в прошлом примере, только сейчас задействовано два канала. Каналы сигнализируют об уровне в баках. Работа программы представлена на рисунке 2.


Рис. 2

    Пустите насос, откройте клапан и с помощью регулирующего сопротивления увеличивайте уровень в красном баке и уменьшайте в синем. Остановите насос, закройте клапан и слейте воду из красного бака в синий. В реальных технологических системах сигналы приходят от датчиков. Многие датчики имеют вторичные преобразователи сигнала в диапазон фиксированного тока или напряжения например (в случае с устройством I-7017RC 0-20мА), что значительно упрощает построение системы. Хорошей новостью является, то что в версии .NET Framework 2.0 (все примеры написаны для NET Framework 1.1) появится класс SerialPort, предоставляющий программный доступ через драйвер к последовательному порту. Вам не надо будет мудрить с функциями API или элементами ActiveX построенных на COM.