📄 ysrecv.c
字号:
}
}
C_RFB_NA_3() /* Reset Frame Count Bit */
{
pIEC->FCB = 0;
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_SYN;
SendDef.Buf[1] = 0x40 |C_RFB_NA;
SendDef.Buf[2] = pIEC->IODef.OCCNO;
SendDef.Buf[3] = sum( &(SendDef.Buf[1]),2 );
SendDef.Buf[4] = LPCI_ETX;
SendDef.SendSize = 5;
}
C_RCU_NA_3() /* Reset Commu Unit */
{
pIEC->FCB = 0;
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_SYN;
SendDef.Buf[1] = 0x40 | C_RCU_NA;
SendDef.Buf[2] = pIEC->IODef.OCCNO;
SendDef.Buf[3] = sum( &(SendDef.Buf[1]),2 );
SendDef.Buf[4] = LPCI_ETX;
SendDef.SendSize = 5;
}
C_RLK_NA_3() /* Request Link Status */
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_SYN;
SendDef.Buf[1] = 0x40 | C_RLK_NA;
SendDef.Buf[2] = pIEC->IODef.OCCNO;
SendDef.Buf[3] = sum( &(SendDef.Buf[1]),2 );
SendDef.Buf[4] = LPCI_ETX;
SendDef.SendSize = 5;
}
C_PL1_NA_3() /* Request P1 Data */
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_SYN;
SendDef.Buf[1] = 0x40 | pIEC->FCB | pIEC->FCV | C_PL1_NA;
SendDef.Buf[2] = pIEC->IODef.OCCNO;
SendDef.Buf[3] = sum( &(SendDef.Buf[1]),2 );
SendDef.Buf[4] = LPCI_ETX;
SendDef.SendSize = 5;
}
C_PL2_NA_3() /* Request P2 Data */
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_SYN;
SendDef.Buf[1] = 0x40 | pIEC->FCB | pIEC->FCV | C_PL2_NA;
SendDef.Buf[2] = pIEC->IODef.OCCNO;
SendDef.Buf[3] = sum( &(SendDef.Buf[1]),2 );
SendDef.Buf[4] = LPCI_ETX;
SendDef.SendSize = 5;
}
C_IGI_NA_3(addr) /* General Interrogation */
unsigned char addr;
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_STX;
SendDef.Buf[1] = 9;
SendDef.Buf[2] = 9;
SendDef.Buf[3] = LPCI_STX;
SendDef.Buf[4] = 0x40 | pIEC->FCB | pIEC->FCV | C_SND_AK;
SendDef.Buf[5] = pIEC->IODef.OCCNO;
SendDef.Buf[6] = C_IGI_NA;
SendDef.Buf[7] = 0x81;
SendDef.Buf[8] = COT_IGI;
SendDef.Buf[9] = pIECDEF[addr]->IODef.OCCNO;
SendDef.Buf[10] = FUN_GLB;
SendDef.Buf[11] = 0x00;
SendDef.Buf[12] = pIECDEF[addr]->SCN++;
SendDef.Buf[13] = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
SendDef.Buf[14] = LPCI_ETX;
SendDef.SendSize = 15;
}
C_SYN_TA_3() /* Clock Synchronization */
{
struct timeb CurrentTime;
struct tm *pTime;
int ms;
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_STX;
SendDef.Buf[1] = 15;
SendDef.Buf[2] = 15;
SendDef.Buf[3] = LPCI_STX;
SendDef.Buf[4] = 0x40 | pIEC->FCB | pIEC->FCV | C_SYN_NK;
SendDef.Buf[5] = 0xff;
SendDef.Buf[6] = C_SYN_TA;
SendDef.Buf[7] = 0x81;
SendDef.Buf[8] = COT_SYN;
SendDef.Buf[9] = 0xff;
SendDef.Buf[10] = FUN_GLB;
SendDef.Buf[11] = 0x00;
ftime(&CurrentTime);
pTime=localtime(&CurrentTime.time);
ms=pTime->tm_sec*60+CurrentTime.millitm;
SendDef.Buf[12] = ms & 0xff;
SendDef.Buf[13] = ms >> 8;
SendDef.Buf[14] = pTime->tm_min;
SendDef.Buf[15] = pTime->tm_hour;
SendDef.Buf[16] = (pTime->tm_wday<<5) | pTime->tm_mday;
SendDef.Buf[17] = pTime->tm_mon+1;
SendDef.Buf[18] = pTime->tm_year % 100;
SendDef.Buf[19] = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
SendDef.Buf[20] = LPCI_ETX;
SendDef.SendSize = 21;
}
C_GC_NA_B1(addr) /* General */
unsigned char addr;
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_STX;
SendDef.Buf[1] = 10;
SendDef.Buf[2] = 10;
SendDef.Buf[3] = LPCI_STX;
SendDef.Buf[4] = 0x40 | pIEC->FCB | pIEC->FCV | C_SND_AK;
SendDef.Buf[5] = pIEC->IODef.OCCNO;
SendDef.Buf[6] = C_GC_NA;
SendDef.Buf[7] = 0x81;
SendDef.Buf[8] = COT_GRD;
SendDef.Buf[9] = pIECDEF[addr]->IODef.OCCNO;
SendDef.Buf[10] = FUN_GEN;
SendDef.Buf[11] = 240;
SendDef.Buf[12] = 0;
SendDef.Buf[13] = 0;
SendDef.Buf[14] = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
SendDef.Buf[15] = LPCI_ETX;
SendDef.SendSize = 16;
}
C_GC_NA_B3(addr,grp) /* General */
unsigned char addr;
int grp;
{
memset(SendDef.Buf,0,MaxSendBuf);
SendDef.Buf[0] = LPCI_STX;
SendDef.Buf[1] = 13;
SendDef.Buf[2] = 13;
SendDef.Buf[3] = LPCI_STX;
SendDef.Buf[4] = 0x40 | pIEC->FCB | pIEC->FCV | C_SND_AK;
SendDef.Buf[5] = pIEC->IODef.OCCNO;
SendDef.Buf[6] = C_GC_NA;
SendDef.Buf[7] = 0x81;
SendDef.Buf[8] = COT_GRD;
SendDef.Buf[9] = pIECDEF[addr]->IODef.OCCNO;
SendDef.Buf[10] = FUN_GEN;
SendDef.Buf[11] = 241;
SendDef.Buf[12] = 0;
if( pIECDEF[addr]->IODef.CONNECTTYPE == mMCD ) SendDef.Buf[12] = 0x3e;
SendDef.Buf[13] = 1;
SendDef.Buf[14] = grp;
SendDef.Buf[15] = 0x00;
SendDef.Buf[16] = 1;
SendDef.Buf[17] = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
SendDef.Buf[18] = LPCI_ETX;
SendDef.SendSize = 19;
}
TxDriver(ptr,len)
unsigned char *ptr;
unsigned short len;
{
int Length;
unsigned short i,k;
signal(SIGALRM,alarm_handler);
alarm(4);
Length=write(fd,ptr,len);
alarm(0);
signal(SIGALRM,SIG_DFL);
if (Length!=len) {
fprintf(stderr,"s%2x: TxDriver TimeOut\n",HEX_BCD(port));
ioctl(fd,TCFLSH,1);
return -1;
}
if (Length<0) {
fprintf(stderr,"s%2x: TxDriver error\n",HEX_BCD(port));
init_device();
return -1;
}
else {
if (pIEC->Display != 0) {
if (ptr[0]==LPCI_STX)
IEC68dsp('s',ptr[6]);
else IEC10dsp('s',ptr[1]);
for (i=0;i<len;i++) {
printf("%2x ",ptr[i]);
if ((((i+1) % MaxListDsp)==0) && (i!=len-1))
printf("\n ");
}
printf("\n");
}
return Length;
}
}
int RxDriver()
{
unsigned char k,temp,ReadNum,CntTmp,ReadNullCount;
unsigned char crcl,crch;
int i,count,RxC;
RxC=0;
ReadNullCount=0;
while (1)
{
ReadNum=0;
ReadNum=read(fd,&temp,1);
if (ReadNum==1) {
RcvDef.Buf[RxC]=temp;
RxC++;
ReadNullCount=0;
}
else if (ReadNum==0) {
if (RxC) {
ReadNullCount++;
if (ReadNullCount>3) {
printf("r: Breakat RxC=%d\n",RxC);
for (i=0;i<RxC;i++) {
printf("%2x ",RcvDef.Buf[i]);
if ((((i+1) % MaxListDsp)==0) && (i!=RxC))
printf("\n ");
}
printf("\n");
ioctl(fd,TCFLSH,0);
return -2;
}
}
else {
RxC=0;
return -1;
}
}
else {
printf("Error Read File\n");
init_device();
return -3;
}
if (RxC==1) {
if ((RcvDef.Buf[0]==LPCI_STX) || (RcvDef.Buf[0]==LPCI_SYN)) continue;
else {
RxC=0;
if (pIEC->Display == 1)
printf("r%2x: Err STX %2x\n",HEX_BCD(port),RcvDef.Buf[0]);
}
}
else if (RxC==5) {
if ((RcvDef.Buf[0]==LPCI_STX)&&(RcvDef.Buf[0]==RcvDef.Buf[3])&&(RcvDef.Buf[1]==RcvDef.Buf[2])) continue;
else if ((RcvDef.Buf[0]==LPCI_SYN) && (RcvDef.Buf[2]==pIEC->IODef.OCCNO) &&
(RcvDef.Buf[4]==LPCI_ETX) && (RcvDef.Buf[3]==sum(&RcvDef.Buf[1],2))) {
if (pIEC->Display == 1) {
IEC10dsp('r',RcvDef.Buf[1]);
for (i=0;i<RxC;i++) printf("%2x ",RcvDef.Buf[i]);
printf("\n");
}
if (RcvDef.Buf[1] & LPCI_ACD) pIEC->ACD=YES;
else pIEC->ACD=NO;
return RxC;
}
else {
printf("r%2x: sync Error-- ",HEX_BCD(port));
for (i=0;i<RxC;i++) printf("%2x ",RcvDef.Buf[i]);
printf("\n");
RxC=0;
}
}
else if( (RxC>14) && (RxC>=RcvDef.Buf[1]+6) ){
printf("check sum = %2x\n",sum(&RcvDef.Buf[4],RcvDef.Buf[1]));
if ( (RcvDef.Buf[RxC-1]==LPCI_ETX) && (RcvDef.Buf[RxC-2]==sum(&RcvDef.Buf[4],RcvDef.Buf[1])) ) {
if (pIEC->Display == 1) {
IEC68dsp('r',RcvDef.Buf[6]);
for (i=0;i<RxC;i++) {
printf("%2x ",RcvDef.Buf[i]);
if ((((i+1) % MaxListDsp)==0) && (i!=RxC))
printf("\n ");
}
printf("\n");
}
if (RcvDef.Buf[4] & LPCI_ACD) pIEC->ACD=YES;
else pIEC->ACD=NO;
return RxC;
}
}
}
}
drv_recv(delay)
int delay;
{
int i,rtn;
RcvTimeOut=0;
signal(SIGALRM,ralarm_handler);
alarm(delay*2);
for (i=0;i<delay*5;i++) {
rtn=RxDriver();
if (rtn>=0) break;
}
alarm(0);
signal(SIGALRM,SIG_DFL);
if ( (RcvTimeOut==0) && (rtn>=0) ) return rtn;
else {
if (pIEC->Display == 1)
printf("r%2x: RxDriver Timeout=%d rtn=%d\n",
HEX_BCD(port),RcvTimeOut,rtn);
return -1;
}
}
RxDrvCheckProc()
{
int rtn,i;
char str[128];
while ( (rtn=drv_recv(5)) < 0 ) {
if (SendDef.RepCount<MaxRetry) {
if (pIEC->Status == NODE_OFF) {
SendDef.RepCount=0;
break;
}
else {
SendDef.RepCount++;
TxDriver(SendDef.Buf,SendDef.SendSize);
}
}
else {
if (pIEC->Status == NODE_ON) {
pIEC->Status = NODE_OFF;
SendStatusToPeer(NODE_OFF,pIEC->IODef.OCCNO);
sprintf(str,"%s通讯中断",
((char *)pSysDef+(int)pIEC->FB.pDescript));
AlarmProc(str,diag_tag);
}
SendDef.RepCount=0;
break;
}
}
if ( rtn > 0 ) {
SendDef.RepCount=0;
if (pIEC->Status == NODE_OFF) {
pIEC->Status = NODE_ON;
pIEC->ClkSet = 1;
SendStatusToPeer(NODE_ON,pIEC->IODef.OCCNO);
sprintf(str,"%s通讯恢复",
((char *)pSysDef+(int)pIEC->FB.pDescript));
AlarmProc(str,diag_tag);
}
pIEC->FCB ^= LPCI_FCB;
return rtn;
}
else return -1;
}
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);
}
AddrIEC = pIEC->IODef.INSTNO;
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);
IECCount=0;
for (i=0;i<IONumber;i++) {
if((pIODEF+i)->POINTTYPE == fIEC)
IECCount++;
}
if (IECCount==0) {
printf("IECDEF Function (fIEC103) Not in DB\n");
exit(0);
}
if (IECCount>MaxIECNum) {
printf("IECDEF Function (fIEC) Exceed MaxIECNum\n");
exit(0);
}
for (i=0; i<MaxIECNum; i++) pIECDEF[i]=(IECDEF *)0;
j=0;
for (i=0;i<IONumber;i++) {
if ( (pIODEF+i)->POINTTYPE == fIEC && (pIODEF+i)->ICNNO == 1 ){
rFoundPointer((long*)&pIODEF[i].TAGNAME,pStr);
pIODEF[i].DBADDRESS=(char*)get_FB_address(pIODEF[i].TAGNAME);
if (pIODEF[i].DBADDRESS==(char*)(-1)) {
printf("IECDEF Tagname: %s Not in DB\n",pIODEF[i].TAGNAME);
exit(0);
}
else {
if ((pIODEF+i)->OCCNO>MaxIECNum){
fprintf(stderr,"IECDEF:OCCNO >MaxNum(254)\n");
exit(0);
}
else{
printf("pIODEF[i].OCCNO==%d\n",pIODEF[i].OCCNO);
if((pIODEF+i)->CONNECTTYPE != mRCS9692)
pIECDEF[pIODEF[i].OCCNO]=(IECDEF *)pIODEF[i].DBADDRESS;
j++;
}
}
}
}
free(pIODEF);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -