Redundante Netzteile werden überall eingesetzt. Sie versorgen Sicherheits- und Brandmeldeanlagen, Zugangskontrollgeräte und andere Systeme unterbrechungsfrei mit Strom. In unserem Unternehmen verwenden wir als solche Quellen in der Regel Geräte von ZAO NVP Bolid. Einige von ihnen, wie z. B. RIP-12-6 / 80M3-R-RS, verfügen über eine RS485-Schnittstelle, über die sie in das Überwachungssystem integriert werden können.
Überwachungstools
Wir verwenden Zabbix 5.2. Wir erhalten Daten vom RIP mit dem Modbus RTU over TCP-Protokoll. Die Unterstützung für dieses Protokoll wird in Zabbix mithilfe des ladbaren Moduls libzbxmodbus implementiert . Auch der C2000-PP-Protokollkonverter (Version 1.32) im „Master“ -Modus und der serielle Schnittstellenkonverter (RS485 zu Ethernet) sind am Überwachungsprozess beteiligt.
Objekte überwachen
Lassen Sie uns zunächst entscheiden, was genau wir steuern können. Aus der Dokumentation für RIP-12-6 / 80M3-R-RS und S2000-PP ging hervor, dass wir uns darauf verlassen können, den Zustand von sieben Zonen (AL) und numerische Werte für Strom und Spannung zu erhalten. Während der Experimente konnte ich die folgenden Zustände der Schleife reproduzieren:
Schleife # 0 Gerätestatus
149 |
Hacken des Gerätekoffers |
Das RIP-Gebäude ist geöffnet |
152 |
Restaurierung des Gerätegehäuses |
RIP-Gebäude geschlossen |
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. - - . , . , .
!