Las fuentes de alimentación redundantes se utilizan en todas partes. Proporcionan un suministro eléctrico ininterrumpido a los dispositivos de seguridad y alarma contra incendios, equipos de control de acceso y otros sistemas. En nuestra empresa, como tales fuentes, por regla general, utilizamos dispositivos de ZAO NVP Bolid. Algunos de ellos, como RIP-12-6 / 80M3-R-RS, cuentan con una interfaz RS485, lo que les permite ser incluidos en el sistema de monitorización.
Herramientas de seguimiento
Estamos usando Zabbix 5.2. Recibiremos datos del RIP usando el protocolo Modbus RTU sobre TCP. El soporte para este protocolo se implementa en Zabbix utilizando el módulo cargable libzbxmodbus . Además, el convertidor de protocolo C2000-PP (ver. 1.32) en el modo “Maestro” y el convertidor de interfaz serial (RS485 a Ethernet) están involucrados en el proceso de monitoreo.
Supervisión de objetos
Para empezar, decidamos qué podemos controlar exactamente. De la documentación para RIP-12-6 / 80M3-R-RS y S2000-PP, resultó que podemos contar con obtener el estado de siete zonas (AL) y valores numéricos de corriente y voltaje. Durante los experimentos, pude reproducir los siguientes estados del bucle:
Lazo # 0 Estado del dispositivo
149 |
Hackear la carcasa del dispositivo |
El edificio RIP está abierto |
152 |
Restauración de la carcasa del dispositivo |
Edificio RIP cerrado |
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. - - . , . , .
!