采用开源Zabbix+500块硬件平替5万块动环检测系统,实现UPS、温湿度、烟雾等数据采集、存储、告警、大屏展示、RS485 Modbus采集、RS232采集

采用开源Zabbix+500块硬件平替5万块动环检测系统,实现UPS、温湿度、烟雾等数据采集、存储、告警、大屏展示、RS485 Modbus采集、RS232采集

王忘杰
2024-11-19 / 0 评论 / 1,004 阅读 / 正在检测是否收录...

架构展示:
lbysqjtg.png

大屏展示:
lbysg9qo.png

所需软件:
Zabbix
Grafana
安装Zabbix-agent2的采集服务器
MThings串口调试软件
厂家自带UPS监控软件
USR-VCOM有人虚拟串口软件

所需硬件:
有人串口服务器(USR-N510)
有人串口服务器 USR-TCP232-306
自制RS485连接线
万图思睿 SD123-ST01 RS485温湿度变送器
万图思睿 SD123-SA01-R4 RS485烟感报警器

所需资料:
科士达YDC3330 modbus开发文档
YDC3330说明书

一、安装、配置串口服务器
1、硬件安装
制作UPS所需要的RS485通讯线,我使用了1、2、8,分别是485+、485-、GND地线,而12V是不需要连接的,因为我们连接的对象是UPS,它并不需要我们通过12V为其供电。
如果我们连接的是温湿度计,则需要通过12V为其供电。
c3e5ad4719fca4390726dfd4e3a3d330.jpg

YDC3330自带两个RS485接口,其支持菊花链连接,所以我使用RS485线一根接一根串起来,这样外观美观。
注意,UPS接线非常危险,注意安全!
5ab8eb5d7ec9341efbed29a8c855215b(1).jpg

串口服务器只需要将串口模式拨到RS485,并且连接电源、网线、串口线即可
63db8b799cec1c62b0a05ef450c92e17(1).jpg

2、网络更改
按串口服务器背面IP地址,登录,修改IP地址和串口参数、协议参数。
右上角更改语言,左侧更改IP地址、按UPS说明书要求调整串口内容,我这里使用的9600:8n1,下方我这里需要使用厂家的UPS软件测试,所以使用的TcpServer None,后面使用Zabbix modbus-get的时候,就需要改成ModbusTCP了
企业微信截图_20221116094429.png

二、解析文档
1、使用厂家软件测试
安装USR-VCOM有人虚拟串口软件,这个软件的作用可以理解为通过网络将串口无限延长。
串口 - 有人串口服务器 - 虚拟串口
企业微信截图_16685633845604.png

此时我们使用厂家的UPS软件,软件正常运行
企业微信截图_1667530101345.png

通过菊花链串联的方式,4台UPS都上线了,可以搜索到站号分别为1、5、6、7,这个后面要用到
企业微信截图_16681501256777.png

2、解析参数
如何获取我们需要的参数呢
假设,我们要获取A相输入电压,查看说明书
采用的modbus-RTU报文格式如图
企业微信截图_1668563729758.png
功能码对照表
企业微信截图_1668563832762.png
A相输入电压地址,大小2Byte
laizyoqy.png
按modbus-RTU组合参数,此时的报文为 01 04 75 30 00 01 XX XX

01为站号1
04为功能码,我们要取的30001在功能码中为04H读
75 30为30000的十六进制
00 01为读取一个寄存器地址,即30001的数据,同理我们要读取ABC三相输入,此处就为00 03三个寄存器地址
XX XX为校验码,modbus调试软件可以自动生成

企业微信截图_16683934749131.png

使用MThings调试,确认我们要获取的数据没问题
企业微信截图_16684121896882.png
此处发现厂家说明书印刷错误,印刷运行状态为30070,实际测试为30080
企业微信截图_16684830609591.png

三、配置Zabbix
1、修改串口服务器为modbus-tcp模式
laj094l1.png

2、通过zabbix-agent2获取数据
安装一台主机,并安装zabbix-agent2,接入zabbix

在zabbix服务器上通过命令请求数据,可以看到数据返回正常

zabbix_get -s 172.16.21.5 -k modbus.get[tcp://172.16.10.201:9000,1,4,30000,81]
zabbix_get -s 172.16.21.5 指定请求的客户端
-k modbus.get 以modbus.get方式请求
tcp://172.16.10.201:9000,1,4,30000,81 串口服务器IP端口,站号1,功能码4,从30000开始请求,请求81个寄存器数据

laj0b2bm.png

3、制作zabbix监控项
我们采用的方式是一次请求,分段解析
laj0cqf3.png

添加监控项
制作modbus-get监控项,按图片填写即可

键值:modbus.get[tcp://172.16.10.201:9000,1,4,30000,81]
信息类型:文本

laj0h9id.png

添加监控项
制作数据分类监控项,从modbus-get监控项获取数据

注意类型为:相关项目
主要项是modbus-get监控项

laj0jdc6.png
还没完,点击到进程中,此处是配置获取第几位的数值,有没有倍率关系,倍率关系看说明书

JSONPath = $[17]
自定义倍数 = 0.1

laj0l456.png

4、制作zabbix报警项
添加触发器

last(/donghuan/ups1yunxingzhuangtai)=5

当ups1yunxingzhuangtai值为5时报警,5的值在说明书中为市电中断
laj0nsib.png

拉闸测试,5s内收到微信告警
企业微信截图_16685004877857.png

添加监控数据获取失败报警

表达式: nodata(/donghuan/modbus.get[tcp://172.16.10.201:9000,7,4,30000,81],30)=1
30秒后无数据进行报警

laj1vbd5.png

四、配置大屏
Grafana正常接入Zabbix

添加一项,一看就懂
laj0qhbm.png
laj0r927.png

按自己的喜好风格制作大屏即可
企业微信截图_16685622722519.png

五、温湿度、烟雾传感器协议解析
新增内容:

lc70ah1r.png

温湿度采集
lbyscrpf.png
修改设备地址
lbysd4wi.png
烟雾采集
lbysdjvp.png
手动触发烟雾告警
lbysdz93.png
读取烟雾信号
lbyseji0.png
万图思睿的产品修改设备地址方式相同

六、施耐德APC Smart-UPS RS232采集
1、连接信息
默认波特率为2400

2、查询字符

Y 让设备进入查询模式
j 续航时间
L 输入电压
O 输出电压
C 当前温度
Q 电池状态
f 电容容量
\ 当前负载

3、发送数据
编写python程序形成UPSdata数据,格式建议为[x,y,z],便于zabbix解析
服务器安装有人vcom软件,将串口连接到服务器

zabbix_sender.exe -c zabbix_agent2.conf -k 键值 -o "发送的数据"

4、zabbix接收
创建 zabbix采集器 键值与zabbix_sender发送的键值对应
m3o4yj4z.png

5、查看接收的数据
m3o4z8kc.png

6、python采集程序示例

import serial,time,os

def main():
    # 配置串口参数
    ser = serial.Serial(
        port='COM11',  # 根据实际情况修改串口号,例如 Windows 上可能是 'COM3'
        baudrate=2400,        # 设置波特率,根据实际情况修改
        timeout=1             # 设置读取超时时间
    )

    if ser.is_open:
        print(f"串口 {ser.port} 已打开,查询 施耐德UPS 信息")
    else:
        print(f"无法打开串口 {ser.port}")
        return

    try:
        # 发送字符 'Y'
        ser.write(b'Y')


        # 等待一段时间让设备响应
        time.sleep(0.1)

        # 读取返回的数据
        response = ser.read(ser.in_waiting )  # 读取所有等待数据或至少1字节
        if response:
            UPS1_list = response.decode('utf-8', errors='ignore').splitlines()
            if UPS1_list[0] == "SM":

                try:
                    ser.write(b'jLOCQf\\Y')
                    # 等待一段时间让设备响应
                    time.sleep(0.1)

                    # 读取返回的数据
                    response = ser.read(ser.in_waiting or 100)  # 读取所有等待数据或至少1字节
                    if response:
                        UPS2_list = response.decode('utf-8', errors='ignore').splitlines()
                        if UPS2_list[7] == "SM":
                            print("续航时间"+UPS2_list[0].lstrip('0').replace(':','')+"分钟 输入电压"+UPS2_list[1]+"V 输出电压"+UPS2_list[2]+"V 当前温度"+UPS2_list[3].lstrip('0')+"摄氏度 电池容量"+UPS2_list[5]+"% 当前负载"+UPS2_list[6].lstrip('0')+"%")
                            UPS3_list = str("["+UPS2_list[0].lstrip('0').replace(':','')+","+UPS2_list[1]+","+UPS2_list[2]+","+UPS2_list[3].lstrip('0')+","+UPS2_list[5]+","+UPS2_list[6].lstrip('0')+"]")
                            command_array = ['zabbix_sender.exe','-c','zabbix_agent2.conf','-k','upsrs232','-o',UPSdata]
                            command_str = ' '.join(command_array)
                            print(command_array)
                            print(command_str)
                            result = os.popen(command_str)
                            print(result.read())
                    else:
                        print("没有接收到返回数据,连接错误")

                except Exception as e:
                    print(f"通信过程中发生错误: {e}")
            else:
                print("UPS连接错误")

        else:
            print("没有接收到返回数据,连接错误")

    except Exception as e:
        print(f"通信过程中发生错误: {e}")

    finally:
        # 关闭串口
        ser.close()
        print(f"串口 {ser.port} 已关闭")

if __name__ == "__main__":
    main()

七、小结
文章很流畅,但现实并不会如此顺利。
第一次,使用的串口线有问题,导致无法连接UPS
第二次,厂家给我发错了文档,连续一星期无法测试成功
第三次,厂家发对了文档,但是文档的内容错误,导致获取的数据不正确
半个月时间分析协议,最后接入Zabbix制作大屏仅用了半天而已
最后,Zabbix无比强大,值得深入学习!

时隔两年,增加了RS232采集
Zabbix真的太强大了

16

评论

博主关闭了所有页面的评论