用Visual C++实现PC与PLC之间的串行通讯
重庆大学学报(自然科学版)
2006年
讯,计算机作为主站,可以实现对PLC从站寄存器的读写直接操作.计算机通过COM口发送指令到PLC的POR他(或PORTl)口,PLC通过RCV接收指令,然后对指令译码后实现指令要求的操作,并返回指令
执行的状态信息‘¨.
‘
2
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读


