你现在位置:首页>技术论文>数据通讯>正文
用VC++开发微机与OMRON PLC间的一种通讯程序
日期:2005-11-21 23:32:03 来源:本站整理  
点击: 作者:未知
点击【】放大字体.

武汉大学动机学院自动化系 李志刚 张峰

WWcW_PLCJS_COM-PLC-技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

[摘 要]
——可——编——程——控-制-器-技——术——门——户

本文介绍了一个使用Visual C++编写的通信程序,主要实现微机与OMRON PLC间的通信,并对它们间的通信协议作了阐述。
WWW_PLCJS@_COM%-PLC-技.术_网

[关键词]
WWW_PL※CJS_COM-PLC-技.术_网

PLC 链接通信 通讯控制
WWW.PLCJS.COM——可编程控制器技术门户

WWcW_PLCJS_COM-PLC-技.术_网

1、前言

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

可编程控制器是一种数字运算操作的电子系统,专为在工业环境下应用而设计。它采用了可编程序的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数和算术操作等面向用户的指令,并通过数字式或模拟式输入输出控制各种类型的机械的生产过程。可编程控制器及其有关外部设备,都按易于与工业控制系统联成一个整体、易于扩充其功能的原则设计。早期的PLC以数字量的顺序控制为主,提供了简单的慢速的通信功能(只支持RS232、RS485、多采用Modbus协议),现在的PLC不仅具有逻辑运算、顺序控制、定时、计数和算术操作,而且还具有A / D、D / A转换,数值计算和数据处理等功能。它既可以对开关量进行控制,也可以对模拟量进行控制,随着PLC功能不断扩充,它还有通讯联网功能,举例C200HX / HG / HE的OMRON PLC的CPU内的RS - 232C端口和外设端口支持通信功能就有与编程设备(如编程器,LSS,或SSS (中文版))进行通信、与个人计算机和其它外设进行上位机链接通信、与个人计算机和其它外设进行RS - 232C、与其它PC进行1:1、再有是与装有NT链接接口的可编程终端(PT)进行NT链接通信(1:1、1:N),本课题就是基于OMRON PLC的链接通信(有通信协议),用VC++开发的上位机与PLC间的通信。
WWW_PLC※JS_COM-PmLC-技.术_网

2、OMRON PLC的通信协议

WWW_PLC※JS_COM-PmLC-技.术_网

目前,随着PLC的快速发展,越来越多的PLC生产厂商开发了它与计算机的通信功能(主要是利用计算机串口进行通信),本文是以C200HE PLC为例,作详细阐述,本文的通信协议采用的是上位机链接通信。上位机链接通信通过在上位机与PLC之间交换命令和应答实现的。在一次交换中传输的命令和应答数据称为一帧,一个帧最多可包含131个数据字符。
plcjs.技.术_网

命令帧格式
WWW_P※LCJS_CO※M-PLC-技-.术_网

从上位机发送一个命令时,按下示的格式排列命令数据
WWW_PLC※JS_COM-PmLC-技.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

按此在新窗口浏览图片
P.L.C.技.术.网——可编程控制器技术门户

@符号必须置于每个命令的开头,节点号是用来辨识每一台PLC的节点,在本文中,它设置PLC的DM6558单元中,识别码设置两字符的命令代码,设置通信是读写PLC的哪个寄存器单元,例读写IR / SR区时它的识别码设置分别为RR和WR,读写DM区分别为RD和WD。正文设置命令参数,包括所要读写PLC寄存器单元的起始地址和字数。FCS是设置两字符的帧检查顺序码,是一个转换成2个ASCII字符的8位数据,这8位数据为从帧开始到正文结束(即FCS之前)所有数据执行“异或”操作的结果。终止符设置“*”和回车(CHR $(13))两字符,表示命令结束。命令帧可以有最多131个字符长。一个等于或大于132字符的命令必须分成若干帧。命令分段,使用回车定界符(CHR $(13))。

WW.W_PLC※JS_C,OM-PL,C-技.术_网

应答帧格式
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

WW.W_PLCJS_COM-PLC-技.术_网

按此在新窗口浏览图片
P.L.C.技.术.网——可编程控制器技术门户

识别码和正文取决于接收到的上位机联结命令,结束码表示命令完成的状态(即是否有错误发生),当应答超过132字符,它必须分成若干帧。结束码是应答帧中表示PLC应答的信息。例结束代码为00表示正常结束,13表示FCS错误,14表示格式错误,15表示入口码数据错误,18表示帧长度错误,A3表示传输数据时因FCS错误引起终止,A8表示传输数据时因帧长度错误引起终止。

plcjs.技.术_网

本文的上位机命令帧包括读写PLC单元中的数据的命令。读命令帧为:@01RR0100000141* + CHR $(13),意思是上位机读取节点为1的PLC中的IR0100单元中的内容。写命令帧为:@01WR0100000171* + CHR $(13),意思是写一个数到节点为1的PLC的IR0100单元中。
WWW_P※LCJS_COM-PLC-)技.术_网

3、系统结构图

WWW_PLC※JS_COM-PmLC-技.术_网

下图是计算机与PLC通信的组成系统图
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW.PLCJS.COM——可编程控制器技术门户

按此在新窗口浏览图片
WWW_PLCJS@_COM%-PLC-技.术_网

上位计算机与多个PLC进行通信,必须连接一个RS232 / 422电平转换器,RS422采用平衡发送接收方式,它具有传输距离长、抗干扰能力强和多点通信能力,最多可以接32台PLC,如图1所示,每一台PLC都必须挂一个COM06单元进行RS422方式连接,所有的PLC与计算机间的通讯采用的是PLC上位机链接通信协议。

W1WW_P4LCJS_COM-PLC-技.术_网

3.1 硬件设置
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

RS232 / 422转换器的设置开关拨到422方式,OMRON PLC上的COM06通信板单元同样设置为422方式和四线制。
WWW_PLC※JS_COM-PmLC-技.术_网

3.2 参数设置
WWW_P※LCJS_CO※M-PLC-技-.术_网

上下位机的通信波特率设置为9600,数据格式设置为E,7,2。
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

3.3 节点设置
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

在PLC的DC6558单元中设置节点号00(初始值)~ 31(号机)。
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

——可——编——程——控-制-器-技——术——门——户

4、用Visual C++6.0编写串行通信程序

WWW_PL※CJS_COM-PLC-技.术_网

本文的上位机链接通信程序是用Visual C++6.0编写的,主要是利用VC++中的一个通信控件来实现的。
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

首先利用MFC AppWizard ( exe ) 建立一个基于对话框,支持Activex控件,命名为Transcomn的应用程序。然后在对话框中加入一些控件,其中那个电话形状的控件必须是在系统中注册过的Microsoft Communications Control,由它进行通讯时首先得设置它的一些属性如表1。
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

属 性 设 定 值 说 明

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

----------------------------------------------
WW.W_PLCJS_COM-PLC-技.术_网

CommPort 1 通讯协议为 PLC 上位机链接通信,利用微机的串口1
——可——编——程——控-制-器-技——术——门——户

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

InputMode 0 接收数据类型为文本形式
P.L.C.技.术.网——可编程控制器技术门户

WWW_PLC※JS_COM-PmLC-技.术_网

Rthreshold 1 每接收一个字符就产生一个事件
WWW_PLCJS_COM-PLC-技.术_网

plcjs.技.术_网

Settings 9600, E, 7, 2  参数依次为波特率、奇偶检验数据位数、停止位数
P.L.C.技.术.网——可编程控制器技术门户

WWW_P※LCJS_CO※M-PLC-技-.术_网

WWW_PL※CJS_COM-PLC-技.术_网

5、程序编写
WWW_P※LCJS_COM-PLC-)技.术_网

在程序中需添加的代码如下:
WWW_P※LCJS_COM-PLC-)技.术_网

// TranscommDlg.cpp:implementation file
WWW_PLCJS@_COM%-PLC-技.术_网

BOOL CTranscommDlg::OnInitDialog ()
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

{
WWW_PLC※JS_COM-PmLC-技.术_网

最后要在ClassWizard中添加变量和响应函数如表2。
WW.W_PLCJS_COM-PLC-技.术_网

控制名称  控制 ID   对应变量或函数

WWW_PLC※JS_COM-PmLC-技.术_网

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

通讯地址文本框 ID - ADDRESS m_address
WWW.PLCJS.COM——可编程控制器技术门户

WWW.PLCJS.COM——可编程控制器技术门户

DM 区文本框 ID - DM  m_dmbox
W1WW_P4LCJS_COM-PLC-技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

LR 区文本框  ID - LR  m_lrbox
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WWcW_PLCJS_COM-PLC-技.术_网

HR 区文本框 ID - HR  m_hrbox
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

WW.W_PLCJS_COM-PLC-技.术_网

IR 区文本框 ID - IR  m_irbox
plcjs.技.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

应答帧文本框 ID - RESPONSE m_response
WWcW_PLCJS_COM-PLC-技.术_网

W1WW_P4LCJS_COM-PLC-技.术_网

通讯控件  ID - MSCOMM  M - comm.
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WWcW_PLCJS_COM-PLC-技.术_网

发送命令按钮 ID - SEND  OnSend ( )
W1WW_P4LCJS_COM-PLC-技.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

// TODO:Add extra initialization here

P.L.C.技.术.网——可编程控制器技术门户

// 打开通信端口1
WWW_PL※CJS_COM-PLC-技.术_网

m_comm..SetCommPort (1);
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

IF_(m_comm..GetPortOper ())
WWW_PL※CJS_COM-PLC-技.术_网

m_comm..SetPortOper (FALSE);
——可——编——程——控-制-器-技——术——门——户

m_comm.SetPortOpen (TRUE);
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

// 初始状态为选中地址为1的PLC,并对它的DM0100单元实行操作
plcjs.技.术_网

m_address= “1”
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

m_dmbox=“0100”
WWW_P※LCJS_COM-PLC-)技.术_网

return TRUE;}
WW.W_PLCJS_COM-PLC-技.术_网

// 发送事件
WWW_P※LCJS_COM-PLC-)技.术_网

void CTranscommDlg::OnSend ()
WW.W_PLC※JS_C,OM-PL,C-技.术_网

{
WWW_PL※CJS_COM-PLC-技.术_网

// TODO:Add your control notification handler code here
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

// 按本文第二部分介绍的,写出需要传出的命令码字符串CString m_send
WWW_PL※CJS_COM-PLC-技.术_网

// 将这个字符串发送到串行口
WWW_P※LCJS_COM-PLC-)技.术_网

Cstring m_send;
W1WW_P4LCJS_COM-PLC-技.术_网

m_comm.SetOutput (COleVariant (m_send));
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

}
WWW_P※LCJS_CO※M-PLC-技-.术_网

// 接收事件
WW.W_PLCJS_COM-PLC-技.术_网

void CTranscommDlg::OnComm ()
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

{
plcjs.技.术_网

// TODO:Add your control notification handler code here
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

if (m_comm..GetCommEvent () = 2)
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

{
plcjs.技.术_网

COle Variant m_input = m_comm.GetInput ();
WWcW_PLCJS_COM-PLC-技.术_网

m_input.ChangeType (VT_BSTR);
WWW_PLCJS_COM-PLC-技.术_网

m_response = m_input.bstrVal; // 把接收到的变量赋给应答帧文本框变量
——可——编——程——控-制-器-技——术——门——户

UpdateData (FALSE);
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

}
plcjs.技.术_网

}
WWW_PLCJS@_COM%-PLC-技.术_网

6、结论

WWW_P※LCJS_COM-PLC-)技.术_网

按照类似的方法,选择不同的地址和单元区,可以编写出其它命令的控制指令,以上的程序已在我所在的武汉大学PLC控制网络实验室作过实验,得到验证。
WWW.PLCJS.COM——可编程控制器技术门户

WWW.PLCJS.COM——可编程控制器技术门户

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行