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

  • Дата

Так как основной задачей работы промышленных контроллеров является сбор и обработка сигналов с модулей ввода - вывода, то возникает необходимость хранения достаточно больших объемов данных для дальнейшей обработки, создания архива, истории измерений, построения графиков и т.п. Хранение больших обемов данных связано с определенными сложностями, их необходимо структурировать, содавать условные выбоки, возможность быстрого поиска нижной информации. Это легко позводяет сделать промышленный контроллер на Windows CE, по средством встроенного сервиса, базы данных ( СУБД ) SQL Server Compact, при неоходимости проектировщик может использовать базу данных и на удалённом сервере.

Рассмотрим работу контроллера с использованием локальной SQL Server Compact  и удалённой MySQL баз данных.

Работа контроллера с локальной базой данных SQL Server Compact

Пользователь без труда может использовать входящую в стандартный комплект поставки контроллера XPac СУБД SQL Server Compact, ее возможностей вполне достаточно для хранения и структурирования больших массивов данных.

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

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

Для работы с базой данных используем стандартную библиотеку System.Data.SqlServerCe.dll.  Подключение библиотеки аналогично подключение библиотек из предыдущих примеров программирования контроллера XPac.

 

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

private void Form1_Load(object sender, EventArgs e) //событие при загрузке формы
{
if (!File.Exists("test.sdf")) // проверка на существование базы test.sdf
{
SqlCeEngine engine = new SqlCeEngine("Data Source=test.sdf"); // функция библиотеки System.Data.SqlServerCE
//для определения подключения к базе
engine.CreateDatabase(); 
Console.WriteLine("Database 'test.sdf' was successfully created"); // выводим сообщение об удачном создании базы
connection = new SqlCeConnection("Data Source=test.sdf"); //инициализация подключения к базе
connection.Open(); // подключение к базе
SqlCeCommand cmd = connection.CreateCommand(); // определение переменной для sql-запроса в базу
cmd.CommandText = "CREATE TABLE test(time datetime , value float)" // описываем sql-запрос для создания таблицы test  
//с полями time и value формата datetime и float соответственно
cmd.ExecuteNonQuery(); // выполняем запрос
Console.WriteLine("Table 'test' was successfully created"); // выводим в консоль сообщение об успешном создании таблицы
connection.Close(); // закрываем подключение к базе
Console.WriteLine("Writing to database..."); // выводим в консоль сообщение о готовности нашей базы и таблицы к записи данных
}
else
{
Console.WriteLine("Database 'test.sdf' already exist"); // если база существует, выводим в консоль соответствующее сообщение
Console.WriteLine("Writing to database..."); // выводим в консоль сообщение о готовности нашей базы и таблицы к записи данных
}
}

 

 

В предыдущей статье посвященной работе с контроллером XPac был продемонстрирован пример работы с модулем аналогового ввода I-8017HCW, модернизируем упомянутый пример таким образом, чтобы значения считываемого канала записывались в таблицу,  для этого добавим на форму таймер, который будет опрашивать модуль аналогового ввода и записывать считанные значения тока в базу

 

private void timer1_Tick(object sender, EventArgs e) // событие при срабатывании таймера
{
// определяем переменную time, содержащую текущее время
DateTime time = DateTime.Now; 
// определяем переменную, в которую будет считана информация с аналогового модуля ввода i-8017HCW
float fValue = 0; 
// инициализируем работу с модулем i-8017HCW, так как он находится во 2 слоте контроллера XPac
pac8017HW.Init(2); 
// считываем данные с модуля i-8017HCW в переменную fValue
pac8017HW.ReadAI(2, 0, 4, ref fValue); 
// инициализируем переменную str1, являющуюся строковым представлением переменной time
string str1=Convert.ToString(time); 
// инициализируем переменную str2, являющуюся строковым представлением переменной fValue
string str2=Convert.ToString(fValue); 
//инициализация подключения к базе
connection = new SqlCeConnection("Data Source=test.sdf"); 
connection.Open();
// инициализация переменной cmd, содержащей sql-запрос в базу
string cmd = string.Format("INSERT INTO test (time, value) VALUES ('{          0          }', '{          1          }')", str1, str2);
// инициализация переменной createCmd для передачи запроса в базу
SqlCeCommand createCmd = connection.CreateCommand(); 
createCmd.CommandText = cmd; 
// осуществление запроса в базу
createCmd.ExecuteNonQuery();
// закрытие соединения с базой
connection.Close(); 
// выводим в консоль дату записи
Console.Write(str1); 
// выводим в консоль разделительный пробел
Console.Write(" "); 
// выводим в консоль считанное значение; переводим строку
Console.WriteLine(str2); 
}

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

Запрограммируем управляющую кнопку button_read для значения value из базы test.sdf по заданному параметру time:

private void button1_Click(object sender, EventArgs e)
{
connection = new SqlCeConnection("Data Source=test.sdf"); // определяем соединение для работы с базой test.sdf
string str3 = input_time.Text; // инициализируем переменную str3, содержащую значение элемента textBox input_time
// значение вводится в формате yyyy-mm-dd hh-mm-ss
string cmd = string.Format("select value from test where time='{          0          }'", str3); // инициализируем переменную cmd,
// содержащую sql-запрос в базу test.sdf
SqlCeCommand readCmd = new SqlCeCommand(cmd, connection); // инициализируем команду readCmd для запроса в базу
readCmd.Connection.Open(); // открываем соединение с базой
SqlCeDataReader rdr = readCmd.ExecuteReader(); // инициализируем экземпляр rdr,
// в который будем возвращать результат выполнения sql-запроса 
while (rdr.Read()) //цикл для чтения возвращённых данных
{
label_read.Text=Convert.ToString(rdr.GetDouble(0)); // выводим результат запроса в элемент Label label_read
}
rdr.Close(); 
connection.Close(); // закрываем соединение с базой
}

Программа готова, осталось скомпилировать и запустить её на контроллере XPac - результатом работы будет считывание сигнала с модуля аналогового ввода i-8017HCW, запись полученных значений в локальную базу данных Compact SQL и вывод их в консоль для контроля в реальном времени; также программа позволяет, указав при этом дату и время записи, считать любое записанное значение.

Работа контроллера с удалённой базой данных MySQL

Программирование контроллера для работы с базой данных MySQL аналогично работе с базой Compact SQL, за отличием использования другой библиотеки - MySql.Data.MySqlClient

Разберём основные отличия работы с базой MySQL от работы с базой SQL Server Compact на примере, описанном выше:

 

using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient; // библиотека для работы с базой MySQL
using pac8017HWNet;
namespace SmartDeviceProject7
{
public partial class Form1 : Form
{
MySqlConnection conn = new MySqlConnection("server=192.168.1.151;user=root;port=3306;password=123456;");
 // параметры для подключения к MySQL-серверу
MySqlCommand cmd = new MySqlCommand();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
conn.Open();
cmd.Connection = conn;
cmd.CommandText = "CREATE DATABASE if not exists test"; // описываем запрос на создание базы "test", если она не существует
cmd.ExecuteNonQuery(); // выполняем запрос на создание базы
cmd.CommandText = "use test; CREATE TABLE if not exists test_table(time timestamp PRIMARY KEY, value float)";
// данный запрос содержит в себе два запроса:
// 1. выбираем в качестве рабочей базу "test"
// 2. при отсутствии в базе "test" таблицы "test_table" создаём её
cmd.ExecuteNonQuery(); // выполняем запрос
}
private void timer1_Tick(object sender, EventArgs e)
{
float fValue=0;
pac8017HW.Init(2);
pac8017HW.ReadAI(2, 0, 4, ref fValue);
label_read.Text = Convert.ToString(fValue);
DateTime time = DateTime.Now;
string str1 = Convert.ToString(fValue);
cmd.Connection = conn;
cmd.CommandText = string.Format("INSERT INTO test_table(value) VALUES ('{             0             }')", str1); 
// запрос для записи в базу считанного показателя тока с модуля i-8017HCW
// передаём лишь 1 параметр, а не 2, как в предыдущем примере,
// так как поле time генерируется автоматически с текущим времени записи
cmd.ExecuteNonQuery(); // выполняем запрос
}
private void button_read_Click(object sender, EventArgs e)
{
cmd.Connection = conn; // определяем экземпляр cmd для sql-запроса
cmd.CommandText = string.Format("select value from test_table where time='{          0          }'", text_read.Text);
// формируем строку sql-запроса 
MySqlDataReader rdr =// инициализируем экземпляр rdr,
// в который будем возвращать результат выполнения sql-запроса
MySqlCommand readCmd = new MySqlCommand(cmd.CommandText, conn);
// инициализируем команду readCmd для запроса в базу
rdr = readCmd.ExecuteReader(); // выполняем sql-запрос
while (rdr.Read()) //цикл для чтения возвращённых данных 
{
label_read.Text=rdr.GetString(0); // выводим возвращённый результат в элемент Label label.read
}
rdr.Close();
}
private void Form1_Closed(object sender, EventArgs e)
{
conn.Close();
}
}
}

Программа готова, а так как она аналогична предыдущему примеру, то результатом её работы будет то же самое - чтения сигналов с модуля ввода, отображение их в консоли и запись этих данных в базу.

Эти небольшие примеры иллюстрируют, насколько прост процесс создания программного кода для работы с базами данных на промышленных контроллерах под Windows CE.

 

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

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

Программирование контроллера под Windows CE. Обмен данными с панелью оператора по Modbus TCP ➦

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

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