📄 ysrecv.c
字号:
#include "iec103.h"
char myprocessname[NAME_SIZE+1];
char mynodename[NAME_SIZE+1];
char strategy[NAME_SIZE+1];
char hostname[NAME_SIZE+1];
char com_tagname[NAME_SIZE+1];
char diag_tag[NAME_SIZE+1];
char IEC_TAGNAME[NAME_SIZE+1];
audio_msg Audio;
SENDDEF SendDef;
RCVDEF RcvDef;
MSG_BUF SendMsg;
MSG_BUF RcvMsg;
char recv_data[ BUFSIZE ];
IODEF *pIODEF;
IECDEF *pIECDEF[MaxIECNum],*pIEC;
char *pStr;
int IECCount,INTCOUNT;
int Display,Enqflag;
int GRP[MaxGRPNum];
unsigned port,RcvTimeOut,IONumber,IECInitMark;
short AddrIEC;
extern int fd;
extern char *rGetSharedMemory();
extern SysDef *pSysDef;
extern PORT_DEF port_def[];
extern void RcvTimeOut_hnd();
extern void alarm_handler();
extern void ralarm_handler();
struct timeb NowTime,EnqTime,ClkTime,FltTest,ValTime;
main(argc,argv)
int argc;
char *argv[];
{
char *pSHM;
int i;
if ( (argc!=3) && (argc!=4) ) {
printf("Command Syntax ----- ysrecv com<11-48> TAGNAME [on|off]\n");
printf("Invalid argc ------- %s\n",argv[0]);
exit(0);
}
port=1;
while (strcmp(port_def[port].alias,"")!=0)
{
if (strcmp(port_def[port].alias,argv[1])==0) break;
else port++;
}
if (strcmp(port_def[port].alias,"")==0) {
printf("Command Syntax ----- ysrecv com<11-48> TAGNAME [on|off]\n");
printf("Invalid argument --- %s\n",argv[1]);
exit(0);
}
sprintf(myprocessname,"%s_%s",argv[0],argv[2]);
get_local_name(hostname);
strcpy(IEC_TAGNAME,argv[2]);
if (InitSharedMemory()==-1) {
printf("InitSharedMemory Failurei --- %s_%s\n",argv[0],argv[1]);
exit(0);
}
if (get_local_aliasname(mynodename)==-1) {
printf("get_local_aliasname Failure---%s_%s\n",argv[0],argv[1]);
exit(0);
}
if (get_local_strategy(strategy)==-1) {
printf("get_local_strategy Failure---%s_%s\n",argv[0],argv[1]);
exit(0);
}
if (msg_init(myprocessname)==-1) {
printf("Msg_init failure---%s\n",myprocessname);
exit(0);
}
get_diag_tag(hostname,diag_tag);
init_sighandler();
open_device();
init_device();
rLoadDataBase();
pIEC->FCV = LPCI_FCV;
pIEC->ACD = NO;
pIEC->ClkSet = 1;
pIEC->Status = NODE_ON;
if( argc==4 && strcmp(argv[3],"on")==0 ) pIEC->Display = 1;
else pIEC->Display = 0;
for(i=0;i<MaxIECNum;i++){
if(pIECDEF[i] == (IECDEF *)0)continue;
pIECDEF[i]->Status = NODE_ON;
}
ftime(&EnqTime);
ftime(&ValTime);
ftime(&ClkTime);
ftime(&FltTest);
setsid();
main_loop();
}
main_loop()
{
int init_flag,rtn,i,pending;
init_flag = 0;
while (1)
{
if (get_redundant_flag(hostname) == 1) {
if (init_flag == 0) {
M_INIT_Proc();
sleep(1);
init_flag=1;
}
dbmIEC();
sleep(1);
}
else{
ioctl(fd,TCFLSH,0);
RcvMsg.mtype = MESG_ALL;
RcvMsg.msg_size = BUFSIZE;
RcvMsg.msg_data = recv_data;
pending = msg_recv( &RcvMsg, 0 );
if (pending>=0) IEC_Status_Proc();
sleep(2);
}
}
}
SendStatusToPeer(code,addr)
unsigned char code;
{
MSG_BUF sbuf;
if (code == NODE_ON)
sbuf.function_code = MSG_IEC_STATUS_ON;
else sbuf.function_code = MSG_IEC_STATUS_OFF;
strcpy((char *)sbuf.dest_node_name,mynodename);
strcpy((char *)sbuf.dest_proc_name,myprocessname);
sbuf.status_flags = addr;
sbuf.msg_size = 0;
sbuf.msg_data = 0;
if(msg_send(&sbuf,0,8,1,0) < 0)
printf("%s send: Network Sending Error----.\n",myprocessname);
}
IEC_Status_Proc()
{
unsigned char relay_addr;
printf("recv msg from node=%s proc=%s\n",
RcvMsg.orig_node_name,RcvMsg.orig_proc_name);
relay_addr = RcvMsg.status_flags;
switch (RcvMsg.function_code)
{
case MSG_IEC_STATUS_ON:
pIECDEF[relay_addr]->Status = NODE_ON;
break;
case MSG_IEC_STATUS_OFF:
pIECDEF[relay_addr]->Status = NODE_OFF;
break;
default:
printf("Error Set Modify Command by Node=%s Proc=%s\n",
RcvMsg.orig_node_name,RcvMsg.orig_proc_name);
break;
}
}
dbmIEC()
{
int i,j,k;
int pending,wait_times;
RcvMsg.mtype = MESG_ALL;
RcvMsg.msg_size = BUFSIZE;
RcvMsg.msg_data = recv_data;
pending = msg_recv( &RcvMsg, 0 );
if (pending>=0) IECSetupCmdProc();
ftime(&NowTime);
if( (pIEC->Status == NODE_ON) && (pIEC->ClkSet == 1) ){
pIEC->ClkSet = 0;
C_SYN_TA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
sleep(1);
}
for( i=0;i<MaxIECNum;i++ ){
if( pIECDEF[i] == (IECDEF *)0 ) continue;
if( pIECDEF[i]->Status == NODE_OFF ) continue;
if( pIECDEF[i]->ENQFLAG == 1 ){
pIECDEF[i]->ENQFLAG = 0;
Find_Relay_GRP(i);
for( j=0;j<MaxGRPNum;j++ ){
if( GRP[j] == 1 ){
wait_times = 0;
C_GC_NA_B3(i,j);
TxDriver(SendDef.Buf,SendDef.SendSize);
sleep(1);
if (RxDrvCheckProc() < 0) break;
while( pIEC->ACD == NO && wait_times < MaxWaitTimes ){
wait_times ++ ;
C_PL2_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if (RxDrvCheckProc() > 0) C_PL2_NA_Proc();
else break;
sleep(1);
}
wait_times = 0;
while( pIEC->ACD == YES ){
C_PL1_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if (RxDrvCheckProc() > 0){
if( RcvDef.Buf[0] == LPCI_SYN ) break;
C_PL1_NA_Proc();
}
else break;
sleep(1);
}
}
}
}
}
if (((NowTime.time-EnqTime.time) > EnqInterval) ||
((EnqTime.time-NowTime.time) > EnqInterval) ) {
ftime(&EnqTime);
if( pIEC->Status == NODE_ON ){
C_PL2_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if (RxDrvCheckProc() > 0) C_PL2_NA_Proc();
while( pIEC->ACD == YES ){
C_PL1_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if (RxDrvCheckProc() > 0){
if( RcvDef.Buf[0] == LPCI_SYN ) break;
C_PL1_NA_Proc();
}
else break;
sleep(1);
}
}
}
else if (((NowTime.time-ClkTime.time) > ClkInterval) ||
((ClkTime.time-NowTime.time) > ClkInterval) ) {
ftime(&ClkTime);
pIEC->ClkSet = 1;
}
else if (((NowTime.time-FltTest.time) > FltInterval) ||
((FltTest.time-NowTime.time) > FltInterval) ) {
ftime(&FltTest);
if( pIEC->Status == NODE_OFF ){
M_INIT_Proc();
sleep(1);
}
}
}
M_INIT_Proc()
{
int code,i,wait_times;
C_RCU_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if ((RxDrvCheckProc() < 0) ||
((RcvDef.Buf[1] & 0x0f) != M_CON_NA)) return -1;
sleep(1);
wait_times = 0;
while( pIEC->ACD == NO && wait_times < MaxWaitTimes ){
wait_times ++ ;
C_PL2_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if (RxDrvCheckProc() > 0) C_PL2_NA_Proc();
else break;
sleep(1);
}
wait_times = 0;
while( pIEC->ACD == YES ){
C_PL1_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if( RxDrvCheckProc() > 0 ) C_PL1_NA_Proc();
else break;
ms_sleep(100);
}
/*
C_RFB_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if ((RxDrvCheckProc() < 0) ||
((RcvDef.Buf[1] & 0x0f) != M_CON_NA)) return -1;
sleep(1);
while( pIEC->ACD == YES ){
C_PL1_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
if( RxDrvCheckProc() > 0 ) C_PL1_NA_Proc();
else break;
ms_sleep(100);
}
for(i=0;i<MaxIECNum;i++){
if(pIECDEF[i] == (IECDEF *)0) continue;
if(pIECDEF[i]->Status == NODE_OFF) continue;
C_IGI_NA_3(i);
TxDriver(SendDef.Buf,SendDef.SendSize);
if ((RxDrvCheckProc() < 0) ||
((RcvDef.Buf[1] & 0x0f) != M_CON_NA)) return -1;
}
*/
pIEC->ClkSet = YES;
return 1;
}
C_SYN_NA_Proc()
{
}
C_RLK_NA_Proc()
{
}
IECSetupCmdProc()
{
printf("recv msg from node=%s proc=%s\n",
RcvMsg.orig_node_name,RcvMsg.orig_proc_name);
}
C_PL1_NA_Proc()
{
int rptr,wptr,length;
unsigned char addr;
if (RcvDef.Buf[0]==LPCI_SYN) return;
addr = RcvDef.Buf[9];
if(pIECDEF[addr] == (IECDEF *)0) return;
switch (pIECDEF[addr]->IODef.CONNECTTYPE)
{
case mLFP901A:
case mLFP902A:
case mLFP951A:
case mLFP921A:
case mLFP922:
case mRCS915C:
case mRCS915D:
case mRCS915E:
case mRCS974A:
case mRCS978C:
RCS_PL1_Proc(addr);
break;
case mBP2A:
case mBP2B:
BP_PL1_Proc(addr);
break;
case mMCD:
MCD_PL1_Proc(addr);
break;
case mPSL602:
PSL_PL1_Proc(addr);
break;
default:
printf("LINKADDR = %d type not defined! \n",pIECDEF[addr]->IODef.OCCNO);
break;
}
}
C_PL2_NA_Proc()
{
unsigned char addr;
if(pIECDEF[addr] == (IECDEF *)0) return;
switch (pIECDEF[addr]->IODef.CONNECTTYPE)
{
case mBP2A:
case mBP2B:
BP_PL2_Proc(addr);
break;
case mMCD:
MCD_PL2_Proc(addr);
break;
case mPSL602:
PSL_PL2_Proc(addr);
break;
default:
break;
}
}
AlarmProc(str,tab)
char str[],tab[];
{
alarm_msg Alarm_Msg;
audio_msg Audio;
struct tm *time_ptr;
time_t Sclock;
Sclock=time((time_t *) NULL);
time_ptr=localtime(&Sclock);
Alarm_Msg.alarm = 1;
Alarm_Msg.log = 1;
Alarm_Msg.hour = time_ptr->tm_hour;
Alarm_Msg.minute = time_ptr->tm_min;
Alarm_Msg.second = time_ptr->tm_sec;
Alarm_Msg.ms = 0;
Alarm_Msg.n = 0;
Alarm_Msg.state = 0x80;
strcpy(Alarm_Msg.alarm_tag,tab);
sprintf(Alarm_Msg.msg,"%s (%s)",str,hostname);
build_alarm(&Alarm_Msg,0);
Audio.audio_no=2;
audio_alarm(&Audio);
}
Find_Relay_GRP(addr)
unsigned char addr;
{
int i,j;
for(i=0;i<MaxGRPNum;i++) GRP[i] = 0;
/* 不同型号保护有不同的 cpu */
switch (pIECDEF[addr]->IODef.CONNECTTYPE)
{
case mLFP901A:
case mLFP902A:
case mLFP951A:
GRP[1] = GRP[2] = GRP[3] = GRP[6] = 1;
case mRCS915C:
case mRCS915D:
case mRCS915E:
case mRCS974A:
case mRCS978C:
GRP[1] = GRP[2] = GRP[3] = GRP[4] = GRP[5] = 1;
GRP[6] = GRP[8] = GRP[9] = 1;
case mLFP921A:
case mLFP922:
GRP[1] = GRP[2] = GRP[3] = 1;
break;
case mBP2A:
case mBP2B:
GRP[0] = GRP[1] = GRP[2] = 1;
break;
case mMCD:
GRP[2] = 1;
break;
case mPSL602:
GRP[4] = 1;
break;
default:
printf("LINKADDR = %d type not defined! \n",pIECDEF[addr]->IODef.OCCNO);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -