发表于:2003-12-30 16:05:00
5楼
可以用协议转换的方式来减少PLC的开发。用协议转换器将7000或4000或其他智能IO设备转换为三菱的格式,直接将数据发到PLC的D寄存器。
以下是用7188协议转换的源码:(有关7188 可以到网上找到很多资料)
#include"..\..\lib\i7188.h"
void main(void)
{ unsigned char i7018Req[4]={0x23,0x30,0x31,0x0d};
unsigned char i7018Res[33];
unsigned char cSendOut[339]; //15 +1 +1 + 4 X iCh +2
unsigned char cSendRpt[47];
int iTemp,iErrorNo,iPt;
int iMd=10,iCh=80,iChk=0; //iMd<16
cSendOut[0]=0x05;
cSendOut[1]=0x30;
cSendOut[2]=0x30;
cSendOut[3]=0x46;
cSendOut[4]=0x46;
cSendOut[5]=0x57;
cSendOut[6]=0x57;
cSendOut[7]=0x30;
cSendOut[8]=0x44;
cSendOut[9]=0x30;
cSendOut[10]=0x33;
cSendOut[11]=0x38;
cSendOut[12]=0x34;
cSendOut[13]=0x31; //iMd 1
cSendOut[14]=0x30; //iMd 0
cSendOut[15]=0x38; //iCh 8
cSendOut[16]=0x30; //iCh 0
cSendRpt[0]=0x44;
cSendRpt[1]=0x30;
cSendRpt[2]=0x35;
cSendRpt[3]=0x30;
cSendRpt[4]=0x30;
cSendRpt[5]=0x31; //iMd 1
cSendRpt[6]=0x30; //iMd 0
InstallCom2(9600L,8,0,1);
InstallCom4(115200L,8,0);
EnableWDT();
for(;;){
RefreshWDT();
for(iTemp=1;iTemp<=iMd;iTemp++){ //1~10 Module Quest and respone start
if(iTemp<10){
i7018Req[1]=0x30+iTemp/10;
i7018Req[2]=0x30+iTemp%10;
}
else{
i7018Req[1]=0x30;
i7018Req[2]=0x41+iTemp%10;
}
SendCmdTo7000(2,i7018Req,0);
RefreshWDT();
iErrorNo=ReceiveResponseFrom7000(2,i7018Res,1000,0);
cSendRpt[7+(iTemp-1)*4]=0x30;
cSendRpt[8+(iTemp-1)*4]=0x30;
cSendRpt[9+(iTemp-1)*4]=0x30;
cSendRpt[10+(iTemp-1)*4]=0x30;
if(iErrorNo!=0){
for(iPt=0;iPt<33;iPt++){
i7018Res[iPt]=0x66;
cSendRpt[7+(iTemp-1)*4]=0x66;
cSendRpt[8+(iTemp-1)*4]=0x66;
cSendRpt[9+(iTemp-1)*4]=0x66;
cSendRpt[10+(iTemp-1)*4]=0x66;
}
}
for(iPt=0;iPt<=32;iPt++){
cSendOut[17+iPt+(iTemp-1)*32]=i7018Res[iPt+1];
}
} //1~10 Module Quest and respone end
for(iPt=1;iPt<=336;iPt++){
iChk=iChk+cSendOut[iPt];
}
cSendOut[337]=*(&iChk);
cSendOut[338]=(iChk>>8);
LedOn();
ToCom4Bufn(cSendOut,339);
WaitTransmitOver4();
DelayMs(50);
ToCom4Bufn(cSendRpt,47);
WaitTransmitOver4();
LedOff();
}
DisableWDT();
RestoreCom4();
RestoreCom2();
}