点击【 大 中 小 】, 可 以 选 择 字 体的大小,以便 你 阅读.
1 引言
可编程序控制器作为当代工业自动化的主要支柱之一,随着其应用范围的不断扩大,PLC与PC之间通信技术的应用也越来越广泛。
通过PLC的编程口进行通讯不仅可以减少系统的成本及复杂性,同时可以减少PLC方面软件的复杂程度和编程量。
本文根据实际工程中的经验进行总结,介绍了利用VC++中MFC实现PC与三菱FX2系列PLC编程口进行串行通信的程序设计基本方法。
2 通信程序设计
在PC机和三菱FX2系列PLC进行串行通信时,由于PC与PLC之间的信息传送是通过PLC编程口实现的,采用的是PLC专用协议通信指令。因此,在PC编程方面需要严格的遵循PLC编程口通讯协议。具体实现介绍如下。
2.1 串口设备的打开
在Visual C++中,利用MFC CFile类来实现串行通讯。这种通信方式与访问磁盘普通文件没有太大不同。打开串口设备需作以下操作:
CFile file;
CFileException e;
file.Open (
portName, //example "COM1","COM2"
CFile::modeReadWrite,
&e);
2.2 串口设备的初始化
串行端口创建时,必须对其进行设置以匹配与其对话的设备。FX2系列PLC的波特率为固定的9600bps,奇偶校验采用偶校验,1位停止位,7位数据位。
一般地,可用如下程序设置它们:
DCB dcb;
::GetCommState( (HANDLE)file.m_hFile, &dcb );
dcb.BaudRate = 9600;
dcb.ByteSize = 7 ;
dcb.StopBits = 1 ;
dcb.Parity = 2 ;
::SetCommState((HANDLE)file.m_hFile, &dcb );
为了更好的控制端口可以利用SetCommTimeouts()函数打开或关闭串口超时功能,具体程序如下:
COMMTIMEOUTS cto;
::GetCommTimeouts((HANDLE)file.m_hFile,&cto);
cto.ReadIntervalTimeout =0;
cto.ReadTotalTimeoutMultiplier =0;
cto.ReadTotalTimeoutConstant =0;
cto.WriteTotalTimeoutMultiplier=0;
cto.WriteTotalTimeoutConstant =0;
::SetCommTimeouts((HANDLE)file.m_hFile,&cto);
图1 多字符帧的组成
2.3 PC与PLC间的通信
FX2系列PLC与PC机的通信中,数据是以帧为单位发送和接收的。其中字符ENQ(0x05)、ACK(0x06)、和NAK(0x15)作为单个字符,可以构成单字符帧。其余的字符在发送和接收时必须用字符STX(0x02)和ETX(0x03)分别表示该字符帧的起始标志和结束标志,否则将构成帧错。一个多字符帧由字符STX、命令码、数据、字符ETX以及和校验五部分组成,其中和校验值是将命令码到ETX之间的所有字符的ASCII码(十六进制数)相加,取所得和的最低二位数。多字符帧格式如图1所示。表1示出FX2系列PLC与PC通信所用的命令码。
在刚开始通信时,PC机首先要发送一个控制字符ENQ(0x05),去查询PLC是否做好通信准备,同时也检查一下PC机与PLC的连接是否正确。若通讯正常,则应答字符ACK(0x06);若通信有错,则应答字符NAK(0x15)。
(1) 应用MFC CFile类实现对串口设备的读写操作的代码
//读串口
char m_ReadBuff[UINT n];
UINT nByte=file.Read (
&m_ReadBuff, //buffer to store byte
UINT nCount //number of bytes to read
);
//写串口
char m_WriteBuff[UINT n];
file.Write (
&m_WriteBuff, //buffer to store byte
UINT nCount //number of bytes to write