📄 ysdrv.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[MaxBHNum],*pIEC;
char *pStr;
int BhCount,*pBH_Index;
int GRP[MaxGRPNum];
unsigned port,RcvTimeOut,IONumber,IECInitMark;
short AddrIEC;
SHM_BH_DEF *shm_bh_buf_r;
SHM_BH_DEF1 *shm_bh_buf_w[MaxBHNum];
extern int fd;
extern char *rGetSharedMemory();
extern SysDef *pSysDef;
extern PORT_DEF port_def[];
extern void RcvTimeOut_hnd();
extern void alarm_handler();
extern void exit_exe();
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 ----- ysdrv 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 ----- ysdrv com<11-48> TAGNAME [on|off]\n");
printf("Invalid argument --- %s\n",argv[1]);
exit(0);
}
sprintf(myprocessname,"%s_%s",argv[0],argv[1]);
strcpy(IEC_TAGNAME,argv[2]);
get_local_name(hostname);
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_exe();
}
if (get_local_strategy(strategy)==-1) {
printf("get_local_strategy Failure---%s_%s\n",argv[0],argv[1]);
exit_exe();
}
if (msg_init(myprocessname)==-1) {
printf("Msg_init failure---%s\n",myprocessname);
exit_exe();
}
get_diag_tag(hostname,diag_tag);
init_sighandler();
open_device();
init_device();
rLoadDataBase();
BH_CREATE_SHM_BUF();
pIEC->DFC = NO;
pIEC->ACD = NO;
pIEC->CU_Reset= 1;
pIEC->ClkSet = 1;
pIEC->Status = NODE_ON;
if (argc==3) pIEC->Display=0;
else
if (strcmp(argv[3],"on")==0) pIEC->Display=1;
setsid();
main_loop();
}
main_loop()
{
int i,j;
unsigned char addr;
while (1)
{
if (get_redundant_flag(hostname) == 1) {
if( RxDrvCheckProc()>0 ){
dbmIEC();
if (RcvDef.Buf[0] == LPCI_STX){
addr = RcvDef.Buf[9];
if( addr < MaxBHNum && pBH_Index[addr] != -1)
WriteBhShmProc(pBH_Index[addr]);
}
}
ms_sleep(200);
}
else{
ioctl(fd,TCFLSH,0);
if( shm_bh_buf_r != (SHM_BH_DEF *)-1 ){
shm_bh_buf_r->rptr = shm_bh_buf_r->wptr;
shm_bh_buf_r->oflag = 0;
}
ms_sleep(500);
}
}
}
SendStatusToPeer(code,addr)
unsigned char code,addr;
{
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;
}
}
M_CON_NA_3() /* Confirm */
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_SYN;
SendDef.Buf[1] = M_CON_NA | pIEC->ACD;
SendDef.Buf[2] = pIEC->IODef.OCCNO;
SendDef.Buf[3] = sum( &(SendDef.Buf[1]),2 );
SendDef.Buf[4] = LPCI_ETX;
SendDef.SendSize = 5;
}
M_NV_NA_3() /* No Request data */
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_SYN;
SendDef.Buf[1] = M_NV_NA | pIEC->ACD;
SendDef.Buf[2] = pIEC->IODef.OCCNO;
SendDef.Buf[3] = sum( &(SendDef.Buf[1]),2 );
SendDef.Buf[4] = LPCI_ETX;
SendDef.SendSize = 5;
}
M_LKR_OK_3() /* Link Status OK */
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_SYN;
SendDef.Buf[1] = M_LKR_OK | pIEC->ACD;
SendDef.Buf[2] = pIEC->IODef.OCCNO;
SendDef.Buf[3] = sum( &(SendDef.Buf[1]),2 );
SendDef.Buf[4] = LPCI_ETX;
SendDef.SendSize = 5;
}
MakeMailPrep(len)
int len;
{
SendDef.Buf[4] = SendDef.Buf[4] | pIEC->ACD;
SendDef.Buf[5] = pIEC->IODef.OCCNO;
SendDef.Buf[len-2] = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
SendDef.SendSize = len;
}
M_PL1_NA_3() /* Send P1 Data */
{
int rptr,len;
rptr = shm_bh_buf_r->rptr;
if( rptr != shm_bh_buf_r->wptr ) {
memset(SendDef.Buf,0,MaxSendBuf);
if( shm_bh_buf_r->data[rptr].type != 0 ){
SendDef.Buf[0] = LPCI_STX;
SendDef.Buf[1] = shm_bh_buf_r->data[rptr].len + 6;
SendDef.Buf[2] = shm_bh_buf_r->data[rptr].len + 6;
SendDef.Buf[3] = LPCI_STX;
SendDef.Buf[4] = 0x08;
SendDef.Buf[5] = pIEC->IODef.OCCNO;
SendDef.Buf[6] = 196;
SendDef.Buf[7] = 0x81;
SendDef.Buf[8] = 0x01;
SendDef.Buf[9] = shm_bh_buf_r->data[rptr].addr;
memcpy(&SendDef.Buf[10],shm_bh_buf_r->data[rptr].buf,shm_bh_buf_r->data[rptr].len);
SendDef.Buf[11+shm_bh_buf_r->data[rptr].len] = LPCI_ETX;
len = shm_bh_buf_r->data[rptr].len + 12;
}
else{
memcpy(SendDef.Buf,shm_bh_buf_r->data[rptr].buf,shm_bh_buf_r->data[rptr].len);
len = shm_bh_buf_r->data[rptr].len;
}
rptr = (rptr + 1) % (BH_BUF_NUM * 4);
if( rptr != shm_bh_buf_r->wptr ) pIEC->ACD = LPCI_ACD;
else pIEC->ACD = NO;
MakeMailPrep(len);
shm_bh_buf_r->rptr = rptr;
}
else{
M_NV_NA_3();
}
}
dbmIEC()
{
unsigned char code;
if( RcvDef.Buf[0] == LPCI_SYN ) code = RcvDef.Buf[1];
else code = RcvDef.Buf[4];
if( (code & 0x0f) == C_SYN_NK ) return;
if( pIEC->CU_Reset == 1 ){
pIEC->CU_Reset = 0 ;
pIEC->DFC = (code & LPCI_FCB);
}
else{
if( (code & LPCI_FCV) != 0 ){
if( pIEC->DFC == (code & LPCI_FCB) ){
TxDriver(SendDef.Buf,SendDef.SendSize);
return;
}
pIEC->DFC ^= LPCI_FCB;
}
}
if( shm_bh_buf_r == (SHM_BH_DEF *)-1 ) return;
if( shm_bh_buf_r->oflag == 1 ||
shm_bh_buf_r->rptr != shm_bh_buf_r->wptr ) {
if( shm_bh_buf_r->oflag == 1 ){
shm_bh_buf_r->rptr = shm_bh_buf_r->wptr;
shm_bh_buf_r->oflag = 0;
pIEC->ACD = NO;
}
else
pIEC->ACD = LPCI_ACD;
}
if( pIEC->Display == 1 )
printf("YS read: rptr=%d---wptr=%d---\n",shm_bh_buf_r->rptr,shm_bh_buf_r->wptr);
switch(code&0x0f)
{
case C_RCU_NA:
case C_RFB_NA:
pIEC->CU_Reset = 1;
M_CON_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
break;
case C_SND_AK:
M_CON_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
break;
case C_RLK_NA:
M_LKR_OK_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
break;
case C_PL1_NA:
M_PL1_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
break;
case C_PL2_NA:
M_NV_NA_3();
TxDriver(SendDef.Buf,SendDef.SendSize);
break;
default:
break;
}
}
WriteBhShmProc(instno)
unsigned char instno;
{
int rptr,wptr,length;
if( RcvDef.Buf[0] == LPCI_SYN ) return;
if( RcvDef.Buf[0] == LPCI_STX && (RcvDef.Buf[6] == 0x05 || RcvDef.Buf[6] == C_SYN_TA) ) return;
if( shm_bh_buf_w[instno] == (SHM_BH_DEF1 *)-1 ) return;
if( pIEC->Display == 1 )
printf("YS write: instno=%d---rptr=%d---wptr=%d---oflag=%d---\n",instno,shm_bh_buf_w[instno]->rptr,
shm_bh_buf_w[instno]->wptr,shm_bh_buf_w[instno]->oflag);
if(RcvDef.Buf[6] == 196)
length = RcvDef.Buf[1] - 6;
else
length = RcvDef.Buf[1] + 6;
if( length <= 0 ) return;
wptr = shm_bh_buf_w[instno]->wptr;
shm_bh_buf_w[instno]->data[wptr].len = length;
shm_bh_buf_w[instno]->data[wptr].addr = RcvDef.Buf[9];
RcvDef.Buf[4] = (RcvDef.Buf[4] & 0x4f);
RcvDef.Buf[5] = RcvDef.Buf[9];
if(RcvDef.Buf[6] == 196)
memcpy(shm_bh_buf_w[instno]->data[wptr].buf,&RcvDef.Buf[10],length);
else
memcpy(shm_bh_buf_w[instno]->data[wptr].buf,RcvDef.Buf,length);
shm_bh_buf_w[instno]->wptr = ( wptr + 1 ) % BH_BUF_NUM;
if( shm_bh_buf_w[instno]->wptr == shm_bh_buf_w[instno]->rptr ) shm_bh_buf_w[instno]->oflag = 1;
sleep(1);
}
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);
}
rLoadDataBase()
{
int i,j,fd,FileLen,ionumber;
char io_file[100];
FILE *fp;
pIEC=(IECDEF *)get_FB_address(IEC_TAGNAME);
if(pIEC == (IECDEF *)(-1)){
printf("IECDEF tagname: %s Does Not Exist!\n",IEC_TAGNAME);
exit(0);
}
sprintf(io_file,"%s/%s/%s/%s.%s",PROJECT_PREFIX,strategy,
DBDIR,strategy,IO_SUFFIX);
if ((fp=fopen(io_file,"r"))==NULL) {
printf("IO_File : %s Does Not Exist!\n",io_file);
exit(0);
}
fseek(fp,0,SEEK_END);
FileLen = ftell(fp);
rewind(fp);
fread(&ionumber,sizeof(int),1,fp);
fclose(fp);
if ((fd=open(io_file,O_RDONLY))<=0) {
printf("IO_File : %s Does Not Exist!\n",io_file);
exit(0);
}
pIODEF=(IODEF*)malloc(FileLen+4);
read(fd,(char*)&IONumber,sizeof(int));
read(fd,(char*)pIODEF,FileLen);
close(fd);
pStr=(char*)((char*)pIODEF+sizeof(IODEF)*IONumber);
BhCount=0;
for (i=0;i<IONumber;i++) {
if((pIODEF+i)->POINTTYPE == fIEC || (pIODEF+i)->POINTTYPE == fWXB)
BhCount++;
}
if (BhCount==0) {
printf("IECDEF Function (fIEC fWXB) Not in DB\n");
exit(0);
}
if (BhCount>MaxBHNum) {
printf("IECDEF Function (fIEC fWXB) Exceed MaxBHNum\n");
exit(0);
}
pBH_Index = (int *)malloc(MaxBHNum*sizeof(int));
memset(pBH_Index,-1,MaxBHNum*sizeof(int));
for (i=0;i<IONumber;i++) {
if((pIODEF+i)->ICNNO == 1){
switch((pIODEF+i)->POINTTYPE)
{
case fIEC:
case fWXB:
if((pIODEF+i)->INSTNO<MaxBHNum && (pIODEF+i)->OCCNO<MaxBHNum)
pBH_Index[(pIODEF+i)->OCCNO] = (pIODEF+i)->INSTNO;
break;
default:
break;
}
}
}
free(pIODEF);
}
BH_CREATE_SHM_BUF()
{
int i,j,instno;
SHM_BH_DEF *pshm1;
SHM_BH_DEF1 *pshm2;
i = sizeof(SHM_BH_DEF);
pshm1 = (SHM_BH_DEF *)rGetSharedMemory(0x700000 , i);
if( pshm1 == (SHM_BH_DEF *)-1 ) {
printf("CREATE sharedmemory(YS_BH) failed\n");
return;
}
shm_bh_buf_r = (SHM_BH_DEF *)pshm1;
memset(pshm1,0,i);
i = sizeof(SHM_BH_DEF1);
for(j=0;j<MaxBHNum;j++){
if(pBH_Index[j] == -1 ) continue;
instno = pBH_Index[j];
pshm2 = (SHM_BH_DEF1 *)rGetSharedMemory(0x600001+instno , i);
if( pshm2 == (SHM_BH_DEF1 *)-1 ) {
printf("CREATE sharedmemory(YS_BH_%d) failed\n",instno);
return;
}
shm_bh_buf_w[instno]=(SHM_BH_DEF1 *)pshm2;
memset(pshm2,0,i);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -