基于VC++的PC 机与PLC 串口通讯的实现
2010-04-24张瑞卿胡爱军
张瑞卿 胡爱军 张 超
(华北电力大学机械工程系,河北 保定 071003)
随着微电子及控制技术的不断发展,PLC 已逐渐 成为一种智能型、综合型控制器,由PLC构成的集散控制是现代工业控制的一个重要组成部分。PLC 具有使用简单方便,故障率低,抗干扰能力强等优点;但同时,数据的计算处理与管理能力较弱,且无法提供良好的人机界面。将计算机与PLC 结合起来,可使两者优势互补,充分利用计算机友好的人机界面,实现人机对话和监控功能,并可进行一定的辅助决策,组成高性能价格比的控制系统。实现计算机与PLC 结合的控制系统的关键之一是二者之间的通信。
本设计选用三菱FX2N 系列的PLC,以Visual C++6.0 作为开发工具对PLC 通讯主程序进行设计,串口通讯采用ActiveX 控制Microsoft Communication Control 6.0,最后用PLC 编程电缆将PLC 编程口与计算机串口连接进行调试。
1 三菱PLC 与计算机之间通信协议
串行通信是指外设和计算机间使用一根数据信号线一位一位地传输数据,每一位数据都占据一个固定的时间长度。“串行”是指外设与接口电路之间的信息传送方式,CPU 与接口之间仍按并行方式工作。串行通信的四个重要参数:波特率(衡量通信速度的参数)、奇偶校验位(一种简单的检错方式)、数据位(衡量通信中实际数据位的参数)和停止位(表示单个数据包的最后一位)[1]。
(1)三菱FX2N 系列通信数据帧格式
FX2N 系列的PLC 与计算机之间的通信采用RS-232C 标准,其传输速率一般设为9600 bps,实际传输过程还可设其它,比如115200 bps 等。奇偶校验位采用偶校验。数据以帧为单位发送和接收。一个多字符帧由起始字元、命令号码、元件首地址、结束字元、和校验五部分组成,其中和校验值是将命令码STX -ETX 之间的字符的ASCII 码(十六进制数)相加,取得所得和的最低二位数。STX 和ETX 分别表示该字符帧的起始标志和结束标志[2]。
起始字元(STX):ASCII 码的起始字元STX 对应的16 进制数位0 ×02。无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始;
命令号码:为两位16 进制数。所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。在回应信息中,下位机会将上位机接收到的命令号码随同其它信息一同发送给上位机;
元件首地址:对应要操作的元件的相应的地址。如从D123 单元中读取数据时,要把它对应的地址:0x10F6 发送给PLC;
元件个数:一次读取位元件或字元件的数量;
结束字元(ETX):ASCII 码的结束字元ETX 对应的16 进制数为0 ×03。无论命令信息还是回应信息,它们的结束字元均为ETX,接收方以此来判知此次通讯已结束;
校验码(Checksum):校验码是将STX -ETX 之间的ASCII 字元的16 进制数值以"LRC(Longitudinal Redundancy Check)"法计算出1 个Byte 长度(两个16 进制数值00 -FFH)的校验码。当下位机接收到信息后,用同样的方法计算出接收信息的校验码,如果两个校验码相同,则说明传送正确[2]。
(2)三菱FX2N 系列通信命令
FX2N 系列PLC 有4 个通信命令,它们是读命令(30H)、写命令(31H)、强制通命令(37H)、强制断命令(38H)。
(3)三菱FX2N 系列通信控制字符
ENQ(ASCII 代码05H):计算机向PLC 发送请求;
ACK(ASCII 代码06H):PLC 对ENQ 的确定回答;
NAK(ASCII 代码15H):PLC 对ENQ 的否认回答;
STX(ASCII 代码02H):报文开始;
ETX(ASCII 代码02H):报文结束。
(4)FX2N 系列设备地址
①读写时的软设备地址
S0 -S7:0000H;X0 -X7:0080H;Y0 -Y7:00A0H;T0 -T7:00C0H;M0 -M7:0100H;C0 -C7:01C0H;D0-D7:1000H
②置位/复位时的软设备地址
S0 -S7:0000H;X0 -X7:0400H;Y0 -Y7:0500H;T0 -T7:0600H;M0 -M7:0800H;C0 -C7:0E00H;D0-D7:0100H
③传输过程
PC 机与FX 系列PLC之间采用应答方式通信,传输出错则组织重发。其传输过程如图1 所示。
PLC 根据PC 机的命令,在每个循环扫描结束处的END 语句后组织自动应答,无需用户在PLC 一方编写程序。
2 系统功能设计
系统主要实现PLC 与计算机的通讯,具体主要完成PC 机指令下传、监测PLC 状态、接收PLC 信息等功能。系统组成:小型PLC 一台、RS232 串口、编程电缆、通讯界面。主操作界面在完成系统功能的前提下,力求明了直观,操作简单灵活方便。系统以VC++6.0 为平台,设计的界面如图2 所示。
本程序设计了四个串口可供选择,只有在选择串口之后才可进行“打开串口,关闭串口”的操作,当打开串口以后,就可以对PLC 进行相应的操作了,为了使界面整洁干净,特别设计了“清空发送区”和“清空接收区”选项,当发送数据和接收数据放满编辑框时只需点击这两个按钮,数据就会清空。且实现代码相当简单,m-sSend.Empty()、m-sReceive.Empty()就可轻松实现这一任务。
PC 机与PLC 的通讯程序流程图如图3 所示。
系统通信控制程序采用了MSComm 控件。此控件提供了两种通信方法:①文件驱动,即用MSComm控件的OnComm 文件捕获并处理通信事件和错误,它是处理串行端口交互作用的一种非常有效的方法;②查询方式,通过查询串口属性来获得事件和错误,实质上还是属于事件驱动,但在有些情况下显得更为便捷。MSComm6.0 控件的属性:①CommPort,设置或返回通信端口号;②Settings,以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位;③PortOpen,设置或返回通信端口的状态,也可以打开和关闭端口;④Input,返回和删除接收缓冲区中的字符;⑤InputMode,设置或返回Input 属性取回的数据的类型,数据取回的形式为字符串或二进制数据的数组;⑥CommEvent 返回最近的通信事件或错误的数字代码,通信程序设计时可以根据该属性值执行不同的操作,在运行时为只写;⑦Output,将字符串写入发送缓冲区。
MSComm6.0 控件只有一个事件,即Oncomm 事件。在通信时如果发生错误或者事件,将会引发Oncomm 事件并且改变其属性值,通过GetCommEvent()可获得Oncomm 产生事件或错误的代码。在与PLC进行通信的过程中,使用MSComm6.0 控件可以自动完成PLC 对计算机发送信息的接收,最终实现PC 机对PLC 的状态检测。
软件实现过程:FX2N 系列的PLC 与计算机之间的通信采用RS-232C 标准,其传输速率固定为9600 bps,奇偶校验位采用偶校验。数据以帧为单位发送和接收。PC 机向PLC 中写数据时首先需对串口进行初始化,并对波特率、校验位等进行设置,然后根据通信协议对PLC 进行相应的读写、复位、置位等操作,PLC根据PC 机送来的控制字进行相应的操作。数据发送,采用专用发送指令XMT TABLE,CommPort,其中TABLE 为发送缓冲区的首地址,首地址中保存要发送的字节数,即数据长度,最大为255,其后的地址中保存要发送的数据,CommPort 指定用于发送的端口。对于数据接收,使用接收指令RCV TABLE,CommPort,接收指令激活初始化或结束接收信息,通过制定端口接收信息并存储于数据缓冲区中,数据缓冲区的第一个数据指明了接收的字节数。
3 系统功能验证
将计算机用通讯电缆与PLC 相连后,首先发送请求05H 以后,验证计算机与PLC 是否可以正常通信,接收区显示06,表示PLC 对ENQ 的确定回答,即PLC已准备好,可以进行下面的操作,具体如图4 和图5。
这里主要对PLC 读值功能进行验证。读操作命令格式如下:
STX -CMD0 -数据段-ETX-SUMH-SUML
在按上述命令格式发送相应的代码后,就可直接读取PLC 响应的信息了。响应信息格式如下:
STX-DATA-ETX-SUMH-SUML
图6 和图7 分别是对PLC 进行读值验证时发送数据和接收数据的显示。
其中接收数据显示中的023030033633,是对X 软地址值(0080H)读取后接收到的数据。具体算法如下:
故,转变成两字节ASCII 代码SUMLX=33;SUMHX=36。
理论分析和实际操作的结果是一致的,即证明了本设计是准确无误的。
4 结语
本文主要使用Visual C++6.0 作为开发工具,通过编写各个模块对应的操作程序,最后用通讯电缆将PC 机与三菱PLC 相连进行调试,基本上达到了预期的设计目标,实现了计算机与PLC 的通信功能。
[1]张筠莉,刘书智.Visual C++实践与提高——串口通信与工程应用篇[M].北京:中国铁道出版社,2005.
[2]李现勇.Visual C++串口通信技术与工程实践(第二版)[M].北京:人民邮电出版社,2004.
[3]贺哲荣,石帅军.流行PLC 实用程序及设计[M].西安:西安电子科技大学出版社,2006.
[4]王力虎,李红波.PC 控制及接口程序设计实例[M].北京:科学出版社,2004.
[5]王卫兵.PLC 系统通信、扩展与网络互连技术[M].北京:机械工业出版社,2004.