synaser + UPS

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

synaser + UPS

Сообщение jhonyxakep » 23.08.2010 15:18:07

Здравствуйте!

Раньше сидел на винде на делфях, там написал программку для работы с UPSками по COM порту. Пересел на Лазарус, поставил synaser

Код: Выделить всё
    ser:=TBlockSerial.Create;
    ser.Connect('COM1');
    ser.config(2400,8,'N',SB1,false,false);


вроде-бы все нормально. Эти настройки использовал на всех ОС, все работало.

Дальше я делаю

Код: Выделить всё
       ser.SendString('Q1');
      label1.caption :=  ser.Recvstring(1000); 


Те в label1 должна появиться строка типа
Код: Выделить всё
(220.0 220.0 99 99 000100
и #13 на конце.

А label1 у меня пустой.

Что я не так делаю?


И еще ser.LastErrorDesc при коннекте говорит что устройство занято, хотя minicom успешно работает си УПС
Аватара пользователя
jhonyxakep
новенький
 
Сообщения: 24
Зарегистрирован: 23.08.2010 14:45:35

Re: synaser + UPS

Сообщение serg_iv » 24.08.2010 10:10:49

Попробуй побайтно принять, что нибудь пересылает обратно?
Возможно на конце строки не тот завершающий символ

Recvstring

Declaration public function Recvstring(timeout: integer): string; virtual;
Description Этот метод ждет, пока законченная строка данных не получена. Строка заканчивается последовательностью CR/LF. Получившаяся строка возвращается без признака конца (CR/LF )! Если никакие данные не получены в пределах блокировки времени (в миллисекундах) период, LastError (?) вырабатывает ErrTimeout (?).
Если ConvertLineEnd (?) используется, то последовательность CR/LF возможно не точно CR/LF. См. описание ConvertLineEnd (?).
Этот метод служит для выполнения протокола линии связи и использует его собственные буфера, чтобы развернуть работу. Поэтому не используйте этот метод с методом RecvBuffer (?), чтобы получить данные, поскольку это может вызвать потерю данных.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: synaser + UPS

Сообщение jhonyxakep » 27.08.2010 15:49:38

serg_iv писал(а):Попробуй побайтно принять, что нибудь пересылает обратно?
Возможно на конце строки не тот завершающий символ


Неа, пусто. Все таки устройство при инициализации влзвращает ошибку - устройство занято, но на самом деле оно не занято.


serg_iv писал(а):Recvstring

Declaration public function Recvstring(timeout: integer): string; virtual;
Description Этот метод ждет, пока законченная строка данных не получена. Строка заканчивается последовательностью CR/LF. Получившаяся строка возвращается без признака конца (CR/LF )! Если никакие данные не получены в пределах блокировки времени (в миллисекундах) период, LastError (?) вырабатывает ErrTimeout (?).
Если ConvertLineEnd (?) используется, то последовательность CR/LF возможно не точно CR/LF. См. описание ConvertLineEnd (?).
Этот метод служит для выполнения протокола линии связи и использует его собственные буфера, чтобы развернуть работу. Поэтому не используйте этот метод с методом RecvBuffer (?), чтобы получить данные, поскольку это может вызвать потерю данных.


А можно ссыль на етот мануал?
Аватара пользователя
jhonyxakep
новенький
 
Сообщения: 24
Зарегистрирован: 23.08.2010 14:45:35

Решение

Сообщение jhonyxakep » 30.08.2010 04:45:02

Для всех кто будет вытворять подобное, мое решение проблемы:

Код: Выделить всё
ser:=TBlockSerial.Create;
ser.LinuxLock := false; //Только для *nix овых систем. Без этого параметра не робит.
ser.Connect('com1'); //Подключаемся к порту
ser.config(2400,8,'N',SB1,false,false); //стандартные настройки com порта для всех UPS


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

//Для вывода статистики с устройства: (протокол Megatec)

     ser.SendString('Q1'+#13); //команда вывода статистики
     lst1.lines.Text := ser.RecvBufferStr(47,5000);  //сообщение из 47 байт


Вот описание формата сообщения:

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>

UPS status data stream :
There should be a space character between every field for data separation. The meaning of each field is list as followed:

a. Start byte : (

b.I/P voltage : MMM.M
M is and integer number ranging from 0 to 9. The unit is Volt.

c.I/P fault voltage : NNN.N
N is and integer number ranging from 0 to 9. The unit is Volt.

** For OFF LINE UPS**

Its purpose is to identify a short duration voltage glitch which cause OFF line UPS to go to Inverter mode. If this occurs, the input voltage will appear normal at query prior to glitch and will still appear normal at next query.

The I/P fault voltage will hold glitch voltage till next query. After query, the I/P fault voltage will be same as I/P voltage until next glitch occurs.

** For ON LINE UPS**

Its purpose is to identify a short duration utility fail which cause ON line UPS to go to battery mode. If this occurs input voltage will appear normal at query prior to fail and will still appear normal at next query.

The I/P fault voltage will hold utility fail voltage till next query. After query, the I/P voltage will be same as I/P voltage until next utility fail occurs.

d.O/P voltage : PPP.P
P is an integer number ranging form 0 to 9. The unit is Volt.

e.O/P current : QQQ
QQQ is a percentage of maximum current, not an absolute value.

f.O/P frequency : RR.R
R is an integer number ranging from 0 to 9. The unit is Hz.

g.Battery voltage : SS.S or S.SS
S is an integer number ranging from 0 to 9. For on-line units battery voltage/cell is provided in the form S.SS. For standby units actual battery voltage is provided in the form SS.S. UPS type in UPS status will determine which reading was obtained.


h.Temperature : TT.T
T is an integer number ranging form 0 to 9. The unit is degree celsius.

i.UPS Status : <U>
<U> is one byte of binary information such as <b7b6b5b4b3b2b1b0>. Where bn is a ASCII character ‘0’ or ‘1’.

UPS status :
Bit
Description
7
1 : Utility Fail (Immediate)
6
1 : Battery Low
5
1 : AVR 0:NORMAL
4
1 : UPS Failed
3
1 : UPS Type is Line-Interactive (0 is On_line)
2
1 : Test in Progress
1
1 : Shutdown Active
0
1 : Beeper On

j.Stop Byte : <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.



Код: Выделить всё
//Запуск теста на 10 секунд
  ser.SendString('T'+#13);

//Отключение/Включение звука
  ser.SendString('T'+#13);


Остальные параметры я не использую. :D

ЗЫ Еще если кому надо: Примерный минимальный разряд батареи 12.5 Вольт, максимальный 13.6 Вольт. Примерное время работы типичного оффисного компьютера от IPPON PowerBack 600 - 5 минут.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
jhonyxakep
новенький
 
Сообщения: 24
Зарегистрирован: 23.08.2010 14:45:35

Re: synaser + UPS

Сообщение trifon » 01.09.2010 02:01:59

Зачем minicom? Есть проверенные годами Network-UPS Tools

Вот к примеру вывод для моего UPS
Код: Выделить всё
battery.charge: 92.5
battery.voltage: 13.40
battery.voltage.nominal: 12.0
device.mfr: unknown
device.model: unknown
device.serial: unknown
device.type: ups
driver.name: megatec
driver.parameter.lowbatt: 50
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttyS0
driver.version: 2.4.3
driver.version.internal: 1.6
input.frequency: 49.9
input.frequency.nominal: 50.0
input.voltage: 225.8
input.voltage.fault: 225.8
input.voltage.maximum: 227.6
input.voltage.minimum: 216.6
input.voltage.nominal: 230.0
output.voltage: 225.8
ups.beeper.status: enabled
ups.delay.shutdown: 0
ups.delay.start: 2
ups.load: 13.0
ups.mfr: unknown
ups.model: unknown
ups.serial: unknown
ups.status: OL
ups.temperature: 25.0
ups.type: standby


Для него есть GUI фронтенд под KDE
knutclient
Так что вряд ли ваша программа будет востребована
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Re: synaser + UPS

Сообщение jhonyxakep » 03.09.2010 16:47:02

minicom - Аналог Hyper Terminal

Во 2 мне требуеться написать конкретное КРОССПЛАТФОРМЕННОЕ ПО.
В 3 проще поставить 50 копий моей программы, чем настраивать эти УПС тулз, и УПС ассистент для винды.
В 4 эта программа - вообще для отдельного учереждения =)
И в 5 - возможность расширяемости конкретно в ту сторону, в какую мне надо. Хоть запуск ракеты в космос, и нажатие на красную кнопку. В linuxе конечно можно обойтись скриптами, ну а в виндоус?
Аватара пользователя
jhonyxakep
новенький
 
Сообщения: 24
Зарегистрирован: 23.08.2010 14:45:35

Re: synaser + UPS

Сообщение Maxx_ir » 03.09.2010 18:16:35

Вот мой мини-терминал который пользую уже несколько лет для
отладочной связи с микроконтроллерами.
Собирался и тестировался: DSL LINUX (gtk1), PUPPYRUS, Mandriva,
SLAX,WIN2k, XP.
Совет при соединении переключите прием на режим "HEX",
там большие потоки символов некорректно отображаются
в символьном режиме.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Maxx_ir
новенький
 
Сообщения: 12
Зарегистрирован: 24.02.2008 20:52:00
Откуда: Тольятти


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

Рейтинг@Mail.ru