Подключение UPS оборудования к MajorDomo по RS232

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
AndrewS
Сообщения: 123
Зарегистрирован: Пт апр 15, 2016 10:18 am
Откуда: 21RU
Благодарил (а): 5 раз
Поблагодарили: 20 раз
Контактная информация:

Подключение UPS оборудования к MajorDomo по RS232

Сообщение AndrewS » Пн авг 29, 2016 10:05 am

Pre: Лежал у меня UPS Ippon Back Power, один из самых дешевых, люди выкидывают UPS просто потому, что не знают, что им нужно только поменять АКБ.
СпойлерПоказать
Изображение
Sub: Но, нам не важно, каким устройством управлять, попробуем на примере Ippon UPS. Главное узнать какими он данными обменивается, мне повезло, я нашел протокол на сайте производителя ->>Протокол передачи данных по СОМ порту в Commander Pro<<-, он у всех моделей Ippon одинаковый. Если вы не смогли найти протокол для своего оборудования, есть более сложный способ при помощи перехватчиков данных com-порта, но об этом не в этом топике.
Protocol:
СпойлерПоказать

Код: Выделить всё

CENTRALION COMMUNICATIONS PROTOCOL
Computer will control information exchange by a query followed by <cr>. UPS will respond with information followed by a <cr> or action.
B. Hardware:
            BAUD RATE............... : 2400 bps
            DATA LENGTH.......... : 8 bits
            STOP BIT..................... : 1 bit
            PARITY........................ : NONE

            CABLING :
               COMPUTER                  UPS
            ===================================
                  RX   <----------   TX  (pin 2)
                  TX    ---------->  RX  (pin 3)
                  GND  <------->   GND (pin 5)
                  (9 pins female D-type connector)

C. COMMUNICATIONS PROTOCOL:
1. Status Inquiry:

Computer : Q1<cr>
        UPS      : UPS status data stream, such as
             (MMM.M NNN.N PPP.P QQQ RR.R S.SS TT.T  b7b6b5b4b3b2b1b0<cr>
...

Example:    Computer : Q1<cr>
    UPS : (208.4 140.0 208.4 034 59.9 2.05 35.0 00110000<cr>

                    Means :  I/P voltage is 208.4V.
                                  I/P fault voltage is 140.0V.
                                  O/P voltage is 208.4V.
                                  O/P current is 34 %.
                                  I/P frequency is 59.9 HZ.
                                  Battery voltage is 2.05V.
                                  Temperature is 35.0 degrees of centigrade.
                                  UPS type is on-line , UPS failed. AVR
                                  active , and shutdown not active.
 
Query: Из приведенного куска протокола с примерами видим, что все просто, отправляем Q1 и возврат каретки. Получаем строку вида:

Код: Выделить всё

(208.4 140.0 208.4 034 59.9 2.05 35.0 00110000<cr> 
Где мы видим, последовательно, через пробел перечислены напряжения, мощности, частоты, температуры и цифровые состояния.
Task: Задача собрать все нужные нам данные и отправлять, в случае необходимости, в микроконтроллер необходимые данные.
Conn: Подключение. У меня экземпляр устройства, почему то, оказался без USB. Я использовал шнур от старого телефонного кабеля на микросхеме PL-2303

Код: Выделить всё

$> lsusb
Bus 002 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Проверяем в терминале получение данных:

Код: Выделить всё

$>ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1
Один порт у меня был занят ESP8266 и это был USB1

Код: Выделить всё

$>screen /dev/ttyUSB0 2400
Попадаем в терминал контроллера UPS
Набираем Q1<Enter>
Получаем:
(225.5 225.3 227.8 007 50.0 13.6 25.0 00001001
Выходим сочетанием клавиш Ctr+a, затем "k", "y"
или другим приложением:

Код: Выделить всё

$>miniterm.py -p /dev/ttyUSB0 -b 2400
--- Miniterm on /dev/ttyUSB0: 2400,8,N,1 ---
--- Quit: Ctrl+]  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
(226.1 226.1 230.0 007 50.0 13.6 25.0 00001001
Q1
Данные получены, теперь нужно завести их в MJD.
Data: Заводить данные будем при помощи PHP и библиотеки php_serial.class.php
Она приспособлена для подключения COM-портов напрямую, в нашем случае надо поменять 2 строчки:

Код: Выделить всё

88                 if (preg_match("@^COM(\d+):?$@i", $device, $matches))
на                if (preg_match("@^ttyUSB(\d+):?$@i", $device, $matches))
и
90                    $device = "/dev/ttyS" . ($matches[1] - 1);
на                     $device = "/dev/ttyUSB" . ($matches[1] - 1);
Но для того чтобы PHP мог открывать порт, нужно добавить пользователя от которого запускается PHP в группу dialout, у меня www-data

Код: Выделить всё

root@orangepiplus2:~# sudo usermod -a -G dialout www-data
root@orangepiplus2:~# groups www-data
www-data : www-data dialout audio
root@orangepiplus2:~#                
Apache: Теперь, проверяем получение данных в браузере. Для этого я в корне MJD создал папку tmp и положим туда 2 файла, первый - библиотека php_serial.class.php, которую мы правили, а второй test.php, с таким содержимым:
СпойлерПоказать

Код: Выделить всё

<?php
echo "Serial<br>";
error_reporting(E_ALL);
ini_set('display_errors', '1');
include "php_serial.class.php"; 

// Let's start the class 
$serial = new phpSerial; 

// First we must specify the device. This works on both linux and windows (if 
// your linux serial device is /dev/ttyS0 for COM1, etc) 
$serial->deviceSet("/dev/ttyUSB0");
$serial->confBaudRate(2400);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);

// Then we need to open it 
$serial->deviceOpen(); 
// To write into 
$serial->sendMessage("Q1\r",0.7);
// Or to read from 
$read = $serial->readPort();

echo $read;

$serial->deviceClose();
// If you want to change the configuration, the device must be closed
// We can change the baud rate 
// etc... 
?>
Теперь по адресу http://IP_MJD/tmp/test.php
Мы должны увидеть

Код: Выделить всё

Serial
(226.5 226.4 229.9 007 50.1 13.6 25.0 00001001
MJD: На этой стадии я пока нахожусь, изучаю строение MJD. Создаем в объектах родительский класс UPS, в нем создаем метод IpponUPS с кодом
СпойлерПоказать

Код: Выделить всё

error_reporting(E_ALL);
ini_set('display_errors', '1');

include_once('php_serial.class.php');

$serial = new phpSerial;

$serial->deviceSet("/dev/ttyUSB0");
$serial->confBaudRate(2400);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);

// Then we need to open it 

$serial->deviceOpen(); 
$serial->sendMessage("Q1\r",0.7);
$read = $serial->readPort();

$this->setProperty("InputData",$read);
preg_match('/(\d+.\d?) (\d+.\d?) (\d+.\d?) (\d+.\d?) (\d+.\d?) (\d+.\d?) (\d+.\d?) (\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)/',$read,$matches);
$this->setProperty("InputVoltage",$matches[1]);
$this->setProperty("FaultVoltage",$matches[2]);
$this->setProperty("OutputVoltage",$matches[3]);
$this->setProperty("Current",$matches[4]);
$this->setProperty("Freq",$matches[5]);
$this->setProperty("Vbat",$matches[6]);
$this->setProperty("Temp",$matches[7]);
$this->setProperty("StatusUtilityFail",$matches[8]);
$this->setProperty("StatusBatteryLow",$matches[9]);
$this->setProperty("StatusAVR",$matches[10]);
$this->setProperty("StatusUPSFailed",$matches[11]);
$this->setProperty("StatusUPSType ",$matches[12]);
$this->setProperty("StatusTestProgress",$matches[13]);
$this->setProperty("StatusShutdownActive",$matches[14]);
$this->setProperty("StatusBeeper",$matches[15]);
$serial->deviceClose();
Создаем новый объект Ippon, теперь через его метод (Вызов метода: По ссылке:) запускаем обмен, получаем набор данных.
footer: Собственно, дальше можно собирать свои алгоритмы, я пока вписал метод в ежеминутный опрос и вот что получил:
СпойлерПоказать
Screenshot (5).png
Screenshot (5).png (72.55 КБ) 4347 просмотров
За это сообщение автора AndrewS поблагодарил:
xor (Сб ноя 14, 2020 12:27 am)
Рейтинг: 1.18%
Слабость - велика, а сила - ничтожна.
ARMBIAN 5.38 stable Debian GNU/Linux 9 (stretch) 4.14.18-sunxi
System load: 2.03 1.85 1.78 Up time: 23 days
Memory usage: 65 % of 2014MB CPU temp: 37°C
Orange Pi Plus 2 H3 Quad Core 1.6GHZ 2GB
Altsky
Сообщения: 16
Зарегистрирован: Вс май 24, 2020 9:24 am
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Подключение UPS оборудования к MajorDomo по RS232

Сообщение Altsky » Пт ноя 13, 2020 1:27 pm

Как подключить такое оборудование используя преобразователь moxa nport rs232 через ethernet к МД? Может какой готовый модуль подойдет? протокол обмена

Код: Выделить всё

1	Inquiry Command
1.1	QPI<cr>: Device Protocol ID Inquiry
Computer: QPI<CRC><cr>
Device: (PI<NN> <CRC><cr>
N is an integer number ranging from 0 to 9.
Function: To request the device Protocol ID.
Protocol ID distribution: 30 for Axpert KS series
1.2	QID<cr>: The device serial number inquiry
Computer: QID <CRC><cr>
Device: (XXXXXXXXXXXXXX <CRC><cr>
1.3	QVFW<cr>: Main CPU Firmware version inquiry
Computer: QVFW<CRC><cr>
Device: (VERFW:<NNNNN.NN><CRC><cr>
<N> is a HEX number from 0...9 or A…F.
Example:
Computer: QVFW<CRC><cr>
Device: (VERFW:00123.01<CRC><cr>
00123: firmware series number;01:version
Armbian Bionic with Linux 5.7.15-sunxi на cubietruck
Аватара пользователя
xor
Сообщения: 1812
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 225 раз
Поблагодарили: 549 раз

Re: Подключение UPS оборудования к MajorDomo по RS232

Сообщение xor » Сб ноя 14, 2020 12:28 am

отличная работа! на винде с этим упсом пользуюсь готовой программкой ups assistent, за протокол спасибо
https://www.foxylab.com/UPSAssistant.php?ru
2020-11-14_00-32-44.png
2020-11-14_00-32-44.png (31.12 КБ) 1149 просмотров
AndrewS
Сообщения: 123
Зарегистрирован: Пт апр 15, 2016 10:18 am
Откуда: 21RU
Благодарил (а): 5 раз
Поблагодарили: 20 раз
Контактная информация:

Re: Подключение UPS оборудования к MajorDomo по RS232

Сообщение AndrewS » Пт дек 25, 2020 10:58 pm

Altsky писал(а):
Пт ноя 13, 2020 1:27 pm
Как подключить такое оборудование используя преобразователь moxa nport rs232 через ethernet к МД? Может какой готовый модуль подойдет? протокол обмена

Код: Выделить всё

1	Inquiry Command
1.1	QPI<cr>: Device Protocol ID Inquiry
Computer: QPI<CRC><cr>
Device: (PI<NN> <CRC><cr>
N is an integer number ranging from 0 to 9.
Function: To request the device Protocol ID.
Protocol ID distribution: 30 for Axpert KS series
1.2	QID<cr>: The device serial number inquiry
Computer: QID <CRC><cr>
Device: (XXXXXXXXXXXXXX <CRC><cr>
1.3	QVFW<cr>: Main CPU Firmware version inquiry
Computer: QVFW<CRC><cr>
Device: (VERFW:<NNNNN.NN><CRC><cr>
<N> is a HEX number from 0...9 or A…F.
Example:
Computer: QVFW<CRC><cr>
Device: (VERFW:00123.01<CRC><cr>
00123: firmware series number;01:version
CRC - это просто алгоритм вычисления контрольной суммы, CR - символ возврата каретки. С виде ничего сложного, просто я не вижу в протоколе полезных данных
Слабость - велика, а сила - ничтожна.
ARMBIAN 5.38 stable Debian GNU/Linux 9 (stretch) 4.14.18-sunxi
System load: 2.03 1.85 1.78 Up time: 23 days
Memory usage: 65 % of 2014MB CPU temp: 37°C
Orange Pi Plus 2 H3 Quad Core 1.6GHZ 2GB
Ответить