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