Программирование контроллера на Windows CE от ICP DAS . Работа с панелью оператора

  • Дата

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

Если обратится к классической модели создания систем автоматизации технологических процессов, то панель оператора займет место верхнего уровня системы. В качестве верхнего уровня так же может выступать промышленный компьютер, но использование промышленного компьютера не всегда оправдано, так как влечет за собой применение SCADA пакетов, и как следствие удорожание системы управления в целом, что критично для небольших систем, а так же серийно производимых АСУ ТП. Если процесс визуализации и взаимодействия с оператором необходимо производить непосредственно на объекте управления, то панель оператора HMI является выгодным вариантом, как с точки зрения простоты ее программирования, так и благоприятно скажется на стоимости системы.

Панели оператора являются неотъемлемой частью любого комплекса по автоматизации промышленного процесса -  это HMI-устройства (Human Machine Interface), осуществляющие связь между человеком и вычислительным комплексом. Панели оператора могут быть различными по функционалу и размерам - от компактных, выполняющих банальные функции ввода-вывода, до моделей, обладающих возможностью обработки данных на уровне собственной логики.
Рассмотрим работу промышленного контроллера на Windows CE XPac-8741-Atom-CE6 в комплексе с панелью оператора Winetek MT8071iP и модулями i-8017HCW, i-8053w, i-8037W. Обработкой данных, получаемых и отсылаемых модулям, в этом случае будет заниматься контроллер, а устройством ввода/вывода будет служить панель Winetek MT8071iP. Связь между панелью оператора и контроллером будет осуществляется в нашем случи по сети Ethernet с использованием протокола Modbus TCP.
Программирование панели будем осуществлять в бесплатной среде разработки EasyBuilder8000, свободно распространяемой команией Weintek. Запрограммируем операторскую панель на взаимодействие с модулями - визуальное отображение сигнулов с модулей ввода и отправку на управляющих сигналов на модуля вывода. Так как модули i-8053W и i-8037W имеют по 16 дискретных каналов,то для визуализации их состояния расположим на форме проекта по 16 битовых индикаторов состояния для каждого модуля(для удобства расположим их в 2 строки по 8 штук - как на модулях):


Поскольку модуль i-8037W является модулем вывода, то мы имеем возможность управлять состоянием его дискретных выходов - расположим под каждым битовым индикатором состояния каналов модуля i-8037W битовый переключатель (тумблер), который будет выполнять функцию выключателя соответствующего канала:


Для отображения считанного сигнала с модуля аналогового ввода i-8017HCW разместим на форме элемент "цифровой дисплей":


Для удобства подпишем каждый битовый индикатор по порядку от 1 до 16 элементом "текст".

Так как панель обладает большим количеством стандартных элементов, визуализируем считываемый с моудля i-8017HCW сигнал в виде графика I(t), для этого создадим ещё одну форму:


 

 

Для перехода между формами создадим на каждой по управляющей кнопке и для удобства восприятия разместим на них элемент "фигура" в виде стрелки:


Запрограммируем кажду кнопку на переход между формами:
 

.

 

 

Элементы визуального отображения размещены, осталось их запрограммировать на ввод/вывод сигналов, для битовых индикаторов определим адреса от 1 до 32 в регистре 0x:


Таким образом битовые индикаторы, отображающие состояние каналов модуля ввода i-8053W имеют адреса с 1 по 16, а индикаторы каналов модуля вывода i-8037W - с 17 по 32:
 

Для битовых переключателей (тумблеров) выставим адреса, соответствующие адресам индикаторов состояния модуля ввода.

 

Для графика определим адрес считывания 1 регистра 3х:


Панель настроена на визуальное отображение сигналов, отправляемых контроллером по протоколу Modbus TCP, управление модулем вывода i-8037W и построение графика I(t), получая данные с модуля аналогового ввода i-8017HCW. Сейчас необходимо запрограммировать контроллер XPac-8741-Atom-CE для обработки сигналов с модулей ввода/вывода и передача этих данных панели оператора.

Создадим новый проект Microsoft Visual Studio. На событие загрузки формы Form_Load повесим инициализацию соединения между панелью и контроллером по протоколу modbus tcp. Другими словами, мы создаем Modbus TCP Server (Slave) на стороне контроллера, который будет опрашивать панель оператора выступая как Master устройство:

private void Form1_Load(object sender, EventArgs e)
{
IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());
IPAddress[] addr = ipEntry.AddressList;
slaveTcpListener = new TcpListener(addr[0], port);
slaveTcpListener.Start();
slave = Modbus.Device.ModbusTcpSlave.CreateTcp(slaveID, slaveTcpListener);
EventHandler(Modbus_Request_Event);
slave.DataStore = Modbus.Data.DataStoreFactory.CreateDefaultDataStore();
slave.DataStore.DataStoreWrittenTo += new EventHandler(Modbus_DataStoreWriteTo);
slave.Listen();
}


Создадим новый элемент Timer и запрограммируем его на чтение состояния аналогово канала ввода модуля i-8017HCW и отправку данных панели оператора:

float fValue = 0;
pac8017HW.Init(2);
pac8017HW.ReadAI(2, 0, 4, ref fValue);
if (fValue < 0) fValue = 0; // если значение отрицательно, то присваиваем ему значение 0
//записываем данные в регистр 3х
slave.DataStore.InputRegisters[1] = Convert.ToUInt16(fValue * 1000);

Следующим блоком будем считывать состояния дискретных каналов ввода модуля i-8053W и передавать их на панель оператора:

 

uint channels = 0;
XPacNET.XPac.pac_ReadDI((IntPtr)null, 3, 16, ref channels);
double i; // объявляем служебную переменную для массива
double q; // объявляем служебную переменную для массива
int w; // объявляем служебную переменную для массива
int[] mark = new int[16];
q = Convert.ToInt16(channels);// переводим переменную channels из типа uint в тип int
for (i = 15; i >= 0; i--)
{
// переводим переменную i из типа double в тип int
w = Convert.ToInt16(i);

// проверяем, положительна ли разница между переменной q и квадратом 
// текущего канала, если она не отрицательна, то маркируем этот канал 
// включённым, если нет - то выключенным
if (q - Math.Pow(2, i) >= 0)
{
mark[w] = 1;// маркируем включённым
q = q - Math.Pow(2, i);
}
else
{
mark[w] = 0;// маркируем выключенным
}
//записываем состояние канала в регистр 0х
int b = w + 1;
slave.DataStore.CoilDiscretes[b] = Convert.ToBoolean(mark[w]);
}

Теперь нужно принять с панели сигнал для управления модулем дискретного вывода i-8037W и передать его на модуль для визуального отображения:

 

int statusdo=0;
int t;
for (t = 17; t <= 32; t++)
{
if(slave.DataStore.CoilDiscretes[t]==true) statusdo = statusdo + Convert.ToInt32(Math.Pow(2, Convert.ToDouble(t- 16 - 1)));
}
label3.Text = Convert.ToString(statusdo);
XPacNET.XPac.pac_WriteDO((IntPtr)null, 4, 16, Convert.ToUInt16(statusdo));

По любым вопросам программирования промышленных контроллеров вы всегда можете обратитсья в компанию "Эксперт-Автоматика".

Смотрите так же статьи по программированию под Windows CE

Программирование контроллеров на Windows CE. Работа с модулями ввода вывода ➦

Программирование контроллеров на Windows CE. Работа с базами данных ➦

Вам может быть интересно: