СпойлерПоказать
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.
Код: Выделить всё
(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
Код: Выделить всё
$>screen /dev/ttyUSB0 2400
Попадаем в терминал контроллера UPS
Набираем Q1<Enter>
Получаем:
(225.5 225.3 227.8 007 50.0 13.6 25.0 00001001
или другим приложением:
Код: Выделить всё
$>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
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);
Код: Выделить всё
root@orangepiplus2:~# sudo usermod -a -G dialout www-data
root@orangepiplus2:~# groups www-data
www-data : www-data dialout audio
root@orangepiplus2:~#
СпойлерПоказать
Код: Выделить всё
<?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...
?>
Мы должны увидеть
Код: Выделить всё
Serial
(226.5 226.4 229.9 007 50.1 13.6 25.0 00001001
СпойлерПоказать
Код: Выделить всё
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();
footer: Собственно, дальше можно собирать свои алгоритмы, я пока вписал метод в ежеминутный опрос и вот что получил:
СпойлерПоказать