📄 com_232.c
字号:
GL_Fill_Forms( pGDRun, pRunSet );
break;
case 4:
if((b3 == 0xA5) || (b3 == 0x5A))
{
if(b3 == 0xA5)
{
//退出测试模式
}
else
{
//进入测试模式
}
tCmd.byStatus=RES_RMT_OK;
Send25(tCmd.byStatus);
}
else
{
//命令无效
tCmd.byStatus=RES_RMT_CODERR;
Send25(tCmd.byStatus);
}
break;
default:
tCmd.byStatus=RES_RMT_CMDERR;
Send25(tCmd.byStatus);
}
}
//预发开出传动命令
void ReplyCmd9A(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt,*cpAck;
if( !Is_Local( _g_dDiValue ) )
{
Send15();
return;
}
pt =sBuf+3;
if(*pt++ != 3)
{
Send15();
return;
}
//记录开出传动命令参数
//返回27报文供主站校验
cpAck=caTmpBuf;
*cpAck++=*pt++;
*cpAck++=*pt++;
*cpAck++=*pt++;
cpAck =caAckBuf;
pt =caTmpBuf;
*cpAck++=8;
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x27;
*cpAck++=3;
*cpAck++=*pt++;
*cpAck++=(BYTE)(~(*pt++));
*cpAck++=(BYTE)(~(*pt++));
MakeCs(caAckBuf);
SciPutn(caAckBuf);
//设置通讯命令状态
tCmd.wDelay=0;
tCmd.byCmd=0x9a;
tCmd.byStatus=RES_DO_READY;
}
//9B:开出传动命令
void ReplyCmd9B(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt,b1,b2,b3;
if( !Is_Local( _g_dDiValue ) )
{
Send15();
return;
}
pt=sBuf+3;
if(*pt++ != 3) //校验命令长度,N=3
{
Send15();
return;
}
//校验命令序列
if((tCmd.byCmd != 0x9a) || (tCmd.byStatus != RES_DO_READY))
{
tCmd.byCmd=0x9b;
tCmd.byStatus=RES_DO_CHKFAIL;
Send25(tCmd.byStatus);
return;
}
tCmd.byCmd=0x9b;
//校验命令参数
b1=*pt++; //类型
b2=*pt++; //对象号
b3=*pt++; //操作代码
pt=caTmpBuf;
if((*pt++ != b1) || (*pt++ != (BYTE)~b2) || (*pt != (BYTE)~b3))
{
tCmd.byStatus=RES_DO_CHKFAIL;
Send25(tCmd.byStatus);
return;
}
else if(b1 != 0x5a)
{
tCmd.byStatus=RES_DO_CMDERR;
Send25(tCmd.byStatus);
return;
}
if((b2 == 0xff) || (b2 == DO_FG))
{
extern volatile DWORD dTCounter;
DWORD TempT;
b2 =DO_FG;
_RstAllDo();
Digital_Out((WORD)b2|DO_PASSWORD);
MM_Do_Indicator((BYTE)b2);
TempT=dTCounter;
while((dTCounter-TempT) < 25); //延时25ms
_RstAllDo();
tCmd.byStatus=RES_DO_OK;
Send25(tCmd.byStatus);
return;
}
else if(b2 > (DOTAB_NUM-1) || b2 < 1)
{
tCmd.byStatus=RES_DO_NUMERR;
Send25(tCmd.byStatus);
return;
}
//Do that operation(assert or reset)
switch(b3)
{
case 0xa5: //assert
Digital_Out((WORD)b2|DO_PASSWORD);
MM_Do_Indicator((BYTE)b2);
tCmd.byStatus=RES_DO_OK;
Send25(tCmd.byStatus);
break;
case 0xa3: //reset
Digital_Back_Out(b2|DO_PASSWORD);
tCmd.byStatus=RES_DO_OK;
Send25(tCmd.byStatus);
break;
default:
tCmd.byStatus=RES_DO_CODERR;
Send25(tCmd.byStatus);
}
}
//读取有效定值区
void ReplyCmd9C(BYTE *sBuf,WORD wFrameCounter)
{
extern TSECTIONINFO tSecInfo;
BYTE *cpAck,*pt;
int i,k;
cpAck=caAckBuf;
k=0;
pt=(BYTE *)(&tSecInfo.szSections[0]);
for(i=SEC_NUMBER; i > 0; i--,pt++)
{
if((*pt) == 1)
{
k++;
}
}
if((k != tSecInfo.byValidNum) || (k > SEC_NUMBER))
{
k=0;
}
*cpAck++=(BYTE)(k+7);
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x1E;
*cpAck++=(BYTE)(k+2);
*cpAck++=RELAY_TYPE_LO;
*cpAck++=RELAY_TYPE_HI;
pt=(BYTE *)(&tSecInfo.szSections[0]);
for(i=0; i < SEC_NUMBER; i++,pt++)
{
if((*pt) == 1)
{
*cpAck++=(BYTE)i;
k--;
}
}
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
//9E:读内存单元
void ReplyCmd9E(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt;
pt=sBuf+3;
if(*pt != 5)
{
Send15();
}
else
{
pt=sBuf+8;
tMemRdWr.byLen=*pt--;
tMemRdWr.dAddr=((DWORD)(*pt--))*256;
tMemRdWr.dAddr+=(DWORD)(*pt--);
tMemRdWr.dAddr=tMemRdWr.dAddr*256+(*pt--);
tMemRdWr.byType=*pt;
Send2E();
}
}
//9F:写内存单元
void ReplyCmd9F(BYTE *sBuf,WORD wFrameCounter)
{
BYTE c,*pt,*pt1;
pt=sBuf+8;
tMemRdWr.byLen=*pt--;
tMemRdWr.dAddr=((DWORD)(*pt--))*256;
tMemRdWr.dAddr+=(DWORD)(*pt--);
tMemRdWr.dAddr=tMemRdWr.dAddr*256+(*pt--);
tMemRdWr.byType=*pt;
if(tMemRdWr.byLen > 0xf0)
{
Send15();
return;
}
switch(tMemRdWr.byType)
{
case 1: //RAM
pt=(BYTE *)tMemRdWr.dAddr,pt1=sBuf+9;
c=tMemRdWr.byLen;
while(c)
{
*pt=*pt1,c--;
if(*pt++ != *pt1++) break;
}
if(c)
Send25(RES_MEM_WRFAIL);
else
Send25(RES_MEM_OK);
break;
case 3: //Flash RAM
Send25(RES_MEM_WRFAIL); //Memory update failure(No Flash RAM)
break;
case 4: //EPROM
Send25(RES_MEM_WRFAIL); //Memory update failure(EPROM cann't be modified)
break;
default:
Send25(RES_CMD_INVALID); //Invalid command
}
}
//A0:读取有效值和相位角
void ReplyCmdA0(BYTE *sBuf,WORD wFrameCounter)
{
Send30(sBuf);
}
//A1:读取增益系数
void ReplyCmdA1(BYTE *sBuf,WORD wFrameCounter)
{
extern short iaFactors[];
BYTE *pt;
WORD i;
DWORD dw;
pt=sBuf+4;
i=(WORD)(*pt);
//ff=所有通道
if(i == 0xff)
{
pt=caAckBuf,i=AI_NUMBER*2;
*pt++=(BYTE)(i+5);
*pt++=byDst,*pt++=byCpuN;
*pt++=0x31;
*pt++=(BYTE)i;
for(i=0;i<AI_NUMBER;i++)
{
//8=0x4000*0.0005
dw=HexFix(((((DWORD)iaFactors[i])+8)<<16)/0x4000L)>>4;
//x.xyy format
*pt++=(BYTE)dw;
*pt++=(BYTE)(dw>>8);
}
}
//指定的一个通道
else
{
if(i > AI_NUMBER || i < 1)
{
Send25(RES_CHN_INVALID);
return;
}
pt=caAckBuf;
*pt++=7;
*pt++=byDst,*pt++=byCpuN;
*pt++=0x31;
*pt++=2;
//8=0x4000*0.0005
dw=HexFix(((((DWORD)iaFactors[i-1])+8)<<16)/0x4000L)>>4;
//x.xyy format
*pt++=(BYTE)dw;
*pt++=(BYTE)(dw>>8);
}
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
//A2:设置模拟量通道的增益系数
// 允许范围是0.95<f<1.05
void ReplyCmdA2(BYTE *sBuf,WORD wFrameCounter)
{
extern short iaFactors[];
BYTE *pt;
int i;
WORD ch;
DWORD dw;
pt=sBuf+3;
//i=N
i =*pt++;
//N=3,指定通道的增益系数
if(i == 3)
{
//校验通道号
ch=*pt++;
if(ch < 1 || ch > AI_NUMBER)
{
Send25(RES_CHN_INVALID);
return;
}
dw=*pt++;
dw+=((DWORD)*pt)<<8;
i=(short)((FixHex(dw<<4)*0x4000L)>>16);
if(i < iFacMinVal || i > iFacMaxVal)
{
Send25(RES_CHN_FAIL);
return;
}
iaFactors[ch-1]=(short)i;
if( FAC_Write_Factors() )
{
Send25(RES_CHN_OK);
}
else
{
Send25(RES_CHN_FAIL);
}
return;
}
//ff=所有通道 N=通道数*2+1
if(i == AI_NUMBER*2+1)
{
//通道号=ff?
if(*pt++ != 0xff)
{
Send25(RES_CHN_INVALID);
return;
}
for(ch =0; ch < AI_NUMBER; ch++)
{
dw =((DWORD)*pt++) & 0x0ffL;
dw+=(((DWORD)*pt++) << 8) & 0x0ffffL;
i =(short)((FixHex(dw << 4)*0x4000L) >> 16);
if(i < iFacMinVal || i > iFacMaxVal)
{
//增益系数超范围,重新读取增益系数
FAC_Read_Factors();
Send25(RES_CHN_FAIL);
return;
}
else
{
iaFactors[ch]=(short)i;
}
}
if(FAC_Write_Factors())
{
Send25(RES_CHN_OK);
}
else
{
Send25(RES_CHN_FAIL);
}
return;
}
//返回通道号无效
Send25(RES_CHN_INVALID);
}
//应答压板操作确认
void ReplyCmdA3(BYTE *sBuf,WORD wFrameCounter)
{
Send16();
}
//A4:读取内部定值信息,返回34报文
void ReplyCmdA4(BYTE *sBuf,WORD wFrameCounter)
{
int i,k;
int n;
BYTE *cpAck;
//校验报文格式
cpAck=sBuf+3;
if(*cpAck++!=2)
{
Send15();
return;
}
else if(*cpAck++!=0xa4)
{
Send15();
return;
}
//起始序号
k=((int)(*cpAck))*10;
if(k>=CSTSET_NUMBER)
{
k=0;
n=0;
}
else if(k+10 >= CSTSET_NUMBER)
{
n=CSTSET_NUMBER-k;
}
else
{
n=10;
}
cpAck=caAckBuf;
*cpAck++=(BYTE)(n*22+2+5);
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x34;
*cpAck++=(BYTE)(n*22+2);//N
*cpAck++=(BYTE)k; //第一个信息元素序号
*cpAck++=(BYTE)n; //本次发送的信息数目
while(n > 0)
{
//n个信息元素
//每个信息元素的定义为:
// 定值名称(16字节)
// 最小值(3字节)
// 最大值(3字节)
BYTE *pt;
TSETVAL *psv;
pt=(BYTE *)tCstSetTable[k].szName;
for(i=16; i > 0; i--)
{
*cpAck++=*pt++;
}
psv=(TSETVAL *)cpAck;
*psv++=tCstSetTable[k].tMin;
*psv++=tCstSetTable[k].tMax;
cpAck=(BYTE *)psv;
k++;
n--;
}
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
//A5:读取内部定值
void ReplyCmdA5(BYTE *sBuf,WORD wFrameCounter)
{
int i;
BYTE *cpAck,*pt;
//校验报文格式
cpAck=sBuf+3;
if(*cpAck++ != 1)
{
Send15();
return;
}
else if(*cpAck != 0xa5)
{
Send15();
return;
}
SET_Read_Cstset(caCstSetBuf);
pt=caCstSetBuf;
cpAck=caAckBuf;
*cpAck++=(BYTE)(CSTSET_NUMBER*3+7);
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x35;
*cpAck++=(BYTE)(CSTSET_NUMBER*3+2);
*cpAck++=RELAY_TYPE_LO;
*cpAck++=RELAY_TYPE_HI;
for(i=CSTSET_NUMBER*3; i > 0; i--)
{
*cpAck++=*pt++;
}
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
//A6:设置内部定值
void ReplyCmdA6(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt,*cp;
int i;
SET_Read_Cstset(caCstSetBuf);
pt=sBuf+3;
i=*pt;
if(i != CSTSET_NUMBER*3+2)
{
Send15(); //报文格式错误
}
pt =sBuf+6;
cp =caCstSetBuf;
for(i =CSTSET_NUMBER*3; i > 0; i--)
{
*cp++=*pt++;
}
if ( !FM_Write_Cstset( caCstSetBuf ) )
{
Send25(RES_CSTSET_FAIL); //设置内部定值失败
}
else if(SET_Switch_Runset() != TRUE)
{
Send25(RES_CSTSET_FAIL);
}
else
{
Send25(RES_CSTSET_OK);
}
}
//读取扰动数据
void ReplyCmdAE(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 4)
{
Send15();
}
else
{
DWORD parm;
parm=*pt++;
parm+=((DWORD)*pt++<<8);
parm+=((DWORD)*pt++<<16);
parm+=((DWORD)*pt<<24);
CommTask(0xAF,19,parm);
}
}
//读取扰动记录表/扰动记录(录波数据)
void ReplyCmdAF(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 4)
{
Send15();
}
else
{
int task;
DWORD parm;
task=(int)(*pt++); //COMMAND
parm=*pt++; //RPTN(L)
parm+=(((DWORD)*pt++)<<8);//RPTN(H)
parm+=(((DWORD)*pt++)<<16);//FAN/RI
CommTask(0xAF,task,parm);
}
}
//CMD_AA:读取采样值
void ReplyCmdAA(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 3)
{
Send15();
}
else
{
int task;
DWORD parm;
task=(int)(*pt++); //COMMAND
parm=*pt++; //RI/FAN/RPTN(L)
parm+=(((DWORD)*pt)<<8);//RPTN(H)
CommTask(0xAA,task,parm);
}
}
//CMD_AB:采样值传输确认
void ReplyCmdAB(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt=sBuf+3;
if(*pt++ != 1)
{
Send15();
}
else
{
DWORD parm;
parm=*pt;
CommTask(0xAA,19,parm);
}
}
//读取报告中的整定值
void ReplyCmdB0(BYTE *sBuf,WORD wFrameCounter)
{
int i;
WORD wRptN;
FM_REPORT_HEADER *pHead;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -