Регистрация данных в энергетическом секторе с помощью аппаратных и программных средств с открытым исходным кодом

Солнечные батареи, Arduino, PHP, MySQL и Flotr

В статье описывается мониторинг простых климатических условий с помощью устройства Arduino в процессе генерации электроэнергии с помощью солнечных батарей. В частности, излагаются базовые сведения по измерению температуры с помощью чипа TMP36 и силы света с помощью светодиода, а также по хранению собираемой информации для последующего извлечения. Кроме этого, рассматривается такие вопросы, как сглаживание избранных результатов и отображение их в виде графиков. Для решения вышеперечисленных задач применялись следующие инструменты: PHP в качестве процессора обработки данных, MySQL® в качестве хранилища данных и Flotr в качестве библиотеки для создания графиков.

Колин Бекингем, исследователь и автор, Freelance

Колин Бекингем (Colin Beckingham) ― независимый исследователь, писатель и программист из Канады. Имеет ученые степени Королевского университета в Кингстоне и Университета Виндзор. Работал в самых разных областях, включая банковские услуги, садоводство, конные скачки, преподавание, гражданскую службу, розничную торговлю, а также путешествия и туризм. Автор приложений на основе баз данных и многочисленных статей в газетах, журналах и в Интернете. В круг его научных интересов входят программирование с открытым исходным кодом, VoIP и управляемые голосом приложения для Linux. Адрес для контактов: colbec@start.ca.



15.03.2013

Обзор

По мере того, как генерация электроэнергии развивается в направлении более чистых и более «разумных» источников, фотогальванические панели малого размера все чаще находят свое место на крышах зданий и на задних дворах. Некоторые из таких установок имеют весьма изощренную конструкцию с высоким уровнем мониторинга и самонастройки, другие же не обладают никакими средствами самоанализа. В последнем случае для владельца такой установки весьма полезным является наличие хорошего и недорого источника базовых технико-эксплуатационных данных.

Каждый владелец хотел бы знать, насколько оптимально работают его солнечные панели в заданных условиях. На выходные показатели панели влияют освещенность и температура, а также скорость ветра и некоторые другие факторы. Чем лучше освещенность, тем больше генерируемая мощность, однако чем больше мощности генерируют элементы, тем больше они нагреваются, что снижает их эффективность. Воздушный поток способствует рассеиванию выделяемого тепла. В идеале мы хотели бы иметь яркий свет и прохладную окружающую среду, а также хороший обдув или иной источник искусственного охлаждения.

Устройство Arduino действует в качестве посредника между датчиками и хранилищем данных. Это позволяет легко реализовать непрерывную запись данных с последующим их отображением в необходимом виде. В статье рассматривается регистрация температурных данных с использованием датчика температуры TMP36 и простого светодиода в качестве светочувствительного элемента.


Arduino

Arduino — это недорогой, адаптируемый и программируемый микропроцессор с открытой архитектурой, способный считывать входные данные в форме напряжения на своих аналоговых контактах. В разделе Ресурсы приведены ссылки на базовую информацию об этом устройстве и на хорошую вводную статью на Web-сайте developerWorks по использованию этого устройства в игровом контексте. Если к определенным входным контактам этого устройства подключить датчики, то оно будет программным способом считывать информацию с этих контактов. Что оно будет дальше делать с этой информацией? Это зависит от того, каким образом вы сконфигурируете имеющиеся у вас аппаратные средства.

Простейший способ получения данных от Arduino состоит в подключении этого устройства непосредственно к USB-интерфейсу хост-компьютера, который будет считывать данные так, как будто они поступают по последовательному соединению. Кроме того, это устройство способно действовать независимо от хост-компьютера — при наличии источника питания и альтернативного канала связи. Arduino поддерживает подключение плат расширения (Shield), которые обеспечивают реализацию таких функций, как сохранение данных непосредственно на карте памяти типа microSD, передача данных по сетевому Ethernet-кабелю категории cat5 на компактный Web-сервер или даже беспроводная передача данных на совместимое приемное устройство.

Рисунок 1, демонстрирующий микропроцессор Arduino со смонтированной на нем платой расширения Ethernet Shield и подключенными Ethernet-кабелем cat5 и кабелем питания, позволяет получить представление о размерах этого устройства.

Рисунок 1. Устройство Arduino с подключенной Ethernet-платой
Photo of the Arduino with an ethernet assembly attached.

Некоторые датчики имеют встроенные схемы для сглаживания данных. Простейшие датчики лишены таких возможностей. Таким образом, возникает вопрос, должно устройство Arduino осуществлять какую-либо необходимую обработку информации перед сохранением или отправкой, или данные должны передаваться в «сыром» виде для последующей обработки на другом компьютере. Каждый из этих вариантов является вполне приемлемым. В описываемом проекте исходные данные наблюдений представляются для последующей обработки. При необходимости это позволяет в любой момент изменить алгоритм сглаживания. В случае применения процесса сглаживания его результаты являются необратимыми. В ситуации с получением данных в реальном времени — при условии, что требования к сглаживанию хорошо проработаны — более разумным подходом было бы поручить сглаживание самому устройству Arduino.


Датчики

Arduino поддерживает работу с широким ассортиментом разнообразных датчиков. В описываемом проекте применяется простое, недорогое и легко воспроизводимое альтернативное решение на основе датчика TMP36 и светодиода.

Датчик TMP36 представляет собой транзистор специальной конструкции. При подаче на него постоянного напряжения он возвращает другое значение напряжения на своих выходных контактах, которое меняется в соответствии с температурой окружающей среды. После этого достаточно зарегистрировать выходное напряжение и выполнить некоторые простые арифметические операции для вычисления температуры в предпочтительной шкале — в градусах Цельсия или в градусах Фаренгейта. В разделе Ресурсы приведены сведения по самому чипу TMP36 и по его подключению к устройству Arduino.

На первый взгляд регистрация температурных данных при генерации электроэнергии из солнечного света выглядит достаточно простой, однако при этом необходимо преодолеть определенные проблемы. Первая проблема, касающаяся температуры окружающей среды, состоит в выборе места размещения датчика. Во избежание ложных показаний необходимо разместить датчик в месте, защищенном от прямых солнечных лучей и от неблагоприятных погодных условий, а также обеспечивающем достаточную вентиляцию. Во-вторых, батарея солнечных элементов (солнечная панель) состоит из нескольких неидентичных элементов, причем даже в одинаковых внешних условиях каждый из них имеет свою рабочую температуру. В идеальном случае можно измерять показатели всех элементов и выводить среднее значение. В качестве альтернативного варианта можно оценить несколько элементов и выбрать репрезентативный средний элемент, а затем ограничиться мониторингом только этого элемента.

Светодиод способен не только излучать свет при подаче на него определенного напряжения, но и генерировать напряжение при освещении светом от внешнего источника (ссылка на соответствующую статью приведена в разделе Ресурсы). Чем больше сила этого света, тем выше напряжение, поступающее от светодиода на входные контакты Arduino. В отличие от датчика температуры, который рассчитан на представление определенной температурной шкалы, для светодиода необходимо экспериментальным путем установить, как его выходные показатели соответствуют силе света в заданной системе единиц.

Реально работающая система

Предположим, что наша солнечная панель расположена недалеко от источника электроэнергии. При этом она не имеет Ethernet-разъема для подключения к локальной сети, но находится в зоне действия точки беспроводного доступа. В этом случае мы можем «запитать» от локального источника энергии и точку доступа, и устройство Arduino, а затем устройство Arduino вместе с Ethernet-платой расширения подключить к репитеру проводным способом. В данном случае в нашем распоряжении имеются аналоговые контакты 3 — 6 для подключения датчиков, а контакты 1 и 2 используются платой Ethernet Shield (более подробная информация об использовании штыревых контактов Arduino приведена в разделе Ресурсы). Наличие четырех штыревых контактов позволяет подключить четыре датчика, например, два датчика температуры (один датчик для измерения температуры окружающей среды и один датчик для измерения температуры панели), датчик света и датчик скорости ветра. Это весьма обширный массив данных для системы с пассивной солнечной панелью.

Физическое подключение устройства Arduino к датчикам на малых расстояниях может быть выполнено обычным телефонным кабелем категории cat3, который представляет собой неэкранированную пару проводов стандарта AWG 24 (American Wire Gauge). Кроме того, это позволяет нам использовать широко распространенные телефонные адаптеры и кабели.

Использование устройства Arduino в сочетание с платой Ethernet Shield порождает определенные трудности, поскольку платформа Arduino непосредственно поддерживает только USB-соединение и последовательное соединение. Таким образом, необходимо учитывать следующие аспекты.

  • В нормальных условиях мы не считываем напряжения с контактов, к которым не подключены датчики.
  • С помощью цилиндрического соединителя на устройство Arduino можно подавать питание с разными номиналами напряжения (см. раздел Ресурсы). Показания напряжения на аналоговом контакте устройства Arduino сильно зависят от напряжения его источника питания. Необходимо гарантировать, что калибровка датчиков осуществляется с таким же точно источником питания, какой будет применяться в реальных условиях. Продвинутые пользователи задействуют контакт Analog Reference (AREF) для получения опорного напряжения.
  • Датчик температуры следует подключать на обратную поверхность солнечного элемента. Клейкая лента для герметизации трубопроводов отопления или вентиляции (далее - герметизирующая лента) отлично подходит для кратковременного закрепления датчика на элементе даже при высоких температурах, однако при этом следует гарантировать, что все открытые провода и разъемы защищены и изолированы надлежащей изоляционной лентой. При ярком освещении, температуре окружающей среды 20° C (69° F) и устойчивом обдувающем ветре нормальная рабочая температура солнечного элемента вполне способна достигать уровня 50° C (124° F).
  • Устройство Arduino в сочетании с платой Ethernet Shield потребляет достаточно много энергии. Так, при использовании комплекта полностью заряженных батарей типа AA для питания по напряжению и по току этих батарей хватит лишь на несколько часов. Продвинутые пользователи для улучшения использования энергии прибегают к задействованию режимов «сна».

На рисунке 2 показаны датчики TMP36, закрепленные на стойке и на солнечной панели. Справа, под черной изоляционной лентой, находится датчик для регистрации температуры окружающей среды на металлической опоре. Слева находится датчик температуры, закрепленный на солнечном элементе с помощью герметизирующей ленты. Эта герметизирующая лента сохраняет клеевые свойства гораздо лучше, чем изоляционная лента потребительского уровня, по крайней мере, в краткосрочной перспективе.

Рисунок 2. Размещение температурных датчиков на панели
photo of sensors attached to a solar panel

На рисунке 3 показан зеленый светодиод, расположенный внутри перевернутой пробирки для защиты от дождя.

Рисунок 3. Датчик света
photo of the light sensor taped to a wooden post

Программа для устройства Arduino (так называемый «скетч»), обеспечивающая доступ к собранным данным, представляет собой простой Web-сервер. Пользователь общается с этим сервером через свой браузер или с помощью другого скрипта (см. Листинг 1). Этот базовый код, предоставленный сообществом Arduino в составе комплекта примеров, требует некоторого редактирования для адаптации к нашим конкретным требованиям (см. раздел Ресурсы).

Листинг 1. Web-сервер Arduino
// на основе «скетча» учебного Web-сервера с ресурса http://arduino.cc/
#include <SPI.h>
#include <Ethernet.h>
//
byte mac[] = { 0x!!, 0x!!, 0x!!, 0x!!, 0x!!, 0x!! };
byte ip[] = { 192,168,0,xxx };
Server server(80);
//
void setup()
{
  // запуск Ethernet-соединения и сервера:
  delay(10000);
  Ethernet.begin(mac, ip);
  server.begin();
}
//
void loop()
{
  // прослушивание входящих клиентов
  Client client = server.available();
  if (client) {
    // http-запрос завершается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // если вы добрались до конца этой строки 
        //(получили символ разделителя строк)
        // и эта строка пуста, то http-запрос завершился,
        // т.е., вы получили ответ
        if (c == '\n' && currentLineIsBlank) {
          // послать стандартный заголовок http-запроса
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
	  //
          // вывод значения каждого входного аналогового контакта
          for (int analogChannel = 3; analogChannel < 7; analogChannel++) {
            //client.print("analog input ");
            client.print(analogChannel);
            client.print(" : ");
            client.print(analogRead(analogChannel));
            client.println("<br />");
          }
          break;
        }
        if (c == '\n') {
          // запуск новой строки
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // вы получили символ в текущей строке
          currentLineIsBlank = false;
        }
      }
    }
    // предоставление Web-серверу времени на получение данных
    delay(1);
    // закрыть соединение:
    client.stop();
  }
}

В начале листинга 1 специфицируются заголовки необходимых библиотек, MAC-адрес платы Ethernet Shield и IP-адрес, по которому мы будем узнавать это устройство Arduino. Кроме того, настраивается объект server и переменная, используемая для хранения значения, которое впоследствии может быть отброшено. Подпрограмма setup(), исполняющаяся один раз в момент запуска, осуществляет инициализацию сервера. После этого в бесконечном цикле исполняется подпрограмма loop(), которая ждет поступления HTTP-запроса, а затем отсылает ответ на него вместе с требуемыми данными. В качестве ответа на запрос эта подпрограмма посылает стандартный заголовок HTTP-ответа, собирает данные с релевантных выводов и отсылает пакет данных в текстовом формате. В описываемом случае отсылаемые данные представляют собой напряжения, присутствующие в момент запроса на контактах с номерами 3, 4, 5 и 6. Данные по контактам 1 и 2 не отсылаются, поскольку эти контакты использует интерфейс между платой Arduino и платой Ethernet Shield. При необходимости можно изменить этот диапазон каналов, чтобы считывать данные только с реально задействованных контактов.

Выходная информация будет выглядеть примерно так, как показано в листинге 2.

Листинг 2. Выходная информация устройства Arduino
3 : 292
4 : 288
5 : 286
6 : 280

В листинге показаны номера контактов и отделенные от них двоеточиями значения показаний на этих контактах в диапазоне от 0 до 1023. Выходная информация может быть более «описательной», чем один только номер аналогового контакта, однако «родовой» номер контакта обеспечивает более высокую степень гибкости, поскольку не привязывает этот контакт к какой-либо конкретной задаче.


Хранилище данных

Теперь необходимо рассмотреть, как хранятся собираемые данные. В данном случае в качестве серверной базы данных мы используем MySQL, как показано в листинге 3.

Листинг 3. Таблица серверной базы данных
CREATE TABLE IF NOT EXISTS `readings` (
  `readid` int(11) NOT NULL AUTO_INCREMENT,
  `tstamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `pin` int(11) NOT NULL,
  `value` float NOT NULL,
  PRIMARY KEY (`readid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

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


Сбор данных и сглаживание данных

После задания серверного компонента мы можем воспользоваться языком PHP для создания запросов к Arduino, для анализа ответов и для хранения наблюдений на серверном компоненте (см. листинг 4.

Листинг 4. PHP-скрипт для регистрации данных
<?php
// чтение показаний датчиков, размещенных на солнечной панели
$fp = fopen("http://192.168.0.xxx","r");
$mysqli = new mysqli("$server",$username,$password,$mysolar);
while ($line = fgets($fp,32)) {
  $line = str_replace("
","",trim($line)); $key = substr($line,0,1); switch ($key) { case 3: // действия, подлежащие выполнению break; case 4: // действия, подлежащие выполнению break; case 5: // освещенность от светодиода, записанная «как есть» $val = (int) substr($line,4); $sql = "insert into readings values(NULL,NULL,$key,$val)"; $result = $mysqli->query($sql); //echo "val = $val\n"; break; case 6: // температура от датчика TMP36, // подключенного к задней стенке солнечного элемента $val = (int) substr($line,4); $tmp = degc($val); // convert to Celsius/Centigrade $tmp -= 5; // calibration $sql = "insert into readings values(NULL,NULL,$key,$tmp)"; $result = $mysqli->query($sql); break; default: //echo "Found strange key $key!\n"; break; } } function degc($v) { $t = $v * (5/1024); $t -= 0.5; $t *= 100; return round($t,1); } ?>

Сначала описываемый скрип открывает соединение с устройством Arduino в указателе файла для чтения. Затем он открывает соединение с серверным MySQL-компонентом для вывода данных. После этого он ждет отклика от Arduino и переходит в цикл для чтения представляемых строк. Каждая из четырех ожидаемых строк содержит HTML-тег перевода строки (break), который упрощает чтение выходной информации в браузере при тестировании. Описываемый скрипт удаляет этот тег. Результирующие строки начинаются с номера штырькового контакта, за которым следует считанное значение напряжения. После этого для каждого номера контакта конструкция типа switch осуществляет переключение на соответствующее действие в зависимости от того, какой датчик подключен к этому контакту.

На следующем шаге осуществляется калибровка. К примеру, если мы обнаружили, что датчик устойчиво завышает определенный показатель, то можем вычесть эту погрешность перед отправкой итогового значения этого показателя. Имеется специальная функция, которая преобразует измеренное напряжение датчика TMP36 в милливольтах в градусы Цельсия. Эта функция переводит значение в диапазоне 0-1023 в значение в диапазоне от 1 до 5, находит нулевую точку и умножает результат на коэффициент 100. И, наконец, она сохраняет очищенное и округленное значение в базе данных. Как узнать о том, что датчик нуждается в коррекции? Один из способов состоит в измерении показателей какого-либо элемента, который ведет себя аналогичным образом, с помощью дистанционного устройства чтения излучательной температуры.

SQL-оператор insert начинается с двух значений NULL, что позволяет серверному компоненту подставить автоматически наращиваемый идентификационный номер вместо первого из этих значений и текущую метку времени вместо второго из этих значений. Затем этот оператор вставляет номер контакта и показание для этого контакта. Вы можете задействовать этот скрипт из своего списка crontab для регулярного исполнения или запускать его по мере необходимости из командной строки..


Отображение графика

После получения данных серверным компонентом следующая задача состоит в том, чтобы упростить восприятие этих данных. Для построения диаграмм имеется несколько доступных библиотек, каждая из которых имеет свои сильные и слабые стороны. Одним из примеров является библиотека Flotr, которая с помощью JavaScript отображает график в окне браузера (см. раздел Ресурсы). Показанный в листинге 5 код читает данных из таблицы показаний и представляет сведения по температуре и освещенности в виде раздельных графиков.

Листинг 5. PHP-скрипт для генерации графиков с использованием библиотеки Flotr
<?php
// чтение данных и отображение их в виде диаграммы с помощью flotr
$doctype = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
    'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>
<head>
<title>LOG reader</title>
<meta http-equiv='Content-Type' content='text/html;charset=UTF-8' />
<script language=\"javascript\" type=\"text/javascript\"
		src=\"../flotr/lib/prototype.js\"></script>
<script language=\"javascript\" type=\"text/javascript\" 
		src=\"../flotr/lib/base64.js\"></script>
<script language=\"javascript\" type=\"text/javascript\"
		src=\"../flotr/lib/canvas2image.js\"></script>
<script language=\"javascript\" type=\"text/javascript\"
		src=\"../flotr/lib/canvastext.js\"></script>
<script language=\"javascript\" type=\"text/javascript\" 
		src=\"../flotr/flotr.js\"></script>
</head><body>";
$mysqli = new mysqli($server,$username,$password,$dbname);
// получение данных по температуре и освещенности; 
// отображение этих данных в виде диаграммы
$sensors = array('Temp'=>6,"Light"=>5);
foreach ($sensors as $label=>$sensor) {
  $sql = "select tstamp,value from readings 
	    where pin=$sensor order by tstamp asc";
  $result = $mysqli->query($sql) or die($mysqli->error);
  $mydata1 = "[ ";
  while ($row = $result->fetch_array()) {
        $cfdoy = $row[0];
        $cfdoy = (strtotime($cfdoy)-(5*60*60))*1000;
        $cfamt = $row[1];
        $mydata1 .= "[ $cfdoy , $cfamt ] ,";
  }
  $mydata1 = substr($mydata1,0,-2)." ]";
  $leg = ($sensor == 18) ? "dC" : "mV";
  $title = ($sensor == 18) ? "Cell Temperature" : "Light";
  $conth .= "<div>$label</div>\n
      <div id=\"container$sensor\" style='width:600px; height:250px;'>
      <script type='text/javascript'>
          var f = Flotr.draw(
              $('container$sensor'), [
              { // => first series
                  data: ".$mydata1.",
                  label: '$leg',   
                  htmlText: false,
                  lines: {show: true}
              }],
              {  
                xaxis: {
                  title: 'Time',
                  mode:'time', 
                  noTicks: 10,
                  labelsAngle:45 
                },
                yaxis: {
                  title: '$leg',
                  noTicks: 8
                },
                title: '$title',
                selection: {
                  mode: 'x', 
                  color: '#B6D9FF',
                  fps: 20
                },
                mouse: {
                  track: true,
                  relative: true,
                  margin: 5,
                  trackFormatter: function(obj) { 
                      var dd = parseInt(obj.x);   
                      var d = new Date(dd);
                      return (d.getHours()+4) + ':' 
			  + d.getMinutes() + ' | ' + obj.y; 
                  },
                  position: 'sw',
                  lineColor: '#FF3F19',
                  trackDecimals: 1,
                  sensibility: 2,  
                  fillOpacity: 0.4 
                }
              }  
      );
        </script></div>";
}
echo "$doctype"."<html><body>".$conth."</body></html>";
?>

Код в листинге 5 начинается с задания строки, которая запускает выводящий информацию XHTML-фрагмент, содержащий ссылку на JavaScript-библиотеки Flotr. Затем открывается соединение с MySQL-сервером, на котором хранятся данные, и настраивается массив, содержащий номера используемых контактов. В процессе пошагового прохождения по элементам этого массива осуществляется извлечение показания релевантного датчика и подстановка этого показания в JavaScript-скрипт.

Скрипт настроен таким образом, чтобы трактовать данные по оси X как значения времени в 24-часовой шкале для обоих графиков. Кроме того, он содержит инструкции для мыши, которые позволяют при перемещении пользователем курсора мыши над выходной линией отображать соответствующие координаты.

На этапе отображения данных можно подумать и об их сглаживании. Сглаживание может быть реализовано посредством применения т.н. «скользящего среднего» или другой схемы на основе взвешивания, которая смягчала бы экстремальные значения.

При использовании реальных данных, генерация которых осуществлялась описываемой установкой с дискретностью пять минут, описываемый скрипт генерирует следующий выходной график без сглаживания (см. рисунок 4). В точке размещения установки (Онтарио) в рассматриваемый период (май) имела место солнечная погода с редкой облачностью. Экземпляр этих данных можно получить в разделе Загрузка.

Рисунок 4. Пример выходной информации
example output

Обратите внимание на близкую корреляцию между уровнем освещенности и температурой элемента, чего и следовало ожидать.

Conclusion

Микропроцессор с открытой архитектурой Arduino — простое и адаптируемое устройство для получения данных в процессе генерации электроэнергии с помощью солнечного излучения. Для него доступен широкий ассортимент разнообразных датчиков. Если соответствующий датчик выдает приемлемый аналоговый сигнал (выходное напряжение) — или альтернативный цифровой сигнал — который может быть четко зарегистрирован устройством Arduino, оно способно собирать и представлять соответствующие данные. Транзистор TMP36 и светодиод в качестве датчиков — это минимально возможный базовый вариант. Серьезные пользователи воспользуются более совершенными альтернативными вариантами.

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


Загрузка

ОписаниеИмяРазмер
Пример данныхreadings.sql.zip1 KБ

Ресурсы

Научиться

Получить продукты и технологии

  • Arduino: основной Web-сайт.
  • MySQL community edition: бесплатно загружаемая версия этой СУБД с открытым кодом.
  • PHP: ознакомьтесь с новейшим выпуском этого языка написания сценариев общего назначения.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=861579
ArticleTitle=Регистрация данных в энергетическом секторе с помощью аппаратных и программных средств с открытым исходным кодом
publish-date=03152013