📄 yslib.c
字号:
/***************************************************************
*
* File Name : ieclib.c
*
* First Date : May 30, 2001.
*
* Programmer : NARI BSJ-2200
*
* Makefile : make.sco
*
***************************************************************/
#include "iec103.h"
#include "device.h"
int fd;
extern unsigned port,RcvTimeOut;
extern IECDEF *pIECDEF[MaxIECNum],*pIEC;
extern SENDDEF SendDef;
extern RCVDEF RcvDef;
extern char hostname[],diag_tag[];
extern SysDef *pSysDef;
void IEC10dsp();
void IEC68dsp();
void alarm_handler()
{
fprintf(stderr,"s: Send Alarm TimeOut\n");
}
void ralarm_handler()
{
RcvTimeOut=1;
fprintf(stderr,"Rcv Alarm TimeOut\n");
}
void exit_exe()
{
msg_delete();
TerminateSharedMemory();
exit(0);
}
void open_device()
{
fd = open(port_def[port].file, O_RDWR);
if (fd < 0) {
printf("open device fail\n");
exit(-1);
}
}
void init_device()
{
struct termio TermBuf;
extern int errno;
extern char *sys_errlist[];
if (ioctl(fd,TCGETA,&TermBuf) < 0) {
close(fd);
fprintf(stderr," get ioctl fail\ncode = %d...%s\n",
errno,sys_errlist[errno]);
exit(-1);
}
TermBuf.c_iflag &= ~IFLAG;
TermBuf.c_oflag &= ~OFLAG;
TermBuf.c_cflag = CFLAG;
TermBuf.c_lflag &= ~LFLAG;
TermBuf.c_cc[4] = 0;
TermBuf.c_cc[5] = 2;
if (ioctl(fd,TCSETAF,&TermBuf) < 0) {
close(fd);
fprintf(stderr," set ioctl fail\ncode = %d...%s\n",
errno,sys_errlist[errno]);
exit(-1);
}
}
HEX_BCD(x)
unsigned x;
{
if (x<=8) return (x+16);
if ((x>=9)&&(x<=16)) return (x+24);
}
unsigned char sum(data,length)
unsigned char data[];
unsigned short length;
{
unsigned short i;
unsigned char result;
result=0;
for (i=0;i<length;i++)
result += data[i];
return (result);
}
rFoundPointer(pData,pStr)
long *pData;
char *pStr;
{
int i,offset;
offset=0;
for (i=0;i<*pData-1;i++)
while (*(pStr+offset++) != '\0');
*pData=(long)(pStr+offset);
}
TxDriver(ptr,len)
unsigned char *ptr;
unsigned short len;
{
int Length;
unsigned short i,k,addr;
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,addr;
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 (pIECDEF[addr]->DispMsg == 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");
}
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) ){
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");
}
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++;
}
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;
SendStatusToPeer(NODE_ON,pIEC->IODef.OCCNO);
sprintf(str,"%s通讯中断",
((char *)pSysDef+(int)pIEC->FB.pDescript));
AlarmProc(str,diag_tag);
}
return rtn;
}
else return -1;
}
void IEC10dsp(dir,code)
unsigned char dir,code;
{
char str[80];
if (dir=='s')
switch (code & 0x0f)
{
case M_CON_NA : strcpy(str,"M_CON_NA"); break; /* 0 */
case M_BSY_NA : strcpy(str,"M_BSY_NA"); break; /* 1 */
case M_NV_NA : strcpy(str,"M_NV__NA"); break; /* 9 */
case M_LKR_OK : strcpy(str,"M_LKR_OK"); break; /* 11 */
case M_LKR_HT : strcpy(str,"M_LKR_HT"); break; /* 14 */
case M_LKR_FT : strcpy(str,"M_LKR_FT"); break; /* 15 */
default : strcpy(str,"????????"); break;
}
else if (dir=='r')
switch (code & 0x0f)
{
case C_RCU_NA : strcpy(str,"C_RCU_NA"); break; /* 0 */
case C_SND_AK : strcpy(str,"C_SND_AK"); break; /* 3 */
case C_RFB_NA : strcpy(str,"C_RFB_NA"); break; /* 7 */
case C_RLK_NA : strcpy(str,"C_RLK_NA"); break; /* 9 */
case C_PL1_NA : strcpy(str,"C_PL1_NA"); break; /* 10 */
case C_PL2_NA : strcpy(str,"C_PL2_NA"); break; /* 11 */
default : strcpy(str,"????????"); break;
}
else strcpy(str,"????????");
printf("%c%2x: %s -- ",dir,HEX_BCD(port),str);
}
void IEC68dsp(dir,code)
unsigned char dir,code;
{
char str[80];
switch (code)
{
case M_TTM_TA : strcpy(str,"M_TTM_TA"); break; /* 1 */
case M_TMR_TA : strcpy(str,"M_TMR_TA"); break; /* 2 */
case M_MEI_NA : strcpy(str,"M_TEI_NA"); break; /* 3 */
case M_TME_TA : strcpy(str,"M_TME_TA"); break; /* 4 */
case M_IDI_NA : if (RcvDef.Buf[11]==2)
strcpy(str,"M_IRF_NA");
else if (RcvDef.Buf[11]==3)
strcpy(str,"M_IRC_NA");
else if (RcvDef.Buf[11]==4)
strcpy(str,"M_IRS_NA");
else if (RcvDef.Buf[11]==5)
strcpy(str,"M_PO__NA");
else
strcpy(str,"========"); break; /* 5 */
case C_SYN_TA : if (dir=='r')
strcpy(str,"C_SYN_TA");
else
strcpy(str,"M_SYN_TA"); break; /* 6 */
case C_IGI_NA : strcpy(str,"C_IGI_NA"); break; /* 7 */
case M_TGI_NA : strcpy(str,"M_TGI_NA"); break; /* 8 */
case M_ME2_NA : strcpy(str,"M_ME2_NA"); break; /* 9 */
case C_GD_NA : if (dir=='r')
strcpy(str,"C_GD__NA");
else
strcpy(str,"M_GD_NTA"); break; /* 10 */
case M_GI_NTA : strcpy(str,"M_GI_NTA"); break; /* 11 */
case C_GRC_TA : strcpy(str,"C_GRC_TA"); break; /* 20 */
case C_GC_NA : strcpy(str,"C_GC__NA"); break; /* 21 */
case M_LRD_TA : strcpy(str,"M_LRD_TA"); break; /* 23 */
case C_ODT_TA : strcpy(str,"C_ODT_NA"); break; /* 24 */
case C_ADT_NA : strcpy(str,"C_ADT_NA"); break; /* 25 */
case M_RTD_TA : strcpy(str,"M_RTD_TA"); break; /* 26 */
case M_RTC_TA : strcpy(str,"M_RTC_TA"); break; /* 27 */
case M_RTT_TA : strcpy(str,"M_RTT_TA"); break; /* 28 */
case M_TOT_TA : strcpy(str,"M_TOT_TA"); break; /* 29 */
case M_TOV_TA : strcpy(str,"M_TOV_TA"); break; /* 30 */
case M_EOT_TA : strcpy(str,"M_EOT_TA"); break; /* 31 */
default : strcpy(str,"????????"); break;
}
printf("%c%2x: %s -- ",dir,HEX_BCD(port),str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -