我做了一个控制PLC的程序,为什么用writeFile(....)输出的值无法控制PLC,
程序的代码如下:
         DCB   dcb;
         hCommDev=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,0,NULL);//打开串口
if(hCommDev==(HANDLE)-1)
{
AfxMessageBox("串口初始化错误!",MB_OK,NULL);
return ;
}
dcb.DCBlength=sizeof(DCB);
GetCommState(hCommDev,&dcb);
dcb.BaudRate=19200;
dcb.ByteSize=8;//数据位8位
dcb.fParity=0;//无检验
dcb.StopBits=0;//停止位1位
         
        int DoData[30];
        DoData[0]=0x05;
        DoData[1]=0x30;
        DoData[2]=0x30;
        DoData[3]=0x46;
        DoData[4]=0x46;
        DoData[5]=0x57;
        DoData[6]=0x57;
        DoData[7]=0x30;
        DoData[8]=0x44;
        DoData[9]=0x30;
        DoData[10]=0x31;
        DoData[11]=0x30;
        DoData[12]=0x30;
        DoData[13]=0x30;
        DoData[14]=0x31;
        DoData[15]=0x30;
        DoData[16]=0x30;
        DoData[17]=0x30;
        DoData[18]=0x46;
        DoData[19]=0x30;
        DoData[20]=0x36;        WriteFile(hCommDev,&DoData[n],21,&nWrite,NULL);
CloseHandle(hCommDev);
经过检验:校验和每错,为什么PLC会没反映呢?

解决方案 »

  1.   

    问题可能出在 int DoData[30];据观察,可能这些数据应是字节型的,改为
    unsigned char DoData[30];&DoData[n]中的n,是不是笔误?
      

  2.   

    &DoData[n]中的n是笔误!
    可能这种方法不大好,能不能用空件做?我用VC加了一个空件到Project里,但是
    不知道应该怎么做?请教!
      

  3.   

    控件都是垃圾,我从不用控件,用控件后操作串扣就更加不透明了,这用控制PLC就很容易出错,WriteFile(hCommDev,&DoData[n],21,&nWrite,NULL);注意这里的21是21字节不是21个int型数据,因此你这里面绝对是用错了21字节等与多少int型数据??????10.5个数据怎么会不出错?????
    你应该这样写WriteFile(hCommDev,&DoData[n],21*sizeof(int),&nWrite,NULL);
      

  4.   

    可以的啊!
    你用的是API来实现串口通信(就是控制PLC),你也可以用MSCOMM控件,直接发字符就可以了,就是你与PLC的通信协议,比如:m_Com.SetOutput(COleVariant("你要发送的数据"))用控件操作起来比较方便和简单!