发表于:2004-02-16 09:49:00
楼主
plc与外部设备通讯,来获取数据,作为控制的动力,ADAM模块4019(即下面所说的4000)
他能作为外部设备,采集环境情况,转化为数据,和plc用485协议通讯,告诉它环境情况
现在遇到的问题是怎样从plc中识别读取ADAM模块4019传进来的数据
下面是工控网的回帖,有更好的方法吗?
如果没有,能不能近一部对下面的进行一下指点。
谢谢:)
~~~非常感谢发件人~~~~~~~
-----邮件原件-----
*省略掉一部分*
可以用协议转换的方式来减少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];
}
*省略掉一部分*
}
DisableWDT();
RestoreCom4();
RestoreCom2();