Fontes de alimentação redundantes são usadas em todos os lugares. Eles fornecem alimentação ininterrupta para dispositivos de segurança e alarme de incêndio, equipamentos de controle de acesso e outros sistemas. Em nossa empresa, como tais fontes, como regra, usamos dispositivos de ZAO NVP Bolid. Alguns deles, como o RIP-12-6 / 80M3-R-RS, possuem interface RS485, o que permite que sejam incluídos no sistema de monitoramento.
Ferramentas de monitoramento
Estamos usando o Zabbix 5.2. Receberemos dados do RIP usando o protocolo Modbus RTU sobre TCP. O suporte para este protocolo é implementado no Zabbix usando o módulo carregável libzbxmodbus . Além disso, o conversor de protocolo C2000-PP (ver. 1.32) no modo “Master” e o conversor de interface serial (RS485 para Ethernet) estão envolvidos no processo de monitoramento.
Objetos de monitoramento
Para começar, vamos decidir o que exatamente podemos controlar. Da documentação para RIP-12-6 / 80M3-R-RS e S2000-PP, constatou-se que podemos contar com a obtenção do estado de sete zonas (AL) e valores numéricos de corrente e tensão. Durante os experimentos, fui capaz de reproduzir os seguintes estados do loop:
Loop # 0 Status do dispositivo
149 |
Hacking the device case |
O edifício RIP está aberto |
152 |
Restauração da caixa do dispositivo |
Prédio RIP fechado |
250 |
|
|
№1
193 |
|
|
192 |
|
|
199 |
|
|
250 |
|
|
№2
194 |
|
7,5 |
195 |
|
7,5 |
250 |
|
|
№3 №4 №1 №2
200 |
|
10 , |
202 |
|
7 |
211 |
|
11 |
250 |
|
|
№5
196 |
|
|
197 |
|
|
250 |
|
|
№6
1 |
220 |
< 150 > 250 |
2 |
220 |
150…250 |
250 |
|
|
, . , , №3 №4 [204] , №0 - [203] . , . , .
, . UProg :
( 2000-),
2000- (Modbus RTU),
, , 2000-. , , -, , -, .
:
- , 126,
- 0 6,
- , №0 "3 - ", - "8- / ".
Zabbix
, Zabbix libzbxmodbus Modbus-. - C2000-, , .
.
, .
, RIP 12 mod 56 RIP 12 6 80 M3 R RS. Request " ". : modbus_read[{$MODBUS_PORT},{$MODBUS_SLAVE},{$STATUS_REG},3,7*uint16] . , modbus C2000-.
{MODBUS_PORT} - (enc - Modbus RTU over TCP), .
{MODBUS_SLAVE} - Modbus UID 2000- ( UProg ).
{STATUS_REG} - №0 . : " 2000-" + 40000 - 1. : 450+40000-1 = 40449.
Request - 2000- JSON. JSON , 2000-, - :
{
"40449":39115,
"40450":51195,
"40451":50171,
"40452":51963,
"40453":51451,
"40454":50683,
"40455":763
}
Request 7 . - JSON . :
Status - ( №0),
Uout - ( №1),
Iout - ( №2),
Ubat1 - 1 ( №3),
Ubat2 - 2 ( №4),
Capacity - ( №5),
Uin - ( №6).
№0 (Status), . JSONPath, 256, .
, JSONPath. javascritpt-. , Iout ( №2) javascript- :
function (value){
var reg = parseInt({$STATUS_REG})+2;
var data = JSON.parse(value);
return data[reg];
}
. :
,
,
,
1,
2,
1 ,
2 ,
220 ,
,
Status,
Iout,
Uout,
1,
2,
Capacity,
Uin,
MODBUS.
RIP 12 mod 56 RIP 12 6 80 M3 R RS
: RIP 12 mod 56 RIP 12 6 80 M3 R RS, RIP 12 mod 56 RIP 12 6 80 M3 R RS.
. , modbus- 2000-. , - . libzbxmodbus, .. c .
, , - , Zabbix. libzbxmodbus , .
, libzbxmodbus , .
shell
, , flock. Modbus modpoll. /usr/lib/zabbix/externalscripts rip_12_mod_56.sh
#!/bin/bash
# rip_12_mod_56.sh
# $1 - protocol://host:port
# $2 - Modbus UID
# $3 - Status register
# $4 - Offset (0 - 6)
# Example of requesting statuses: ./rip_12_mod_56.sh enc://127.0.0.1:4001 1 40000
# Example value request: ./rip_12_mod_56.sh enc://127.0.0.1:4001 1 40000 3
(($# < 3)) && { printf '%s\n' "You have given little data. Command exited with non-zero"; exit 1; }
lockfile=$(echo "$1" | awk -F "://" '{print $2}')
setzone()
{
modpoll -m $1 -a $4 -r 46181 -0 -1 -c 1 -p $3 $2 $5> /dev/null 2>&1
(($? != 0)) && { printf '%s\n' "Command exited with non-zero"; exit 1; }
sleep 0.15
}
getvalue ()
{
value=$(modpoll -m $1 -a $4 -r 46328 -0 -1 -c 1 -t 4:hex -p $3 $2 |grep ]: |awk '{print $2}')
printf "%d" $value
}
getstatus ()
{
status=$(modpoll -m $1 -a $4 -r $5 -1 -c 7 -t 4:hex -p $3 $2 | grep ]: | awk -F "0x" 'BEGIN { printf"["} NR!=7{printf "\""$2"\","} NR==7 {printf "\""$2"\""} END { printf "]"}')
echo "{ \"status\": $status }"
}
(
flock -e 200
protocol=$(echo $1 | awk -F "://" '{print $1}');
host=$(echo $1 | awk -F "://" '{print $2}' | awk -F ":" '{print $1}')
port=$(echo $1 | awk -F "://" '{print $2}' | awk -F ":" '{print $2}')
register=$(($3+1))
if (($# >= 4)); then
zone=$(($register+$4-40000))
setzone $protocol $host $port $2 $zone
echo $(getvalue $protocol $host $port $2)
sleep 0.15
exit 0
fi
echo $(getstatus $protocol $host $port $2 $register)
sleep 0.15;
) 200> /tmp/$lockfile
RIP 12 mod 56 RIP 12 6 80 M3 R RS EXTENDED
Request " ". : rip_12_mod_56.sh[{$MODBUS_PORT}, {$MODBUS_SLAVE}, {$STATUS_REG}]. RIP 12 mod 56 RIP 12 6 80 M3 R RS, Request - JSON .
JSON JSONPath. :
{
"status": ["98CB","C7FB","C3FB","CAFB","C8FB","C5FB","02FB"]
}
. .
, Request 7 . - JSON .
5 " ".
Uout_value - , .
Iout_value - , .
Ubat1_value - №1, .
Ubat2_value - №2, .
Uin_value - , .
: rip_12_mod_56.sh[{$MODBUS_PORT}, {$MODBUS_SLAVE}, {$STATUS_REG}, < >].
, RIP 12 mod 56 RIP 12 6 80 M3 R RS.
RIP 12 mod 56 RIP 12 6 80 M3 R RS EXTENDED
: RIP 12 mod 56 RIP 12 6 80 M3 R RS EXTENDED, rip_12_mod_56.sh.
RIP 12 mod 56 RIP 12 6 80 M3 R RS. - - . , . , .
!