Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18080203
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: BSD

2008-04-07 18:08:31

0xEaa13

由于某种原因,弄得经常停电,对家里的服务器造成了危害。所以弄来了一台老的SANTAK M500W UPS,型号比较老了,所以没有数据接口,停电之后仍旧只能支持几十分钟,如果供电不恢复的话还是没用,所以准备对UPS进行改造。

首先要为UPS写一个支持程序,目的是让系统掉电候自动执行关机指令。我用的是FreeBSD,此系统下的串口编程资料很少,我找了很久才勉强找到几篇国外的文章。

程序如下:
格式化的程序在这里

+++++++++++++++++++++++++++++++++++++++++

#include
#include
#include
#include
#include
#include
#include
#include
#include
static fd = 0;

help()
{
printf("0xEaa13`s UPS Daemon Version 1.0\n\
Usage: ./ups-daemon device-name\n\
\nWritten by 0xEaa13\n\
Host:\n\
E-MAIL: eaa13_at_bsdmail.org\n\
");
exit(0);
}

int
main(int argc, char **argv)
{
int count = 0;
int ledon;
int ledoff;
pid_t pid;
int status;
ledon |= TIOCM_DTR;
ledoff &= ~TIOCM_DTR;

if (argc != 2)
help();
/* open device */
fd = open(argv[1], O_RDWR | O_NDELAY);
if (fd < 0) {
printf("Open device %s error!\n", argv[1]);
exit(2);
}
if ((pid = fork()) < 0) {
printf("Fork error!\n");
exit(1);
} else if (pid > 0) {
printf("Start daemon OK!\nPid is:%d\n", pid);
exit(0);
}
while (1) {
ioctl(fd, TIOCMSET, &ledoff);
sleep(1);
ioctl(fd, TIOCMSET, &ledon);
sleep(1);

ioctl(fd, TIOCMGET, &status);
if (status & TIOCM_CAR) {
int i;
for (i = 0; i < 2; i++) {
sleep(60);
ioctl(fd, TIOCMGET, &status);
if (status & TIOCM_CAR) {
count++;
}
}

if (count == 2) {
system("/sbin/shutdown -p now");
} else {
count = 0;
}
}
}
}


+++++++++++++++++++++++++++++++++++++++++++++++
下面是串口部分线路图

点击看原图![清晰]

程序是通过TICOMSET/GET ioctl()函数来对串口进行操作的,程序使用了DB9串口的3个脚:1-DCD,4-DTR,5_GND。先用ioctl(fd, TIOCMSET, &ledoff);使4脚DTR变为低电平,LED不亮,sleep(1);之后用ioctl(fd, TIOCMSET, &ledon);使LED持续点亮,同时把4脚的高电平信号用于1脚DCD信号的采样,如果1-4之间的光耦关闭,1脚就得不到4脚的高电平信号,程序便认为UPS不工作,LED持续闪烁。如果UPS工作,把光耦打开了,程序便会进入监视程序,在3分钟内完成3次检测,如果3次结果都是UPS工作,程序便发出指令使系统关机。

下面是程序的使用方式:
# gcc -o ups-d ups-d.c
# ./ups-d /dev/cuaa0(第一个串口)
Start daemon OK!
Pid is:1362
# (程序已经fork成daemon进程了)
程序正常工作的时候你将会看见LED持续闪烁,当检测到UPS工作的时候LED常亮,说明进入了监视程序。
程序这边已经完成,现在要解决的问题是改造UPS的电路,使其能在工作的时候发给程序信号。
UPS部分电路改造:

点击看原图![清晰]

UPS工作时由一驱动IC通过一1k电阻驱动UPS面板上的橙色LED发光,现在在1k电阻上并联一只PC817光耦,光耦另一端接串口的1脚和4脚,这样当LED点亮的同时也驱动光耦工作。

下面是几张实物图:

拆开后的SANTAK M500W UPS:


光耦的接线:


用热缩管封起来的光耦:



改造完的UPS:



连接图-1:



连接图-2:



系统全貌:



好了,现在整个系统已经完成,有任何问题可以和我联系。
阅读(643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~