当前位置:首页 > 通信技术 > 通信技术
[导读]阐述了用VC开发上位机与PLC之间的串口通信程序设计方法和实现技术。

 摘要:通过多串口通信技术在金刚石合成控制系统中的应用,讨论了32位Windows操作系统下,VC多串口通信技术的设计与实现方法,并运用面向对象方法和多线程技术设计了一个比较完善的串口通信类。阐述了用VC开发上位机与PLC之间的串口通信程序设计方法和实现技术。

    关键词:串口通信;面向对象方法;多线程;PLC

1 引言

传统的金刚石合成机控制系统是由一个PLC和一个可显示终端构成。这种传统的控制系统一般具有如下缺点:

(1) 系统所有的工作都由PLC完成,其控制精度较差,致使合成的金刚石质量较差;

(2) 显示终端的平面尺寸过小,这一方面使得操作人员观察系统的状态很不方便,另一方面?也常常会引起误操作;

(3) 金刚石合成工艺复杂,需控制的参数很多,但原控制系统不能对参数进行保存,这样在根据不同产品和工艺要求对部分参数进行调整时,每次都必须重新设置所有的参数,操作非常麻烦;

(4) 界面不友好;

(5)不能通过控制系统自动考核操作人员的工作质量。

为了提高控制精度、方便操作,开发新的控制系统迫在眉睫。笔者针对以上问题,将IPC与PLC有机结合在一起,开发了一套新的控制系统。通过该系统可在上位机(IPC)和PLC之间通过RS-232与RS-485进行大量串口通信。

2 VC串口通信分析

在32位Windows系统下使用VC开发串口通信程序通常有如下4种方法:

 (1)使用Microsoft公司提供的名为MSCOMM的通信控件;

 (2)直接使用Windows应用程序接口(API);

(3)自行设计一个串口通信类;

(4)通过开发一个ActiveX控件来实现串口通信功能。

在上述几种方法中,实际上还是使用Windows API函数,然后把串口通信的细节给封装起来,同时提供给用户几个简单的接口函数。上述几种方法各有优缺点,但在实际情况下,大多数编程人员喜欢使用API函数自行设计串口通信类。

用Windows API函数进行串口通信的编程流程如图1所示。其中打开串口是确定串口号与串口的打开方式;初始化串口用于配置通讯的波特率、每字节位数、校验位、停止位和读写超时等;读写串口用于向串口进行发送数据和从串口接收数据;关闭串口用于将串口关闭并释放串口资源(Windows系统下串口是系统资源)。

由于绝大多数控制系统中串口通信是比较费时的,而且监控系统还要进行数据处理和显示等,所以一般采用多线程技术,并用AfxBeginThread()函数创建辅助线程来管理串口通信,这样,主进程就能在进行串口读写的同时,处理数据并完成用户指令的响应,但是设计时一定要处理好数据的共享问题。

串口读写既可以选择同步、异步方式,也可以选择查询、定时读写和事件驱动方式。由于同步方式容易造成线程阻塞,所以一般采用异步方式;而查询方式要占用大量的CPU时间,所以一般采用定时读写或者事件驱动方式,事件驱动方式相关文献较多,故此重点讨论定时读写方式。定时读写方式就是上位机向下位机发送固定格式的数据,在下位机收到后向上位机返回状态信息数据。由于数据的传输需要时间,所有上位机发送数据后就调用_sleep()函数进行休眠,休眠的时间可根据需要进行不同的设置。这样,可以节省CPU时间,以使系统能够很好地进行监控工作和处理其它事务。

3 VC串口通信的设计与实现

笔者在Windows系统下,采用面向对象的方法和多线程技术,并使用Visual C6.0作为编程工具开发了一个通用串口通信类CSerialPort,该CSerialPort类封装了串口通信的基本数据和方法,下面给出CSerialPort类的简单介绍。

CSerialPort类头文件中的主要成员变量和成员函数如下:

Class CSerialPort

{

private:

HANDEL m_hPort;

DCB m_Dcb;

COMMTIMEOUTS m_TimeOuts;

DWORD m_Error;

Public:

CSerialPort(); ?? //构造函数

virtual~CSerialPort(); ?? //析构函数

//InitPort() 函数实现初始化串口

BOOL InitPort(

char* str=“com1”,

UINT BaudRate=9600,

UINT Parity=0,

UINT ByteSize=8,

UINT StopBits=1,

UINT ReadMultiplier=0,

UINT ReadConstant=0,

UINT WriteMultiplier=10,

UINT WriteConstant=1000);

DCB GetDCB();? //获得DCB参数

//SetDCB()函数实现设置DCB参数

BOOL SetDCB(

UINT BaudRate=9600,

UINT Parity=0,

UNIT ByteSize=8,

UINT StopBits=1);

// GetTimeOuts()函数获得超时参数

COMMTIMEOUTS GetTimeOuts();

// SetTimeOuts()函数设置超时参数

BOOL SetTimeOuts(

UINT ReadMultiplier=0,

UINT ReadConstant=0,

UINT WriteMultiplier=10,

UINT WriteConstant=1000);

// WritePort()函数实现写串口操作

void WritePort(HANDLE port,CString);

CString ReadPort(HANDLE port); //读串口操作

BOOL ClosePort();? //关闭串口

};

下面对该类的重要函数作以说明:

 (1)在构造函数CSerialPort()中已对该类的数据成员进行了初始化操作。

(2)初始化串口函数InitPort()函数用于完成串口的初始化工作,包括打开串口、设置DCB参数、设置通信的超时时间等。

打开串口使用CreateFile()函数,其中InitPort()函数中的第一个参数为要打开的串口,通常将该参数赋给CreateFile()函数中的第一个参数;设置DCB参数应调用该类中的SetDCB()函数,并将InitPort()函数中的第2至第5参数赋给SetDCB()函数;设置通信的超时时间应调用该类中的SetTimeOuts()函数,并将InitPort()函数中的第6至第9参数赋给SetTimeOuts()函数。另外,该串口是系统资源,应该根据不同要求对其安全属性进行设置。

(3)SetDCB()函数用于设置DCB参数,包括传输的波特率、是否进行奇偶校验、每字节长度以及停止位等。

(4)SetTimeOuts()函数用于设定访问的超时值,根据设置的值可以计算出总的超时间隔。前面两个参数用来设置读操作总的超时值,后面两个参数用来设置写操作总的超时值。

(5)WritePort()函数用来完成向串口写数据。由于该系统需要对多个串口进行通信,所以首先应把串口号作为参数传递给该函数;接着该函数把按参数传递过来的、要发送的数据进行编码(也就是加入校验,这样能减少误码率),然后再调用Windows API函数WriteFile()并把数据发送到串口。

(6)ReadPort()函数用来完成从串口读数据,由于有多个串口,所以应把串口作为参数传递进来,然后调用API函数ReadFile(),并把下位机发送到串口,数据读出来放到缓存里面,接着对数据进行处理以将其变换成字符串(CString)类型并返回。

(7)GetDCB()函数主要用于获得串口的当前配置,可通过调用API函数GetCommState()来实现,然后再进行相应的处理。

(8)GetTimeOuts()函数用于获得访问超时值。

(9)ClosePort()函数可用来关闭串口。因为在Windows系统中串口是系统资源,因而在不用时,应将其释放掉,以便于其它进程对该资源的使用。

4 基于串口通信的金刚石合成控制

金刚石合成控制系统采用主从式控制方式,上位机为微机、下位机为PLC。上位机的主要功能是对系统进行实时监控,下位机的主要功能是对系统进行实时控制。上位机采用Windows 98操作系统,其监控程序可用VC开发,上、下位机之间通过RS-232与RS-485串口进行通信,它们之间采用的通信波特率为9600bps,无奇偶校验,每字节8位,并有1位停止位。上、下位机之间传送的数据格式可自己定义。由于传输数据时可能会引起错误,所以加入了校验算法。该系统通过上位机向下位机发送数据,下位机收到后就把当前系统的状态参数返回给上位机。由于该系统中所控制的参数具有迟滞性,所以应采用定时发送数据的方法来采集现场状态信息。

上位机编程时,可用VC6.0生成一个对话框类型的程序框架,然后将自己编写的CSerialPort类加入到该工程中,并在主界面类?CCrystal?中添加一个CSerialPort类的成员变量serial。当监控系统开始工作时,可用AfxBeginThread??函数创建辅助线程来管理串口通信,当调用CSerialPort类中的WritePort? ?函数向串口发送数据后,可调用_sleep? ?函数使辅助线程休眠一段时间,以便使PLC有充分的时间返回数据;接着再调用CSerialPort类中的ReadPort()函数并从串口读数据,然后再调用_sleep()函数使辅助线程再休眠一定的时间。这样设计后,当进行串口通信时,主线程就能继续完成监控功能和处理其他事务。辅助线程函数的主要代码如下:

UINT SerialPro(void* param)

{

Ccrystal* mdlg=(Ccrystal*)param?

CString str;

int flag=1;

//如果初始化串口失败返回

if(!InitPort(“com2”))

{AfxMessageBox(“打开串口2失败”);

return 0;

}

//循环读写串口,直到结束

while(flag)

{

//这里把要发送的数据传送给变量str

……

//向串口写数据

mdlg->serial.WritePort(hport,str);

//让辅助线程休眠100ms

_sleep(100);

//从串口读数据并赋给变量str

str=mdlg->serial.ReadPort(hport);

//这里把从串口得到的数据进行处理

……

5 结束语

运用面向对象方法和多线程技术设计的通用串口通信类CSerialPort类,通过对Windows API函数的封装使串口通信变得简单方便、容易维护。目前,该软件系统已成功地应用于金刚石合成控制系统,并成功解决了RS-232与RS-485两种串口通信的问题。经过几个月的运行表明,该串口通信软件工作稳定,出色地完成了系统的实时监控和显示任务。此外,由于采用了面向对象的方法和模块化设计,该软件的维护和升级十分方便;同时该系统具有很好的移植性,按照不同需求稍微改动一些代码就可以应用于其它控制系统中。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在智能制造和物流自动化领域,AGV(Automated Guided Vehicle,自动导引车)机器人扮演着举足轻重的角色。其控制系统宛如人类的大脑,指挥着 AGV 的一举一动,不同类型的 AGV 机器人控制系统,有着...

关键字: 机器人 控制系统 自动化

2025年8月1日 – 提供超丰富半导体和电子元器件™的业界知名新品引入 (NPI) 代理商贸泽电子 (Mouser Electronics) 推出全新自动化资源中心,为工程师带来丰富的工业自动化新技术。借助这些资源,该...

关键字: 控制系统 机器人 自动化软件

杭州2025年4月10日 /美通社/ -- 近日,山东裕龙石化2000万吨/年炼油及1#150万吨/年乙烯炼化一体化项目顺利投产, 2#150万吨/年乙烯也即将投产。作为国家"十四五"重点工程,这一总...

关键字: 控制系统 AI 供应链 SI

北京2025年4月9日 /美通社/ -- 隶属于AVEVA 剑维软件集团旗下的泰尔文特控制系统(中国)有限公司(以下简称"泰尔文特")获得"北京市外资研发中心"认定,并于2025中...

关键字: 控制系统 研发中心 软件 EV

在现代电子测量与控制系统中,传感器作为获取外界物理量并转化为电信号的关键部件,其输出信号往往面临着分辨率不足和电流驱动能力有限的问题。运算放大器(运放)的引入,为解决这些问题提供了有效的途径。通过与传感器输出相连,运放能...

关键字: 电子测量 控制系统 传感器

在很多嵌入式控制系统中,系统既要完成大量的信息采集和复杂的算法,又要实现精确的控制功能。

关键字: 嵌入式 控制系统

在工业控制、电子设备以及自动化系统等众多领域中,开关量检测电路起着至关重要的作用,它负责将外部的开关状态信息准确地传输给控制系统,以实现各种逻辑控制和监测功能。然而,在实际应用环境中,开关量检测电路常常受到来自内部和外部...

关键字: 开关量检测 抗扰度 控制系统

在现代港口码头物流领域 ,卸船机扮演着至关重要的角色。这些大型设备负责高效地卸载船只上的货物 ,而其精确操作的关键在于先进的“控制系统”。随着工业4. 0的兴起 ,EtherNet/IP协议成为连接控制系统与设备的关键通...

关键字: 卸船机 控制系统 EtherNet/IP PLC

随着城市现代化程度的提高,交通需求和交通量迅速增长,城市交通网络中交通拥挤日益严重,逐步成为经济和社会发展中的全球性共同问题。传统的交通信号灯控制系统大多采用固定转换时间间隔的控制方法,但由于十字路口不同时刻车辆的流量是...

关键字: FPGA 智能交通信号灯 控制系统

杭州2024年12月13日 /美通社/ -- 近日,中控技术成功中标荣盛新材料(舟山)有限公司金塘新材料项目(简称"金塘新材料项目")全厂控制系统框架项目,并在中控科技园举办开工会。该项目预计将部署高...

关键字: 控制系统 新材料 数字化 SMART
关闭