用Visual C++实现PC与PLC之间的串行通讯

重庆大学学报(自然科学版)

2006年

讯,计算机作为主站,可以实现对PLC从站寄存器的读写直接操作.计算机通过COM口发送指令到PLC的POR他(或PORTl)口,PLC通过RCV接收指令,然后对指令译码后实现指令要求的操作,并返回指令

执行的状态信息‘¨.

Msco咖串行通讯控件实现通信

MSComm.控件提供了一系列标准通信属性和方

法,使用它可以建立起应用程序与串行端口的连接,完成串行数据的发送和接收‘21,如表l所示.

表lMSC锄m一性

属性

描述

Commport设定或传回通信连接端口代号Setting设定初始化参数

InputIJen指定由串行端口读入的字符串长度InputMode设定Input属性取回数据类型Rthreghold设定工传回引发接受事件的字符数StIIr朗hold

设定或传回发送事件的字符数

2.1通讯口初始化

利用MFc向导建立基于单文档应用程序PL—CComm,所有步骤缺省,在项目中插入MSCOMM控

件.因涉及多个Fo彻View窗口,且都是采用同一个

MsCor啪串行通讯控件,所以必须要用到非模式对话

框.采取这种方式,需要创建一个对话框,把MSComm控件拖人其中,并且设置该对话框的属性为不可视的.2.2通信口发送数据

通过Mscomm控件的SetOutput函数用于发送数据.首先要向PLC发送数据,表明需要得到什么数据.在Visualc++中,通讯控件发送数据的任务是由其

接口成员函数Seto啦)ut来实现的,该函数使用的参数

是constVARIANT&new—Value.利用SetOutput函数更为方便.因此,可以利用Vi驰alC++提供CByte.

Amy类型来构造COleVari姐t类型的对象,并将其传

递给setOutput函数.利用SetOuⅡ)ut函数,如果要采集PLC中地址是D1800的数据,就可以采用以下格式.

void

CMainFr锄e::readDl800(){CByteAI_r町D1800;D1800.SetSize(15);D1800[O]=0如5;

D1800[14]=0x31;∥根据PLc通信协议来定

pDlg一>Com.Setoutput(ColeVari跚t(D1800))

2.3通信口采集数据

通讯控件接收通讯数据的任务是通过其接口成员函数GetInput来实现的,该函数的返回值的类型为

VARIANT,同样可以将其赋值给COleV8ri眦类型的万方数据

变量∞J.

∥相应的Oncomm事件处理

void

Dlg::OnComm()

VARLANTplcl;COleSafbArray

plc2;

LONGleng出,i;BYTE

data[1024】;

CStringgtr;

if(com.Getcon瑚Event()==2)∥判断是否

缓冲区内有数据

{plcl=com.GetInput();∥读取缓冲区内的数据

plc2=plcl;∥将VARIAN,I'型变量转换为ColeS小Amy型变量

lengtlI=plc2.GetoneDimsize();∥确定数据

长度

for(i=o;i<lengl}l;i++)∥将数据转换

为BYl.E型数组

plc2.Get

EkHnen£(&i,dat8+i);

?∥把数据做各种处理}

数据采集上来之后可把它们显示在窗口中,并定时存人数据库.

2.4写数据

由于PLC向上位机应答是自动进行,所以写数据只要利用VC++中的定时控制,定时向PLC发读数据指令即可,程序设计简单,可直接调用WriteFile()函数.

3上位机串行通信程序设计

3.1通信程序设计概述

在完成了MScon姗控件初始化设置后,就可以进行Pc与PLC间的串行通讯设计.Rs232C协议是控制中常用的计算机串行口协议,该协议是基于物理层的

通信协议,负责直接与硬件打交道,而Vc++与其他

高级语言相比在这方面具有较大的优势,这也是许多

控制系统采用该语言的原因,用VC++开发串行通信

通常有4种方式"。J:

1)单线程中实现白定义的串行通信类:单线程赋予串行通信程序设计较大的灵活性,端口的读写可选择简单的查询方式,或通过设置与外设数据发送时间间隔TimeCycle相同的定时器SetTimer(1,TimeCycle,NuLL),进行定时读取或发送,上述通讯方式在PLC

数量较多是,循环周期长,实时陛差.

2)多线程下实现串行通信

对实时性要求高的场合,可采用事件驱动L/O读

用Visual C++实现PC与PLC之间的串行通讯相关文档

最新文档

返回顶部