前几天要做一个跟PLC通信的程序,在这里讲一讲学到的一点东西
程序如果是用VB来做的话有一个MScomm控件,比较简单,不过我只在VB6.0里面发现有这个控件.在.net里面没有,好像要通过某些操作可以加进来,我觉得比较麻烦就没有去做.
我是用C++来做的,平台是.net2005.没有用控件,直接用到几个串口连接及操作的API函数.
首先是跟串口的连接,一般是用com1口
code:
///////
m_hCom=CreateFile(L"COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, 0,NULL);
///////
//m_hCom是一个HANDLE,判断它是否为空,空表示打开串口失败,那要检查一下串口是否可以用了.
SetupComm(m_hCom,READBUFLEN,WRITEBUFLEN); // 初始化通讯设备参数
///READBUFLEN是自己定义的读缓冲的长度,WRITEBUFLEN是写缓冲的长度
COMMTIMEOUTS CommTimeOuts;//上面是设置异步操作的时间间隔
//获取并设置串口
DCB dcb;
GetCommState(m_hCom, &dcb) ;
dcb.BaudRate = 9600;//比特率
dcb.ByteSize = 7;//字节数
dcb.Parity = EVENPARITY;//偶校验
dcb.StopBits = TWOSTOPBITS ; //2位停止位
SetCommState( m_hCom, &dcb);
PurgeComm (m_hCom,PURGE_TXCLEAR | PURGE_RXCLEAR) ; // 清除缓冲信息
.....
DWORD lbyteswritten;
WriteFile(m_hCom,SendString,WRITEBUFLEN,&lbyteswritten,0);
/*WriteFile是向PLC发送信号,SendString是信号码,是一个字符串,一般是用ASCII码,不过不是标准的ASCII码,是 PLC生产公司自己定义的,如果他们公司没有定义的ASCII码的话就用标准的,比如Omron定义的ASCII码里面没有回车符的定义,所以用标准的 '/x0D'表示.*/
.......
DWORD lbytesreaded;
char Data[READBUFLEN];
memset(Data,'/0',READBUFLEN);
ReadFile(m_hCom,Data,READBUFLEN,&lbytesreaded,0);
/*ReadFile是接收从PLC上发回来的信号,这个信号要能正确反应真实信号的话需要发送的信号格式正确才行.Data是一个字符串,你可以对里面的某一位的值进行判断以确定接收到什么变化.然后进行相应的处理.
最后不要忘记在关闭程序的时候*/
.....
CloseHandle(m_hCom);//将打开的串口句柄关闭
/*事实上与PLC的通信最终归结为串口通信,只要知道PLC发送和接收的格式就可以很容易完成。
至于PLC内部的程序控制就要懂工控的强人来写程序了。一般来说都是两方面的人员商量好一个都可以接受的协议然后大家按照协议来写各自的程序,最后通信的时候只需要对协议处理就行。*/