Catu daya yang berlebihan digunakan di mana-mana. Mereka menyediakan catu daya tanpa gangguan ke perangkat keamanan dan alarm kebakaran, peralatan kontrol akses, dan sistem lainnya. Di perusahaan kami, sebagai sumber tersebut, sebagai aturan, kami menggunakan perangkat dari ZAO NVP Bolid. Beberapa di antaranya, seperti RIP-12-6 / 80M3-R-RS, memiliki antarmuka RS485, yang memungkinkannya untuk disertakan dalam sistem pemantauan.
Alat pemantauan
Kami menggunakan Zabbix 5.2. Kami akan menerima data dari RIP menggunakan Modbus RTU melalui protokol TCP. Dukungan untuk protokol ini diimplementasikan di Zabbix menggunakan modul loadable libzbxmodbus . Juga, konverter protokol C2000-PP (ver. 1.32) dalam mode "Master" dan konverter antarmuka serial (RS485 ke Ethernet) terlibat dalam proses pemantauan.
Memantau objek
Untuk memulainya, mari kita putuskan apa sebenarnya yang bisa kita kendalikan. Dari dokumentasi untuk RIP-12-6 / 80M3-R-RS dan S2000-PP, ternyata kita dapat mengandalkan memperoleh status tujuh zona (AL) dan nilai numerik arus dan tegangan. Selama percobaan, saya dapat mereproduksi keadaan loop berikut:
Loop # 0 Status perangkat
149 |
Meretas casing perangkat |
Gedung RIP terbuka |
152 |
Pemulihan casing perangkat |
Gedung RIP ditutup |
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. - - . , . , .
!