Compare commits
5 Commits
v1.1.0
...
armtest1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| b87da0f454 | |||
| 54c97ad103 | |||
| cf94a99cad | |||
| 1cde041e86 | |||
| fb55b76005 |
175
arm_pro/pt61850netd_pqfe.pro
Normal file
175
arm_pro/pt61850netd_pqfe.pro
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
TEMPLATE = app
|
||||||
|
TARGET = pt61850netd_pqfe
|
||||||
|
DEPENDPATH += .
|
||||||
|
|
||||||
|
INCLUDEPATH += . \
|
||||||
|
./source \
|
||||||
|
./source/include \
|
||||||
|
./source/include/mmslite \
|
||||||
|
./source/include/pg_inst \
|
||||||
|
./source/include/curl \
|
||||||
|
./source/include/oss_sdk \
|
||||||
|
./source/include/rocketmq
|
||||||
|
|
||||||
|
QMAKE_ORIG_TARGET = $$(TARGET)
|
||||||
|
|
||||||
|
QT += core xml network
|
||||||
|
CONFIG += thread
|
||||||
|
|
||||||
|
DEFINES += _CRT_SECURE_NO_WARNINGS
|
||||||
|
DEFINES += MMS_LITE LINUX=2 MOSI LEAN_T TP0_ENABLED
|
||||||
|
DEFINES += CLIENT _DEBUG _REENTRANT _GNU_SOURCE _LARGEFILE64_SOURCE
|
||||||
|
|
||||||
|
# debug/release flags
|
||||||
|
CONFIG(debug, debug|release) {
|
||||||
|
message("Building debug version with debug symbols")
|
||||||
|
QMAKE_CFLAGS_DEBUG += -g -O0
|
||||||
|
QMAKE_CXXFLAGS_DEBUG += -g -O0
|
||||||
|
CONFIG += force_debug_info
|
||||||
|
} else {
|
||||||
|
message("Building release version")
|
||||||
|
QMAKE_CFLAGS_RELEASE += -O2
|
||||||
|
QMAKE_CXXFLAGS_RELEASE += -O2
|
||||||
|
}
|
||||||
|
|
||||||
|
win32 {
|
||||||
|
DEFINES -= UNICODE
|
||||||
|
DEFINES += _AFXDLL
|
||||||
|
CONFIG += console
|
||||||
|
}
|
||||||
|
|
||||||
|
win32 {
|
||||||
|
# RC_FILE=pt61850netd_pqfe.rc
|
||||||
|
SOURCES += source/mms/event.c
|
||||||
|
INCLUDEPATH += ./source/include/apr
|
||||||
|
QMAKE_LFLAGS += /NODEFAULTLIB:libcmt.lib
|
||||||
|
LIBS += -L./lib -L./lib/mmslite -lws2_32
|
||||||
|
|
||||||
|
CONFIG(debug, debug|release) {
|
||||||
|
DEFINES += DEBUG_SISCO
|
||||||
|
MMS_LIB_SUFFIX = _ld.lib
|
||||||
|
QMAKE_POST_LINK = $$QMAKE_COPY debug\\*.exe ..\\..\\usr_bin\\jspqfe_home\\bin
|
||||||
|
} else {
|
||||||
|
MMS_LIB_SUFFIX = _n.lib
|
||||||
|
QMAKE_POST_LINK = $$QMAKE_COPY release\\*.exe ..\\..\\usr_bin\\jspqfe_home\\bin
|
||||||
|
}
|
||||||
|
|
||||||
|
LIBS += ositcps$$MMS_LIB_SUFFIX \
|
||||||
|
mvl$$MMS_LIB_SUFFIX \
|
||||||
|
mmsle$$MMS_LIB_SUFFIX \
|
||||||
|
mmsl$$MMS_LIB_SUFFIX \
|
||||||
|
asn1$$MMS_LIB_SUFFIX \
|
||||||
|
mem$$MMS_LIB_SUFFIX \
|
||||||
|
meml$$MMS_LIB_SUFFIX \
|
||||||
|
slog$$MMS_LIB_SUFFIX \
|
||||||
|
utility$$MMS_LIB_SUFFIX \
|
||||||
|
ssec0$$MMS_LIB_SUFFIX
|
||||||
|
|
||||||
|
LIBS += -llibapr-1 -llibaprutil-1 -llibjclite
|
||||||
|
}
|
||||||
|
|
||||||
|
unix {
|
||||||
|
# 清掉旧标准
|
||||||
|
QMAKE_CXXFLAGS -= -std=gnu++98
|
||||||
|
QMAKE_CXXFLAGS -= -std=c++98
|
||||||
|
QMAKE_CXXFLAGS -= -std=gnu++11
|
||||||
|
QMAKE_CXXFLAGS -= -std=c++11
|
||||||
|
|
||||||
|
# 只保留一个
|
||||||
|
QMAKE_CXXFLAGS += -std=gnu++14
|
||||||
|
|
||||||
|
include(fe_common.pri)
|
||||||
|
SOURCES += source/mms/event2.c
|
||||||
|
INCLUDEPATH += ./source/include/apr-linux
|
||||||
|
|
||||||
|
LIBS += -L/FeProject/lib
|
||||||
|
# LIBS += -L/FeProject/lib/pgodbc
|
||||||
|
|
||||||
|
DEFINES += DEBUG_SISCO
|
||||||
|
VERSION = 1.0.0
|
||||||
|
|
||||||
|
# rpath
|
||||||
|
QMAKE_LFLAGS += -Wl,-rpath,/FeProject/lib \
|
||||||
|
-Wl,-rpath,/FeProject/lib/mmslite
|
||||||
|
|
||||||
|
LIBS += -lrt -lpthread
|
||||||
|
|
||||||
|
MMS_LIB_SUFFIX = _ld.a
|
||||||
|
LIBS += /FeProject/lib/mmslite/ositcps$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/mmslite/mvl$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/mmslite/mmsle$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/mmslite/mmsl$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/mmslite/asn1l$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/mmslite/mem$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/mmslite/slog$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/mmslite/util$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/mmslite/ssec0$$MMS_LIB_SUFFIX \
|
||||||
|
/FeProject/lib/libcurl.so \
|
||||||
|
/FeProject/lib/libmxml4.so \
|
||||||
|
/FeProject/lib/librocketmq.so \
|
||||||
|
/FeProject/lib/libhttprun.so \
|
||||||
|
/FeProject/lib/liblog4cplus.so
|
||||||
|
|
||||||
|
LIBS += -lapr-1 -laprutil-1 -ljclite
|
||||||
|
LIBS += -lrdkafka++
|
||||||
|
LIBS += -lrdkafka
|
||||||
|
LIBS += -L/FeProject/lib -llog4cplus
|
||||||
|
LIBS += -L/root/JoyProject/3rdparty/boost_pic_aarch64/lib -Wl,--no-as-needed -lboost_iostreams -Wl,--as-needed
|
||||||
|
LIBS += -L/root/JoyProject/3rdparty/zlib_pic_aarch64/lib -lz
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# install
|
||||||
|
target.path = ../../bin
|
||||||
|
INSTALLS += target
|
||||||
|
|
||||||
|
# Input
|
||||||
|
|
||||||
|
HEADERS += source/mms/db_interface.h \
|
||||||
|
source/include/otlv4.h \
|
||||||
|
source/mms/mmsclient.h \
|
||||||
|
source/mms/mmsop_en.h \
|
||||||
|
source/mms/rdb_client.h \
|
||||||
|
source/mms/ver_conf.h \
|
||||||
|
source/misc/SM4.h \
|
||||||
|
source/json/save2json.h \
|
||||||
|
source/json/mms_json_inter.h \
|
||||||
|
# source/json/rdkafka.h \
|
||||||
|
# source/json/rdkafkacpp.h \
|
||||||
|
# source/json/kafka_producer.h \
|
||||||
|
source/json/cjson.h \
|
||||||
|
source/rocketmq/SimpleProducer.h \
|
||||||
|
source/cfg_parse/custom_printf.h \
|
||||||
|
source/log4cplus/log4.h
|
||||||
|
|
||||||
|
SOURCES += source/mms/main.c \
|
||||||
|
source/mms/clntobj.c \
|
||||||
|
source/mms/logcfgx.c \
|
||||||
|
source/mms/mms_process.c \
|
||||||
|
source/mms/mmscli_rpt.c \
|
||||||
|
source/mms/mmsclient.c \
|
||||||
|
source/mms/mmslvar.c \
|
||||||
|
source/mms/mmsop_en.c \
|
||||||
|
source/mms/mvl_acse.c \
|
||||||
|
source/mms/mvlop_en.c \
|
||||||
|
source/mms/parse_xml.c \
|
||||||
|
source/mms/rdb_client.c \
|
||||||
|
source/mms/rdb_ext_utils.c \
|
||||||
|
source/mms/reject.c \
|
||||||
|
source/mms/mmscli_log.c \
|
||||||
|
source/misc/SM4.cpp \
|
||||||
|
source/misc/my_encrypt.cpp \
|
||||||
|
source/json/save2json.cpp \
|
||||||
|
source/cfg_parse/cfg_parser.cpp \
|
||||||
|
# source/json/kafka_producer.cpp \
|
||||||
|
source/json/create_json.cpp \
|
||||||
|
source/json/cjson.c \
|
||||||
|
source/cfg_parse/nacos.cpp \
|
||||||
|
source/cfg_parse/base64.cpp \
|
||||||
|
source/cfg_parse/SimpleProducer.cpp \
|
||||||
|
source/cfg_parse/log4.cpp \
|
||||||
|
# source/cfg_parse/oss_aliyun.cpp \
|
||||||
|
#source/cfg_parse/obs_huaweiyun.cpp \
|
||||||
|
# source/cfg_parse/datahub.cpp \
|
||||||
|
# source/cfg_parse/uds_huaweiyun.cpp
|
||||||
|
|
||||||
22
boot/feservice
Normal file
22
boot/feservice
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
'start')
|
||||||
|
$FEP_ENV/boot/start_fe.sh
|
||||||
|
;;
|
||||||
|
|
||||||
|
'stop')
|
||||||
|
$FEP_ENV/boot/stop_fe.sh
|
||||||
|
;;
|
||||||
|
|
||||||
|
'restart')
|
||||||
|
$FEP_ENV/boot/stop_fe.sh
|
||||||
|
$FEP_ENV/boot/start_fe.sh
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Usage: feservice start|stop|restart"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
44
boot/ps_fe.sh
Normal file
44
boot/ps_fe.sh
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# @file: $RCSfile: ps_fe.sh,v $
|
||||||
|
# @brief: $ϵͳӦ<CDB3><D3A6><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>̽ű<CCBD>
|
||||||
|
# @version: $Revision: 1.2 $
|
||||||
|
# @date: $Date: 2017/02/23 03:42:58 $
|
||||||
|
# @author: $Author: zhanchengguo $
|
||||||
|
# @state: $State: Exp $
|
||||||
|
# @latest: $Id: ps_fe.sh,v 1.2 2017/02/23 03:42:58 zhanchengguo Exp $
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
RUNTIME_CF_FILE="$FEP_ENV/etc/runtime.cf"
|
||||||
|
|
||||||
|
while read LINE ; do
|
||||||
|
if [ -n "$LINE" ] ; then
|
||||||
|
if [ ${LINE:0:1} != "#" ]; then
|
||||||
|
BINPATH=`echo $LINE | awk -F '^' '{printf $1}'`
|
||||||
|
BINPATH=`echo "$BINPATH" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $BINPATH
|
||||||
|
BIN=`echo $LINE | awk -F '^' '{printf $2}'`
|
||||||
|
BIN=`echo "$BIN" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $BIN
|
||||||
|
SPECIAL=`echo $LINE | awk -F '^' '{printf $4}'`
|
||||||
|
SPECIAL=`echo "$SPECIAL" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $SPECIAL
|
||||||
|
|
||||||
|
SLEEPSEC=`echo $LINE | awk -F '^' '{printf $5}'`
|
||||||
|
SLEEPSEC=`echo "$SLEEPSEC" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $SLEEPSEC
|
||||||
|
STARTFLAG=`echo $LINE | awk -F '^' '{printf $7}'`
|
||||||
|
STARTFLAG=`echo "$STARTFLAG" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $STARTFLAG
|
||||||
|
|
||||||
|
# if [ "`echo $STARTFLAG`" != "IGNORE_START" ]; then
|
||||||
|
CMD_STR=" ps -w | grep `echo "'"``echo $BIN``echo "'"` | grep -v 'grep'"
|
||||||
|
BIN2=`echo $BIN`
|
||||||
|
ps -ef | grep "$BIN2" | grep -v 'grep'
|
||||||
|
# fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < $RUNTIME_CF_FILE
|
||||||
|
|
||||||
|
echo ""
|
||||||
106
boot/start_fe.sh
Normal file
106
boot/start_fe.sh
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# @file: $RCSfile: start_fe.sh,v $
|
||||||
|
# @brief: $ϵͳӦ<CDB3><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>
|
||||||
|
# @version: $Revision: 1.1 $
|
||||||
|
# @date: $Date: 2018/12/26 07:19:31 $
|
||||||
|
# @author: $Author: lizhongming $
|
||||||
|
# @state: $State: Exp $
|
||||||
|
# @latest: $Id: start_fe.sh,v 1.1 2018/12/26 07:19:31 lizhongming Exp $
|
||||||
|
|
||||||
|
QTDIR=/qt-4.8.4
|
||||||
|
export QTDIR
|
||||||
|
|
||||||
|
FEP_ENV=/FeProject
|
||||||
|
export FEP_ENV
|
||||||
|
|
||||||
|
PATH=$FEP_ENV/bin:$QTDIR/bin:$PATH
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
LD_LIBRARY_PATH=$FEP_ENV/lib:$FEP_ENV/lib3rd:$QTDIR/lib:$LD_LIBRARY_PATH
|
||||||
|
export LD_LIBRARY_PATH
|
||||||
|
|
||||||
|
check_log_file()
|
||||||
|
{
|
||||||
|
if [ -n "$1" ] ; then
|
||||||
|
FILE_SIZE=0
|
||||||
|
FILE_SIZE=`du $1 | awk '{print $1}'`
|
||||||
|
if [ $FILE_SIZE -ge 5120 ]
|
||||||
|
then
|
||||||
|
if [ -f "$1".3 ]; then
|
||||||
|
rm -f "$1".3
|
||||||
|
fi
|
||||||
|
if [ -f "$1".2 ]; then
|
||||||
|
mv "$1".2 "$1".3
|
||||||
|
fi
|
||||||
|
if [ -f "$1".1 ]; then
|
||||||
|
mv "$1".1 "$1".2
|
||||||
|
fi
|
||||||
|
mv "$1" "$1".1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGFILE="$FEP_ENV/dat/log/start_fe.log"
|
||||||
|
check_log_file $LOGFILE
|
||||||
|
|
||||||
|
|
||||||
|
echo "" ; echo ""
|
||||||
|
echo "******* `date "+%F %R:%S"` Start Processes *******"
|
||||||
|
echo "" >>"$LOGFILE"
|
||||||
|
echo "" >>"$LOGFILE"
|
||||||
|
echo "******* `date "+%F %R:%S"` Start Processes *******" >>"$LOGFILE"
|
||||||
|
#sysctl -w "kernel.core_pattern=/usr/local/sascore/%e.%p.%t.core" &> /dev/null
|
||||||
|
|
||||||
|
#ִ<>г<EFBFBD><D0B3><EFBFBD>·<EFBFBD><C2B7>^<5E><>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>^<5E>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>^<5E>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
RUNTIME_CF_FILE="$FEP_ENV/etc/runtime.cf"
|
||||||
|
|
||||||
|
echo "Using config file name: $RUNTIME_CF_FILE"
|
||||||
|
echo "Using config file name: $RUNTIME_CF_FILE">>"$LOGFILE"
|
||||||
|
CURDIR=`pwd`
|
||||||
|
while read LINE ; do
|
||||||
|
if [ -n "$LINE" ] ; then
|
||||||
|
if [ ${LINE:0:1} != "#" ]; then
|
||||||
|
BINPATH=`echo $LINE | awk -F '^' '{printf $1}'`
|
||||||
|
BINPATH=`echo "$BINPATH" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $BINPATH
|
||||||
|
BIN=`echo $LINE | awk -F '^' '{printf $2}'`
|
||||||
|
BIN=`echo "$BIN" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $BIN
|
||||||
|
SPECIAL=`echo $LINE | awk -F '^' '{printf $4}'`
|
||||||
|
SPECIAL=`echo "$SPECIAL" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $SPECIAL
|
||||||
|
|
||||||
|
SLEEPSEC=`echo $LINE | awk -F '^' '{printf $5}'`
|
||||||
|
SLEEPSEC=`echo "$SLEEPSEC" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $SLEEPSEC
|
||||||
|
STARTFLAG=`echo $LINE | awk -F '^' '{printf $7}'`
|
||||||
|
STARTFLAG=`echo "$STARTFLAG" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $STARTFLAG
|
||||||
|
|
||||||
|
RESTARTFLAG=`echo $LINE | awk -F '^' '{printf $6}'`
|
||||||
|
RESTARTFLAG=`echo "$RESTARTFLAG" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
echo $RESTARTFLAG
|
||||||
|
|
||||||
|
if [ "$RESTARTFLAG" = "IGNORE_RESTART" ]; then
|
||||||
|
# echo "" ;
|
||||||
|
CMD_STR=" sleep `echo $SLEEPSEC` "
|
||||||
|
echo "$CMD_STR"
|
||||||
|
echo "$CMD_STR" >>"$LOGFILE"
|
||||||
|
$CMD_STR
|
||||||
|
|
||||||
|
CMD_STR=" `echo $BINPATH``echo $BIN` `echo $SPECIAL` "
|
||||||
|
echo "$CMD_STR"
|
||||||
|
echo "$CMD_STR" >>"$LOGFILE"
|
||||||
|
$CMD_STR &>/dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < $RUNTIME_CF_FILE
|
||||||
|
|
||||||
|
cd $CURDIR
|
||||||
|
|
||||||
|
DT=`date "+%F %R:%S.%N"`
|
||||||
|
echo "******* ${DT:0:23} Start Processes Succcessfully *******"
|
||||||
|
echo "******* ${DT:0:23} Start Processes Succcessfully *******" >>"$LOGFILE"
|
||||||
107
boot/stop_fe.sh
Normal file
107
boot/stop_fe.sh
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# @file: $RCSfile: stop_fe.sh,v $
|
||||||
|
# @brief: $ϵͳӦ<CDB3><D3A6>ֹͣ<CDA3><D6B9><EFBFBD>̽ű<CCBD>
|
||||||
|
# @version: $Revision: 1.5 $
|
||||||
|
# @date: $Date: 2017/02/28 08:40:43 $
|
||||||
|
# @author: $Author: zhanchengguo $
|
||||||
|
# @state: $State: Exp $
|
||||||
|
# @latest: $Id: stop_fe.sh,v 1.5 2017/02/28 08:40:43 zhanchengguo Exp $
|
||||||
|
|
||||||
|
check_log_file()
|
||||||
|
{
|
||||||
|
if [ -n "$1" ] ; then
|
||||||
|
FILE_SIZE=0
|
||||||
|
FILE_SIZE=`du $1 | awk '{print $1}'`
|
||||||
|
if [ $FILE_SIZE -ge 5120 ]
|
||||||
|
then
|
||||||
|
if [ -f "$1".3 ]; then
|
||||||
|
rm -f "$1".3
|
||||||
|
fi
|
||||||
|
if [ -f "$1".2 ]; then
|
||||||
|
mv "$1".2 "$1".3
|
||||||
|
fi
|
||||||
|
if [ -f "$1".1 ]; then
|
||||||
|
mv "$1".1 "$1".2
|
||||||
|
fi
|
||||||
|
mv "$1" "$1".1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGFILE="/FeProject/dat/log/start_fe.log"
|
||||||
|
check_log_file $LOGFILE
|
||||||
|
|
||||||
|
echo "" ; echo ""
|
||||||
|
echo "****** `date "+%F %R:%S"` Stop Processes ******"
|
||||||
|
echo "" >>"$LOGFILE"
|
||||||
|
echo "" >>"$LOGFILE"
|
||||||
|
echo "****** `date "+%F %R:%S"` Stop Processes ******" >>"$LOGFILE"
|
||||||
|
|
||||||
|
RUNTIME_CF_FILE="/FeProject/etc/runtime.cf"
|
||||||
|
|
||||||
|
#cat $RUNTIME_CF_FILE |tac > /tmp/runtime.cf
|
||||||
|
sed '1!G;h;$!d' $RUNTIME_CF_FILE > /tmp/runtime.cf
|
||||||
|
|
||||||
|
echo "Using config file name: $RUNTIME_CF_FILE"
|
||||||
|
echo "Using config file name: $RUNTIME_CF_FILE">>"$LOGFILE"
|
||||||
|
|
||||||
|
while read LINE ; do
|
||||||
|
if [ -n "$LINE" ] ; then
|
||||||
|
if [ ${LINE:0:1} != "#" ]; then
|
||||||
|
BINPATH=`echo $LINE | awk -F '^' '{printf $1}'`
|
||||||
|
BINPATH=`echo "$BINPATH" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $BINPATH
|
||||||
|
BIN=`echo $LINE | awk -F '^' '{printf $2}'`
|
||||||
|
BIN=`echo "$BIN" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $BIN
|
||||||
|
SPECIAL=`echo $LINE | awk -F '^' '{printf $4}'`
|
||||||
|
SPECIAL=`echo "$SPECIAL" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $SPECIAL
|
||||||
|
|
||||||
|
SLEEPSEC=`echo $LINE | awk -F '^' '{printf $5}'`
|
||||||
|
SLEEPSEC=`echo "$SLEEPSEC" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $SLEEPSEC
|
||||||
|
STARTFLAG=`echo $LINE | awk -F '^' '{printf $7}'`
|
||||||
|
STARTFLAG=`echo "$STARTFLAG" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
|
||||||
|
# echo $STARTFLAG
|
||||||
|
|
||||||
|
if [ "`echo $STARTFLAG`" != "IGNORE_START" ]; then
|
||||||
|
# echo ""
|
||||||
|
# echo "" >>"$LOGFILE"
|
||||||
|
CMD_STR=" ps -w | grep `echo "'"``echo $BIN``echo "'"` | grep -v 'grep'"
|
||||||
|
BIN2=`echo $BIN`
|
||||||
|
BIN3=`echo $BIN |awk '{print$1}'`
|
||||||
|
# CMD_STR="killall `echo $BIN | awk '{print$1}'` 2>&1 "
|
||||||
|
PIDSTR=`ps -ef | grep "$BIN2" | grep -v 'grep'`
|
||||||
|
if [ -n "$PIDSTR" ] ; then
|
||||||
|
if [ "$BIN3" == "fe_main" ]; then
|
||||||
|
CMD_STR=" sleep 3 "
|
||||||
|
echo "$CMD_STR"
|
||||||
|
echo "$CMD_STR" >>"$LOGFILE"
|
||||||
|
$CMD_STR
|
||||||
|
fi
|
||||||
|
|
||||||
|
CMD_STR="kill -15 `echo $PIDSTR | awk '{print$2}'` "
|
||||||
|
echo " Kill process: \"$BIN\" with PID `echo $PIDSTR | awk '{print$2}'`"
|
||||||
|
echo " Kill process: \"$BIN\" with PID `echo $PIDSTR | awk '{print$2}'`" >>"$LOGFILE"
|
||||||
|
echo " Executing: $CMD_STR"
|
||||||
|
echo " Executing: $CMD_STR" >>"$LOGFILE"
|
||||||
|
CMD_RESULT=`$CMD_STR`
|
||||||
|
if [ -n "$CMD_RESULT" ] ; then
|
||||||
|
echo "$CMD_RESULT"
|
||||||
|
echo "$CMD_RESULT" >>"$LOGFILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
echo " Process \"$BIN\" not running."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < /tmp/runtime.cf
|
||||||
|
|
||||||
|
DT=`date "+%F %R:%S.%N"`
|
||||||
|
echo "****** ${DT:0:23} Stop Processes Succcessfully ******"
|
||||||
|
echo "" >>"$LOGFILE"
|
||||||
|
echo "****** ${DT:0:23} Stop Processes Succcessfully ******" >>"$LOGFILE"
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <atomic>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "../mms/db_interface.h"
|
#include "../mms/db_interface.h"
|
||||||
|
|
||||||
@@ -53,6 +54,7 @@ extern std::string G_MQCONSUMER_TOPIC_UD;
|
|||||||
extern std::string G_MQCONSUMER_TOPIC_RT;
|
extern std::string G_MQCONSUMER_TOPIC_RT;
|
||||||
|
|
||||||
extern std::string FRONT_INST;
|
extern std::string FRONT_INST;
|
||||||
|
extern bool DEBUGOPEN;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -371,7 +373,7 @@ void rocketmq_consumer_receive(
|
|||||||
static int currentQueueId = 0;
|
static int currentQueueId = 0;
|
||||||
|
|
||||||
// 队列选择器回调函数:轮询选择队列 ID
|
// 队列选择器回调函数:轮询选择队列 ID
|
||||||
int RoundRobinSelector(int queueNum, CMessage* msg, void* arg) {
|
/*int RoundRobinSelector(int queueNum, CMessage* msg, void* arg) {
|
||||||
if (queueNum == 0) {
|
if (queueNum == 0) {
|
||||||
throw std::runtime_error("No available queues");
|
throw std::runtime_error("No available queues");
|
||||||
}
|
}
|
||||||
@@ -381,6 +383,24 @@ int RoundRobinSelector(int queueNum, CMessage* msg, void* arg) {
|
|||||||
currentQueueId = 0;
|
currentQueueId = 0;
|
||||||
}
|
}
|
||||||
return queueId;
|
return queueId;
|
||||||
|
}*/
|
||||||
|
int RoundRobinSelector(int queueNum, CMessage* msg, void* arg) {
|
||||||
|
static std::atomic<int> currentQueueId(0);
|
||||||
|
|
||||||
|
if (queueNum <= 0) {
|
||||||
|
std::cout << "[MQ][SELECTOR_FAIL] queueNum=" << queueNum << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int id = currentQueueId.fetch_add(1, std::memory_order_relaxed);
|
||||||
|
int queueId = id % queueNum;
|
||||||
|
|
||||||
|
std::cout << "[MQ][SELECTOR] queueNum=" << queueNum
|
||||||
|
<< ", current=" << id
|
||||||
|
<< ", selected=" << queueId
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
return queueId;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 封装生产者的类
|
// 封装生产者的类
|
||||||
@@ -398,6 +418,9 @@ public:
|
|||||||
// 设置 nameserver 地址
|
// 设置 nameserver 地址
|
||||||
SetProducerNameServerAddress(producer_, nameServer.c_str());
|
SetProducerNameServerAddress(producer_, nameServer.c_str());
|
||||||
|
|
||||||
|
//lnk20260417设置数据上送消息体最大值,默认4M,调整为1M,避免过大消息导致发送失败
|
||||||
|
SetProducerMaxMessageSize(producer_, 1024 * 1024); // 1MB
|
||||||
|
|
||||||
SetProducerSessionCredentials(producer_, G_MQCONSUMER_ACCESSKEY.c_str(),G_MQCONSUMER_SECRETKEY.c_str(), "");
|
SetProducerSessionCredentials(producer_, G_MQCONSUMER_ACCESSKEY.c_str(),G_MQCONSUMER_SECRETKEY.c_str(), "");
|
||||||
|
|
||||||
// 启动生产者
|
// 启动生产者
|
||||||
@@ -438,6 +461,64 @@ public:
|
|||||||
|
|
||||||
// 发送消息
|
// 发送消息
|
||||||
void sendMessage(const char* strbody, const char* topic, const std::string& tags, const std::string& keys) {
|
void sendMessage(const char* strbody, const char* topic, const std::string& tags, const std::string& keys) {
|
||||||
|
|
||||||
|
if (DEBUGOPEN) {
|
||||||
|
std::cout << "sendMessage called with topic: " << (topic ? topic : "NULL")
|
||||||
|
<< ", tags: " << tags
|
||||||
|
<< ", keys: " << keys
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
if (strbody) {
|
||||||
|
// ===== 1️⃣ 真实长度 vs strlen =====
|
||||||
|
std::string body_str(strbody);
|
||||||
|
|
||||||
|
std::cout << "[MQ][LEN_CHECK]"
|
||||||
|
<< " strlen=" << strlen(strbody)
|
||||||
|
<< ", std::string.size=" << body_str.size()
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
// ===== 2️⃣ 检测是否包含 \0 =====
|
||||||
|
bool has_null = false;
|
||||||
|
for (size_t i = 0; i < body_str.size(); i++) {
|
||||||
|
if (body_str[i] == '\0') {
|
||||||
|
has_null = true;
|
||||||
|
std::cout << "[MQ][FOUND_NULL] index=" << i << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << "[MQ][HAS_NULL] " << (has_null ? "YES" : "NO") << std::endl;
|
||||||
|
|
||||||
|
// ===== 3️⃣ 打印头部(可读)=====
|
||||||
|
size_t len = strlen(strbody);
|
||||||
|
size_t n = std::min((size_t)200, len);
|
||||||
|
|
||||||
|
std::cout << "[MQ][BODY_HEAD] "
|
||||||
|
<< std::string(strbody, n)
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
std::cout << "[MQ][BODY_TAIL] "
|
||||||
|
<< std::string(strbody + (len - n), n)
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
// ===== 4️⃣ 十六进制打印前100字节 =====
|
||||||
|
std::cout << "[MQ][HEX_HEAD] ";
|
||||||
|
for (size_t i = 0; i < std::min((size_t)100, body_str.size()); i++) {
|
||||||
|
printf("%02X ", (unsigned char)body_str[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
// ===== 5️⃣ 十六进制打印尾部100字节 =====
|
||||||
|
std::cout << "[MQ][HEX_TAIL] ";
|
||||||
|
size_t start = (body_str.size() > 100) ? body_str.size() - 100 : 0;
|
||||||
|
for (size_t i = start; i < body_str.size(); i++) {
|
||||||
|
printf("%02X ", (unsigned char)body_str[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
} else {
|
||||||
|
std::cout << "[MQ][ERROR] strbody is NULL" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CSendResult result;
|
CSendResult result;
|
||||||
CMessage* msg = NULL;
|
CMessage* msg = NULL;
|
||||||
|
|
||||||
@@ -462,11 +543,67 @@ public:
|
|||||||
RoundRobinSelector, // 队列选择器回调函数
|
RoundRobinSelector, // 队列选择器回调函数
|
||||||
&queueNum // 传递给选择器的额外参数(队列数量)
|
&queueNum // 传递给选择器的额外参数(队列数量)
|
||||||
);
|
);
|
||||||
|
/////////////////////////////////替换接口,性能较低但不影响
|
||||||
|
/*CSendResult result;
|
||||||
|
memset(&result, 0, sizeof(result));
|
||||||
|
|
||||||
|
int sendResult = SendMessageOrderly(
|
||||||
|
producer_,
|
||||||
|
msg,
|
||||||
|
RoundRobinSelector,
|
||||||
|
&queueNum,
|
||||||
|
0, // autoRetryTimes
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
|
||||||
|
std::cout << "[MQ][ORDERLY_RESULT]"
|
||||||
|
<< " ret=" << sendResult
|
||||||
|
<< ", sendStatus=" << (int)result.sendStatus
|
||||||
|
<< ", msgId=" << result.msgId
|
||||||
|
<< ", offset=" << result.offset
|
||||||
|
<< ", topic=" << (topic ? topic : "")
|
||||||
|
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
||||||
|
<< std::endl;*/
|
||||||
|
/////////////////////////////////替换接口,性能较低但不影响
|
||||||
|
// 发送消息:临时改成同步发送,绕过 orderly / selector,便于定位问题
|
||||||
|
/*CSendResult result;
|
||||||
|
memset(&result, 0, sizeof(result));
|
||||||
|
|
||||||
|
int sendResult = SendMessageSync(
|
||||||
|
producer_,
|
||||||
|
msg,
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
|
||||||
|
std::cout << "[MQ][SYNC_RESULT]"
|
||||||
|
<< " ret=" << sendResult
|
||||||
|
<< ", sendStatus=" << (int)result.sendStatus
|
||||||
|
<< ", msgId=" << result.msgId
|
||||||
|
<< ", offset=" << result.offset
|
||||||
|
<< ", topic=" << (topic ? topic : "")
|
||||||
|
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
||||||
|
<< std::endl;*/
|
||||||
|
// 发送消息:临时改成同步发送,绕过 orderly / selector,便于定位问题
|
||||||
|
|
||||||
if (sendResult == 0) { // 假设返回 0 表示成功
|
if (sendResult == 0) { // 假设返回 0 表示成功
|
||||||
std::cout << "Message sent successfully.topic:" << topic <<std::endl;
|
std::cout << "[MQ][SEND_OK]"
|
||||||
|
<< " topic=" << (topic ? topic : "")
|
||||||
|
<< ", tags=" << tags
|
||||||
|
<< ", keys=" << keys
|
||||||
|
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
||||||
|
<< std::endl;
|
||||||
} else {
|
} else {
|
||||||
std::cout << "Failed to send message." << std::endl;
|
|
||||||
|
std::cout << "[MQ][SEND_FAIL]"
|
||||||
|
<< " ret=" << sendResult
|
||||||
|
<< ", topic=" << (topic ? topic : "")
|
||||||
|
<< ", tags=" << tags
|
||||||
|
<< ", keys=" << keys
|
||||||
|
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
||||||
|
<< std::endl;
|
||||||
|
std::cout << "[MQ][BODY_HEAD] " << std::string(strbody, std::min((size_t)200, strlen(strbody))) << std::endl;
|
||||||
|
std::cout << "[MQ][BODY_TAIL] " << std::string(strbody + std::max((size_t)0, strlen(strbody) - std::min((size_t)200, strlen(strbody)))) << std::endl;
|
||||||
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_MQ,"【ERROR】前置的%s%d号进程 mq发送失败,请检查mq配置", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 销毁消息
|
// 销毁消息
|
||||||
@@ -559,7 +696,7 @@ void rocketmq_producer_send(const char* strbody, const char* topic)
|
|||||||
catch (const std::exception& e) {
|
catch (const std::exception& e) {
|
||||||
std::cerr << "Failed to send message: " << e.what() << std::endl;
|
std::cerr << "Failed to send message: " << e.what() << std::endl;
|
||||||
// 处理发送失败的情况,例如记录日志或重试
|
// 处理发送失败的情况,例如记录日志或重试
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_MQ,"【ERROR】前置的%s%d号进程 mq发送失败,请检查mq配置", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_MQ,"【ERROR】前置的%s%d号进程 mq发送失败,请检查mq配置", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -358,6 +358,14 @@ std::string WEB_EVENT = "";
|
|||||||
std::string WEB_FILEUPLOAD = "";
|
std::string WEB_FILEUPLOAD = "";
|
||||||
std::string WEB_FILEDOWNLOAD = "";
|
std::string WEB_FILEDOWNLOAD = "";
|
||||||
|
|
||||||
|
// 日志限流配置
|
||||||
|
int G_LOG_RATE_RESET_SEC = 3600; // 1小时重置
|
||||||
|
int G_LOG_RATE_LIMIT_SEC = 60; // 进入限流后:60秒1条
|
||||||
|
int G_LOG_RATE_KEEP_ALL_MS = 60000; // 间隔 >= 60000ms,全部保留
|
||||||
|
int G_LOG_RATE_KEEP_BURST_MS = 1000; // 间隔 >= 1000ms,按二级策略
|
||||||
|
int G_LOG_RATE_KEEP_BURST_COUNT = 60; // 二级保留前60条
|
||||||
|
int G_LOG_RATE_KEEP_HIGHFREQ_COUNT = 10; // 高频保留前10条
|
||||||
|
|
||||||
//lnk20250115添加台账锁
|
//lnk20250115添加台账锁
|
||||||
extern pthread_mutex_t mtx;
|
extern pthread_mutex_t mtx;
|
||||||
|
|
||||||
@@ -781,6 +789,29 @@ void init_config() {
|
|||||||
std::cout << "Read G_TEST_NUM:" << G_TEST_NUM << std::endl;
|
std::cout << "Read G_TEST_NUM:" << G_TEST_NUM << std::endl;
|
||||||
std::cout << "Read G_TEST_TYPE:" << G_TEST_TYPE << std::endl;
|
std::cout << "Read G_TEST_TYPE:" << G_TEST_TYPE << std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
// 日志限流配置
|
||||||
|
G_LOG_RATE_RESET_SEC = settings.value("LogRate/ResetSec", 3600).toInt();
|
||||||
|
G_LOG_RATE_LIMIT_SEC = settings.value("LogRate/LimitSec", 60).toInt();
|
||||||
|
G_LOG_RATE_KEEP_ALL_MS = settings.value("LogRate/KeepAllMs", 60000).toInt();
|
||||||
|
G_LOG_RATE_KEEP_BURST_MS = settings.value("LogRate/KeepBurstMs", 1000).toInt();
|
||||||
|
G_LOG_RATE_KEEP_BURST_COUNT = settings.value("LogRate/KeepBurstCount", 60).toInt();
|
||||||
|
G_LOG_RATE_KEEP_HIGHFREQ_COUNT = settings.value("LogRate/KeepHighFreqCount", 10).toInt();
|
||||||
|
|
||||||
|
std::cout << "Read G_LOG_RATE_RESET_SEC:" << G_LOG_RATE_RESET_SEC << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_LIMIT_SEC:" << G_LOG_RATE_LIMIT_SEC << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_KEEP_ALL_MS:" << G_LOG_RATE_KEEP_ALL_MS << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_KEEP_BURST_MS:" << G_LOG_RATE_KEEP_BURST_MS << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_KEEP_BURST_COUNT:" << G_LOG_RATE_KEEP_BURST_COUNT << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_KEEP_HIGHFREQ_COUNT:" << G_LOG_RATE_KEEP_HIGHFREQ_COUNT << std::endl;
|
||||||
|
|
||||||
|
if (G_LOG_RATE_RESET_SEC <= 0) G_LOG_RATE_RESET_SEC = 3600;
|
||||||
|
if (G_LOG_RATE_LIMIT_SEC <= 0) G_LOG_RATE_LIMIT_SEC = 60;
|
||||||
|
if (G_LOG_RATE_KEEP_ALL_MS <= 0) G_LOG_RATE_KEEP_ALL_MS = 60000;
|
||||||
|
if (G_LOG_RATE_KEEP_BURST_MS <= 0) G_LOG_RATE_KEEP_BURST_MS = 1000;
|
||||||
|
if (G_LOG_RATE_KEEP_BURST_COUNT < 0) G_LOG_RATE_KEEP_BURST_COUNT = 60;
|
||||||
|
if (G_LOG_RATE_KEEP_HIGHFREQ_COUNT < 0) G_LOG_RATE_KEEP_HIGHFREQ_COUNT = 10;
|
||||||
|
|
||||||
//20241212lnk添加多前置
|
//20241212lnk添加多前置
|
||||||
if (g_front_seg_index != 0 && g_front_seg_num != 0) {
|
if (g_front_seg_index != 0 && g_front_seg_num != 0) {
|
||||||
MULTIPLE_NODE_FLAG = 1;
|
MULTIPLE_NODE_FLAG = 1;
|
||||||
@@ -1499,7 +1530,7 @@ int parse_rpt_log_ini()
|
|||||||
//添加判断,有的监测点没有cpuno为2,直接申请了LD_info[1],没申请LD_info[0]
|
//添加判断,有的监测点没有cpuno为2,直接申请了LD_info[1],没申请LD_info[0]
|
||||||
if(ied_usr->LD_info[cpuno].LD_name == NULL){
|
if(ied_usr->LD_info[cpuno].LD_name == NULL){
|
||||||
printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
|
printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
|
||||||
continue;//跳过防止崩溃
|
continue;//跳过防止崩溃
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1878,18 +1909,18 @@ int parse_ledger_update_xml(trigger_update_xml_t* trigger_update_xml)
|
|||||||
//加载一个文件的内容到数据结构
|
//加载一个文件的内容到数据结构
|
||||||
if (!load_ledger_update_from_xml(trigger_update_xml, filename)) {
|
if (!load_ledger_update_from_xml(trigger_update_xml, filename)) {
|
||||||
std::cout << "read /etc/ledgerupdate/" << filename << " success..." << std::endl;
|
std::cout << "read /etc/ledgerupdate/" << filename << " success..." << std::endl;
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER_UPDATE,"【WARN】前置的%s%d号进程 读取台账更新文件成功,开始更新台账", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_LEDGER_UPDATE,"【WARN】前置的%s%d号进程 读取台账更新文件成功,开始更新台账", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
}
|
}
|
||||||
//处理过的文件删除掉
|
//处理过的文件删除掉
|
||||||
|
|
||||||
if (std::remove(filename.c_str()) != 0) {
|
if (std::remove(filename.c_str()) != 0) {
|
||||||
std::cerr << "Failed to remove file: " << filename << " Error: " << strerror(errno) << std::endl;
|
std::cerr << "Failed to remove file: " << filename << " Error: " << strerror(errno) << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER_UPDATE,"【ERROR】前置的%s%d号进程 删除已读取的台账更新文件失败!请检查台账更新文件是否残留在/FeProject/etc/ledgerupdate", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER_UPDATE,"【ERROR】前置的%s%d号进程 删除已读取的台账更新文件失败!请检查台账更新文件是否残留在/FeProject/etc/ledgerupdate", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
return APR_EGENERAL;
|
return APR_EGENERAL;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
std::cout << "remove file: " << filename << " success..." << std::endl;
|
std::cout << "remove file: " << filename << " success..." << std::endl;
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程 删除已读取的台账更新文件成功", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_LEDGER_UPDATE,"【NORMAL】前置的%s%d号进程 删除已读取的台账更新文件成功", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2069,7 +2100,7 @@ int parse_3s_xml(trigger_3s_xml_t* trigger_3s_xml)
|
|||||||
|
|
||||||
printf("/etc/trigger3s/*.xml success...\n");
|
printf("/etc/trigger3s/*.xml success...\n");
|
||||||
|
|
||||||
DIY_INFOLOG("process","【WARN】前置读取实时数据触发文件成功,即将注册实时数据报告");
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_RT_DATA,"【WARN】前置读取实时数据触发文件成功,即将注册实时数据报告");
|
||||||
|
|
||||||
return APR_SUCCESS;
|
return APR_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -2382,7 +2413,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
|
|||||||
QDir dir(cfg_dir);
|
QDir dir(cfg_dir);
|
||||||
if (!dir.exists()) {
|
if (!dir.exists()) {
|
||||||
qDebug() << "folder does not exist!";
|
qDebug() << "folder does not exist!";
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法解析补招文件,补招文件路径/FeProject/etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法解析补招文件,补招文件路径/FeProject/etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//指定文件后缀名,可指定多种类型
|
//指定文件后缀名,可指定多种类型
|
||||||
@@ -2398,7 +2429,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
|
|||||||
if (!file.open(QIODevice::ReadOnly))
|
if (!file.open(QIODevice::ReadOnly))
|
||||||
{
|
{
|
||||||
qDebug() << "file.open error";
|
qDebug() << "file.open error";
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法打开补招文件%s", get_front_msg_from_subdir(), g_front_seg_index,qstrRecallPath.toStdString().c_str());
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法打开补招文件%s", get_front_msg_from_subdir(), g_front_seg_index,qstrRecallPath.toStdString().c_str());
|
||||||
continue; //以只读方式打开
|
continue; //以只读方式打开
|
||||||
}
|
}
|
||||||
bool ret = doc.setContent(&file);
|
bool ret = doc.setContent(&file);
|
||||||
@@ -2406,7 +2437,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
|
|||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
qDebug() << "doc.setContent error";
|
qDebug() << "doc.setContent error";
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法解析补招文件%s,补招内容无效", get_front_msg_from_subdir(), g_front_seg_index,qstrRecallPath.toStdString().c_str());
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法解析补招文件%s,补招内容无效", get_front_msg_from_subdir(), g_front_seg_index,qstrRecallPath.toStdString().c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//将文件内容读到doc中
|
//将文件内容读到doc中
|
||||||
@@ -2984,7 +3015,7 @@ void DeletcRecallXml() {
|
|||||||
QDir dir(cfg_dir);
|
QDir dir(cfg_dir);
|
||||||
if (!dir.exists()) {
|
if (!dir.exists()) {
|
||||||
qDebug() << "folder does not exist!";
|
qDebug() << "folder does not exist!";
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 删除旧的补招文件失败,补招文件路径/FeProject/etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 删除旧的补招文件失败,补招文件路径/FeProject/etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QStringList filter(file_name);
|
QStringList filter(file_name);
|
||||||
@@ -2999,7 +3030,7 @@ void DeletcRecallXml() {
|
|||||||
if (fileInfo.lastModified() < saveDaysAgo) {
|
if (fileInfo.lastModified() < saveDaysAgo) {
|
||||||
QFile::remove(fileInfo.absoluteFilePath());
|
QFile::remove(fileInfo.absoluteFilePath());
|
||||||
|
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程 删除超过两天的补招文件", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_RECALL,"【NORMAL】前置的%s%d号进程 删除超过两天的补招文件", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3016,7 +3047,7 @@ void CreateRecallXml()
|
|||||||
{
|
{
|
||||||
printf("insert ID_CJournalRecall_Map!\n");
|
printf("insert ID_CJournalRecall_Map!\n");
|
||||||
|
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程 开始写入补招文件", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_RECALL,"【NORMAL】前置的%s%d号进程 开始写入补招文件", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
QMap<QString, QList<CJournalRecall> > ID_CJournalRecall_Map;
|
QMap<QString, QList<CJournalRecall> > ID_CJournalRecall_Map;
|
||||||
|
|
||||||
@@ -3049,7 +3080,7 @@ void CreateRecallXml()
|
|||||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
|
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
|
||||||
printf("补招查询完成,打开%s失败,无法写入线路补招配置!\n", qstrRecallPath.toAscii().data());
|
printf("补招查询完成,打开%s失败,无法写入线路补招配置!\n", qstrRecallPath.toAscii().data());
|
||||||
|
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法将补招文件写入补招文件路径/FeProject/etc/recall/", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法将补招文件写入补招文件路径/FeProject/etc/recall/", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
QMap<QString, QList<CJournalRecall> >().swap(ID_CJournalRecall_Map);
|
QMap<QString, QList<CJournalRecall> >().swap(ID_CJournalRecall_Map);
|
||||||
return;
|
return;
|
||||||
@@ -3766,14 +3797,14 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
|
|||||||
// 参数验证
|
// 参数验证
|
||||||
if (num <= 0) {
|
if (num <= 0) {
|
||||||
std::cerr << "Error: 'num' must be greater than 0." << std::endl;
|
std::cerr << "Error: 'num' must be greater than 0." << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置的多进程最大进程号为:%d,应该为大于0的整数",num);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER,"【ERROR】前置的多进程最大进程号为:%d,应该为大于0的整数",num);
|
||||||
return 1; // 返回适当的错误码
|
return 1; // 返回适当的错误码
|
||||||
}
|
}
|
||||||
|
|
||||||
index = index - 1;
|
index = index - 1;
|
||||||
if (index < 0 || index >= num) {
|
if (index < 0 || index >= num) {
|
||||||
std::cerr << "Error: 'index' must be in the range [0, num]." << std::endl;
|
std::cerr << "Error: 'index' must be in the range [0, num]." << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置当前进程的进程号为:%d,应该为0到最大进程号范围内的整数",index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER,"【ERROR】前置当前进程的进程号为:%d,应该为0到最大进程号范围内的整数",index);
|
||||||
return 1; // 返回适当的错误码
|
return 1; // 返回适当的错误码
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3781,7 +3812,7 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
|
|||||||
// 获取参数
|
// 获取参数
|
||||||
if (codes.empty()) {
|
if (codes.empty()) {
|
||||||
std::cerr << "Error: 'codes' vector is empty." << std::endl;
|
std::cerr << "Error: 'codes' vector is empty." << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程调用web台账接口的入参为空",get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程调用web台账接口的入参为空",get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3834,7 +3865,7 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::cerr << "data 无效或为空数组,重试" << std::endl;
|
std::cerr << "data 无效或为空数组,重试" << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置从web接口中获取的台账信息为空或者无效信息无法解析,请核对前置使用的入参信息:%s",parm.c_str());
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER,"【ERROR】前置从web接口中获取的台账信息为空或者无效信息无法解析,请核对前置使用的入参信息:%s",parm.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3881,7 +3912,7 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
|
|||||||
break; // 本地台账解析成功且数组非空
|
break; // 本地台账解析成功且数组非空
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置从本地台账中获取的台账信息为空或者无效信息无法解析,请核对前置使用的入参信息:%s",parm.c_str());
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER,"【ERROR】前置从本地台账中获取的台账信息为空或者无效信息无法解析,请核对前置使用的入参信息:%s",parm.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
free(ledger); // root==null释放内容
|
free(ledger); // root==null释放内容
|
||||||
@@ -4181,7 +4212,7 @@ int parse_device_cfg_web()
|
|||||||
|
|
||||||
std::cout << "input_jstr: " << input_jstr << std::endl; // 输出结果
|
std::cout << "input_jstr: " << input_jstr << std::endl; // 输出结果
|
||||||
|
|
||||||
DIY_DEBUGLOG("process","【DEBUG】前置的%s%d号进程调用web接口获取台账使用的请求输入为:%s",get_front_msg_from_subdir(), g_front_seg_index,input_jstr);
|
DIY_DEBUGLOG_CODE("process",0,LOG_CODE_LEDGER,"【DEBUG】前置的%s%d号进程调用web接口获取台账使用的请求输入为:%s",get_front_msg_from_subdir(), g_front_seg_index,input_jstr);
|
||||||
|
|
||||||
codes.push_back(input_jstr); //是否需要筛选状态直接在配置文件控制
|
codes.push_back(input_jstr); //是否需要筛选状态直接在配置文件控制
|
||||||
|
|
||||||
@@ -4216,13 +4247,13 @@ int parse_device_cfg_web()
|
|||||||
//判断是否相等
|
//判断是否相等
|
||||||
if(max_process_num != max_index){
|
if(max_process_num != max_index){
|
||||||
if(max_process_num > 0 && max_process_num < 10){
|
if(max_process_num > 0 && max_process_num < 10){
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"【WARN】前置比对台账获取的进程数:%d和本地配置的进程数:%d,不匹配,按照台账进程数重置前置的进程数量",max_process_num,max_index);
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_LEDGER,"【WARN】前置比对台账获取的进程数:%d和本地配置的进程数:%d,不匹配,按照台账进程数重置前置的进程数量",max_process_num,max_index);
|
||||||
// 调用执行脚本函数
|
// 调用执行脚本函数
|
||||||
close_listening_socket();
|
close_listening_socket();
|
||||||
execute_bash("reset", max_process_num, "all");
|
execute_bash("reset", max_process_num, "all");
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置从台账获取的进程数:%d不符合范围1~9,按照本地配置进程数启动进程",max_process_num);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER,"【ERROR】前置从台账获取的进程数:%d不符合范围1~9,按照本地配置进程数启动进程",max_process_num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4231,7 +4262,7 @@ int parse_device_cfg_web()
|
|||||||
|
|
||||||
std::cout << "terminal_ledger_num:" << count_cfg << std::endl;
|
std::cout << "terminal_ledger_num:" << count_cfg << std::endl;
|
||||||
|
|
||||||
DIY_DEBUGLOG("process","【DEBUG】前置的%s%d号进程调用获取到的台账的数量为:%d",get_front_msg_from_subdir(), g_front_seg_index,count_cfg);
|
DIY_DEBUGLOG_CODE("process",0,LOG_CODE_LEDGER,"【DEBUG】前置的%s%d号进程调用获取到的台账的数量为:%d",get_front_msg_from_subdir(), g_front_seg_index,count_cfg);
|
||||||
|
|
||||||
//如果当前进程获取的台账为0,按照配置数量申请空间,台账内容为空
|
//如果当前进程获取的台账为0,按照配置数量申请空间,台账内容为空
|
||||||
g_node->n_clients = count_cfg;
|
g_node->n_clients = count_cfg;
|
||||||
@@ -4246,11 +4277,11 @@ int parse_device_cfg_web()
|
|||||||
//添加提示
|
//添加提示
|
||||||
std::cout << "!!!!!!!!!!single process can not add any ledger unless reboot!!!!!!!"<< std::endl;
|
std::cout << "!!!!!!!!!!single process can not add any ledger unless reboot!!!!!!!"<< std::endl;
|
||||||
|
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"【WARN】前置的%s%d号进程获取到的台账的数量大于配置文件中给单个进程配置的台账数量:%d,这个进程将按照获取到的台账的数量来创建台账空间,这个进程不能直接通过台账添加来新增台账,只能通过重启进程或者先删除已有台账再添加台账的方式来添加新台账",get_front_msg_from_subdir(), g_front_seg_index,IED_COUNT);
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_LEDGER,"【WARN】前置的%s%d号进程获取到的台账的数量大于配置文件中给单个进程配置的台账数量:%d,这个进程将按照获取到的台账的数量来创建台账空间,这个进程不能直接通过台账添加来新增台账,只能通过重启进程或者先删除已有台账再添加台账的方式来添加新台账",get_front_msg_from_subdir(), g_front_seg_index,IED_COUNT);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, IED_COUNT * sizeof(ied_t*));//g_node->clients 这块大内存空间存储了 count_cfg 个 ied_t* 类型的指针(即一个指针数组)这是(指向内存块的指针)的指针数组
|
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, IED_COUNT * sizeof(ied_t*));//g_node->clients 这块大内存空间存储了 count_cfg 个 ied_t* 类型的指针(即一个指针数组)这是(指向内存块的指针)的指针数组
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程根据配置文件中给单个进程配置的台账数量:%d来创建台账空间",get_front_msg_from_subdir(), g_front_seg_index,IED_COUNT);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_LEDGER,"【NORMAL】前置的%s%d号进程根据配置文件中给单个进程配置的台账数量:%d来创建台账空间",get_front_msg_from_subdir(), g_front_seg_index,IED_COUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
//把ied放入数组
|
//把ied放入数组
|
||||||
@@ -4512,7 +4543,7 @@ int parse_device_cfg_web()
|
|||||||
{
|
{
|
||||||
isdelta_flag = 1; //存在一个监测点为角型接线则这个前置就要启动第二个配置列表
|
isdelta_flag = 1; //存在一个监测点为角型接线则这个前置就要启动第二个配置列表
|
||||||
cout << "monitor_id" << monitor_id << "v_wiring_type:" << line_info.v_wiring_type << "is delta wiring:" << isdelta_flag << endl;
|
cout << "monitor_id" << monitor_id << "v_wiring_type:" << line_info.v_wiring_type << "is delta wiring:" << isdelta_flag << endl;
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"【WARN】前置连接的监测点 %s 是角形接线,对应终端为%s 终端类型是%s",line_info.mp_id,ied_usr->terminal_id,ied_usr->dev_type);
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_LEDGER,"【WARN】前置连接的监测点 %s 是角形接线,对应终端为%s 终端类型是%s",line_info.mp_id,ied_usr->terminal_id,ied_usr->dev_type);
|
||||||
}
|
}
|
||||||
strcpy(line_info.monitor_status, monitor_status);
|
strcpy(line_info.monitor_status, monitor_status);
|
||||||
cout << "monitor_status:" << line_info.monitor_status << endl;
|
cout << "monitor_status:" << line_info.monitor_status << endl;
|
||||||
@@ -4786,7 +4817,7 @@ int parse_model_cfg_web()
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
if(parse_model_web(&icd_model_map,codes)){
|
if(parse_model_web(&icd_model_map,codes)){
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置的%s%d号进程 icd模型接口异常,将使用默认的icd模型,请检查接口配置", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置的%s%d号进程 icd模型接口异常,将使用默认的icd模型,请检查接口配置", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
return APR_SUCCESS; //可以使用默认的映射文件所以返回正常
|
return APR_SUCCESS; //可以使用默认的映射文件所以返回正常
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5053,7 +5084,7 @@ int recall_json_handle(const char* jstr)
|
|||||||
|
|
||||||
if(strcmp(ied_usr->LD_info[m].mp_id,monitorId.toStdString().c_str()) == 0){//匹配上了
|
if(strcmp(ied_usr->LD_info[m].mp_id,monitorId.toStdString().c_str()) == 0){//匹配上了
|
||||||
|
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程处理监测点%s -id:%s 的数据补招",get_front_msg_from_subdir(), g_front_seg_index,ied_usr->LD_info[m].name,ied_usr->LD_info[m].mp_id);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_RECALL,"【NORMAL】前置的%s%d号进程处理监测点%s -id:%s 的数据补招",get_front_msg_from_subdir(), g_front_seg_index,ied_usr->LD_info[m].name,ied_usr->LD_info[m].mp_id);
|
||||||
mppair = 1;
|
mppair = 1;
|
||||||
break;//找到就退出监测点循环
|
break;//找到就退出监测点循环
|
||||||
}
|
}
|
||||||
@@ -5276,7 +5307,7 @@ void handleUploadResponse(const std::string& response, char* wavepath) {
|
|||||||
cJSON* json_data = cJSON_Parse(response.c_str());
|
cJSON* json_data = cJSON_Parse(response.c_str());
|
||||||
if (json_data == nullptr) {
|
if (json_data == nullptr) {
|
||||||
std::cerr << "Error parsing response: " << cJSON_GetErrorPtr() << std::endl;
|
std::cerr << "Error parsing response: " << cJSON_GetErrorPtr() << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传文件失败,web返回的消息错误,无法解析");
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传文件失败,web返回的消息错误,无法解析");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5322,11 +5353,11 @@ void handleUploadResponse(const std::string& response, char* wavepath) {
|
|||||||
|
|
||||||
std::cout << "wavepath: " << wavepath << std::endl;
|
std::cout << "wavepath: " << wavepath << std::endl;
|
||||||
|
|
||||||
DIY_INFOLOG("process","【NORMAL】前置上传文件成功,远端文件名:%s",wavepath);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【NORMAL】前置上传文件成功,远端文件名:%s",wavepath);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::cerr << "Error: Missing expected fields in JSON response." << std::endl;
|
std::cerr << "Error: Missing expected fields in JSON response." << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传文件失败,web返回的消息没有远端文件名");
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传文件失败,web返回的消息没有远端文件名");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 释放 JSON 对象
|
// 释放 JSON 对象
|
||||||
@@ -5443,7 +5474,7 @@ void SendFileWeb(const std::string& strUrl, const char* localpath, const char* c
|
|||||||
CURLcode res = curl_easy_perform(curl);
|
CURLcode res = curl_easy_perform(curl);
|
||||||
if (res != CURLE_OK) {
|
if (res != CURLE_OK) {
|
||||||
std::cerr << "http web failed: " << curl_easy_strerror(res) << std::endl;
|
std::cerr << "http web failed: " << curl_easy_strerror(res) << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传暂态录波文件 %s 失败,请检查文件上传接口配置",localpath);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传暂态录波文件 %s 失败,请检查文件上传接口配置",localpath);
|
||||||
} else {
|
} else {
|
||||||
std::cout << "http web success, response: " << resPost0 << std::endl;
|
std::cout << "http web success, response: " << resPost0 << std::endl;
|
||||||
handleUploadResponse(resPost0, wavepath); // 处理响应
|
handleUploadResponse(resPost0, wavepath); // 处理响应
|
||||||
@@ -6064,7 +6095,7 @@ int parse_rpt_log_ini_one(ied_t* ied)
|
|||||||
//添加判断,有的监测点没有cpuno为2,直接申请了LD_info[2-1],没申请LD_info[0]
|
//添加判断,有的监测点没有cpuno为2,直接申请了LD_info[2-1],没申请LD_info[0]
|
||||||
if(ied_usr->LD_info[cpuno].LD_name == NULL){
|
if(ied_usr->LD_info[cpuno].LD_name == NULL){
|
||||||
printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
|
printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
|
||||||
continue;//跳过防止崩溃
|
continue;//跳过防止崩溃
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6542,6 +6573,9 @@ void rocketmq_test_300(int mpnum,int front_index,int type) {
|
|||||||
// 循环发送 300 条消息
|
// 循环发送 300 条消息
|
||||||
if(type == 0){
|
if(type == 0){
|
||||||
std::cout << " use ledger send msg " << std::endl;
|
std::cout << " use ledger send msg " << std::endl;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&mtx);
|
||||||
|
|
||||||
for (int i = 0; (total_messages > 0 && g_node_id == 100) && i < g_node->n_clients; ++i) {//台账模拟不限制进程号
|
for (int i = 0; (total_messages > 0 && g_node_id == 100) && i < g_node->n_clients; ++i) {//台账模拟不限制进程号
|
||||||
|
|
||||||
ied = (ied_t*)g_node->clients[i];
|
ied = (ied_t*)g_node->clients[i];
|
||||||
@@ -6611,6 +6645,13 @@ void rocketmq_test_300(int mpnum,int front_index,int type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << "Finished sending " << g_node->n_clients << " messages." << std::endl;
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&mtx);
|
||||||
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
std::cout << " use monitor + number send msg " << std::endl;
|
std::cout << " use monitor + number send msg " << std::endl;
|
||||||
@@ -6663,9 +6704,10 @@ void rocketmq_test_300(int mpnum,int front_index,int type) {
|
|||||||
apr_sleep(apr_time_from_msec(60000/total_messages)); // 添加毫秒延时
|
apr_sleep(apr_time_from_msec(60000/total_messages)); // 添加毫秒延时
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::cout << "Finished sending " << total_messages << " messages." << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Finished sending " << total_messages << " messages." << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ struct LOGEntry {
|
|||||||
std::string id;
|
std::string id;
|
||||||
std::string level; // terminal / measurepoint
|
std::string level; // terminal / measurepoint
|
||||||
int code; //code
|
int code; //code
|
||||||
int min_grade;
|
int min_grade; //允许上送的最低日志等级
|
||||||
int countdown;
|
int countdown; //自动关闭的倒计时,单位秒
|
||||||
};
|
};
|
||||||
|
|
||||||
//日志上送map管理
|
//日志上送map管理
|
||||||
@@ -68,6 +68,15 @@ extern std::string intToString(int number);
|
|||||||
|
|
||||||
//日志主题
|
//日志主题
|
||||||
extern std::string G_LOG_TOPIC;
|
extern std::string G_LOG_TOPIC;
|
||||||
|
|
||||||
|
// 日志限流配置
|
||||||
|
extern int G_LOG_RATE_RESET_SEC;
|
||||||
|
extern int G_LOG_RATE_LIMIT_SEC;
|
||||||
|
extern int G_LOG_RATE_KEEP_ALL_MS;
|
||||||
|
extern int G_LOG_RATE_KEEP_BURST_MS;
|
||||||
|
extern int G_LOG_RATE_KEEP_BURST_COUNT;
|
||||||
|
extern int G_LOG_RATE_KEEP_HIGHFREQ_COUNT;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
//log4命名空间
|
//log4命名空间
|
||||||
using namespace log4cplus;
|
using namespace log4cplus;
|
||||||
@@ -337,7 +346,19 @@ protected:
|
|||||||
|
|
||||||
// ③ 限频:同一条日志
|
// ③ 限频:同一条日志
|
||||||
const std::string rkey = make_key(logger_name, level, code, msg);
|
const std::string rkey = make_key(logger_name, level, code, msg);
|
||||||
if (!should_emit(rkey)) return;
|
|
||||||
|
uint64_t suppressed_before_emit = 0;
|
||||||
|
if (!should_emit(rkey, suppressed_before_emit)) return;
|
||||||
|
|
||||||
|
// 如果本次输出前压掉过日志,则在 log 文本后追加统计
|
||||||
|
std::string final_msg = msg;
|
||||||
|
if (suppressed_before_emit > 0) {
|
||||||
|
std::ostringstream suppressed_oss;
|
||||||
|
suppressed_oss << msg << " 【已过滤重复同类日志 "
|
||||||
|
<< suppressed_before_emit
|
||||||
|
<< " 条】";
|
||||||
|
final_msg = suppressed_oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "{\"processNo\":\"" << intToString(g_front_seg_index)
|
oss << "{\"processNo\":\"" << intToString(g_front_seg_index)
|
||||||
@@ -348,7 +369,7 @@ protected:
|
|||||||
<< "\",\"logtype\":\"" << safe_logtype
|
<< "\",\"logtype\":\"" << safe_logtype
|
||||||
<< "\",\"frontType\":\"" << get_front_type_from_subdir()
|
<< "\",\"frontType\":\"" << get_front_type_from_subdir()
|
||||||
<< "\",\"code\":" << code
|
<< "\",\"code\":" << code
|
||||||
<< ",\"log\":\"" << escape_json(msg) << "\"}";
|
<< ",\"log\":\"" << escape_json(final_msg) << "\"}";
|
||||||
|
|
||||||
Ckafka_data_t connect_info;
|
Ckafka_data_t connect_info;
|
||||||
connect_info.strTopic = QString::fromStdString(G_LOG_TOPIC);
|
connect_info.strTopic = QString::fromStdString(G_LOG_TOPIC);
|
||||||
@@ -386,11 +407,20 @@ public:
|
|||||||
//////////////////////////////////////////////////////////////////20260303添加日志上送控制 - 频率限制实现
|
//////////////////////////////////////////////////////////////////20260303添加日志上送控制 - 频率限制实现
|
||||||
private:
|
private:
|
||||||
struct RateState {
|
struct RateState {
|
||||||
uint64_t hit_count;
|
uint64_t pass_count; // 当前周期内已放行条数
|
||||||
|
uint64_t suppressed_count; // 当前被抑制条数
|
||||||
std::chrono::steady_clock::time_point last_emit;
|
std::chrono::steady_clock::time_point last_emit;
|
||||||
|
std::chrono::steady_clock::time_point last_seen;
|
||||||
|
std::chrono::steady_clock::time_point last_reset;
|
||||||
bool has_emit;
|
bool has_emit;
|
||||||
|
|
||||||
RateState() : hit_count(0), last_emit(), has_emit(false) {}
|
RateState()
|
||||||
|
: pass_count(0),
|
||||||
|
suppressed_count(0),
|
||||||
|
last_emit(),
|
||||||
|
last_seen(),
|
||||||
|
last_reset(),
|
||||||
|
has_emit(false) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::unordered_map<std::string, RateState> s_rate_map;
|
static std::unordered_map<std::string, RateState> s_rate_map;
|
||||||
@@ -398,37 +428,98 @@ private:
|
|||||||
|
|
||||||
static std::string make_key(const std::string& logger_name, int level, int code, const std::string& msg) {
|
static std::string make_key(const std::string& logger_name, int level, int code, const std::string& msg) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << logger_name << "|" << level << "|" << code << "|" << msg;
|
oss << logger_name << "|" << level << "|" << code ; //<< "|" << msg;
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool should_emit(const std::string& key) {
|
static bool should_emit(const std::string& key, uint64_t& suppressed_before_emit) {
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
|
|
||||||
const auto now = steady_clock::now();
|
const auto now = steady_clock::now();
|
||||||
|
suppressed_before_emit = 0;
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lk(s_rate_mutex);
|
std::lock_guard<std::mutex> lk(s_rate_mutex);
|
||||||
RateState& st = s_rate_map[key];
|
RateState& st = s_rate_map[key];
|
||||||
|
|
||||||
const int RESET_SEC = 3600;
|
const int RESET_SEC = G_LOG_RATE_RESET_SEC ; // 1小时重置
|
||||||
if (st.has_emit) {
|
const int LIMIT_SEC = G_LOG_RATE_LIMIT_SEC ; // 进入限流后:多久发1条 主要控制中频和高频那些,低频的都直接放行了
|
||||||
auto idle = duration_cast<seconds>(now - st.last_emit).count();
|
|
||||||
if (idle >= RESET_SEC) st.hit_count = 0;
|
// 初始化 / 强制每小时重置
|
||||||
|
if (st.last_reset.time_since_epoch().count() == 0) {
|
||||||
|
st.last_reset = now;
|
||||||
|
} else {
|
||||||
|
auto since_reset = duration_cast<seconds>(now - st.last_reset).count();
|
||||||
|
if (since_reset >= RESET_SEC) { //重置周期
|
||||||
|
st = RateState();
|
||||||
|
st.last_reset = now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
st.hit_count++;
|
// 计算当前频率档位(按“本次与上次看到该key的间隔”判断)
|
||||||
const int period_sec = (st.hit_count > 3) ? 300 : 1;
|
// >=60秒/条:全部保留
|
||||||
|
// [1秒, 60秒):保留前60条,然后1分钟1条
|
||||||
|
// <1秒:保留前10条,然后1分钟1条
|
||||||
|
int allow_burst = 0;
|
||||||
|
|
||||||
if (!st.has_emit) {
|
if (st.last_seen.time_since_epoch().count() == 0) {
|
||||||
|
// 第一次看到,先按“全部保留”处理
|
||||||
|
allow_burst = -1;
|
||||||
|
} else {
|
||||||
|
auto gap_ms = duration_cast<milliseconds>(now - st.last_seen).count();
|
||||||
|
|
||||||
|
if (gap_ms >= G_LOG_RATE_KEEP_ALL_MS) { //什么时候不需要限流 //低频 //如果这里设置的很低,就不会限流
|
||||||
|
allow_burst = -1; // 全部保留
|
||||||
|
} else if (gap_ms >= G_LOG_RATE_KEEP_BURST_MS) {
|
||||||
|
allow_burst = G_LOG_RATE_KEEP_BURST_COUNT; // 前60条 //中频 //如果这里设置的比低频低,也不会生效
|
||||||
|
} else {
|
||||||
|
allow_burst = G_LOG_RATE_KEEP_HIGHFREQ_COUNT; // 前10条 //高频
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
st.last_seen = now;
|
||||||
|
|
||||||
|
// 档位1:全部保留
|
||||||
|
if (allow_burst == -1) {
|
||||||
|
suppressed_before_emit = st.suppressed_count;
|
||||||
|
st.suppressed_count = 0;
|
||||||
|
st.pass_count++;
|
||||||
st.last_emit = now;
|
st.last_emit = now;
|
||||||
st.has_emit = true;
|
st.has_emit = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto elapsed = duration_cast<seconds>(now - st.last_emit).count();
|
// 档位2/3:先放前N条
|
||||||
if (elapsed >= period_sec) {
|
if (st.pass_count < (uint64_t)allow_burst) {
|
||||||
|
suppressed_before_emit = st.suppressed_count;
|
||||||
|
st.suppressed_count = 0;
|
||||||
|
st.pass_count++;
|
||||||
st.last_emit = now;
|
st.last_emit = now;
|
||||||
|
st.has_emit = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 超过前N条后:进入 1分钟1条
|
||||||
|
if (!st.has_emit) {
|
||||||
|
suppressed_before_emit = st.suppressed_count;
|
||||||
|
st.suppressed_count = 0;
|
||||||
|
st.pass_count++;
|
||||||
|
st.last_emit = now;
|
||||||
|
st.has_emit = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto elapsed = duration_cast<seconds>(now - st.last_emit).count();
|
||||||
|
if (elapsed >= LIMIT_SEC) {
|
||||||
|
suppressed_before_emit = st.suppressed_count;
|
||||||
|
st.suppressed_count = 0;
|
||||||
|
st.pass_count++;
|
||||||
|
st.last_emit = now;
|
||||||
|
st.has_emit = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 本条被抑制
|
||||||
|
st.suppressed_count++;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -554,7 +645,7 @@ void init_loggers_bydevid(const char* dev_id)
|
|||||||
Logger device_logger = init_logger(device_key, device_dir, dev_id, device_appender); //用终端id作为日志文件名
|
Logger device_logger = init_logger(device_key, device_dir, dev_id, device_appender); //用终端id作为日志文件名
|
||||||
logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DEFAULT);
|
logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DEFAULT);
|
||||||
|
|
||||||
DIY_INFOLOG(device_key.c_str(),"【NORMAL】终端id:%s终端级日志初始化完毕", ied_usr->terminal_id);
|
DIY_INFOLOG_CODE(device_key.c_str(),1,LOG_CODE_OTHER,"【NORMAL】终端id:%s终端级日志初始化完毕", ied_usr->terminal_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化监测点
|
// 初始化监测点
|
||||||
@@ -579,7 +670,7 @@ void init_loggers_bydevid(const char* dev_id)
|
|||||||
Logger mon_logger = init_logger(mon_key.str(), mon_path.str(), mon_name.str(),monitor_appender);//用监测点号作为日志文件名
|
Logger mon_logger = init_logger(mon_key.str(), mon_path.str(), mon_name.str(),monitor_appender);//用监测点号作为日志文件名
|
||||||
logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DEFAULT);
|
logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DEFAULT);
|
||||||
|
|
||||||
DIY_INFOLOG(mon_key.str().c_str(),"【NORMAL】监测点:%s - id:%s监测点级日志初始化完毕", ied_usr->LD_info[i].name,ied_usr->LD_info[i].mp_id);
|
DIY_INFOLOG_CODE(mon_key.str().c_str(),2,LOG_CODE_OTHER,"【NORMAL】监测点:%s - id:%s监测点级日志初始化完毕", ied_usr->LD_info[i].name,ied_usr->LD_info[i].mp_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -628,7 +719,7 @@ void init_loggers() {
|
|||||||
|
|
||||||
logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DEFAULT);
|
logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DEFAULT);
|
||||||
|
|
||||||
DIY_INFOLOG(device_key.c_str(),"【NORMAL】终端id:%s终端级日志初始化完毕", ied_usr->terminal_id);
|
DIY_INFOLOG_CODE(device_key.c_str(),1,LOG_CODE_OTHER,"【NORMAL】终端id:%s终端级日志初始化完毕", ied_usr->terminal_id);
|
||||||
|
|
||||||
// 初始化监测点
|
// 初始化监测点
|
||||||
// 监测点 logger 名称格式:monitor.<mp_id>
|
// 监测点 logger 名称格式:monitor.<mp_id>
|
||||||
@@ -650,7 +741,7 @@ void init_loggers() {
|
|||||||
|
|
||||||
logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DEFAULT);
|
logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DEFAULT);
|
||||||
|
|
||||||
DIY_INFOLOG(mon_key.str().c_str(),"【NORMAL】监测点:%s - id:%s监测点级日志初始化完毕", ied_usr->LD_info[i].name,ied_usr->LD_info[i].mp_id);
|
DIY_INFOLOG_CODE(mon_key.str().c_str(),2,LOG_CODE_OTHER,"【NORMAL】监测点:%s - id:%s监测点级日志初始化完毕", ied_usr->LD_info[i].name,ied_usr->LD_info[i].mp_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
338
include/ied.h
338
include/ied.h
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @file: $RCSfile: ied.h,v $
|
* @file: $RCSfile: ied.h,v $
|
||||||
* @brief: $<EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
* @brief: $设备数据结构定义
|
||||||
*
|
*
|
||||||
* @version: $Revision: 1.1 $
|
* @version: $Revision: 1.1 $
|
||||||
* @date: $Date: 2018/11/24 06:54:49 $
|
* @date: $Date: 2018/11/24 06:54:49 $
|
||||||
@@ -24,35 +24,35 @@ typedef byte_t channel_size_type;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define PRV_ANA_EXTENSION (1) //ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
#define PRV_ANA_EXTENSION (1) //模拟量用户扩展属性 总数
|
||||||
#define PRV_DIGIT_EXTENSION (3) //ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
#define PRV_DIGIT_EXTENSION (3) //遥信量用户扩展属性 总数
|
||||||
#define PRV_EVENT_EXTENSION (3) //<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
#define PRV_EVENT_EXTENSION (3) //事件量用户扩展属性 总数
|
||||||
#define PRV_PULSE_EXTENSION (2) //ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
#define PRV_PULSE_EXTENSION (2) //遥测量用户扩展属性 总数
|
||||||
//-----ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>չ---------------//
|
//-----模拟量用户扩展---------------//
|
||||||
#define ANA_EXTENSION_ALARM (0) //<EFBFBD>澯:<3A>澯<EFBFBD>ȼ<EFBFBD>;<3B>澯<EFBFBD><E6BEAF><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
#define ANA_EXTENSION_ALARM (0) //告警:告警等级;告警声音文件名
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct analog_t analog_t;
|
typedef struct analog_t analog_t;
|
||||||
struct analog_t {
|
struct analog_t {
|
||||||
byte_t type; /**< <EFBFBD><EFBFBD>ѹ/<2F><><EFBFBD><EFBFBD>/<2F>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>/<2F><EFBFBD><DEB9><EFBFBD><EFBFBD><EFBFBD>/Ƶ<><C6B5>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> */
|
byte_t type; /**< 电压/电流/有功功率/无功功率/频率/功率因素/其它 */
|
||||||
float initval; /**< ȱʡֵ */
|
float initval; /**< 缺省值 */
|
||||||
float minimum; /**< ȡֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
float minimum; /**< 取值下限 */
|
||||||
float maximum; /**< ȡֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
float maximum; /**< 取值上限 */
|
||||||
float step; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
float step; /**< 步长 */
|
||||||
byte_t integral; /**< precision ( n , m ) - n */
|
byte_t integral; /**< precision ( n , m ) - n */
|
||||||
byte_t decimal; /**< precision ( n , m ) - m */
|
byte_t decimal; /**< precision ( n , m ) - m */
|
||||||
float offset; /**< ʵ<EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
float offset; /**< 实际值转换基数 */
|
||||||
float factor; /**< ʵ<EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
|
float factor; /**< 实际值转换系数 */
|
||||||
float threshold; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
float threshold; /**< 门限值 */
|
||||||
float smooth; /**< ƽ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
|
float smooth; /**< 平滑系数 */
|
||||||
float lower; /**< <EFBFBD>澯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
float lower; /**< 告警下限值 */
|
||||||
float higher; /**< <EFBFBD>澯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
float higher; /**< 告警上限值 */
|
||||||
float lowest; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>澯ֵ */
|
float lowest; /**< 下下限告警值 */
|
||||||
float highest; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>澯ֵ */
|
float highest; /**< 上上限告警值 */
|
||||||
float blur; /**< <EFBFBD><EFBFBD>ֵģ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
|
float blur; /**< 阀值模糊系数 */
|
||||||
char dimension[SHORTNAME]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ASCII<EFBFBD><EFBFBD>ʽ(A/V/kV/kvar/kW/MW etc.) */
|
char dimension[SHORTNAME]; /**< 量纲ASCII格式(A/V/kV/kvar/kW/MW etc.) */
|
||||||
void *ext[PRV_ANA_EXTENSION]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ */
|
void *ext[PRV_ANA_EXTENSION]; /**< 保护管理机扩展 */
|
||||||
}ALIGNPACKED;
|
}ALIGNPACKED;
|
||||||
|
|
||||||
|
|
||||||
@@ -66,27 +66,27 @@ struct ana_extention_t{
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct digit_t digit_t;
|
typedef struct digit_t digit_t;
|
||||||
#define DGT_TYP_UNDEF 0x00 /**< δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define DGT_TYP_UNDEF 0x00 /**< 未定义 */
|
||||||
#define DGT_TYP_SAMPLING 0x01 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define DGT_TYP_SAMPLING 0x01 /**< 采样 */
|
||||||
#define DGT_TYP_EVENT 0x02 /**< <EFBFBD>¼<EFBFBD> */
|
#define DGT_TYP_EVENT 0x02 /**< 事件 */
|
||||||
#define DGT_TYP_ALARM 0x03 /**< <EFBFBD>澯 */
|
#define DGT_TYP_ALARM 0x03 /**< 告警 */
|
||||||
#define DGT_TYP_OPERATE 0x04 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define DGT_TYP_OPERATE 0x04 /**< 操作 */
|
||||||
#define DGT_TYP_SYSTEM 0x05 /**< ϵͳ */
|
#define DGT_TYP_SYSTEM 0x05 /**< 系统 */
|
||||||
/** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
/** 数字量私有属性 */
|
||||||
struct digit_t {
|
struct digit_t {
|
||||||
byte_t type; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>¼<EFBFBD>/<2F>澯/<2F><><EFBFBD><EFBFBD>/ϵͳ */
|
byte_t type; /**< 采样/事件/告警/操作/系统 */
|
||||||
byte_t initval; /**< default zero value(0 or 1) */
|
byte_t initval; /**< default zero value(0 or 1) */
|
||||||
byte_t level; /**< level */
|
byte_t level; /**< level */
|
||||||
byte_t snd_timer; /**< sound play timer (s) */
|
byte_t snd_timer; /**< sound play timer (s) */
|
||||||
byte_t rst_timer; /**< auto restore timer (s) */
|
byte_t rst_timer; /**< auto restore timer (s) */
|
||||||
uint16_t act_lim; /**< (0 ==> 1)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>澯<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint16_t act_lim; /**< (0 ==> 1)动作告警上限 */
|
||||||
uint16_t rst_lim; /**< (1 ==> 0)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>澯<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint16_t rst_lim; /**< (1 ==> 0)动作告警上限 */
|
||||||
uint16_t act_num; /**< (0 ==> 1)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>) */
|
uint16_t act_num; /**< (0 ==> 1)动作上限(不需界面录入) */
|
||||||
uint16_t rst_num; /**< (1 ==> 0)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>) */
|
uint16_t rst_num; /**< (1 ==> 0)动作上限(不需界面录入) */
|
||||||
//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
|
//第二版去掉
|
||||||
//char on[SHORTNAME]; /**< 0==>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ASCII<EFBFBD><EFBFBD>ʽ) */
|
//char on[SHORTNAME]; /**< 0==>1动作名称(ASCII格式) */
|
||||||
//char off[SHORTNAME]; /**< 1==>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ASCII<EFBFBD><EFBFBD>ʽ) */
|
//char off[SHORTNAME]; /**< 1==>0动作名称(ASCII格式) */
|
||||||
void *ext[PRV_DIGIT_EXTENSION]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ */
|
void *ext[PRV_DIGIT_EXTENSION]; /**< 保护管理机扩展 */
|
||||||
}ALIGNPACKED;
|
}ALIGNPACKED;
|
||||||
|
|
||||||
|
|
||||||
@@ -102,12 +102,12 @@ struct digit_t {
|
|||||||
|
|
||||||
typedef struct state_describe_extention_t state_describe_extention_t;
|
typedef struct state_describe_extention_t state_describe_extention_t;
|
||||||
struct state_describe_extention_t{
|
struct state_describe_extention_t{
|
||||||
char *state_describe[4]; /**< ״̬0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
char *state_describe[4]; /**< 状态0,1,2,3的描述 */
|
||||||
};
|
};
|
||||||
typedef struct sound_file_name_extention_t sound_file_name_extention_t;
|
typedef struct sound_file_name_extention_t sound_file_name_extention_t;
|
||||||
|
|
||||||
struct sound_file_name_extention_t{
|
struct sound_file_name_extention_t{
|
||||||
char *sound_file_name[3]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¹ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
char *sound_file_name[3]; /**< 开报警声、合报警声、事故报警声 */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct epfi_addt_extension_t epfi_addt_extension_t;
|
typedef struct epfi_addt_extension_t epfi_addt_extension_t;
|
||||||
@@ -120,48 +120,48 @@ struct epfi_addt_extension_t {
|
|||||||
|
|
||||||
typedef struct pulse_t pulse_t;
|
typedef struct pulse_t pulse_t;
|
||||||
/** Integrated totals private attr */
|
/** Integrated totals private attr */
|
||||||
#define PLS_TYP_UNDEF 0x00 /**< δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define PLS_TYP_UNDEF 0x00 /**< 未定义 */
|
||||||
#define PLS_TYP_PLUS_POWER_HV 0x01 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD> */
|
#define PLS_TYP_PLUS_POWER_HV 0x01 /**< 正向有功 */
|
||||||
#define PLS_TYP_PLUS_POWER_NO 0x02 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define PLS_TYP_PLUS_POWER_NO 0x02 /**< 正向无功 */
|
||||||
#define PLS_TYP_NEGATIVE_POWER_HV 0x03 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD> */
|
#define PLS_TYP_NEGATIVE_POWER_HV 0x03 /**< 反向有功 */
|
||||||
#define PLS_TYP_NEGATIVE_POWER_NO 0x04 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define PLS_TYP_NEGATIVE_POWER_NO 0x04 /**< 反向无功 */
|
||||||
struct pulse_t {
|
struct pulse_t {
|
||||||
byte_t type; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
byte_t type; /**< 正向有功/正向无功/反向有功/反向无功 */
|
||||||
uint32_t save_flag; /**< <EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint32_t save_flag; /**< 存储标记 */
|
||||||
uint32_t initval; /**< default value */
|
uint32_t initval; /**< default value */
|
||||||
uint32_t minimum; /**< minimum value */
|
uint32_t minimum; /**< minimum value */
|
||||||
uint32_t maximum; /**< maximum value */
|
uint32_t maximum; /**< maximum value */
|
||||||
uint32_t step; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint32_t step; /**< 步长 */
|
||||||
//changed by zhancg 2017-04-05 <EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>
|
//changed by zhancg 2017-04-05 配系数
|
||||||
// uint32_t offset; /**< ʵ<EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
// uint32_t offset; /**< 实际值转换基数 */
|
||||||
// uint32_t factor; /**< ʵ<EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
|
// uint32_t factor; /**< 实际值转换系数 */
|
||||||
// uint32_t threshold; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
// uint32_t threshold; /**< 门限值 */
|
||||||
// uint32_t smooth; /**< ƽ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
|
// uint32_t smooth; /**< 平滑系数 */
|
||||||
float offset; /**< ʵ<EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
float offset; /**< 实际值转换基数 */
|
||||||
float factor; /**< ʵ<EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
|
float factor; /**< 实际值转换系数 */
|
||||||
float threshold; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
float threshold; /**< 门限值 */
|
||||||
float smooth; /**< ƽ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
|
float smooth; /**< 平滑系数 */
|
||||||
char dimension[SHORTNAME]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ASCII<EFBFBD><EFBFBD>ʽ(kvar/kW/MW etc.) */
|
char dimension[SHORTNAME]; /**< 量纲ASCII格式(kvar/kW/MW etc.) */
|
||||||
void *ext[PRV_PULSE_EXTENSION];
|
void *ext[PRV_PULSE_EXTENSION];
|
||||||
}ALIGNPACKED;
|
}ALIGNPACKED;
|
||||||
typedef struct pluse_stage_limits_extention_t pluse_stage_limits_extention_t;
|
typedef struct pluse_stage_limits_extention_t pluse_stage_limits_extention_t;
|
||||||
struct pluse_stage_limits_extention_t{
|
struct pluse_stage_limits_extention_t{
|
||||||
uint32_t limits[3]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<2C>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>ֵ,<2C>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
uint32_t limits[3]; /**< 峰电度限值,日电度限值,月电度限值 */
|
||||||
};
|
};
|
||||||
typedef struct pluse_stage_const_extention_t pluse_stage_const_extention_t;
|
typedef struct pluse_stage_const_extention_t pluse_stage_const_extention_t;
|
||||||
struct pluse_stage_const_extention_t{
|
struct pluse_stage_const_extention_t{
|
||||||
char* stage[8]; /**< <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1,<2C><>ʱ<EFBFBD><CAB1>2,<2C><>ʱ<EFBFBD><CAB1>3,<2C><>ʱ<EFBFBD><CAB1>4,<2C><>ʱ<EFBFBD><CAB1>1,<2C><>ʱ<EFBFBD><CAB1>2,<2C><>ʱ<EFBFBD><CAB1>3,<2C><>ʱ<EFBFBD><CAB1>4 */
|
char* stage[8]; /**< 峰时段1,峰时段2,峰时段3,峰时段4,谷时段1,谷时段2,谷时段3,谷时段4 */
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
typedef struct command_t command_t;
|
typedef struct command_t command_t;
|
||||||
/** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ */
|
/** 命令消息结构 */
|
||||||
struct command_t {
|
struct command_t {
|
||||||
ticks_t ticks; /**< Ticks when command generated */
|
ticks_t ticks; /**< Ticks when command generated */
|
||||||
apr_time_t tmlimit; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> */
|
apr_time_t tmlimit; /**< 命令执行完成的限制时间 */
|
||||||
byte_t state; /**< ACTIVE<EFBFBD><EFBFBD>FINISH or TIMEOUT */
|
byte_t state; /**< ACTIVE、FINISH or TIMEOUT */
|
||||||
byte_t channel; /**< command channel no */
|
byte_t channel; /**< command channel no */
|
||||||
byte_t flag; /**< General<EFBFBD><EFBFBD>System or Special */
|
byte_t flag; /**< General、System or Special */
|
||||||
byte_t typ; /**< Command TYPE(IEC60870-5-101) */
|
byte_t typ; /**< Command TYPE(IEC60870-5-101) */
|
||||||
uint32_t ied; /**< Controlled IED id */
|
uint32_t ied; /**< Controlled IED id */
|
||||||
uint32_t group; /**< Controlled group id */
|
uint32_t group; /**< Controlled group id */
|
||||||
@@ -173,65 +173,65 @@ struct command_t {
|
|||||||
|
|
||||||
|
|
||||||
/** status_t code definiens */
|
/** status_t code definiens */
|
||||||
#define STATUS_NORMAL 0 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define STATUS_NORMAL 0 /**< 正常 */
|
||||||
#define STATUS_NOINIT 1 /**< δ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> */
|
#define STATUS_NOINIT 1 /**< 未初始化 */
|
||||||
#define STATUS_OVERTIME 2 /**< ͨ<EFBFBD>ų<EFBFBD>ʱ */
|
#define STATUS_OVERTIME 2 /**< 通信超时 */
|
||||||
#define STATUS_BREAKOFF 3 /**< ͨ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
|
#define STATUS_BREAKOFF 3 /**< 通信中断 */
|
||||||
#define STATUS_BLOCKED 4 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define STATUS_BLOCKED 4 /**< 封锁 */
|
||||||
#define STATUS_TESTING 5 /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define STATUS_TESTING 5 /**< 测试 */
|
||||||
#define STATUS_NOTDEF 6 /**< δ<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) */
|
#define STATUS_NOTDEF 6 /**< 未配置(本运行状态没有配置) */
|
||||||
|
|
||||||
typedef uint16_t status_t; /**< <EFBFBD>豸<EFBFBD><EFBFBD>ͨ<EFBFBD>Žڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
typedef uint16_t status_t; /**< 设备或通信节点的运行状态 */
|
||||||
|
|
||||||
typedef struct alias_t alias_t;
|
typedef struct alias_t alias_t;
|
||||||
/** <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صı<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ */
|
/** 数据元素的别名结构 */
|
||||||
struct alias_t { /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صı<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ */
|
struct alias_t { /**< 数据元素的别名结构 */
|
||||||
uint32_t id; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD>ַ */
|
uint32_t id; /**< 别名信息地址 */
|
||||||
uint32_t parent; /**< <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IED */
|
uint32_t parent; /**< 所指代的IED */
|
||||||
uint32_t group; /**< <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IED<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint32_t group; /**< 所指代的IED内的组号 */
|
||||||
uint32_t dot; /**< <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IED<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint32_t dot; /**< 所指代的IED内的序号 */
|
||||||
value_t* value; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
value_t* value; /**< 运行时刻实时数据 */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ied_t ied_t;
|
typedef struct ied_t ied_t;
|
||||||
typedef struct group_t group_t;
|
typedef struct group_t group_t;
|
||||||
typedef struct element_t element_t;
|
typedef struct element_t element_t;
|
||||||
|
|
||||||
/** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϢԪ<EFBFBD>صĽṹ */
|
/** 数据信息元素的结构 */
|
||||||
struct element_t {
|
struct element_t {
|
||||||
uint32_t id; /**< Identification, Information Address */
|
uint32_t id; /**< Identification, Information Address */
|
||||||
uint32_t flags; /**< flags define */
|
uint32_t flags; /**< flags define */
|
||||||
byte_t type; /**< IEC60870-5-101 TYP.(IEC60870DEF.h) */
|
byte_t type; /**< IEC60870-5-101 TYP.(IEC60870DEF.h) */
|
||||||
byte_t code; /**< Data code type.(BIN/ASCII/BCD/etc.) */
|
byte_t code; /**< Data code type.(BIN/ASCII/BCD/etc.) */
|
||||||
uint32_t parent; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸 */
|
uint32_t parent; /**< 隶属设备 */
|
||||||
uint32_t group; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint32_t group; /**< 数据组号 */
|
||||||
uint32_t dot; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint32_t dot; /**< 数据序号 */
|
||||||
uint16_t size; /**< <EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>λ) */
|
uint16_t size; /**< 数据宽度(以字节为单位) */
|
||||||
char name[LONGNAME]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
char name[LONGNAME]; /**< 数据名称 */
|
||||||
|
|
||||||
char *aliasname; /**< <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>Ӧ<EFBFBD><EFBFBD>Ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ++EPFI++ */
|
char *aliasname; /**< 数据点别名,如用于中文名称对应的英文名称 ++EPFI++ */
|
||||||
|
|
||||||
void *owner; /**< ˽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խṹ(analog_t/digit_t/..../etc.) */
|
void *owner; /**< 私有属性结构(analog_t/digit_t/..../etc.) */
|
||||||
void *script; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ */
|
void *script; /**< 关联的计算表达式 */
|
||||||
|
|
||||||
/** Runtime generate */
|
/** Runtime generate */
|
||||||
value_t value; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʵʱ<EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
value_t value; /**< 运行时刻实时数据缓冲区 */
|
||||||
ticks_t last; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>仯ʱ<EFBFBD><EFBFBD> */
|
ticks_t last; /**< 最后变化时间 */
|
||||||
uint32_t state; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
uint32_t state; /**< 数据状态 */
|
||||||
byte_t funtype; /**< <EFBFBD>̳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ݹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
byte_t funtype; /**< 继承自所属组的类型,表示数据功能类型 */
|
||||||
uint16_t index; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint16_t index; /**< 数据元素索引 */
|
||||||
uint16_t n_alias_add_1; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD> */
|
uint16_t n_alias_add_1; /**< 分配的数据别名缓冲区的大小(预留1,动态定订购用) */
|
||||||
uint16_t n_alias; /**< <EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD> */
|
uint16_t n_alias; /**< 数据别名数组元素个数 */
|
||||||
alias_t* alias; /**< <EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
alias_t* alias; /**< 数据别名索引数组 */
|
||||||
uint16_t alias_pos; /**< <EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰλ<EFBFBD><EFBFBD> */
|
uint16_t alias_pos; /**< 数据别名当前位置 */
|
||||||
uint32_t offset; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
uint32_t offset; /**< 数据在设备数据缓冲区内的偏移索引 */
|
||||||
group_t *grp; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
group_t *grp; /**< 所属数据组句柄 */
|
||||||
ied_t *ied; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
ied_t *ied; /**< 所属设备句柄 */
|
||||||
|
|
||||||
/* Extend property */
|
/* Extend property */
|
||||||
void *sys_ext; /**< <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5> */
|
void *sys_ext; /**< 数据点的系统扩展属性,由基本库实现 */
|
||||||
void *app_ext; /**< <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>Ӧ<EFBFBD>ÿ<EFBFBD>ʵ<EFBFBD><CAB5> */
|
void *app_ext; /**< 数据点的应用扩展属性,由应用库实现 */
|
||||||
void *usr_ext; /**< <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ʵ<EFBFBD><CAB5> */
|
void *usr_ext; /**< 数据点的用户扩展属性,由应用程序实现 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/** group_t->type definiens */
|
/** group_t->type definiens */
|
||||||
@@ -245,36 +245,36 @@ struct element_t {
|
|||||||
#define GRP_ALARM 7 /**< Alarm type */
|
#define GRP_ALARM 7 /**< Alarm type */
|
||||||
#define GRP_SETTING 8 /**< Fixed value type */
|
#define GRP_SETTING 8 /**< Fixed value type */
|
||||||
#define GRP_STATUS 9 /**< State of device */
|
#define GRP_STATUS 9 /**< State of device */
|
||||||
#define GRP_VDI 10 /**< <EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD> type */
|
#define GRP_VDI 10 /**< 软压板 type */
|
||||||
#define GRP_STEPPOS 11 /**< Step position type */
|
#define GRP_STEPPOS 11 /**< Step position type */
|
||||||
#define GRP_COMBO 12 /**< combo/compute type */
|
#define GRP_COMBO 12 /**< combo/compute type */
|
||||||
#define GRP_SIMANA 13 /**< ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define GRP_SIMANA 13 /**< 模拟量 */
|
||||||
#define GRP_SETAREA 14 /**< <EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD> */
|
#define GRP_SETAREA 14 /**< 定值区 */
|
||||||
#define GRP_ACCANA 15 /**< ¼<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define GRP_ACCANA 15 /**< 录波模拟量 */
|
||||||
#define GRP_ACCDGT 16 /**< ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define GRP_ACCDGT 16 /**< 录波开关量 */
|
||||||
#define GRP_SETPOINT 18 /**< Set point type for 101,104 protocol used only */
|
#define GRP_SETPOINT 18 /**< Set point type for 101,104 protocol used only */
|
||||||
#define GRP_STEPCONTROL 19 /**< <EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define GRP_STEPCONTROL 19 /**< 步位置调节组 */
|
||||||
|
|
||||||
/** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ */
|
/** 数据组结构 */
|
||||||
struct group_t {
|
struct group_t {
|
||||||
uint32_t id; /**< Identification, Commond Address of Set */
|
uint32_t id; /**< Identification, Commond Address of Set */
|
||||||
uint32_t flags; /**< Flags definiens */
|
uint32_t flags; /**< Flags definiens */
|
||||||
byte_t type; /**< Analogue/Digit/Control/Event/etc. */
|
byte_t type; /**< Analogue/Digit/Control/Event/etc. */
|
||||||
char name[LONGNAME]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
char name[LONGNAME]; /**< 数据组的名称 */
|
||||||
uint16_t maxelems; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>elements<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ */
|
uint16_t maxelems; /**< 允许包含elements的最大数目 */
|
||||||
element_t *elements; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
element_t *elements; /**< 数据元素定义数组 */
|
||||||
|
|
||||||
// runtime generate
|
// runtime generate
|
||||||
uint16_t count; /**< ʵ<EFBFBD>ʰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ */
|
uint16_t count; /**< 实际包含的数据元素数目 */
|
||||||
uint16_t index; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IED->groups<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD> */
|
uint16_t index; /**< 数据组索引IED->groups的数组下标 */
|
||||||
value_t value; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>黺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>elements<EFBFBD><EFBFBD>ʵʱֵ */
|
value_t value; /**< 数据组缓冲区,顺序存放elements的实时值 */
|
||||||
ied_t *ied; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
ied_t *ied; /**< 所属设备句柄 */
|
||||||
apr_hash_t *htdots; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD> */
|
apr_hash_t *htdots; /**< 数据元素定义哈希表 */
|
||||||
|
|
||||||
/* Extend property */
|
/* Extend property */
|
||||||
void *sys_ext; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5> */
|
void *sys_ext; /**< 数据组的系统扩展属性,由基本库实现 */
|
||||||
void *app_ext; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>Ӧ<EFBFBD>ÿ<EFBFBD>ʵ<EFBFBD><CAB5> */
|
void *app_ext; /**< 数据组的应用扩展属性,由应用库实现 */
|
||||||
void *usr_ext; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ʵ<EFBFBD><CAB5> */
|
void *usr_ext; /**< 数据组的用户扩展属性,由应用程序实现 */
|
||||||
};
|
};
|
||||||
|
|
||||||
//<!-- IEDConfig id,name,flags,type,chncount,cpucount,addrsinfo,cpusinfo,station,frequency,delay,count
|
//<!-- IEDConfig id,name,flags,type,chncount,cpucount,addrsinfo,cpusinfo,station,frequency,delay,count
|
||||||
@@ -284,83 +284,83 @@ struct group_t {
|
|||||||
#define IED_TYPE_REMOTE (1)
|
#define IED_TYPE_REMOTE (1)
|
||||||
#define IED_TYPE_SYSTEM (2)
|
#define IED_TYPE_SYSTEM (2)
|
||||||
#define IED_TYPE_VIRTUAL (3)
|
#define IED_TYPE_VIRTUAL (3)
|
||||||
#define IED_TYPE_EPFI (4) /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define IED_TYPE_EPFI (4) /**< 保护管理机 */
|
||||||
|
|
||||||
|
|
||||||
#define IED_FLAG_BLOCKED 0x00000004 /**< <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱʡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define IED_FLAG_BLOCKED 0x00000004 /**< 是否封锁,缺省不封锁 */
|
||||||
|
|
||||||
|
|
||||||
#define CHANBEL_TYPE_UNKNOWN (0)
|
#define CHANBEL_TYPE_UNKNOWN (0)
|
||||||
#define CHANNEL_TYPE_IPV4 (1)
|
#define CHANNEL_TYPE_IPV4 (1)
|
||||||
#define CHANNEL_TYPE_IPV6 (2) /**< δ<EFBFBD><EFBFBD> */
|
#define CHANNEL_TYPE_IPV6 (2) /**< 未用 */
|
||||||
#define CHANNEL_TYPE_SERIAL (3) /**< <EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD> */
|
#define CHANNEL_TYPE_SERIAL (3) /**< 串口号 */
|
||||||
|
|
||||||
#define CHANNEL_TYPE_USER_DEFINED (254) /**< <EFBFBD>û<EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
#define CHANNEL_TYPE_USER_DEFINED (254) /**< 用户自定义类型 */
|
||||||
|
|
||||||
|
|
||||||
typedef struct channel_t channel_t;
|
typedef struct channel_t channel_t;
|
||||||
struct channel_t {
|
struct channel_t {
|
||||||
uint32_t master; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>(Node ID) */
|
uint32_t master; /**< 所属通信通道(Node ID) */
|
||||||
|
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2008-08-16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,֧<><D6A7>
|
//以下两个属性域为2008-08-16增加,支持
|
||||||
int channel_type; /**< ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
int channel_type; /**< 通道地址类型 */
|
||||||
char addr_str[LONGNAME]; /**< ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ */
|
char addr_str[LONGNAME]; /**< 通道地址的字符串表示 */
|
||||||
|
|
||||||
uint32_t addr; /**< ͨ<EFBFBD>Ŷ˿ڵ<EFBFBD>ַ */
|
uint32_t addr; /**< 通信端口地址 */
|
||||||
uint16_t port; /**< ip<EFBFBD><EFBFBD>ַ<EFBFBD>Ķ˿<EFBFBD> */
|
uint16_t port; /**< ip地址的端口 */
|
||||||
|
|
||||||
uint32_t status; /**< ͨ<EFBFBD>Ŷ˿<EFBFBD>״̬ */
|
uint32_t status; /**< 通信端口状态 */
|
||||||
ticks_t last_ticks; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> */
|
ticks_t last_ticks; /**< 最近访问时间 */
|
||||||
ticks_t last_send_ticks; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯʱ<EFBFBD><EFBFBD> */
|
ticks_t last_send_ticks; /**< 最近查询时间 */
|
||||||
void *connect; /**< ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӿ<EFBFBD><EFBFBD><EFBFBD> */
|
void *connect; /**< 通道连接句柄 */
|
||||||
ied_t *ied; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
ied_t *ied; /**< 所属设备句柄 */
|
||||||
int ied_id; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸id */
|
int ied_id; /**< 所属设备id */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct cpuinfo_t cpuinfo_t;
|
typedef struct cpuinfo_t cpuinfo_t;
|
||||||
struct cpuinfo_t {
|
struct cpuinfo_t {
|
||||||
byte_t addr; /**< CPU<EFBFBD><EFBFBD>ַ */
|
byte_t addr; /**< CPU地址 */
|
||||||
byte_t status; /**< CPU״̬ */
|
byte_t status; /**< CPU状态 */
|
||||||
byte_t templ; /**< CPUģ<EFBFBD><EFBFBD> */
|
byte_t templ; /**< CPU模板 */
|
||||||
char name[LONGNAME]; /**< CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
char name[LONGNAME]; /**< CPU名称 */
|
||||||
ticks_t last_gi; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD>ѯʱ<EFBFBD><EFBFBD> */
|
ticks_t last_gi; /**< 最近总查询时间 */
|
||||||
ticks_t last_gi_send; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> */
|
ticks_t last_gi_send; /**< 最近总查询发送时间 */
|
||||||
ticks_t next_gi_send; /**< <EFBFBD>´<EFBFBD><EFBFBD>ܲ<EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> */
|
ticks_t next_gi_send; /**< 下次总查询发送时间 */
|
||||||
ticks_t last_ticks; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> */
|
ticks_t last_ticks; /**< 最近访问时间 */
|
||||||
ticks_t last_send_ticks; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯʱ<EFBFBD><EFBFBD> */
|
ticks_t last_send_ticks; /**< 最近查询时间 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** IED struct definiens */
|
/** IED struct definiens */
|
||||||
struct ied_t {
|
struct ied_t {
|
||||||
uint32_t id; /**< Primy key ( = 0 ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IED ) */
|
uint32_t id; /**< Primy key ( = 0 系统保留IED ) */
|
||||||
uint32_t flags; /**< Flags define */
|
uint32_t flags; /**< Flags define */
|
||||||
byte_t type; /**< Type define */
|
byte_t type; /**< Type define */
|
||||||
byte_t chncount; /**< <EFBFBD>豸ͨ<EFBFBD>Ŷ˿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱʡ=1<><31> */
|
byte_t chncount; /**< 设备通信端口总数(缺省=1) */
|
||||||
channel_t *channel; /**< <EFBFBD>豸ͨ<EFBFBD>Ŷ˿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
channel_t *channel; /**< 设备通信端口数组 */
|
||||||
byte_t cpucount; /**< CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱʡ=1<><31> */
|
byte_t cpucount; /**< CPU总数(缺省=1) */
|
||||||
cpuinfo_t *cpuinfo; /**< CPU<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
cpuinfo_t *cpuinfo; /**< CPU地址数组 */
|
||||||
char name[LONGNAME]; /**< <EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
char name[LONGNAME]; /**< 设备名称 */
|
||||||
uint32_t station; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><ֱ<><D6B1>Ŀ¼ID> */
|
uint32_t station; /**< 所属站号<直属目录ID> */
|
||||||
uint32_t node; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>Žڵ<EFBFBD><EFBFBD><EFBFBD> */
|
uint32_t node; /**< 所属通信节点号 */
|
||||||
uint16_t frequency; /**< ͨ<EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> */
|
uint16_t frequency; /**< 通信扫描频率 */
|
||||||
uint32_t delay; /**< ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ʱ(ms) */
|
uint32_t delay; /**< 通信响应延时(ms) */
|
||||||
uint16_t count; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ */
|
uint16_t count; /**< 包含的数据组数目 */
|
||||||
group_t *groups; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鶨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
group_t *groups; /**< 数据组定义数组 */
|
||||||
apr_hash_t *htgroups; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鶨<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
apr_hash_t *htgroups; /**< 数据组定义哈希表句柄 */
|
||||||
uint32_t systoken_st; /**< ϵͳ<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>״̬ */
|
uint32_t systoken_st; /**< 系统令牌的状态 */
|
||||||
|
|
||||||
/* Runtime generate */
|
/* Runtime generate */
|
||||||
uint16_t index; /**< <EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD> */
|
uint16_t index; /**< 设备数组下标 */
|
||||||
status_t status; /**< <EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
status_t status; /**< 设备运行状态 */
|
||||||
ticks_t last_ticks; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> */
|
ticks_t last_ticks; /**< 最近访问时间 */
|
||||||
ticks_t last_gi; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD>ѯʱ<EFBFBD><EFBFBD> */
|
ticks_t last_gi; /**< 最近总查询时间 */
|
||||||
|
|
||||||
/* Extend property */
|
/* Extend property */
|
||||||
void *sys_ext; /**< <EFBFBD>豸<EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ⶨ<EFBFBD><E2B6A8> */
|
void *sys_ext; /**< 设备的系统扩展属性,基本库定义 */
|
||||||
void *app_ext; /**< <EFBFBD>豸<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,Ӧ<>ÿⶨ<C3BF><E2B6A8> */
|
void *app_ext; /**< 设备的应用扩展属性,应用库定义 */
|
||||||
void *usr_ext; /**< <EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
void *usr_ext; /**< 设备的用户扩展属性,应用程序定义 */
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _OS_WIN32_
|
#ifdef _OS_WIN32_
|
||||||
|
|||||||
@@ -2791,13 +2791,6 @@ static void format_time_ms(long long ms, char* buf, size_t buf_len)
|
|||||||
void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long time,char* devtype,int monitor_id)
|
void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long time,char* devtype,int monitor_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
char full_key_m_c[256]; // 分配足够空间
|
|
||||||
char full_key_m_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_m_c, sizeof(full_key_m_c), "monitor.%s.COM", mp_id);
|
|
||||||
snprintf(full_key_m_d, sizeof(full_key_m_d), "monitor.%s.DATA", mp_id);
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
|
|
||||||
XmlConfig c_xmlcfg;
|
XmlConfig c_xmlcfg;
|
||||||
if (xmlinfo_list.contains(devtype)) {
|
if (xmlinfo_list.contains(devtype)) {
|
||||||
c_xmlcfg = xmlinfo_list[devtype]->xmlcfg;
|
c_xmlcfg = xmlinfo_list[devtype]->xmlcfg;
|
||||||
@@ -2847,7 +2840,7 @@ void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long ti
|
|||||||
snprintf(mp_name, sizeof(mp_name), "unknown");
|
snprintf(mp_name, sizeof(mp_name), "unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
DIY_WARNLOG_CODE(full_key_m_d, LOG_CODE_REPORT,
|
DIY_WARNLOG_CODE(mp_id,2 ,LOG_CODE_GGIO_LPHD,
|
||||||
"监测点:%s(%s),在%s发生事件:%s,事件值:%.2f",
|
"监测点:%s(%s),在%s发生事件:%s,事件值:%.2f",
|
||||||
mp_name, mp_id, time_str, descBa.constData(), v);
|
mp_name, mp_id, time_str, descBa.constData(), v);
|
||||||
|
|
||||||
@@ -2964,7 +2957,7 @@ void Set_xml_databaseinfo(char* MODEL_ID, char* TMNL_TYPE, char* FILE_PATH, char
|
|||||||
cout << file_name << "!!!!!!!!!!!!!!!!!!!!!!!!!!" << save_name << endl;
|
cout << file_name << "!!!!!!!!!!!!!!!!!!!!!!!!!!" << save_name << endl;
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【WARN】前置获取到终端类型%s,该终端类型对应的映射文件为%s,映射文件将下载并保存在本地为%s",TMNL_TYPE,FILE_PATH,save_name);
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_ICD_AND_DOWNLOAD,"【WARN】前置获取到终端类型%s,该终端类型对应的映射文件为%s,映射文件将下载并保存在本地为%s",TMNL_TYPE,FILE_PATH,save_name);
|
||||||
|
|
||||||
|
|
||||||
// 调用web获取文件内容
|
// 调用web获取文件内容
|
||||||
@@ -2990,7 +2983,7 @@ void Set_xml_databaseinfo(char* MODEL_ID, char* TMNL_TYPE, char* FILE_PATH, char
|
|||||||
(dataItem == NULL || (dataItem->type == cJSON_NULL))) {
|
(dataItem == NULL || (dataItem->type == cJSON_NULL))) {
|
||||||
isErrorJson = true;
|
isErrorJson = true;
|
||||||
std::cerr << "Error: Server returned empty file stream, code=A00555." << std::endl;
|
std::cerr << "Error: Server returned empty file stream, code=A00555." << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process", LOG_CODE_ICD_AND_DOWNLOAD,
|
DIY_ERRORLOG_CODE("process",0, LOG_CODE_ICD_AND_DOWNLOAD,
|
||||||
"【ERROR】前置下载文件失败,服务端返回A00555(文件流为空),文件=%s",
|
"【ERROR】前置下载文件失败,服务端返回A00555(文件流为空),文件=%s",
|
||||||
save_name);
|
save_name);
|
||||||
}
|
}
|
||||||
@@ -3007,17 +3000,17 @@ void Set_xml_databaseinfo(char* MODEL_ID, char* TMNL_TYPE, char* FILE_PATH, char
|
|||||||
outFile.close();
|
outFile.close();
|
||||||
std::cout << "File saved successfully!" << std::endl;
|
std::cout << "File saved successfully!" << std::endl;
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG("process","【NORMAL】前置下载映射文件%s成功",save_name);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_ICD_AND_DOWNLOAD,"【NORMAL】前置下载映射文件%s成功",save_name);
|
||||||
} else {
|
} else {
|
||||||
std::cerr << "Error: Unable to open file for writing." << std::endl;
|
std::cerr << "Error: Unable to open file for writing." << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置写入本地映射文件%s失败",save_name);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置写入本地映射文件%s失败",save_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 释放分配的内存
|
// 释放分配的内存
|
||||||
free(fileContent);
|
free(fileContent);
|
||||||
} else {
|
} else {
|
||||||
std::cerr << "Error: Unable to download file." << std::endl;
|
std::cerr << "Error: Unable to download file." << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置调用文件下载接口下载远端文件文件%s失败",FILE_PATH);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置调用文件下载接口下载远端文件文件%s失败",FILE_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3348,7 +3341,7 @@ static bool writeJsonToFile(const char* filePath, const char* jsonString)
|
|||||||
{
|
{
|
||||||
FILE* fp = fopen(filePath, "w");
|
FILE* fp = fopen(filePath, "w");
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
//DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】无法将暂态事件写入本地缓存");
|
//DIY_ERRORLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【ERROR】无法将暂态事件写入本地缓存");
|
||||||
std::cerr << "Failed to write in file : " << filePath << std::endl;
|
std::cerr << "Failed to write in file : " << filePath << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -3435,7 +3428,7 @@ static void scanAndResendOfflineFiles(const std::string &dirPath)
|
|||||||
// 读取文件内容(即之前存的 JSON)
|
// 读取文件内容(即之前存的 JSON)
|
||||||
FILE* fp = fopen(fileList[i].fileName.c_str(), "r");
|
FILE* fp = fopen(fileList[i].fileName.c_str(), "r");
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】无法打开本地缓存的暂态事件");
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【ERROR】无法打开本地缓存的暂态事件");
|
||||||
std::cerr << " fail to open exsist file " << fileList[i].fileName << std::endl;
|
std::cerr << " fail to open exsist file " << fileList[i].fileName << std::endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -3462,14 +3455,14 @@ static void scanAndResendOfflineFiles(const std::string &dirPath)
|
|||||||
std::cout << "old file send fail" << std::endl;
|
std::cout << "old file send fail" << std::endl;
|
||||||
|
|
||||||
|
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【WARN】前置重发暂态事件失败");
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【WARN】前置重发暂态事件失败");
|
||||||
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// 表示有响应,则可视为成功;根据项目需要可加更精细的判断
|
// 表示有响应,则可视为成功;根据项目需要可加更精细的判断
|
||||||
handleCommentResponse(std::string(ptr));
|
handleCommentResponse(std::string(ptr));
|
||||||
|
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【WARN】前置重发暂态事件成功");
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【WARN】前置重发暂态事件成功");
|
||||||
|
|
||||||
std::cout << "old file send success,remove it" << std::endl;
|
std::cout << "old file send success,remove it" << std::endl;
|
||||||
// 删除文件
|
// 删除文件
|
||||||
@@ -3504,13 +3497,6 @@ char* uuid_cfg,char* uuid_dat,
|
|||||||
char* mp_id,char* Qvvr_rptname,char* devtype)
|
char* mp_id,char* Qvvr_rptname,char* devtype)
|
||||||
{
|
{
|
||||||
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
char full_key_m_c[256]; // 分配足够空间
|
|
||||||
char full_key_m_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_m_c, sizeof(full_key_m_c), "monitor.%s.COM", mp_id);
|
|
||||||
snprintf(full_key_m_d, sizeof(full_key_m_d), "monitor.%s.DATA", mp_id);
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
|
|
||||||
// 原本的逻辑,不做任何改动
|
// 原本的逻辑,不做任何改动
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
XmlConfig c_xmlcfg;
|
XmlConfig c_xmlcfg;
|
||||||
@@ -3565,7 +3551,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
|
|||||||
|
|
||||||
char* json_string = cJSON_Print(root);
|
char* json_string = cJSON_Print(root);
|
||||||
if (json_string == NULL) {
|
if (json_string == NULL) {
|
||||||
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】监测点:%s暂态事件生成JSON字符串失败",mp_id);
|
DIY_ERRORLOG_CODE(mp_id,2,LOG_CODE_TRANSIENT_COMM,"【ERROR】监测点:%s暂态事件生成JSON字符串失败",mp_id);
|
||||||
std::cerr << "Failed to print JSON object." << std::endl;
|
std::cerr << "Failed to print JSON object." << std::endl;
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -3585,7 +3571,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
|
|||||||
if (j_r == NULL) {
|
if (j_r == NULL) {
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】暂态接口响应异常,无法上送监测点%s的暂态事件",mp_id);
|
DIY_ERRORLOG_CODE(mp_id,2,LOG_CODE_TRANSIENT_COMM,"【ERROR】暂态接口响应异常,无法上送监测点%s的暂态事件",mp_id);
|
||||||
|
|
||||||
std::cout << "qvvr send fail ,store in local" << std::endl;
|
std::cout << "qvvr send fail ,store in local" << std::endl;
|
||||||
// 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M,若超过则删除最老的一个文件
|
// 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M,若超过则删除最老的一个文件
|
||||||
@@ -3607,7 +3593,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
|
|||||||
|
|
||||||
// 把 json_string 写入文件
|
// 把 json_string 写入文件
|
||||||
if(!writeJsonToFile(fileName.c_str(), json_string)){
|
if(!writeJsonToFile(fileName.c_str(), json_string)){
|
||||||
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】监测点:%s无法将暂态时间为%lld的暂态事件写入本地缓存",mp_id,start_tm);
|
DIY_ERRORLOG_CODE(mp_id,2,LOG_CODE_TRANSIENT_COMM,"【ERROR】监测点:%s无法将暂态时间为%lld的暂态事件写入本地缓存",mp_id,start_tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024);
|
checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024);
|
||||||
@@ -3636,7 +3622,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
|
|||||||
std::cout << "Error: Received NULL response" << std::endl;
|
std::cout << "Error: Received NULL response" << std::endl;
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】暂态接口无响应,无法上送监测点%s的暂态事件",mp_id);
|
DIY_ERRORLOG_CODE(mp_id,2,LOG_CODE_TRANSIENT_COMM,"【ERROR】暂态接口无响应,无法上送监测点%s的暂态事件",mp_id);
|
||||||
|
|
||||||
std::cout << "qvvr send fail ,store in local" << std::endl;
|
std::cout << "qvvr send fail ,store in local" << std::endl;
|
||||||
// 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M,若超过则删除最老的一个文件
|
// 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M,若超过则删除最老的一个文件
|
||||||
@@ -3656,7 +3642,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
|
|||||||
fileName += ".txt";
|
fileName += ".txt";
|
||||||
// 把 json_string 写入文件
|
// 把 json_string 写入文件
|
||||||
if(!writeJsonToFile(fileName.c_str(), json_string)){
|
if(!writeJsonToFile(fileName.c_str(), json_string)){
|
||||||
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】监测点:%s无法将暂态时间为%lld的暂态事件写入本地缓存",mp_id,start_tm);
|
DIY_ERRORLOG_CODE(mp_id,2,LOG_CODE_TRANSIENT_COMM,"【ERROR】监测点:%s无法将暂态时间为%lld的暂态事件写入本地缓存",mp_id,start_tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024);
|
checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024);
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ extern std::string intToString(int number);
|
|||||||
int StringToInt(const std::string& str);
|
int StringToInt(const std::string& str);
|
||||||
extern pthread_mutex_t mtx;//lnk20250115
|
extern pthread_mutex_t mtx;//lnk20250115
|
||||||
|
|
||||||
|
extern int RECALL_ONLY_FLAG; //lnk20260309添加一个全局变量,标志是否只运行补招程序
|
||||||
|
|
||||||
extern void SendFileWeb(const std::string& strUrl,
|
extern void SendFileWeb(const std::string& strUrl,
|
||||||
const char* localpath,
|
const char* localpath,
|
||||||
@@ -1022,7 +1022,7 @@ int parse_set(const std::string& json_str) {
|
|||||||
//进程号为0或者进程号匹配上
|
//进程号为0或者进程号匹配上
|
||||||
std::cout << "msg index:"<< index_value <<" self index:" << g_front_seg_index << std::endl;
|
std::cout << "msg index:"<< index_value <<" self index:" << g_front_seg_index << std::endl;
|
||||||
|
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程处理topic:%s_%s的进程控制消息",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_SET.c_str());
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_PROCESS_CONTROL,"【NORMAL】前置的%s%d号进程处理topic:%s_%s的进程控制消息",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_SET.c_str());
|
||||||
|
|
||||||
if (code_str == "set_process") {
|
if (code_str == "set_process") {
|
||||||
|
|
||||||
@@ -1049,7 +1049,7 @@ int parse_set(const std::string& json_str) {
|
|||||||
}
|
}
|
||||||
execute_bash(fun, processNum, frontType);
|
execute_bash(fun, processNum, frontType);
|
||||||
|
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_PROCESS_CONTROL,"【WARN】前置的%s%d号进程执行指令:%s,reset表示重启所有进程,add表示添加进程",get_front_msg_from_subdir(), g_front_seg_index,fun.c_str());
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_PROCESS_CONTROL,"【WARN】前置的%s%d号进程执行指令:%s,reset表示重启所有进程,add表示添加进程",get_front_msg_from_subdir(), g_front_seg_index,fun.c_str());
|
||||||
|
|
||||||
//脚本在3秒后执行
|
//脚本在3秒后执行
|
||||||
//回复消息
|
//回复消息
|
||||||
@@ -1071,7 +1071,7 @@ int parse_set(const std::string& json_str) {
|
|||||||
send_reply_to_kafka(guid,"1","收到删除进程指令,这个进程将会重启 ");
|
send_reply_to_kafka(guid,"1","收到删除进程指令,这个进程将会重启 ");
|
||||||
|
|
||||||
//上送日志
|
//上送日志
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_PROCESS_CONTROL,"【WARN】前置的%s%d号进程执行指令:%s,即将重启",get_front_msg_from_subdir(), g_front_seg_index,fun.c_str());
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_PROCESS_CONTROL,"【WARN】前置的%s%d号进程执行指令:%s,即将重启",get_front_msg_from_subdir(), g_front_seg_index,fun.c_str());
|
||||||
|
|
||||||
apr_sleep(apr_time_from_sec(10));
|
apr_sleep(apr_time_from_sec(10));
|
||||||
::_exit(-1039); //进程退出
|
::_exit(-1039); //进程退出
|
||||||
@@ -1114,7 +1114,7 @@ int parse_set(const std::string& json_str) {
|
|||||||
(proindex >= 10 && proindex < 100)){ //单连测试用的进程号应该大于10小于100
|
(proindex >= 10 && proindex < 100)){ //单连测试用的进程号应该大于10小于100
|
||||||
execute_bash_debug(fun, ip, frontType,proindex);
|
execute_bash_debug(fun, ip, frontType,proindex);
|
||||||
|
|
||||||
DIY_WARNLOG("process","【WARN】前置的%s%d号进程执行指令:%s,start开启单连进程,delete杀死单连进程",get_front_msg_from_subdir(), g_front_seg_index,fun.c_str());
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_PROCESS_CONTROL,"【WARN】前置的%s%d号进程执行指令:%s,start开启单连进程,delete杀死单连进程",get_front_msg_from_subdir(), g_front_seg_index,fun.c_str());
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
std::cout << "param is not executable" <<std::endl;
|
std::cout << "param is not executable" <<std::endl;
|
||||||
@@ -1471,7 +1471,7 @@ int parse_log(const std::string& json_str) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程处理日志上送消息",get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_LOG_REQUEST,"【NORMAL】前置的%s%d号进程处理日志上送消息",get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
//进程号和匹配上
|
//进程号和匹配上
|
||||||
std::cout << "msg index:"<< processNo <<" self index:" << g_front_seg_index << std::endl;
|
std::cout << "msg index:"<< processNo <<" self index:" << g_front_seg_index << std::endl;
|
||||||
@@ -1588,7 +1588,7 @@ int parse_control(const std::string& json_str, const std::string& output_dir) {
|
|||||||
std::cout << "msg index:"<< process_No <<" self index:" << g_front_seg_index << std::endl;
|
std::cout << "msg index:"<< process_No <<" self index:" << g_front_seg_index << std::endl;
|
||||||
|
|
||||||
//记录日志
|
//记录日志
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程处理topic:%s_%s的台账更新消息",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_UD.c_str());
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_LEDGER_UPDATE,"【NORMAL】前置的%s%d号进程处理topic:%s_%s的台账更新消息",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_UD.c_str());
|
||||||
|
|
||||||
//匹配后响应收到台账更新消息
|
//匹配后响应收到台账更新消息
|
||||||
//除了回复收到消息,执行结束后还要回复结果
|
//除了回复收到消息,执行结束后还要回复结果
|
||||||
@@ -2141,7 +2141,7 @@ static int HandleTypeDownloadAndUpload(chnl_usr_t* chnl_usr,
|
|||||||
char localpath[512] = {0};
|
char localpath[512] = {0};
|
||||||
if (BuildTempLocalPath(localpath, sizeof(localpath), chnl_usr, req->path) != 0)
|
if (BuildTempLocalPath(localpath, sizeof(localpath), chnl_usr, req->path) != 0)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE("process", LOG_CODE_TRANSIENT_COMM,
|
DIY_ERRORLOG_CODE("process",0, LOG_CODE_TRANSIENT_COMM,
|
||||||
"【ERROR】构造本地临时路径失败 devid=%s path=%s",
|
"【ERROR】构造本地临时路径失败 devid=%s path=%s",
|
||||||
req->devid, req->path);
|
req->devid, req->path);
|
||||||
|
|
||||||
@@ -2156,7 +2156,7 @@ static int HandleTypeDownloadAndUpload(chnl_usr_t* chnl_usr,
|
|||||||
|
|
||||||
if (ret != SD_SUCCESS)
|
if (ret != SD_SUCCESS)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE("process", LOG_CODE_TRANSIENT_COMM,
|
DIY_ERRORLOG_CODE("process",0, LOG_CODE_TRANSIENT_COMM,
|
||||||
"【ERROR】装置文件下载失败 devid=%s, rem=%s, ret=0x%X",
|
"【ERROR】装置文件下载失败 devid=%s, rem=%s, ret=0x%X",
|
||||||
req->devid, req->path, ret);
|
req->devid, req->path, ret);
|
||||||
|
|
||||||
@@ -2164,7 +2164,7 @@ static int HandleTypeDownloadAndUpload(chnl_usr_t* chnl_usr,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIY_INFOLOG("process",
|
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】装置文件下载成功 devid=%s, rem=%s, local=%s",
|
"【NORMAL】装置文件下载成功 devid=%s, rem=%s, local=%s",
|
||||||
req->devid, req->path, localpath);
|
req->devid, req->path, localpath);
|
||||||
|
|
||||||
@@ -2192,7 +2192,7 @@ static int HandleTypeTransferToDevice(chnl_usr_t* chnl_usr,
|
|||||||
char localpath[512] = {0};
|
char localpath[512] = {0};
|
||||||
if (BuildTempLocalPath(localpath, sizeof(localpath), chnl_usr, req->path) != 0)
|
if (BuildTempLocalPath(localpath, sizeof(localpath), chnl_usr, req->path) != 0)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE("process", LOG_CODE_TRANSIENT_COMM,
|
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【ERROR】构造本地临时路径失败 devid=%s path=%s",
|
"【ERROR】构造本地临时路径失败 devid=%s path=%s",
|
||||||
req->devid, req->path);
|
req->devid, req->path);
|
||||||
|
|
||||||
@@ -2203,7 +2203,7 @@ static int HandleTypeTransferToDevice(chnl_usr_t* chnl_usr,
|
|||||||
int dlRet = DownloadFileWeb(WEB_FILEDOWNLOAD, req->path, localpath);
|
int dlRet = DownloadFileWeb(WEB_FILEDOWNLOAD, req->path, localpath);
|
||||||
if (dlRet != 0)
|
if (dlRet != 0)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE("process", LOG_CODE_TRANSIENT_COMM,
|
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【ERROR】Web 文件下载失败 devid=%s, path=%s",
|
"【ERROR】Web 文件下载失败 devid=%s, path=%s",
|
||||||
req->devid, req->path);
|
req->devid, req->path);
|
||||||
|
|
||||||
@@ -2211,7 +2211,7 @@ static int HandleTypeTransferToDevice(chnl_usr_t* chnl_usr,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIY_INFOLOG("process",
|
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】Web 文件下载成功 devid=%s, webpath=%s, local=%s",
|
"【NORMAL】Web 文件下载成功 devid=%s, webpath=%s, local=%s",
|
||||||
req->devid, req->path, localpath);
|
req->devid, req->path, localpath);
|
||||||
|
|
||||||
@@ -2227,7 +2227,7 @@ static int HandleTypeTransferToDevice(chnl_usr_t* chnl_usr,
|
|||||||
|
|
||||||
if (ret != SD_SUCCESS)
|
if (ret != SD_SUCCESS)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE("process", LOG_CODE_TRANSIENT_COMM,
|
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【ERROR】文件传送到装置失败 devid=%s, src=%s, dest=%s, ret=0x%X",
|
"【ERROR】文件传送到装置失败 devid=%s, src=%s, dest=%s, ret=0x%X",
|
||||||
req->devid, localpath, destfilename, ret);
|
req->devid, localpath, destfilename, ret);
|
||||||
|
|
||||||
@@ -2235,7 +2235,7 @@ static int HandleTypeTransferToDevice(chnl_usr_t* chnl_usr,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIY_INFOLOG("process",
|
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】文件传送到装置成功 devid=%s, src=%s, dest=%s",
|
"【NORMAL】文件传送到装置成功 devid=%s, src=%s, dest=%s",
|
||||||
req->devid, localpath, destfilename);
|
req->devid, localpath, destfilename);
|
||||||
|
|
||||||
@@ -2266,7 +2266,7 @@ void HandleFileDirReqForChannel(chnl_usr_t *chnl_usr)
|
|||||||
if (req == NULL)
|
if (req == NULL)
|
||||||
return; // 当前连接没有文件请求
|
return; // 当前连接没有文件请求
|
||||||
|
|
||||||
DIY_INFOLOG("process",
|
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】处理文件请求 terminal_id=%s type=%d path=%s",
|
"【NORMAL】处理文件请求 terminal_id=%s type=%d path=%s",
|
||||||
req->devid, req->type, req->path);
|
req->devid, req->type, req->path);
|
||||||
|
|
||||||
@@ -2291,7 +2291,7 @@ void HandleFileDirReqForChannel(chnl_usr_t *chnl_usr)
|
|||||||
filenum,
|
filenum,
|
||||||
(ret == SD_SUCCESS) ? 0 : ret);
|
(ret == SD_SUCCESS) ? 0 : ret);
|
||||||
|
|
||||||
DIY_INFOLOG("process",
|
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】目录请求处理完成 terminal_id=%s ret=0x%X filenum=%d",
|
"【NORMAL】目录请求处理完成 terminal_id=%s ret=0x%X filenum=%d",
|
||||||
req->devid, ret, filenum);
|
req->devid, ret, filenum);
|
||||||
|
|
||||||
@@ -2309,7 +2309,7 @@ void HandleFileDirReqForChannel(chnl_usr_t *chnl_usr)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DIY_WARNLOG("process",
|
DIY_WARNLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【WARN】未知文件请求类型 type=%d devid=%s path=%s",
|
"【WARN】未知文件请求类型 type=%d devid=%s path=%s",
|
||||||
req->type, req->devid, req->path);
|
req->type, req->devid, req->path);
|
||||||
|
|
||||||
@@ -2391,7 +2391,7 @@ int myMessageCallbackrtdata(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
//记录日志
|
//记录日志
|
||||||
DIY_INFOLOG("process","【NORMAL】前置消费topic:%s_%s的实时触发消息",FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_RT.c_str());
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_RT_DATA,"【NORMAL】前置消费topic:%s_%s的实时触发消息",FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_RT.c_str());
|
||||||
|
|
||||||
// 处理消息(例如,打印消息内容)
|
// 处理消息(例如,打印消息内容)
|
||||||
std::cout << "rt data Callback received message: " << body << std::endl;
|
std::cout << "rt data Callback received message: " << body << std::endl;
|
||||||
@@ -2410,7 +2410,7 @@ int myMessageCallbackrtdata(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
if (!parseJsonMessageRT(body, devid, line, realData, soeData, limit)) {
|
if (!parseJsonMessageRT(body, devid, line, realData, soeData, limit)) {
|
||||||
std::cerr << "Failed to parse the JSON message." << std::endl;
|
std::cerr << "Failed to parse the JSON message." << std::endl;
|
||||||
//记录日志
|
//记录日志
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RT_DATA,"【ERROR】前置消费topic:%s_%s的实时触发消息失败,消息的json格式不正确",FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_RT.c_str());
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RT_DATA,"【ERROR】前置消费topic:%s_%s的实时触发消息失败,消息的json格式不正确",FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_RT.c_str());
|
||||||
return E_RECONSUME_LATER;
|
return E_RECONSUME_LATER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2428,7 +2428,7 @@ int myMessageCallbackrtdata(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
}
|
}
|
||||||
// 创建 XML 文件
|
// 创建 XML 文件
|
||||||
if (!createXmlFile(dev_index, mp_index, realData, soeData, limit,"new")) {
|
if (!createXmlFile(dev_index, mp_index, realData, soeData, limit,"new")) {
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RT_DATA,"【ERROR】前置无法创建实时数据触发文件");
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RT_DATA,"【ERROR】前置无法创建实时数据触发文件");
|
||||||
std::cerr << "Failed to create the XML file." << std::endl;
|
std::cerr << "Failed to create the XML file." << std::endl;
|
||||||
return E_RECONSUME_LATER;
|
return E_RECONSUME_LATER;
|
||||||
}
|
}
|
||||||
@@ -2467,9 +2467,15 @@ int myMessageCallbackupdate(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//处理台账更新消息
|
//处理台账更新消息
|
||||||
std::string updatefilepath = "/home/pq/FeProject/etc/ledgerupdate";
|
if(RECALL_ONLY_FLAG != 1 || (g_node_id != STAT_DATA_BASE_NODE_ID)) {
|
||||||
if(parse_control(body,updatefilepath)){
|
std::string updatefilepath = "/FeProject/etc/ledgerupdate";
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER_UPDATE,"【ERROR】前置的%s%d号进程处理topic:%s_%s的台账更新消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_UD.c_str());
|
if(parse_control(body,updatefilepath)){
|
||||||
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER_UPDATE,"【ERROR】前置的%s%d号进程处理topic:%s_%s的台账更新消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_UD.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
printf("only process recall config, skip ledger update\n");
|
||||||
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_SPACE_ALARM,"【WARN】当前配置为仅日志模式,统计数据进程跳过台账更新");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2505,7 +2511,7 @@ int myMessageCallbackset(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
|
|
||||||
//处理进程更新消息
|
//处理进程更新消息
|
||||||
if(parse_set(body)){
|
if(parse_set(body)){
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_PROCESS_CONTROL,"【ERROR】前置的%s%d号进程处理topic:%s_%s的进程控制消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_SET.c_str());
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_PROCESS_CONTROL,"【ERROR】前置的%s%d号进程处理topic:%s_%s的进程控制消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_SET.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2541,7 +2547,7 @@ int myMessageCallbacklog(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
|
|
||||||
//处理进程更新消息
|
//处理进程更新消息
|
||||||
if(parse_log(body)){
|
if(parse_log(body)){
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LOG_REQUEST,"【ERROR】前置的%s%d号进程处理topic:%s_%s的日志上送消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_LOG.c_str());
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LOG_REQUEST,"【ERROR】前置的%s%d号进程处理topic:%s_%s的日志上送消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_LOG.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2590,7 +2596,7 @@ int myMessageCallbackrecall(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
std::cerr << "recall data is NULL." << std::endl;
|
std::cerr << "recall data is NULL." << std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程处理topic:%s_%s的补招触发消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_RC.c_str());
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程处理topic:%s_%s的补招触发消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(),G_MQCONSUMER_TOPIC_RC.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2616,7 +2622,7 @@ int myMessageCallbackfile(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
return E_RECONSUME_LATER;
|
return E_RECONSUME_LATER;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIY_INFOLOG("process","【NORMAL】前置消费topic:%s_%s的文件控制消息",
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_FILE_CONTROL,"【NORMAL】前置消费topic:%s_%s的文件控制消息",
|
||||||
FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_FILE.c_str());
|
FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_FILE.c_str());
|
||||||
|
|
||||||
std::cout << "file Callback received message: " << body << std::endl;
|
std::cout << "file Callback received message: " << body << std::endl;
|
||||||
@@ -2625,13 +2631,13 @@ int myMessageCallbackfile(CPushConsumer* consumer, CMessageExt* msg)
|
|||||||
file_dir_req_t req;
|
file_dir_req_t req;
|
||||||
if (ParseFileDirReq(body, &req) != 0)
|
if (ParseFileDirReq(body, &req) != 0)
|
||||||
{
|
{
|
||||||
DIY_WARNLOG("process", "【WARN】文件控制消息解析失败: %s", body);
|
DIY_WARNLOG_CODE(req.devid,1,LOG_CODE_FILE_CONTROL,"【WARN】文件控制消息解析失败: %s", body);
|
||||||
return E_CONSUME_SUCCESS;
|
return E_CONSUME_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
PushFileDirReq(&req);
|
PushFileDirReq(&req);
|
||||||
|
|
||||||
DIY_INFOLOG("process",
|
DIY_INFOLOG_CODE(req.devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】文件目录请求已入队 guid=%s devid=%s path=%s",
|
"【NORMAL】文件目录请求已入队 guid=%s devid=%s path=%s",
|
||||||
req.guid, req.devid, req.path);
|
req.guid, req.devid, req.path);
|
||||||
|
|
||||||
|
|||||||
248
log4cplus/config/defines.hxx
Normal file
248
log4cplus/config/defines.hxx
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
/* include/log4cplus/config/defines.hxx. Generated from defines.hxx.in by configure. */
|
||||||
|
#ifndef LOG4CPLUS_CONFIG_DEFINES_HXX
|
||||||
|
#define LOG4CPLUS_CONFIG_DEFINES_HXX
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_SYSLOG_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_ARPA_INET_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_NETINET_IN_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_NETINET_TCP_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_SYS_TIMEB_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_SYS_TIME_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_SYS_TYPES_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_SYS_STAT_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_SYS_SYSCALL_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_SYS_FILE_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_TIME_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_NETDB_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_UNISTD_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_FCNTL_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_STDARG_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_STDIO_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_STDLIB_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_ERRNO_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_WCHAR_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_ICONV_H */
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_LIMITS_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_FTIME 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_GETADDRINFO 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_GETHOSTBYNAME_R 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_GETPID 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_GMTIME_R 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_HTONL 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_HTONS 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_LOCALTIME_R 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_LSTAT 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_FCNTL 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_LOCKF 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_FLOCK 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_NTOHL 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_NTOHS 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `shutdown' function. */
|
||||||
|
#define LOG4CPLUS_HAVE_SHUTDOWN 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_PIPE 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_PIPE2 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_POLL 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_POLL_H 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_STAT 1
|
||||||
|
|
||||||
|
/* Define if this is a single-threaded library. */
|
||||||
|
/* #undef LOG4CPLUS_SINGLE_THREADED */
|
||||||
|
|
||||||
|
/* */
|
||||||
|
/* #undef LOG4CPLUS_USE_PTHREADS */
|
||||||
|
|
||||||
|
/* Define for compilers/standard libraries that support more than just the "C"
|
||||||
|
locale. */
|
||||||
|
/* #undef LOG4CPLUS_WORKING_LOCALE */
|
||||||
|
|
||||||
|
/* Define for C99 compilers/standard libraries that support more than just the
|
||||||
|
"C" locale. */
|
||||||
|
/* #undef LOG4CPLUS_WORKING_C_LOCALE */
|
||||||
|
|
||||||
|
/* Define to int if undefined. */
|
||||||
|
/* #undef socklen_t */
|
||||||
|
|
||||||
|
/* Defined for --enable-debugging builds. */
|
||||||
|
/* #undef LOG4CPLUS_DEBUGGING */
|
||||||
|
|
||||||
|
/* Defined if the compiler understands __declspec(dllexport) or
|
||||||
|
__attribute__((visibility("default"))) construct. */
|
||||||
|
#define LOG4CPLUS_DECLSPEC_EXPORT __attribute__ ((visibility("default")))
|
||||||
|
|
||||||
|
/* Defined if the compiler understands __declspec(dllimport) or
|
||||||
|
__attribute__((visibility("default"))) construct. */
|
||||||
|
#define LOG4CPLUS_DECLSPEC_IMPORT __attribute__ ((visibility("default")))
|
||||||
|
|
||||||
|
/* Defined if the compiler understands
|
||||||
|
__attribute__((visibility("hidden"))) construct. */
|
||||||
|
#define LOG4CPLUS_DECLSPEC_PRIVATE __attribute__ ((visibility("hidden")))
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_TLS_SUPPORT 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_THREAD_LOCAL_VAR thread_local
|
||||||
|
|
||||||
|
/* Defined if the host OS provides ENAMETOOLONG errno value. */
|
||||||
|
#define LOG4CPLUS_HAVE_ENAMETOOLONG 1
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define LOG4CPLUS_HAVE_VSNPRINTF 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `vsnwprintf' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_VSNWPRINTF */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `_vsnwprintf' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE__VSNWPRINTF */
|
||||||
|
|
||||||
|
/* */
|
||||||
|
/* #undef LOG4CPLUS_HAVE__VSNPRINTF */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `vfprintf_s' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_VFPRINTF_S */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `vfwprintf_s' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_VFWPRINTF_S */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `vsprintf_s' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_VSPRINTF_S */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `vswprintf_s' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_VSWPRINTF_S */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `_vsnprintf_s' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE__VSNPRINTF_S */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `_vsnwprintf_s' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE__VSNWPRINTF_S */
|
||||||
|
|
||||||
|
/* Defined if the compiler supports __FUNCTION__ macro. */
|
||||||
|
#define LOG4CPLUS_HAVE_FUNCTION_MACRO 1
|
||||||
|
|
||||||
|
/* Defined if the compiler supports __PRETTY_FUNCTION__ macro. */
|
||||||
|
#define LOG4CPLUS_HAVE_PRETTY_FUNCTION_MACRO 1
|
||||||
|
|
||||||
|
/* Defined if the compiler supports __func__ symbol. */
|
||||||
|
#define LOG4CPLUS_HAVE_FUNC_SYMBOL 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `mbstowcs' function. */
|
||||||
|
#define LOG4CPLUS_HAVE_MBSTOWCS 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `wcstombs' function. */
|
||||||
|
#define LOG4CPLUS_HAVE_WCSTOMBS 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have Linux style syscall(SYS_gettid). */
|
||||||
|
#define LOG4CPLUS_HAVE_GETTID 1
|
||||||
|
|
||||||
|
/* Define when iconv() is available. */
|
||||||
|
/* #undef LOG4CPLUS_WITH_ICONV */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `iconv' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_ICONV */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `iconv_close' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_ICONV_CLOSE */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `iconv_open' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_ICONV_OPEN */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `OutputDebugString' function. */
|
||||||
|
/* #undef LOG4CPLUS_HAVE_OUTPUTDEBUGSTRING */
|
||||||
|
|
||||||
|
/* Define to 1 if the system has the `constructor' function attribute
|
||||||
|
with priority */
|
||||||
|
#define LOG4CPLUS_HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR_PRIORITY 1
|
||||||
|
|
||||||
|
/* Define to 1 if the system has the `constructor' function attribute */
|
||||||
|
#define LOG4CPLUS_HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR 1
|
||||||
|
|
||||||
|
/* Define to 1 if the system has the `init_priority' variable attribute */
|
||||||
|
#define LOG4CPLUS_HAVE_VAR_ATTRIBUTE_INIT_PRIORITY 1
|
||||||
|
|
||||||
|
/* Defined to enable unit tests. */
|
||||||
|
/* #undef LOG4CPLUS_WITH_UNIT_TESTS */
|
||||||
|
|
||||||
|
#endif // LOG4CPLUS_CONFIG_DEFINES_HXX
|
||||||
@@ -107,43 +107,62 @@ extern LOG_TLS int g_log_code_tls; // 声明为 TLS 变量,定义见 log4.cpp
|
|||||||
|
|
||||||
|
|
||||||
// ====================== 日志宏区域 ======================
|
// ====================== 日志宏区域 ======================
|
||||||
// 原始不带 code 的实现(兼容/复用)
|
|
||||||
#define DIY_LOG(LEVEL_FUNC, KEY, ...) \
|
|
||||||
do { \
|
|
||||||
char buf[256]; \
|
|
||||||
format_log_msg(buf, sizeof(buf), __VA_ARGS__); \
|
|
||||||
LEVEL_FUNC(KEY, buf); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
// ★新增:带 code 的实现(C/C++ 通用,使用 TLS 保存/恢复)
|
#define DIY_LOG_CODE(LEVEL_FUNC, KEY, KEY_TYPE, CODE_INT, ...) \
|
||||||
#define DIY_LOG_CODE(LEVEL_FUNC, KEY, CODE_INT, ...) \
|
do { \
|
||||||
do { \
|
int __old_code__ = g_log_code_tls; \
|
||||||
int __old_code__ = g_log_code_tls; /* 备份旧值 */ \
|
g_log_code_tls = (int)(CODE_INT); \
|
||||||
g_log_code_tls = (int)(CODE_INT); /* 设置本次日志 code */ \
|
\
|
||||||
char buf[256]; \
|
char __msg_buf__[256]; \
|
||||||
format_log_msg(buf, sizeof(buf), __VA_ARGS__); \
|
format_log_msg(__msg_buf__, sizeof(__msg_buf__), __VA_ARGS__); \
|
||||||
LEVEL_FUNC(KEY, buf); /* 输出日志 */ \
|
\
|
||||||
g_log_code_tls = __old_code__; /* 恢复旧值 */ \
|
const char* __key_raw__ = (KEY); \
|
||||||
|
\
|
||||||
|
char __key_buf__[256]; \
|
||||||
|
switch ((int)(KEY_TYPE)) { \
|
||||||
|
case 0: \
|
||||||
|
snprintf(__key_buf__, sizeof(__key_buf__), "process"); \
|
||||||
|
break; \
|
||||||
|
case 1: \
|
||||||
|
snprintf(__key_buf__, sizeof(__key_buf__), \
|
||||||
|
"terminal.%s", __key_raw__); \
|
||||||
|
break; \
|
||||||
|
case 2: \
|
||||||
|
snprintf(__key_buf__, sizeof(__key_buf__), \
|
||||||
|
"monitor.%s", __key_raw__); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
snprintf(__key_buf__, sizeof(__key_buf__), "%s", \
|
||||||
|
__key_raw__); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
LEVEL_FUNC(__key_buf__, __msg_buf__); \
|
||||||
|
g_log_code_tls = __old_code__; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
// ★修改:默认宏改为 code=0(兼容原有用法)
|
// ★修改:默认宏改为 code=0(兼容原有用法)
|
||||||
#define DIY_ERRORLOG(KEY, ...) DIY_LOG_CODE(log_error, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0
|
#define DIY_ERRORLOG(KEY, ...) DIY_LOG_CODE(log_error, KEY, 0, LOG_CODE_OTHER,__VA_ARGS__) // ★修改:默认 code=0
|
||||||
#define DIY_WARNLOG(KEY, ...) DIY_LOG_CODE(log_warn, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0
|
#define DIY_WARNLOG(KEY, ...) DIY_LOG_CODE(log_warn, KEY, 0, LOG_CODE_OTHER,__VA_ARGS__) // ★修改:默认 code=0
|
||||||
#define DIY_INFOLOG(KEY, ...) DIY_LOG_CODE(log_info, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0
|
#define DIY_INFOLOG(KEY, ...) DIY_LOG_CODE(log_info, KEY, 0, LOG_CODE_OTHER,__VA_ARGS__) // ★修改:默认 code=0
|
||||||
#define DIY_DEBUGLOG(KEY, ...) DIY_LOG_CODE(log_debug, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0
|
#define DIY_DEBUGLOG(KEY, ...) DIY_LOG_CODE(log_debug, KEY, 0, LOG_CODE_OTHER,__VA_ARGS__) // ★修改:默认 code=0
|
||||||
|
|
||||||
// ★新增:显式传入 code 的便捷宏
|
// ★新增:显式传入 code 的便捷宏
|
||||||
// 用法示例:DIY_WARNLOG_CODE(full_key_m_c, warn_recallstart, "【WARN】监测点:%s ...", ...);
|
#define DIY_ERRORLOG_CODE(KEY, LEVEL_INT,CODE_INT, ...) DIY_LOG_CODE(log_error, KEY, LEVEL_INT, CODE_INT, __VA_ARGS__) // ★新增
|
||||||
#define DIY_ERRORLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_error, KEY, CODE_INT, __VA_ARGS__) // ★新增
|
#define DIY_WARNLOG_CODE(KEY, LEVEL_INT,CODE_INT, ...) DIY_LOG_CODE(log_warn, KEY, LEVEL_INT, CODE_INT, __VA_ARGS__) // ★新增
|
||||||
#define DIY_WARNLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_warn, KEY, CODE_INT, __VA_ARGS__) // ★新增
|
#define DIY_INFOLOG_CODE(KEY, LEVEL_INT,CODE_INT, ...) DIY_LOG_CODE(log_info, KEY, LEVEL_INT, CODE_INT, __VA_ARGS__) // ★新增
|
||||||
#define DIY_INFOLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_info, KEY, CODE_INT, __VA_ARGS__) // ★新增
|
#define DIY_DEBUGLOG_CODE(KEY, LEVEL_INT,CODE_INT, ...) DIY_LOG_CODE(log_debug, KEY, LEVEL_INT, CODE_INT, __VA_ARGS__) // ★新增
|
||||||
#define DIY_DEBUGLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_debug, KEY, CODE_INT, __VA_ARGS__) // ★新增
|
|
||||||
|
|
||||||
|
|
||||||
// ====================== 日志宏区域 ======================
|
// ====================== 日志宏区域 ======================
|
||||||
|
|
||||||
|
|
||||||
typedef enum LogCode {
|
typedef enum LogCode {
|
||||||
|
LOG_CODE_MENU_CONTROL = 94, /* 目录控制类型 */
|
||||||
|
LOG_CODE_FILE_CONTROL = 95, /* 文件控制类型 */
|
||||||
|
LOG_CODE_WIRETYPE = 96, /* 接线类型 */
|
||||||
|
LOG_CODE_CONFIG = 97, /* 配置相关 */
|
||||||
|
LOG_CODE_JSON = 98, /* JSON结构 */
|
||||||
LOG_CODE_OTHER = 99, /* 其他类型 */
|
LOG_CODE_OTHER = 99, /* 其他类型 */
|
||||||
LOG_CODE_LEDGER = 100, /* 台账类型 */
|
LOG_CODE_LEDGER = 100, /* 台账类型 */
|
||||||
LOG_CODE_RPTINIT = 101, /* 报告初始化 */
|
LOG_CODE_RPTINIT = 101, /* 报告初始化 */
|
||||||
@@ -151,6 +170,7 @@ typedef enum LogCode {
|
|||||||
LOG_CODE_TRANSIENT = 300, /* 暂态发生 */
|
LOG_CODE_TRANSIENT = 300, /* 暂态发生 */
|
||||||
LOG_CODE_TRANSIENT_COMM = 301, /* 暂态接口 */
|
LOG_CODE_TRANSIENT_COMM = 301, /* 暂态接口 */
|
||||||
LOG_CODE_COMTRADE_FILE = 302, /* 录波文件(Comtrade) */
|
LOG_CODE_COMTRADE_FILE = 302, /* 录波文件(Comtrade) */
|
||||||
|
LOG_CODE_GGIO_LPHD = 304, /* GGIO事件 */
|
||||||
LOG_CODE_MQ = 400, /* MQ发送 */
|
LOG_CODE_MQ = 400, /* MQ发送 */
|
||||||
LOG_CODE_RT_DATA = 401, /* 实时数据 */
|
LOG_CODE_RT_DATA = 401, /* 实时数据 */
|
||||||
LOG_CODE_LEDGER_UPDATE = 402, /* 台账更新 */
|
LOG_CODE_LEDGER_UPDATE = 402, /* 台账更新 */
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ int main(int argc, const char **argv)
|
|||||||
//char buf[256];
|
//char buf[256];
|
||||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
|
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
//log_debug("process", buf);
|
//log_debug("process", buf);
|
||||||
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_OTHER,"【NORMAL】前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
#ifdef _OS_UNIX_
|
#ifdef _OS_UNIX_
|
||||||
#ifdef QT_NO_DEBUG
|
#ifdef QT_NO_DEBUG
|
||||||
@@ -268,7 +268,7 @@ int main(int argc, const char **argv)
|
|||||||
//char buf[256];
|
//char buf[256];
|
||||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
//log_error("process", buf);
|
//log_error("process", buf);
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,7 +277,7 @@ int main(int argc, const char **argv)
|
|||||||
//char buf[256];
|
//char buf[256];
|
||||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
//log_error("process", buf);
|
//log_error("process", buf);
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,7 +324,7 @@ int main(int argc, const char **argv)
|
|||||||
//char buf[256];
|
//char buf[256];
|
||||||
//format_log_msg(buf,sizeof(buf),"前置的业务线程死锁,退出进程");
|
//format_log_msg(buf,sizeof(buf),"前置的业务线程死锁,退出进程");
|
||||||
//log_error("process", buf);
|
//log_error("process", buf);
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程 业务线程死锁,退出进程", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程 业务线程死锁,退出进程", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
apr_sleep(apr_time_from_sec(10));
|
apr_sleep(apr_time_from_sec(10));
|
||||||
exit(-1039);
|
exit(-1039);
|
||||||
|
|||||||
@@ -151,13 +151,6 @@ void CloseIECReports(chnl_usr_t *chnl_usr)
|
|||||||
void closeChannel(chnl_usr_t *chnl_usr)
|
void closeChannel(chnl_usr_t *chnl_usr)
|
||||||
{
|
{
|
||||||
|
|
||||||
//终端日志的key,lnk20250526
|
|
||||||
char full_key_t_c[256]; // 分配足够空间
|
|
||||||
char full_key_t_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_t_c, sizeof(full_key_t_c), "terminal.%s.COM", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id);
|
|
||||||
snprintf(full_key_t_d, sizeof(full_key_t_d), "terminal.%s.DATA", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id);
|
|
||||||
//终端日志的key,lnk20250526
|
|
||||||
|
|
||||||
char comm_str[256];
|
char comm_str[256];
|
||||||
memset(comm_str,0,256);
|
memset(comm_str,0,256);
|
||||||
apr_snprintf(comm_str,sizeof(comm_str),"%16s:%d\t\tdisconnected !!!",chnl_usr->ip_str,chnl_usr->chnl->port);
|
apr_snprintf(comm_str,sizeof(comm_str),"%16s:%d\t\tdisconnected !!!",chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
@@ -185,7 +178,7 @@ void closeChannel(chnl_usr_t *chnl_usr)
|
|||||||
ret = mms_disconnectFromServer(chnl_usr->net_info,&chnl_usr->m_reqCtrl);
|
ret = mms_disconnectFromServer(chnl_usr->net_info,&chnl_usr->m_reqCtrl);
|
||||||
echo_warn("---------end disconnectFromServer!\n");
|
echo_warn("---------end disconnectFromServer!\n");
|
||||||
|
|
||||||
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】前置与终端%s - ip端口%s:%d 断开连接", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】前置与终端%s - ip端口%s:%d 断开连接", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
|
|
||||||
if (ret != SD_SUCCESS){
|
if (ret != SD_SUCCESS){
|
||||||
echo_warn("---------disconnectFromServer success!\n");
|
echo_warn("---------disconnectFromServer success!\n");
|
||||||
@@ -309,26 +302,19 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
{
|
{
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]); //遍历监测点
|
LD_info = &(ied_usr->LD_info[cpuno]); //遍历监测点
|
||||||
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
char full_key_m_c[256]; // 分配足够空间
|
|
||||||
char full_key_m_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_m_c, sizeof(full_key_m_c), "monitor.%s.COM", LD_info->mp_id);
|
|
||||||
snprintf(full_key_m_d, sizeof(full_key_m_d), "monitor.%s.DATA", LD_info->mp_id);
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
|
|
||||||
if (LD_info->cpuno==0){
|
if (LD_info->cpuno==0){
|
||||||
// 仅在还没达到5次上限时打印
|
// 仅在还没达到5次上限时打印
|
||||||
if (!LD_info->has_logged_regist) {
|
if (!LD_info->has_logged_regist) {
|
||||||
LD_info->registcount++;
|
LD_info->registcount++;
|
||||||
|
|
||||||
if (LD_info->registcount <= 5) {
|
if (LD_info->registcount <= 5) {
|
||||||
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【ERROR】监测点:%s - id:%s报告触发失败,监测点逻辑标识号为0,请检查装置对应的台账信息是否正确", LD_info->name,LD_info->mp_id);
|
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【ERROR】监测点:%s - id:%s报告触发失败,监测点逻辑标识号为0,请检查装置对应的台账信息是否正确", LD_info->name,LD_info->mp_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 到5次就不再打印,并标记
|
// 到5次就不再打印,并标记
|
||||||
if (LD_info->registcount > 5) {
|
if (LD_info->registcount > 5) {
|
||||||
LD_info->has_logged_regist = true;
|
LD_info->has_logged_regist = true;
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s监测点逻辑标识号错误日志已达本次记录上限,不再输出,请检查装置对应的台账信息是否正确",
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s监测点逻辑标识号错误日志已达本次记录上限,不再输出,请检查装置对应的台账信息是否正确",
|
||||||
LD_info->name, LD_info->mp_id);
|
LD_info->name, LD_info->mp_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,7 +328,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
|
|
||||||
if (judge_rpt_next_should_do(rptinfo)==SHOULD_DO_NOTHING)//检查是否触发
|
if (judge_rpt_next_should_do(rptinfo)==SHOULD_DO_NOTHING)//检查是否触发
|
||||||
{
|
{
|
||||||
//DIY_DEBUGLOG(full_key_m_c,"【DEBUG】监测点:%s - id:%s不注册报告", LD_info->name,LD_info->mp_id);
|
//DIY_DEBUGLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【DEBUG】监测点:%s - id:%s不注册报告", LD_info->name,LD_info->mp_id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +344,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
printf("start mms_register_iec_rpt................................\n");
|
printf("start mms_register_iec_rpt................................\n");
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s开始注册报告,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【NORMAL】监测点:%s - id:%s开始注册报告,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
||||||
|
|
||||||
if ( strstr(rptinfo->rptID,"LLN0$BR$brcbFlickerData") )
|
if ( strstr(rptinfo->rptID,"LLN0$BR$brcbFlickerData") )
|
||||||
rptinfo->IntgPd = 600; //10分钟
|
rptinfo->IntgPd = 600; //10分钟
|
||||||
@@ -386,14 +372,14 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
LD_info->registcount++;
|
LD_info->registcount++;
|
||||||
|
|
||||||
if (LD_info->registcount <= 5) {
|
if (LD_info->registcount <= 5) {
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT, "【WARN】监测点:%s - id:%s注册报告失败,报告名:%s",
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT, "【WARN】监测点:%s - id:%s注册报告失败,报告名:%s",
|
||||||
LD_info->name, LD_info->mp_id, rpt_inst_name);
|
LD_info->name, LD_info->mp_id, rpt_inst_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 到5次就不再打印,并标记
|
// 到5次就不再打印,并标记
|
||||||
if (LD_info->registcount > 5) {
|
if (LD_info->registcount > 5) {
|
||||||
LD_info->has_logged_regist = true;
|
LD_info->has_logged_regist = true;
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注册报告失败日志已达本次注册上限,不再输出,请检查装置icd和映射文件是否匹配或者装置存在过多连接",
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注册报告失败日志已达本次注册上限,不再输出,请检查装置icd和映射文件是否匹配或者装置存在过多连接",
|
||||||
LD_info->name, LD_info->mp_id);
|
LD_info->name, LD_info->mp_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -416,7 +402,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
//mq日志
|
//mq日志
|
||||||
LD_info->has_logged_regist = FALSE;
|
LD_info->has_logged_regist = FALSE;
|
||||||
LD_info->registcount = 0;
|
LD_info->registcount = 0;
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注册报告成功,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注册报告成功,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
||||||
|
|
||||||
// add here to GI not the same time
|
// add here to GI not the same time
|
||||||
GIoffset = 0.5 * g_pt61850app->giTime;
|
GIoffset = 0.5 * g_pt61850app->giTime;
|
||||||
@@ -424,7 +410,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
}
|
}
|
||||||
printf("end mms_register_iec_rpt................................\n");
|
printf("end mms_register_iec_rpt................................\n");
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s注册报告结束,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【NORMAL】监测点:%s - id:%s注册报告结束,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { //rpt_registered ==TRUE
|
else { //rpt_registered ==TRUE
|
||||||
@@ -433,7 +419,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
printf("start mms_unregister_iec_rpt................................\n");
|
printf("start mms_unregister_iec_rpt................................\n");
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s开始注销报告,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【NORMAL】监测点:%s - id:%s开始注销报告,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
||||||
|
|
||||||
ret = mms_unregister_iec_rpt (chnl_usr->net_info, &g_rpt_typeids,
|
ret = mms_unregister_iec_rpt (chnl_usr->net_info, &g_rpt_typeids,
|
||||||
LD_info->LD_name,rpt_inst_name,g_pt61850app->mmsOpTimeout);
|
LD_info->LD_name,rpt_inst_name,g_pt61850app->mmsOpTimeout);
|
||||||
@@ -444,7 +430,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
APR_EGENERAL, LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl_id);
|
APR_EGENERAL, LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl_id);
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注销报告失败,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注销报告失败,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -453,11 +439,11 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl->port,chnl_usr->chnl_id );
|
LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl->port,chnl_usr->chnl_id );
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s注销报告成功,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【NORMAL】监测点:%s - id:%s注销报告成功,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
||||||
}
|
}
|
||||||
printf("end mms_unregister_iec_rpt................................\n");
|
printf("end mms_unregister_iec_rpt................................\n");
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s注销报告结束,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【NORMAL】监测点:%s - id:%s注销报告结束,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -510,13 +496,6 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
|
|||||||
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
||||||
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
char full_key_m_c[256]; // 分配足够空间
|
|
||||||
char full_key_m_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_m_c, sizeof(full_key_m_c), "monitor.%s.COM", LD_info->mp_id);
|
|
||||||
snprintf(full_key_m_d, sizeof(full_key_m_d), "monitor.%s.DATA", LD_info->mp_id);
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
|
|
||||||
//日志控制块缺失
|
//日志控制块缺失
|
||||||
if (LD_info->logcount<=0){
|
if (LD_info->logcount<=0){
|
||||||
// 仅在还没达到5次上限时打印
|
// 仅在还没达到5次上限时打印
|
||||||
@@ -524,13 +503,13 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
|
|||||||
LD_info->registcount++;
|
LD_info->registcount++;
|
||||||
|
|
||||||
if (LD_info->registcount <= 5) {
|
if (LD_info->registcount <= 5) {
|
||||||
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【ERROR】监测点:%s - id:%s补招数据失败,监测点缺少日志控制块,请检查装置对应的装置类型是否有配对的icd模型", LD_info->name,LD_info->mp_id);
|
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【ERROR】监测点:%s - id:%s补招数据失败,监测点缺少日志控制块,请检查装置对应的装置类型是否有配对的icd模型", LD_info->name,LD_info->mp_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 到5次就不再打印,并标记
|
// 到5次就不再打印,并标记
|
||||||
if (LD_info->registcount > 5) {
|
if (LD_info->registcount > 5) {
|
||||||
LD_info->has_logged_regist = true;
|
LD_info->has_logged_regist = true;
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s缺少日志控制块日志已达本次记录上限,不再输出,请检查装置对应的装置类型是否有配对的icd模型",
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s缺少日志控制块日志已达本次记录上限,不再输出,请检查装置对应的装置类型是否有配对的icd模型",
|
||||||
LD_info->name, LD_info->mp_id);
|
LD_info->name, LD_info->mp_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -561,11 +540,11 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
|
|||||||
|
|
||||||
if(strcmp(cfg1.ValueOfTimeUnit, "utc") == 0){//装置时间是utc还是北京
|
if(strcmp(cfg1.ValueOfTimeUnit, "utc") == 0){//装置时间是utc还是北京
|
||||||
utc_or_beijing = 28800;//秒
|
utc_or_beijing = 28800;//秒
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,下发补招时间为utc时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,下发补招时间为utc时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
utc_or_beijing = 0;
|
utc_or_beijing = 0;
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,下发补招时间为beijing时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,下发补招时间为beijing时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
@@ -609,7 +588,7 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
|
|||||||
LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id);
|
LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id);
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
//DIY_WARNLOG(full_key_m_c,"【WARN】监测点:%s - id:%s开始补招数据", LD_info->name,LD_info->mp_id);
|
//DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据", LD_info->name,LD_info->mp_id);
|
||||||
|
|
||||||
ret = mms_jread(loginfo, chnl_usr->net_info, loginfo->LD_info->LD_name, loginfo->logName,
|
ret = mms_jread(loginfo, chnl_usr->net_info, loginfo->LD_info->LD_name, loginfo->logName,
|
||||||
loginfo->start_time, loginfo->end_time, g_pt61850app->mmsOpTimeout, chnl_usr->ip_str);
|
loginfo->start_time, loginfo->end_time, g_pt61850app->mmsOpTimeout, chnl_usr->ip_str);
|
||||||
@@ -618,7 +597,7 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
|
|||||||
LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id);
|
LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id);
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【ERROR】监测点:%s - id:%s补招数据失败 - 失败时间点:%lld 至 %lld", LD_info->name,LD_info->mp_id,loginfo->start_time,loginfo->end_time);
|
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【ERROR】监测点:%s - id:%s补招数据失败 - 失败时间点:%lld 至 %lld", LD_info->name,LD_info->mp_id,loginfo->start_time,loginfo->end_time);
|
||||||
|
|
||||||
failed_count++;
|
failed_count++;
|
||||||
}
|
}
|
||||||
@@ -671,7 +650,7 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
|
|||||||
|
|
||||||
// ===== [新增结束] =====
|
// ===== [新增结束] =====
|
||||||
|
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s结束补招数据", LD_info->name,LD_info->mp_id);
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s结束补招数据", LD_info->name,LD_info->mp_id);
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1119,9 +1098,9 @@ void process_ledger_update(trigger_update_xml_t *ledger_update_xml)
|
|||||||
//关闭这个终端的所有连接//////////////////////////////////////////////////////////////////////
|
//关闭这个终端的所有连接//////////////////////////////////////////////////////////////////////
|
||||||
for(chnl_no=0 ; chnl_no<ied->chncount; chnl_no++) {
|
for(chnl_no=0 ; chnl_no<ied->chncount; chnl_no++) {
|
||||||
chnl_usr = (chnl_usr_t*)ied->channel[chnl_no].connect;
|
chnl_usr = (chnl_usr_t*)ied->channel[chnl_no].connect;
|
||||||
if (chnl_usr->m_state!=CHANNEL_CONNECTED){//跳过未连接的通道
|
/*if (chnl_usr->m_state!=CHANNEL_CONNECTED){//跳过未连接的通道
|
||||||
continue;
|
continue;
|
||||||
}
|
}*///20260416任何状态都关闭连接
|
||||||
closeChannel(chnl_usr);//关闭更新台账后,任务会自动连接
|
closeChannel(chnl_usr);//关闭更新台账后,任务会自动连接
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1232,9 +1211,9 @@ void process_ledger_update(trigger_update_xml_t *ledger_update_xml)
|
|||||||
//关闭这个终端的所有连接//////////////////////////////////////////////////////////////////////
|
//关闭这个终端的所有连接//////////////////////////////////////////////////////////////////////
|
||||||
for(chnl_no=0 ; chnl_no<ied->chncount; chnl_no++) {
|
for(chnl_no=0 ; chnl_no<ied->chncount; chnl_no++) {
|
||||||
chnl_usr = (chnl_usr_t*)ied->channel[chnl_no].connect;
|
chnl_usr = (chnl_usr_t*)ied->channel[chnl_no].connect;
|
||||||
if (chnl_usr->m_state!=CHANNEL_CONNECTED){ //跳过没连接的通道,一般一个终端只有一个
|
/*if (chnl_usr->m_state!=CHANNEL_CONNECTED){ //跳过没连接的通道,一般一个终端只有一个
|
||||||
continue;
|
continue;
|
||||||
}
|
}*///20260416任何状态都关闭连接
|
||||||
closeChannel(chnl_usr);//关闭更新台账后,如果是删除则不会再连接,关闭连接时这个ied的报告会被清除,报告控制会被注销
|
closeChannel(chnl_usr);//关闭更新台账后,如果是删除则不会再连接,关闭连接时这个ied的报告会被清除,报告控制会被注销
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1425,7 +1404,7 @@ void check_ledger_update()//lnk20250113
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
printf("only process recall config, skip ledger update\n");
|
printf("only process recall config, skip ledger update\n");
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_SPACE_ALARM,"【WARN】当前配置为仅日志模式,统计数据进程跳过台账更新");
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_SPACE_ALARM,"【WARN】当前配置为仅日志模式,统计数据进程跳过台账更新");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1481,13 +1460,13 @@ void check_disk_quota()
|
|||||||
//printf("Current user disk free size: %dMB ,total size: %dMB \n",freeSizeMB,totalSizeMB);
|
//printf("Current user disk free size: %dMB ,total size: %dMB \n",freeSizeMB,totalSizeMB);
|
||||||
if (freeSizeMB<g_min_free_size){
|
if (freeSizeMB<g_min_free_size){
|
||||||
echo_warn2("Current user disk free size: %dMB < %dMB, please check!\n",freeSizeMB,g_min_free_size);
|
echo_warn2("Current user disk free size: %dMB < %dMB, please check!\n",freeSizeMB,g_min_free_size);
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_SPACE_ALARM,"【WARN】前置磁盘检测: 当前磁盘的可用空间为%dMB,小于最小可用空间%dMB,请检查磁盘",freeSizeMB,g_min_free_size);
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_SPACE_ALARM,"【WARN】前置磁盘检测: 当前磁盘的可用空间为%dMB,小于最小可用空间%dMB,请检查磁盘",freeSizeMB,g_min_free_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((freeSizeMB/(totalSizeMB/100+1) )<10){
|
if ((freeSizeMB/(totalSizeMB/100+1) )<10){
|
||||||
echo_warn2("Current user disk free size percent < 10%%, free size: %dMB ,total size: %dMB ,please check!\n",
|
echo_warn2("Current user disk free size percent < 10%%, free size: %dMB ,total size: %dMB ,please check!\n",
|
||||||
freeSizeMB,totalSizeMB);
|
freeSizeMB,totalSizeMB);
|
||||||
DIY_WARNLOG_CODE("process",LOG_CODE_SPACE_ALARM,"【WARN】前置磁盘检测: 当前磁盘的可用空间的百分比小于10%%,可用空间为%dMB,总空间为%dMB,请检查磁盘",freeSizeMB,totalSizeMB);
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_SPACE_ALARM,"【WARN】前置磁盘检测: 当前磁盘的可用空间的百分比小于10%%,可用空间为%dMB,总空间为%dMB,请检查磁盘",freeSizeMB,totalSizeMB);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1609,13 +1588,6 @@ void CheckNextNotConnectedChannel()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//终端日志的key,lnk20250526
|
|
||||||
char full_key_t_c[256]; // 分配足够空间
|
|
||||||
char full_key_t_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_t_c, sizeof(full_key_t_c), "terminal.%s.COM", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id);
|
|
||||||
snprintf(full_key_t_d, sizeof(full_key_t_d), "terminal.%s.DATA", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id);
|
|
||||||
//终端日志的key,lnk20250526
|
|
||||||
|
|
||||||
//10-11-01 22:03 beijing
|
//10-11-01 22:03 beijing
|
||||||
if( ( (chnl_total_no+1)==g_pt61850app->chnl_counts) || (g_onlyIP[0]!=0) ){
|
if( ( (chnl_total_no+1)==g_pt61850app->chnl_counts) || (g_onlyIP[0]!=0) ){
|
||||||
if(g_pt61850app->initNum<255)
|
if(g_pt61850app->initNum<255)
|
||||||
@@ -1641,7 +1613,7 @@ void CheckNextNotConnectedChannel()
|
|||||||
//mq日志
|
//mq日志
|
||||||
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = true;
|
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = true;
|
||||||
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = false;
|
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = false;
|
||||||
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d连接成功", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d连接成功", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
|
|
||||||
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
|
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
|
||||||
chnl_usr->m_reqCtrl = NULL;
|
chnl_usr->m_reqCtrl = NULL;
|
||||||
@@ -1688,11 +1660,11 @@ void CheckNextNotConnectedChannel()
|
|||||||
if(true == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat){
|
if(true == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat){
|
||||||
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = false;
|
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = false;
|
||||||
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
|
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
|
||||||
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip/端口:%s:%d,从开始连接到目前已经%i秒,连接失败,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,secsSince);
|
DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】终端%s - ip/端口:%s:%d,从开始连接到目前已经%i秒,连接失败,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,secsSince);
|
||||||
}
|
}
|
||||||
else if(false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat && false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect){
|
else if(false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat && false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect){
|
||||||
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
|
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
|
||||||
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip/端口:%s:%d,从开始连接到目前已经%i秒,连接失败,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,secsSince);
|
DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】终端%s - ip/端口:%s:%d,从开始连接到目前已经%i秒,连接失败,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,secsSince);
|
||||||
}
|
}
|
||||||
|
|
||||||
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
|
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
|
||||||
@@ -1723,11 +1695,11 @@ void CheckNextNotConnectedChannel()
|
|||||||
if(true == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat){
|
if(true == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat){
|
||||||
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = false;
|
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = false;
|
||||||
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
|
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
|
||||||
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d,从开始连接到目前已经300秒,未能获取连接响应,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d,从开始连接到目前已经300秒,未能获取连接响应,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
}
|
}
|
||||||
else if(false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat && false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect){
|
else if(false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat && false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect){
|
||||||
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
|
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
|
||||||
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d,从开始连接到目前已经300秒,未能获取连接响应,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d,从开始连接到目前已经300秒,未能获取连接响应,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1767,7 +1739,7 @@ void CheckNextNotConnectedChannel()
|
|||||||
if (chnl_usr->chnl->ied->cpucount != NULL && chnl_usr->chnl->ied->cpucount > 0 && ied_usr->dev_flag == ENABLE) {//2023-09-26 czy 如果line count<0 不需要连接//lnk20250121如果终端无效则不连接
|
if (chnl_usr->chnl->ied->cpucount != NULL && chnl_usr->chnl->ied->cpucount > 0 && ied_usr->dev_flag == ENABLE) {//2023-09-26 czy 如果line count<0 不需要连接//lnk20250121如果终端无效则不连接
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
//DIY_WARNLOG(full_key_t_c,"【WARN】重新连接终端%s - ip端口:%s:%d", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
//DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】重新连接终端%s - ip端口:%s:%d", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
|
|
||||||
ret = mms_connectToServer(ied_usr->dev_key, ied_usr->dev_series, serverARName, &(chnl_usr->net_info), &(chnl_usr->m_reqCtrl));
|
ret = mms_connectToServer(ied_usr->dev_key, ied_usr->dev_series, serverARName, &(chnl_usr->net_info), &(chnl_usr->m_reqCtrl));
|
||||||
|
|
||||||
@@ -1779,7 +1751,7 @@ void CheckNextNotConnectedChannel()
|
|||||||
chnl_usr->m_StartConnectingTime = sGetMsTime();
|
chnl_usr->m_StartConnectingTime = sGetMsTime();
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
//DIY_WARNLOG(full_key_t_c,"【WARN】正在重新连接终端%s - ip端口:%s:%d - 识别码/秘钥:%s/%s", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->dev_series,((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->dev_key);
|
//DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】正在重新连接终端%s - ip端口:%s:%d - 识别码/秘钥:%s/%s", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->dev_series,((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->dev_key);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1791,7 +1763,7 @@ void CheckNextNotConnectedChannel()
|
|||||||
echo_warn3("FAILED: mms_connectToServer IP %s:%d ,NetInfo= %x \n", chnl_usr->ip_str, chnl_usr->chnl->port, chnl_usr->net_info);
|
echo_warn3("FAILED: mms_connectToServer IP %s:%d ,NetInfo= %x \n", chnl_usr->ip_str, chnl_usr->chnl->port, chnl_usr->net_info);
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
//DIY_WARNLOG(full_key_t_c,"【WARN】重新连接终端%s - ip端口:%s:%d 失败!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
//DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】重新连接终端%s - ip端口:%s:%d 失败!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1822,7 +1794,7 @@ void CheckNextNotConnectedChannel()
|
|||||||
chnl_usr->chnl->status = STATUS_BREAKOFF;
|
chnl_usr->chnl->status = STATUS_BREAKOFF;
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d 断连完成,关闭连接通道", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d 断连完成,关闭连接通道", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1852,7 +1824,7 @@ void CheckNextNotConnectedChannel()
|
|||||||
chnl_usr->chnl->status = STATUS_BREAKOFF;
|
chnl_usr->chnl->status = STATUS_BREAKOFF;
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d 断连未完成,但是已经超时180秒,关闭连接通道", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
DIY_WARNLOG_CODE(((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,1,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d 断连未完成,但是已经超时180秒,关闭连接通道", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2004,13 +1976,6 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
||||||
int have_new_files = FALSE;
|
int have_new_files = FALSE;
|
||||||
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
char full_key_m_c[256]; // 分配足够空间
|
|
||||||
char full_key_m_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_m_c, sizeof(full_key_m_c), "monitor.%s.COM", LD_info->mp_id);
|
|
||||||
snprintf(full_key_m_d, sizeof(full_key_m_d), "monitor.%s.DATA", LD_info->mp_id);
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
|
|
||||||
for (i=0;i<256;i++) {
|
for (i=0;i<256;i++) {
|
||||||
if (LD_info->FltNum[i]<=0)
|
if (LD_info->FltNum[i]<=0)
|
||||||
continue;
|
continue;
|
||||||
@@ -2022,7 +1987,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
printf(">>>>>>>> IED [%d]: %s is calling cn wavefile, !!!!!!!! file_match_str=%s \n",ied->id,ied->name,file_match_str);
|
printf(">>>>>>>> IED [%d]: %s is calling cn wavefile, !!!!!!!! file_match_str=%s \n",ied->id,ied->name,file_match_str);
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s开始召唤录波文件", LD_info->name,LD_info->mp_id);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【NORMAL】监测点:%s - id:%s开始召唤录波文件", LD_info->name,LD_info->mp_id);
|
||||||
|
|
||||||
ret = SD_FAILURE;
|
ret = SD_FAILURE;
|
||||||
filenum = 0;
|
filenum = 0;
|
||||||
@@ -2044,14 +2009,14 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
int ret2,ret3;
|
int ret2,ret3;
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s获取录波文件列表成功,开始匹配录波文件", LD_info->name,LD_info->mp_id);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【NORMAL】监测点:%s - id:%s获取录波文件列表成功,开始匹配录波文件", LD_info->name,LD_info->mp_id);
|
||||||
|
|
||||||
//WW 2023-11-01将录波段号由字符串匹配修改为int的fltnum匹配
|
//WW 2023-11-01将录波段号由字符串匹配修改为int的fltnum匹配
|
||||||
ret2 = parse_file_names_by_fltnum(LD_info->FltNum[i], ldstr, filenames, filenum, &cfg_idx, &dat_idx, file_base_name, file_yyyymm);
|
ret2 = parse_file_names_by_fltnum(LD_info->FltNum[i], ldstr, filenames, filenum, &cfg_idx, &dat_idx, file_base_name, file_yyyymm);
|
||||||
//WW 2023-11-01 end
|
//WW 2023-11-01 end
|
||||||
if (ret2 !=APR_SUCCESS){
|
if (ret2 !=APR_SUCCESS){
|
||||||
//mq日志
|
//mq日志
|
||||||
//DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【WARN】监测点:%s - id:%s前置记录的录波事件上传的录波号段%d与从装置获取的录波文件列表匹配失败,装置没有对应的号段的录波文件,清除该记录", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]);
|
//DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【WARN】监测点:%s - id:%s前置记录的录波事件上传的录波号段%d与从装置获取的录波文件列表匹配失败,装置没有对应的号段的录波文件,清除该记录", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]);
|
||||||
//lnk20250819装置没有对应的文件时清除录波号段
|
//lnk20250819装置没有对应的文件时清除录波号段
|
||||||
printf("监测点:%s - id:%s前置记录的录波事件上传的录波号段%d与从装置获取的录波文件列表匹配失败,装置没有对应的号段的录波文件,清除该记录", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]);
|
printf("监测点:%s - id:%s前置记录的录波事件上传的录波号段%d与从装置获取的录波文件列表匹配失败,装置没有对应的号段的录波文件,清除该记录", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]);
|
||||||
LD_info->FltNum[i] = -1;
|
LD_info->FltNum[i] = -1;
|
||||||
@@ -2067,15 +2032,35 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
if (ret2==SD_SUCCESS && ret3==SD_SUCCESS ) { //两个文件都写好了
|
if (ret2==SD_SUCCESS && ret3==SD_SUCCESS ) { //两个文件都写好了
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s从终端获取录波文件成功", LD_info->name,LD_info->mp_id);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【NORMAL】监测点:%s - id:%s从终端获取录波文件成功", LD_info->name,LD_info->mp_id);
|
||||||
|
|
||||||
QVVR_t *qvvr; //暂态事件
|
QVVR_t *qvvr; //暂态事件
|
||||||
long long start_tm,trig_tm,end_tm;
|
long long start_tm,trig_tm,end_tm;//北京时间
|
||||||
|
|
||||||
ret2 = extract_timestamp_from_cfg_file(filenames[cfg_idx],&start_tm,&trig_tm);//提取文件的开始时间和触发时间
|
ret2 = extract_timestamp_from_cfg_file(filenames[cfg_idx],&start_tm,&trig_tm);//提取文件的开始时间和触发时间
|
||||||
|
|
||||||
|
//添加录波文件时间戳校准20260409
|
||||||
|
{
|
||||||
|
XmlConfigC cfg;
|
||||||
|
long long utc_or_beijing = 0;
|
||||||
|
if (get_xml_config_by_dev_type(ied_usr->dev_type, &cfg)) {
|
||||||
|
if(strcmp(cfg.WaveTimeFlag, "utc") == 0){//装置时间是utc还是北京
|
||||||
|
utc_or_beijing = 28800000;//八小时相差毫秒数
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
utc_or_beijing = 0;
|
||||||
|
}
|
||||||
|
trig_tm = trig_tm + utc_or_beijing;//如果是utc时间则转换为北京时间
|
||||||
|
start_tm = start_tm + utc_or_beijing;//接口上送没用到
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("读取失败,未找到 dev_type\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
printf(">>>>>>>> extract_timestamp_from_cfg_file end \n");
|
printf(">>>>>>>> extract_timestamp_from_cfg_file end \n");
|
||||||
if (ret2 ==APR_SUCCESS) {
|
if (ret2 ==APR_SUCCESS) {
|
||||||
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s提取录波文件时间成功", LD_info->name,LD_info->mp_id);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【NORMAL】监测点:%s - id:%s提取录波文件时间成功", LD_info->name,LD_info->mp_id);
|
||||||
//to find the paired qvvr by the time of trig_tm
|
//to find the paired qvvr by the time of trig_tm
|
||||||
printf(">>>>>>>> extract_timestamp_from_cfg_file success \n");
|
printf(">>>>>>>> extract_timestamp_from_cfg_file success \n");
|
||||||
qvvr = find_qvvr_by_trig_tm(LD_info,trig_tm); //根据文件的触发时间查找检测点记录的匹配上的暂态事件
|
qvvr = find_qvvr_by_trig_tm(LD_info,trig_tm); //根据文件的触发时间查找检测点记录的匹配上的暂态事件
|
||||||
@@ -2095,7 +2080,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
|
|
||||||
char loc_file_fullname_cfg[256];//本地文件名
|
char loc_file_fullname_cfg[256];//本地文件名
|
||||||
memset(loc_file_fullname_cfg, 0, sizeof(loc_file_fullname_cfg));
|
memset(loc_file_fullname_cfg, 0, sizeof(loc_file_fullname_cfg));
|
||||||
apr_snprintf(loc_file_fullname_cfg, sizeof(loc_file_fullname_cfg), "/home/pq/FeProject/comtrade/%s", cfg_only_filename_ret);
|
apr_snprintf(loc_file_fullname_cfg, sizeof(loc_file_fullname_cfg), "/FeProject/comtrade/%s", cfg_only_filename_ret);
|
||||||
char oss_file_fullname_cfg[256];//远端文件名
|
char oss_file_fullname_cfg[256];//远端文件名
|
||||||
memset(oss_file_fullname_cfg, 0, sizeof(oss_file_fullname_cfg));
|
memset(oss_file_fullname_cfg, 0, sizeof(oss_file_fullname_cfg));
|
||||||
apr_snprintf(oss_file_fullname_cfg, sizeof(oss_file_fullname_cfg), "comtrade/wave/%s/%s", LD_info->mp_id, cfg_only_filename_ret);
|
apr_snprintf(oss_file_fullname_cfg, sizeof(oss_file_fullname_cfg), "comtrade/wave/%s/%s", LD_info->mp_id, cfg_only_filename_ret);
|
||||||
@@ -2133,7 +2118,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
|
|
||||||
char loc_file_fullname_dat[256];
|
char loc_file_fullname_dat[256];
|
||||||
memset(loc_file_fullname_dat, 0, sizeof(loc_file_fullname_dat));
|
memset(loc_file_fullname_dat, 0, sizeof(loc_file_fullname_dat));
|
||||||
apr_snprintf(loc_file_fullname_dat, sizeof(loc_file_fullname_dat), "/home/pq/FeProject/comtrade/%s", dat_only_filename_ret);
|
apr_snprintf(loc_file_fullname_dat, sizeof(loc_file_fullname_dat), "/FeProject/comtrade/%s", dat_only_filename_ret);
|
||||||
char oss_file_fullname_dat[256];
|
char oss_file_fullname_dat[256];
|
||||||
memset(oss_file_fullname_dat, 0, sizeof(oss_file_fullname_dat));
|
memset(oss_file_fullname_dat, 0, sizeof(oss_file_fullname_dat));
|
||||||
apr_snprintf(oss_file_fullname_dat, sizeof(oss_file_fullname_dat), "comtrade/wave/%s/%s", LD_info->mp_id, dat_only_filename_ret);
|
apr_snprintf(oss_file_fullname_dat, sizeof(oss_file_fullname_dat), "comtrade/wave/%s/%s", LD_info->mp_id, dat_only_filename_ret);
|
||||||
@@ -2292,14 +2277,16 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
//获取时间类型lnk20250520
|
//获取时间类型lnk20250520
|
||||||
XmlConfigC cfg;
|
XmlConfigC cfg;
|
||||||
if (get_xml_config_by_dev_type(ied_usr->dev_type, &cfg)) {
|
if (get_xml_config_by_dev_type(ied_usr->dev_type, &cfg)) {
|
||||||
} else {
|
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
|
||||||
|
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld,触发时间:%lld,映射配置的暂态持续时间单位是s", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld,触发时间:%lld,映射配置的暂态持续时间单位是ms", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
printf("读取失败,未找到 dev_type\n");
|
printf("读取失败,未找到 dev_type\n");
|
||||||
}
|
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld,触发时间:%lld,映射配置的暂态持续时间单位未配置", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
|
||||||
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
|
|
||||||
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld,触发时间:%lld,映射配置的暂态持续时间单位是秒", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld,触发时间:%lld,映射配置的暂态持续时间单位是毫秒", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2307,7 +2294,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 下载录波文件%s和%s失败,录波号段:%d", LD_info->name,LD_info->mp_id,filenames[cfg_idx],filenames[dat_idx],LD_info->FltNum[i]);
|
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 下载录波文件%s和%s失败,录波号段:%d", LD_info->name,LD_info->mp_id,filenames[cfg_idx],filenames[dat_idx],LD_info->FltNum[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2315,7 +2302,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
if (ied && chnl_usr){
|
if (ied && chnl_usr){
|
||||||
echo_warn2("mms_mvla_fdir Failed: IED [%d] %s \n", ied->id , chnl_usr->ip_str) ;
|
echo_warn2("mms_mvla_fdir Failed: IED [%d] %s \n", ied->id , chnl_usr->ip_str) ;
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【WARN】监测点:%s - id:%s召唤录波文件列表失败,放弃这个号段", LD_info->name,LD_info->mp_id);
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【WARN】监测点:%s - id:%s召唤录波文件列表失败,放弃这个号段", LD_info->name,LD_info->mp_id);
|
||||||
LD_info->FltNum[i] = -1;
|
LD_info->FltNum[i] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -854,15 +854,8 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
|
|||||||
printf("[BEGIND Process] Received Report From %s:%d %s %s ,va_total = %i ,【count = %i】 \n",
|
printf("[BEGIND Process] Received Report From %s:%d %s %s ,va_total = %i ,【count = %i】 \n",
|
||||||
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count);
|
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count);
|
||||||
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
char full_key_m_c[256]; // 分配足够空间
|
|
||||||
char full_key_m_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_m_c, sizeof(full_key_m_c), "monitor.%s.COM", LD_info->mp_id);
|
|
||||||
snprintf(full_key_m_d, sizeof(full_key_m_d), "monitor.%s.DATA", LD_info->mp_id);
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_d,"【NORMAL】前置收到监测点:%s - id:%s的报告,报告名称:%s,监测点对应终端的ip和端口是: %s:%d,报告总数:%i,当前报告数:%i", LD_info->name,LD_info->mp_id,rcb_info->RptID,chnl_usr->ip_str,chnl_usr->chnl->port,va_total, rptinfo->count);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【NORMAL】前置收到监测点:%s - id:%s的报告,报告名称:%s,监测点对应终端的ip和端口是: %s:%d,报告总数:%i,当前报告数:%i", LD_info->name,LD_info->mp_id,rcb_info->RptID,chnl_usr->ip_str,chnl_usr->chnl->port,va_total, rptinfo->count);
|
||||||
|
|
||||||
//apr_time_t previousTime = apr_time_now();//
|
//apr_time_t previousTime = apr_time_now();//
|
||||||
//apr_time_exp_t localTime;
|
//apr_time_exp_t localTime;
|
||||||
@@ -1162,14 +1155,14 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
|
|||||||
echo_err3("Ignore this report due to line_id invalid , Report From %s %s %s !!!",
|
echo_err3("Ignore this report due to line_id invalid , Report From %s %s %s !!!",
|
||||||
APR_EGENERAL, chnl_usr->ip_str, LD_info->LD_name, rcb_info->RptID);
|
APR_EGENERAL, chnl_usr->ip_str, LD_info->LD_name, rcb_info->RptID);
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_REPORT,"【ERROR】前置不处理这个监测点:%s - id:%s的报告,报告名称:%s,原因是监测点的序号非法", LD_info->name,LD_info->mp_id,rcb_info->RptID);
|
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【ERROR】前置不处理这个监测点:%s - id:%s的报告,报告名称:%s,原因是监测点的序号非法", LD_info->name,LD_info->mp_id,rcb_info->RptID);
|
||||||
|
|
||||||
}
|
}
|
||||||
printf("[END Process] Report From %s:%d %s %s ,va_total = %i ,【count = %i】 \n",
|
printf("[END Process] Report From %s:%d %s %s ,va_total = %i ,【count = %i】 \n",
|
||||||
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count);
|
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count);
|
||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_INFOLOG(full_key_m_d,"【NORMAL】前置处理监测点:%s - id:%s的报告结束,报告名称:%s,监测点对应终端的ip和端口是: %s:%d,报告总数:%i,当前报告数:%i", LD_info->name,LD_info->mp_id,rcb_info->RptID,chnl_usr->ip_str,chnl_usr->chnl->port,va_total, rptinfo->count);
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【NORMAL】前置处理监测点:%s - id:%s的报告结束,报告名称:%s,监测点对应终端的ip和端口是: %s:%d,报告总数:%i,当前报告数:%i", LD_info->name,LD_info->mp_id,rcb_info->RptID,chnl_usr->ip_str,chnl_usr->chnl->port,va_total, rptinfo->count);
|
||||||
|
|
||||||
//apr_time_t previousTimeend = apr_time_now();//
|
//apr_time_t previousTimeend = apr_time_now();//
|
||||||
//apr_time_exp_t localTimeend;
|
//apr_time_exp_t localTimeend;
|
||||||
@@ -1462,7 +1455,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
|
|||||||
//need do nothing!
|
//need do nothing!
|
||||||
not_set_rpt_q_this = FALSE;
|
not_set_rpt_q_this = FALSE;
|
||||||
}
|
}
|
||||||
else if (strstr(FULL_FCDA_Name, "GGIO"))
|
else if (strstr(FULL_FCDA_Name, "GGIO") || strstr(FULL_FCDA_Name, "LPHD"))
|
||||||
{
|
{
|
||||||
not_set_rpt_q_this = FALSE;
|
not_set_rpt_q_this = FALSE;
|
||||||
}
|
}
|
||||||
@@ -1485,7 +1478,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
|
|||||||
//need do nothing!
|
//need do nothing!
|
||||||
not_set_rpt_TimeID_this = FALSE;
|
not_set_rpt_TimeID_this = FALSE;
|
||||||
}
|
}
|
||||||
else if (strstr(FULL_FCDA_Name, "GGIO")) {//CZY 2023-08-17 WW 2022-11-14修改判断 LLN0$BR$brcbRDRE
|
else if (strstr(FULL_FCDA_Name, "GGIO") || strstr(FULL_FCDA_Name, "LPHD")) {//CZY 2023-08-17 WW 2022-11-14修改判断 LLN0$BR$brcbRDRE
|
||||||
//need do nothing!
|
//need do nothing!
|
||||||
not_set_rpt_TimeID_this = FALSE;
|
not_set_rpt_TimeID_this = FALSE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ apr_status_t init_rdb()
|
|||||||
//char buf[256];
|
//char buf[256];
|
||||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
//log_error("process", buf);
|
//log_error("process", buf);
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
@@ -212,7 +212,7 @@ apr_status_t init_rdb()
|
|||||||
//char buf[256];
|
//char buf[256];
|
||||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
//log_error("process", buf);
|
//log_error("process", buf);
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
@@ -223,7 +223,7 @@ apr_status_t init_rdb()
|
|||||||
if (rv != APR_SUCCESS) {
|
if (rv != APR_SUCCESS) {
|
||||||
echo_errg("Failed to parse report log define ini file! \n");
|
echo_errg("Failed to parse report log define ini file! \n");
|
||||||
|
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"【ERROR】前置的%s%d号进程报告初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RPTINIT,"【ERROR】前置的%s%d号进程报告初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
@@ -232,7 +232,7 @@ apr_status_t init_rdb()
|
|||||||
if (app_get_private_config(g_my_conf_fname) != APR_SUCCESS) {
|
if (app_get_private_config(g_my_conf_fname) != APR_SUCCESS) {
|
||||||
echo_errg("Failed when processing private configuration\n");
|
echo_errg("Failed when processing private configuration\n");
|
||||||
|
|
||||||
DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程读取mms配置失败", get_front_msg_from_subdir(), g_front_seg_index);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程读取mms配置失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
|
|
||||||
return APR_EGENERAL;
|
return APR_EGENERAL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -535,13 +535,6 @@ void processQVVR_end(LD_info_t* LD_info)
|
|||||||
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
char full_key_m_c[256]; // 分配足够空间
|
|
||||||
char full_key_m_d[256]; // 分配足够空间
|
|
||||||
snprintf(full_key_m_c, sizeof(full_key_m_c), "monitor.%s.COM", LD_info->mp_id);
|
|
||||||
snprintf(full_key_m_d, sizeof(full_key_m_d), "monitor.%s.DATA", LD_info->mp_id);
|
|
||||||
//监测点日志的key,lnk20250526
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
int find_paired = FALSE;
|
int find_paired = FALSE;
|
||||||
int i;
|
int i;
|
||||||
@@ -562,11 +555,11 @@ void processQVVR_end(LD_info_t* LD_info)
|
|||||||
long long utc_or_beijing;
|
long long utc_or_beijing;
|
||||||
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
|
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
|
||||||
s_or_ms = 0.001;
|
s_or_ms = 0.001;
|
||||||
//DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s上送的暂态持续时间单位是秒,监测点对应装置型号:%s",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
//DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s上送的暂态持续时间单位是秒,监测点对应装置型号:%s",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
s_or_ms = 1.0;
|
s_or_ms = 1.0;
|
||||||
//DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s上送的暂态持续时间单位是毫秒,监测点对应装置型号:%s",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
//DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s上送的暂态持续时间单位是毫秒,监测点对应装置型号:%s",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strcmp(cfg.ValueOfTimeUnit, "utc") == 0){//上送的是utc还是北京
|
if(strcmp(cfg.ValueOfTimeUnit, "utc") == 0){//上送的是utc还是北京
|
||||||
@@ -635,7 +628,7 @@ void processQVVR_end(LD_info_t* LD_info)
|
|||||||
|
|
||||||
//匹配后再发qvvr,起始时间要填暂态触发的时间,就是第一次事件上送时只有时间没有值的那个时间
|
//匹配后再发qvvr,起始时间要填暂态触发的时间,就是第一次事件上送时只有时间没有值的那个时间
|
||||||
//mq日志
|
//mq日志
|
||||||
DIY_WARNLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT,"【WARN】监测点%s - id:%s 发生暂态事件,暂态时间:%lld,暂态持续时间:%f,暂态幅值:%f,暂态类型:%d",LD_info->name,LD_info->mp_id,
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点%s - id:%s 发生暂态事件,暂态时间:%lld,暂态持续时间:%f,暂态幅值:%f,暂态类型:%d",LD_info->name,LD_info->mp_id,
|
||||||
LD_info->qvvr[LD_info->qvvr_idx].QVVR_time,
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_time,
|
||||||
LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime,
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime,
|
||||||
LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg,
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg,
|
||||||
@@ -669,10 +662,10 @@ void processQVVR_end(LD_info_t* LD_info)
|
|||||||
|
|
||||||
//mq日志
|
//mq日志
|
||||||
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
|
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间,装置型号:%s 配置的暂态持续时间单位是秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间,装置型号:%s 配置的暂态持续时间单位是秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间,装置型号:%s 配置的暂态持续时间单位是毫秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间,装置型号:%s 配置的暂态持续时间单位是毫秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
170
mykafka.ini
Normal file
170
mykafka.ini
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
[Kafka]
|
||||||
|
BrokerList=
|
||||||
|
EventTopic=
|
||||||
|
KafkaFlag=
|
||||||
|
KafkaListSize=
|
||||||
|
|
||||||
|
RTDataTopic=Real_Time_Data_Topic
|
||||||
|
HisTopic=LN_Topic
|
||||||
|
PSTTopic=LN_Topic
|
||||||
|
PLTTopic=LN_Topic
|
||||||
|
AlmTopic=AlmTopic
|
||||||
|
SngTopic=SngTopic
|
||||||
|
|
||||||
|
[Oracle]
|
||||||
|
OtlType=
|
||||||
|
OtlConnect=
|
||||||
|
OtlFlag=
|
||||||
|
OtlConnectLimit=
|
||||||
|
SqlListSize=
|
||||||
|
|
||||||
|
[Comtrade]
|
||||||
|
NEWESTFlag=
|
||||||
|
|
||||||
|
[SFTP]
|
||||||
|
SFtpFlag=
|
||||||
|
|
||||||
|
[SagSource]
|
||||||
|
UpdateFlag=
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
UnitOfTime=
|
||||||
|
|
||||||
|
[Recall]
|
||||||
|
JournalTime=
|
||||||
|
recall_lenth=
|
||||||
|
recall_start=
|
||||||
|
recall_dailytime=
|
||||||
|
select_day=
|
||||||
|
|
||||||
|
[screen]
|
||||||
|
ScreenFlag=
|
||||||
|
WebHost=
|
||||||
|
WebPort=
|
||||||
|
ScreenUrl=
|
||||||
|
|
||||||
|
[AccountUpdate]
|
||||||
|
Interval=
|
||||||
|
LastUpdateTime=
|
||||||
|
|
||||||
|
[MultiNode]
|
||||||
|
Interval=
|
||||||
|
|
||||||
|
[CommunicationLog]
|
||||||
|
StatusRecordDuration=
|
||||||
|
AbnormalRecordDuration=
|
||||||
|
|
||||||
|
[Postgres]
|
||||||
|
Database=
|
||||||
|
Username=
|
||||||
|
Password=
|
||||||
|
Schema=
|
||||||
|
Dnsname=
|
||||||
|
TablePrefix=
|
||||||
|
|
||||||
|
[Web]
|
||||||
|
ClientId=
|
||||||
|
ClientSecret=
|
||||||
|
TokenUrl=
|
||||||
|
DeviceUrl=
|
||||||
|
GrantType=
|
||||||
|
|
||||||
|
[Flag]
|
||||||
|
FileFlag=4
|
||||||
|
FrontInst=884d132ac3a01225fcacc8c10da07d09
|
||||||
|
FrontIP=192.168.1.167
|
||||||
|
SendFlag=3
|
||||||
|
RecallOnlyFlag=
|
||||||
|
|
||||||
|
[Ledger]
|
||||||
|
TerminalStatus="[0]"
|
||||||
|
MonitorStatus="[1,2]"
|
||||||
|
IcdFlag=0
|
||||||
|
IedCount=300
|
||||||
|
|
||||||
|
[Socket]
|
||||||
|
SocketEnable=0
|
||||||
|
SocketPort=13000
|
||||||
|
|
||||||
|
[Http]
|
||||||
|
HttpEnable=0
|
||||||
|
HttpIp=0.0.0.0
|
||||||
|
HttpPort=12000
|
||||||
|
WebDevice=http://192.168.1.68:10202/nodeDevice/nodeDeviceList
|
||||||
|
WebIcd=http://192.168.1.68:10202/icd/icdPathList
|
||||||
|
WebIntegrity=http://192.168.1.68:10202/LineIntegrityData/saveOrUpdateData
|
||||||
|
WebComflag=http://192.168.1.68:10202/dev/updateDevComFlag
|
||||||
|
WebEvent=http://192.168.1.68:10203/event/addEventDetail
|
||||||
|
WebFileupload=http://192.168.1.68:10207/file/upload
|
||||||
|
WebFiledownload=http://192.168.1.68:10207/file/download
|
||||||
|
|
||||||
|
[Oss]
|
||||||
|
OssEndpoint=
|
||||||
|
AccessKeyID=
|
||||||
|
AccessKeySecret=
|
||||||
|
BucketName=
|
||||||
|
|
||||||
|
[FrontNode]
|
||||||
|
Node=
|
||||||
|
|
||||||
|
[MySql]
|
||||||
|
ConStr=
|
||||||
|
|
||||||
|
[InfluxDb]
|
||||||
|
SelectUrl=
|
||||||
|
WriteUrl=
|
||||||
|
|
||||||
|
[RocketMq]
|
||||||
|
producer=Group_producer
|
||||||
|
Ipport=192.168.1.68:9876
|
||||||
|
Topic=TEST_Topic
|
||||||
|
Tag=Test_Tag
|
||||||
|
Key=Test_Keys
|
||||||
|
Queuenum=4
|
||||||
|
|
||||||
|
Testflag=1
|
||||||
|
Testnum=100
|
||||||
|
Testtype=1
|
||||||
|
TestPort=11000
|
||||||
|
TestList=
|
||||||
|
|
||||||
|
consumer=Group_consumer
|
||||||
|
ConsumerIpport=192.168.1.68:9876
|
||||||
|
ConsumerTopicRT=ask_real_data_topic
|
||||||
|
ConsumerTagRT=Test_Tag
|
||||||
|
ConsumerKeyRT=Test_Keys
|
||||||
|
ConsumerAccessKey=rmqroot
|
||||||
|
ConsumerSecretKey=001@#njcnmq
|
||||||
|
ConsumerChannel=
|
||||||
|
ConsumerTopicUD=control_Topic
|
||||||
|
ConsumerTagUD=Test_Tag
|
||||||
|
ConsumerKeyUD=Test_Keys
|
||||||
|
ConsumerTopicRC=recall_Topic
|
||||||
|
ConsumerTagRC=Test_Tag
|
||||||
|
ConsumerKeyRC=Test_Keys
|
||||||
|
ConsumerTopicSET=process_Topic
|
||||||
|
ConsumerTagSET=Test_Tag
|
||||||
|
ConsumerKeySET=Test_Keys
|
||||||
|
ConsumerTopicLOG=ask_log_Topic
|
||||||
|
ConsumerTagLOG=Test_Tag
|
||||||
|
ConsumerKeyLOG=Test_Keys
|
||||||
|
LOGTopic=log_Topic
|
||||||
|
LOGTag=Test_Tag
|
||||||
|
LOGKey=Test_Keys
|
||||||
|
CONNECTTopic=Device_Run_Flag_Topic
|
||||||
|
CONNECTTag=Test_Tag
|
||||||
|
CONNECTKey=Test_Keys
|
||||||
|
Heart_Beat_Topic=Heart_Beat_Topic
|
||||||
|
Heart_Beat_Tag=Test_Tag
|
||||||
|
Heart_Beat_Key=Test_Key
|
||||||
|
Topic_Reply_Topic=Topic_Reply_Topic
|
||||||
|
Topic_Reply_Tag=Test_Tag
|
||||||
|
Topic_Reply_Key=Test_Key
|
||||||
|
|
||||||
|
[LogRate]
|
||||||
|
ResetSec=3600
|
||||||
|
LimitSec=60
|
||||||
|
KeepAllMs=60000
|
||||||
|
KeepBurstMs=1000
|
||||||
|
KeepBurstCount=60
|
||||||
|
KeepHighFreqCount=10
|
||||||
@@ -24,7 +24,7 @@ for fd_path in /proc/$$/fd/*; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
# 设置日志文件路径
|
# 设置日志文件路径
|
||||||
LOGFILE="$FEP_ENV/dat/log/start_fe.log"
|
LOGFILE="/FeProject/dat/log/start_fe.log"
|
||||||
|
|
||||||
INI_FILE="/FeProject/etc/config/mykafka.ini"
|
INI_FILE="/FeProject/etc/config/mykafka.ini"
|
||||||
|
|
||||||
@@ -315,7 +315,7 @@ handle_reset() {
|
|||||||
# 关闭旧的 comtrade 进程
|
# 关闭旧的 comtrade 进程
|
||||||
#kill_process_by_name "/FeProject/bin/pt61850netd_pqfe -d cfg_soe_comtrade"
|
#kill_process_by_name "/FeProject/bin/pt61850netd_pqfe -d cfg_soe_comtrade"
|
||||||
|
|
||||||
/home/pq/FeProject/boot/stop_fe.sh
|
/FeProject/boot/stop_fe.sh
|
||||||
|
|
||||||
wait_all_exit || exit 1
|
wait_all_exit || exit 1
|
||||||
|
|
||||||
@@ -325,34 +325,34 @@ handle_reset() {
|
|||||||
sleep 5
|
sleep 5
|
||||||
|
|
||||||
# 清空 runtime.cf 中的所有进程配置
|
# 清空 runtime.cf 中的所有进程配置
|
||||||
sed -i '/cfg_stat_data/d' /home/pq/FeProject/etc/runtime.cf
|
sed -i '/cfg_stat_data/d' /FeProject/etc/runtime.cf
|
||||||
sed -i '/cfg_recallhis_data/d' /home/pq/FeProject/etc/runtime.cf
|
sed -i '/cfg_recallhis_data/d' /FeProject/etc/runtime.cf
|
||||||
sed -i '/cfg_3s_data/d' /home/pq/FeProject/etc/runtime.cf
|
sed -i '/cfg_3s_data/d' /FeProject/etc/runtime.cf
|
||||||
sed -i '/cfg_soe_comtrade/d' /home/pq/FeProject/etc/runtime.cf
|
sed -i '/cfg_soe_comtrade/d' /FeProject/etc/runtime.cf
|
||||||
sed -i '/fe_watchdog/d' /home/pq/FeProject/etc/runtime.cf
|
sed -i '/fe_watchdog/d' /FeProject/etc/runtime.cf
|
||||||
|
|
||||||
# 根据进程号添加对应进程配置
|
# 根据进程号添加对应进程配置
|
||||||
if [ "$1" -eq 1 ]; then
|
if [ "$1" -eq 1 ]; then
|
||||||
#看门狗固定放在第一个,防止stop时会把要杀死的进程重启
|
#看门狗固定放在第一个,防止stop时会把要杀死的进程重启
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ fe_watchdog -m 18192 ^ ^ ^ 1 ^ IGNORE_RESTART ^\n')" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ fe_watchdog -m 18192 ^ ^ ^ 1 ^ IGNORE_RESTART ^\n')" /FeProject/etc/runtime.cf
|
||||||
# 进程号为 1,按固定格式添加
|
# 进程号为 1,按固定格式添加
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s 1_1^ ^ ^ 1 ^ ^\n')" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s 1_1^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s 1_1^ ^ ^ 1 ^ ^\n')" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s 1_1^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
|
|
||||||
else
|
else
|
||||||
#看门狗固定放在第一个,防止stop时会把要杀死的进程重启
|
#看门狗固定放在第一个,防止stop时会把要杀死的进程重启
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ fe_watchdog -m 18192 ^ ^ ^ 1 ^ IGNORE_RESTART ^\n')" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ fe_watchdog -m 18192 ^ ^ ^ 1 ^ IGNORE_RESTART ^\n')" /FeProject/etc/runtime.cf
|
||||||
# 进程号大于 1,按 -s ${i}_ 格式添加
|
# 进程号大于 1,按 -s ${i}_ 格式添加
|
||||||
for i in $(seq 1 $1); do
|
for i in $(seq 1 $1); do
|
||||||
# 在 runtime.cf 中插入对应的配置行,直接插入变量替换结果
|
# 在 runtime.cf 中插入对应的配置行,直接插入变量替换结果
|
||||||
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
|
||||||
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
|
||||||
done
|
done
|
||||||
#以下部分没有多进程
|
#以下部分没有多进程
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -364,16 +364,16 @@ handle_reset() {
|
|||||||
|
|
||||||
# 重新启动服务
|
# 重新启动服务
|
||||||
|
|
||||||
/home/pq/FeProject/boot/start_fe.sh
|
/FeProject/boot/start_fe.sh
|
||||||
|
|
||||||
echo "****** reset all in $1******" >>"$LOGFILE"
|
echo "****** reset all in $1******" >>"$LOGFILE"
|
||||||
elif [ "$2" == "stat" ]; then
|
elif [ "$2" == "stat" ]; then
|
||||||
# 清空 runtime.cf 中包含 cfg_stat_data 的行
|
# 清空 runtime.cf 中包含 cfg_stat_data 的行
|
||||||
sed -i '/cfg_stat_data/d' /home/pq/FeProject/etc/runtime.cf
|
sed -i '/cfg_stat_data/d' /FeProject/etc/runtime.cf
|
||||||
|
|
||||||
# 根据进程号来添加新的进程配置
|
# 根据进程号来添加新的进程配置
|
||||||
for i in $(seq 1 $1); do
|
for i in $(seq 1 $1); do
|
||||||
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
|
||||||
done
|
done
|
||||||
|
|
||||||
# 关闭旧的看门狗进程
|
# 关闭旧的看门狗进程
|
||||||
@@ -385,16 +385,16 @@ handle_reset() {
|
|||||||
#sleep 5
|
#sleep 5
|
||||||
|
|
||||||
# 启动服务不影响其他功能的进程
|
# 启动服务不影响其他功能的进程
|
||||||
/home/pq/FeProject/boot/start_fe.sh
|
/FeProject/boot/start_fe.sh
|
||||||
|
|
||||||
echo "****** reset stat in $1******" >>"$LOGFILE"
|
echo "****** reset stat in $1******" >>"$LOGFILE"
|
||||||
elif [ "$2" == "recall" ]; then
|
elif [ "$2" == "recall" ]; then
|
||||||
# 清空 runtime.cf 中包含 cfg_recallhis_data 的行
|
# 清空 runtime.cf 中包含 cfg_recallhis_data 的行
|
||||||
sed -i '/cfg_recallhis_data/d' /home/pq/FeProject/etc/runtime.cf
|
sed -i '/cfg_recallhis_data/d' /FeProject/etc/runtime.cf
|
||||||
|
|
||||||
# 根据进程号来添加新的进程配置
|
# 根据进程号来添加新的进程配置
|
||||||
for i in $(seq 1 $1); do
|
for i in $(seq 1 $1); do
|
||||||
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
|
||||||
done
|
done
|
||||||
|
|
||||||
# 关闭旧的看门狗进程
|
# 关闭旧的看门狗进程
|
||||||
@@ -405,7 +405,7 @@ handle_reset() {
|
|||||||
#sleep 5
|
#sleep 5
|
||||||
|
|
||||||
# 启动服务不影响其他功能的进程
|
# 启动服务不影响其他功能的进程
|
||||||
/home/pq/FeProject/boot/start_fe.sh
|
/FeProject/boot/start_fe.sh
|
||||||
|
|
||||||
echo "****** reset recall in $1******" >>"$LOGFILE"
|
echo "****** reset recall in $1******" >>"$LOGFILE"
|
||||||
else
|
else
|
||||||
@@ -429,22 +429,22 @@ handle_add() {
|
|||||||
# 如果 $1 在 1 和 10 之间,进入处理逻辑
|
# 如果 $1 在 1 和 10 之间,进入处理逻辑
|
||||||
if [ "$2" == "all" ]; then
|
if [ "$2" == "all" ]; then
|
||||||
# 检查是否已存在该条目,避免重复添加
|
# 检查是否已存在该条目,避免重复添加
|
||||||
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^" /home/pq/FeProject/etc/runtime.cf; then
|
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
|
||||||
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^" /home/pq/FeProject/etc/runtime.cf; then
|
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
|
||||||
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
|
||||||
fi
|
fi
|
||||||
elif [ "$2" == "stat" ]; then
|
elif [ "$2" == "stat" ]; then
|
||||||
# 检查是否已存在该条目,避免重复添加
|
# 检查是否已存在该条目,避免重复添加
|
||||||
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^" /home/pq/FeProject/etc/runtime.cf; then
|
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
|
||||||
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
|
||||||
fi
|
fi
|
||||||
elif [ "$2" == "recall" ]; then
|
elif [ "$2" == "recall" ]; then
|
||||||
# 检查是否已存在该条目,避免重复添加
|
# 检查是否已存在该条目,避免重复添加
|
||||||
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^" /home/pq/FeProject/etc/runtime.cf; then
|
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
|
||||||
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /home/pq/FeProject/etc/runtime.cf
|
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "****** process add type null ******"
|
echo "****** process add type null ******"
|
||||||
@@ -457,7 +457,7 @@ handle_add() {
|
|||||||
#sleep 5
|
#sleep 5
|
||||||
|
|
||||||
# 启动服务,不影响正在运行的进程
|
# 启动服务,不影响正在运行的进程
|
||||||
/home/pq/FeProject/boot/start_fe.sh
|
/FeProject/boot/start_fe.sh
|
||||||
|
|
||||||
else
|
else
|
||||||
# 如果 $1 不在 1 到 10 之间,记录错误日志
|
# 如果 $1 不在 1 到 10 之间,记录错误日志
|
||||||
|
|||||||
Reference in New Issue
Block a user