网站首页 - 关于我们 - 团队成员 - 联系我们

 rss
♀ 您现在的位置在:首页 -> CNFUG期刊 -> 正文(阅读
在FreeBSD下UPS的改造

0xEaa13 <blue@bsdmail.org>

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

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
static fd = 0;

help()
{
printf("0xEaa13`s UPS Daemon Version 1.0\n\
Usage: ./ups-daemon device-name\n\
\nWritten by 0xEaa13\n\
Host:http://eaa13.dns0755.net\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:



系统全貌:



好了,现在整个系统已经完成,有任何问题可以和我联系。

网友评论  以下本论与CNFUG(China FreeBSD User Group)立场无关
网友:yzz163 发表时间:2005年03月01日

看不到图了?

网友:chunyv 发表时间:2005年03月24日

94 啊 !!

我也说几句




推荐给好友

  


文章下载

本功能正在开发中,目前不能使用,敬请原谅。

√ 期刊在线投稿: /journal/contribute.html

√ 本文打印于《CNFUG期刊》,欢迎访问 http://www.cnfug.net 获取更多技术文章。