基于WIN32API函数的PLC与PC串行通信解读
- 格式:doc
- 大小:355.50 KB
- 文档页数:2
WIN32 API串口通信掌握串行通信API函数的用法是掌握串行通信编程技术的关键。
在Win32中,系统将串行口与文件统一了起来,对它们的打开、读写、关闭等操作都使用相同的API函数,但是它们之间又有差别,这些差别主要体现在API函数中部分参数的设置上。
有关通信的API主要包括打开串口、关闭串口、配置串口、设置缓冲区、设置超时、事件驱动、读串口、写串口等。
串口的打开和关闭1:串口的打开。
由于在Windows环境中,串口作为一种文件来使用,打开串口用打开文件同样的API函数CreateFile()。
函数原型为:HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); 其中几个参数的含义分别为:lpFileName指定文件名或设备名,串口通讯时,它必须是“COMx”,其中的“x”为串口编号,如第一个串口则为“COM1”;dwDesiredAccess为串口读写属性;dwShareMode指定该端口的共享属性,串行口不能作为共享设备,故参数值必须为0;lpSecurityAttributes为安全属性,对于串口应该为0 ;dwCreationDisposition指文件的创建模式,对于串口必须为OPEN—EXISTING;dwFlagsAndAttributes描述了创建文件的其它属性,对于串行口,有效的设置只能是FILE-FLAG-OVERLAPPED 或者0,分别表示异步或同步读写;参数hTemplateFile必须为NULL。
返回值:若成功,返回创建的句柄;否则返回INVALID—HANDLE—VALUE。
win32API串口通信WIN32API--串口通信[源码]serial.cpp vc++6.0#include#include#includeHANDLE hComm;OVERLAPPED m_ov;COMSTAT comstat;DWORD m_dwCommEvents;/*注意:在异步通信时不用等到I/O操作完成后函数才返回异步可以更快的响应用户操作;同步,相反,响应的I/O操作必须完成后函数才返回,否则阻塞线程*/bool openport(char *portname)//打开一个串口{//创建串口句柄hComm = CreateFile(portname, //设备名GENERIC_READ | GENERIC_WRITE, //指定可对串口进行读写0,//串口不能共享0,OPEN_EXISTING, //定义文件创建方式FILE_FLAG_OVERLAPPED, //设定为异步通信方式0);//模板文件句柄 0:串口无模板if (hComm == INVALID_HANDLE_VALUE)return FALSE; //串口打开不成功INVALID_HANDLE_value(0XFFFFFFFF)。
elsereturn true; //串口打开成功}/*设置串口在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。
这需要通过一个DCB结构来进行。
DCB结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。
在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。
第一次打开串口时,串口设置为系统默认值,函数GetCommState和SetCommState可用于检索和设定端口设置的DCB(设备控制块)结构。
该结构中BaudRate、ByteSize、StopBits和Parity字段含有串口波特率、数据位数、停止位和奇偶校验控制等信息。
程序中用DCB进行串口设置时,应先调用API函数GetCommState,来获得串口的设置信息*/bool setupdcb(int rate_arg){DCB dcb;int rate = rate_arg;memset(&dcb, 0, sizeof(dcb)); //申请一块内存单元并清零if (!GetCommState(hComm, &dcb)) //获取当前DCB配置-hFile:串口句柄-lpDCB:设备控制块(Device Control Block)结构地址{return FALSE;}/* -------------------------------------------------------------------- */// set DCB to configure the serial portdcb.DCBlength = sizeof(dcb);//设备控制块结构体大小/* ---------- Serial Port Config ------- */dcb.BaudRate = rate; //波特率dcb.Parity = NOPARITY; //奇偶校验dcb.fParity = 0; //是否进行奇偶校验dcb.StopBits = ONESTOPBIT;// 停止位个数,0~2分别对应1位、1.5位、2位停止位dcb.ByteSize = 8; //数据宽度,一般为8,有时候为7dcb.fOutxCtsFlow = 0;//是否CTS线上的硬件握手dcb.fOutxDsrFlow = 0;//是否DSR线上的硬件握手dcb.fDtrControl = DTR_CONTROL_DISABLE; //DTR控制dcb.fDsrSensitivity = 0;dcb.fRtsControl = RTS_CONTROL_DISABLE;dcb.fOutX = 0; //是否使用XON/XOFF协议dcb.fInX = 0; //是否使用XON/XOFF协议/* ----------------- misc parameters ----- */dcb.fErrorChar = 0;dcb.fBinary = 1;dcb.fNull = 0;dcb.fAbortOnError = 0;dcb.wReserved = 0;dcb.XonLim = 2;//设置在XON字符发送之前inbuf中允许的最少字节数dcb.XoffLim = 4;//在发送XOFF字符之前outbuf中允许的最多字节数dcb.XonChar = 0x13;//设置表示XON字符的字符,一般是采用0x11这个数值dcb.XoffChar = 0x19;//设置表示XOFF字符的字符,一般是采用0x13这个数值dcb.EvtChar = 0;/*真正在串口编程中用到的数据成员没有几个,在此仅介绍少数的几个常用的参数:DWORD BaudRate:串口波特率DWORD fParity:为1的话激活奇偶校验检查DWORD Parity:校验方式,值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零DWORD ByteSize:一个字节的数据位个数,范围是5~8DWORD StopBits:停止位个数,0~2分别对应1位、1.5位、2位停止位然后再末尾调用SetCommState就可以了,还是比较方便的。
PLC与PC(个人计算机)通讯概述个人计算机(以下简称PC)具有较强的数据处理功能,配备着多种高级语言,若选择适当的操作系统,则可提供优良的软件平台,开发各种应用系统,特别是动态画面显示等。
随着工业PC的推出,PC在工业现场运行的可靠性问题也得到了解决,用户普遍感到,把PC连入PLC应用系统可以带来一系列的好处。
1. PC与PLC实现通信的意义把PC连入PLC应用系统具有以下四个方面作用:1)构成以PC为上位机,单台或多台PLC为下位机的小型集散系统,可用PC实现操作站功能。
2)在PLC应用系统中,把PC开发成简易工作站或者工业终端,可实现集中显示、集中报警功能。
3)把PC开发成PLC编程终端,可通过编程器接口接入PLC,进行编程、调试及监控。
4)把PC开发成网间连接器,进行协议转换,可实现PLC与其它计算机网络的互联。
2. PC与PLC实现通信的方法把PC连入PLC应用系统是为了向用户提供诸如工艺流程图显示、动态数据画面显示、报表编制、趋势图生成、窗口技术以及生产管理等多种功能,为PLC应用系统提供良好、物美价廉的人机界面。
但这对用户的要求较高,用户必须做较多的开发工作,才能实现PC 与PLC的通信。
为了实现PC与PLC的通信,用户应当做如下工作:1)判别PC上配置的通信口是否与要连入的PLC匹配,若不匹配,则增加通信模板。
2)要清楚PLC的通信协议,按照协议的规定及帧格式编写PC的通信程序。
PLC中配有通信机制,一般不需用户编程。
若PLC厂家有PLC与PC的专用通信软件出售,则此项任务较容易完成。
3)选择适当的操作系统提供的软件平台,利用与PLC交换的数据编制用户要求的画面。
4)若要远程传送,可通过Modem接入电话网。
若要PC具有编程功能,应配置编程软件。
3. PC与PLC实现通信的条件从原则上讲,PC连入PLC网络并没有什么困难。
只要为PC配备该种PLC网专用的通信卡以及通信软件,按要求对通信卡进行初始化,并编制用户程序即可。
用Win32 API 实现串行通信南京航空航天大学牛新庄--------------------------------------------------------------------------------串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
我们可以利用Windows API 提供的通信函数编写出高可移植性的串行通信程序。
在Win16中,可以利用OpenComm、CloseComm和WriteComm等函数打开、关闭和读写串口。
但在Win32中,串口和其他通信设备均被作为文件处理,串口的打开、关闭和读写等操作所用的API函数与操作文件的函数相同。
可通过CreateFile函数打开串口,通过CloseFile函数关闭串口,通过CommProp、DCB结构、GetCommProperties、SetCommProperties、GetCommState及SetCommState等函数设置串口状态,通过函数ReadFile和WritFile读写串口。
VC++ 6.0是Windows应用程序开发的主流语言之一,它具有良好的图形设计界面并支持面向对象的程序设计方法。
本文结合一个实例介绍在VC++ 6.0下如何利用Win32 API 实现串行通信程序。
实现原理本文的实例来自一个水泥发货系统,在系统中,需要将通过总量传感器采集到的仓重值传入到计算机中,以便系统做出相应的处理。
这需要使用串行通信来完成采集数据的传递工作。
对于串行通信设备,Win32 API支持同步和异步两种I/O操作。
同步操作方式的程序设计相对比较简单,但I/O操作函数在I/O操作结束前不能返回,这将挂起调用线程,直到I/O操作结束。
异步操作方式相对要复杂一些,但它可让耗时的I/O操作在后台进行,不会挂起调用线程,这在大数据量通信的情况下对改善调用线程的响应速度是相当有效的。
异步操作方式特别适合同时对多个串行设备进行I/O操作和同时对一个串行设备进行读/写操作。
1 引言在很多情况下,远程监控和工业自动化领域系统经常采用串并口通信编程,其中串行接口被广泛地应用于工程实践的长距离通信中。
运用Windows通信API可以在Windows 环境下进行串口编程,不用对硬件直接进行操作,并通过VC、VB和Delphi等语言进行调用,大大方便了对数据的处理。
本文对和串口通信相关的32位Windows API函数进行了介绍,并给出了相应的程序实例。
2 Windows API简介Win32 API作为Microsoft 32位平台(包括:Windows 9x,Windows NT3.1/4.0/5.0,WindowsCE)的应用程序编程接口,它是构筑所有32位Windows平台的基石,所有在Windows平台上运行的应用程序都可以调用这些函数。
API是windows的核心,从事Windows应用程序开发,离不开对Win32 API函数的调用。
只有充分理解和利用API 函数,才能深入到Windows的部,充分挖掘系统提供的强大功能和灵活性。
3 Windows API相关串口通信函数介绍在32位的Windows系统中,串口通信是作为文件处理的,串口操作一般为的打开、关闭、读取、写入等操作,相应的Windows API 函数如下:3.1 打开和关闭串口1 打开串口在Windows系统中串口通信会话以调用CreateFile ( )函数开始。
CreateFile ( )函数可以读写访问串口,并返回一个句柄,并在以后的端口操作中使用。
现其他初始化工作。
2 关闭串口关闭串口通过调用CloseHandle ( )函数关闭由CreatHandle ( )函数返回的句柄来完成。
3.2 串口配置和串口属性在用CreatFile ( )函数打开串口后,系统将根据上次打开串口时设置的值来初始化串口,可以集成上次打开操作后的数值,包括设备控制块(DCB)和超时控制结构(COMMTIMEOUTS)。
Modbus rtu通信协议串口通讯动态链接库DLL(以下简称DLL),是为满足工业通信需要,针对工业领域要求上位机对PLC、工业仪表通讯实时采集与控制的组态编程而设计。
本DLL是采用Delphi语言开发的标准串口通讯库,具有以下特点:1)、遵循modbus rtu串口通讯协议(施耐德、西门子、台达、永宏等品牌PLC及各类工业仪表等支持本协议);2)、实时性、可靠性好,通用性强;3)、适用于多PLC联网和上位机通信,满足多方面的需要(联网时可采用485总线式);4)、函数接口功能全,操作简单,支持modbus的大部分读写功能函数;5)、附加实用转换与读取函数,易于快速开发(VC等非RAD开发环境的开发);6)、支持USB、PC扩展卡等扩展串口号;7)、支持多种操作系统win9x/win2000/winXP(标注Win32 DLL);8)、可在多种编程环境下使用,例如VB、VC、Delphi等开发环境。
9)、支持modbus rtu标准的功能代码01、02、03、04、05、06、15、16且对相关功能代码的读取和写如做了一些扩充更加符合工业自动化领域的工控软件的开发,是广大工控工程师的必备工具软件。
二、modbus rtu通讯协议简介Modbus 协议是应用于电子控制器上的一种通用语言。
通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。
它已经成为一通用工业标准。
有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。
它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。
它制定了消息域格局和内容的公共格式。
当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。
如果需要回应,控制器将生成反馈信息并用Modbus协议发出。
plc和计算机间串行通讯程序设计PLC和计算机间的串行通讯可以通过多种协议,如RS232、RS485、Modbus等进行。
其基本原理是通过串行通讯口将PLC和计算机连接起来,然后通过编程实现对PLC进行读写操作,以实现数据的交换。
具体的串行通讯程序设计需要考虑以下几个方面:
1. 确定通讯协议:在实现串行通讯时,需要确定通讯协议,比如RS232、RS485、Modbus等,然后根据协议要求对通讯口进行配置。
2. 配置串行通讯口:对于不同的通讯协议,需要对串行通讯口进
行不同的配置,如波特率、数据位、校验位等。
3. 编写数据收发程序:通过编写数据收发程序,可以实现对PLC
和计算机之间数据的交换。
一般来说,先发送数据请求给PLC,PLC接
收请求后返回数据,然后计算机再对收到的数据进行解析和处理。
4. 错误处理:在实际的串行通讯中,可能会发生各种错误,如通
讯中断、数据异常等,需要对这些错误进行处理,以保证程序的稳定
性和可靠性。
总的来说,串行通讯程序设计需要充分了解通讯协议和串行通讯
口的相关知识,同时需要对PLC和计算机之间的通讯进行严谨的设计
和实现,以确保程序的正常运行。