2023年6月22日发(作者:)
基于will32AH函数的PLCsPC串行通信低压电器(2∞6№10)基于Will32API函数的PLC与PC串行通信束长宝,陈兴,史旺旺,蒋步军(扬州大学信息工程学院,江苏扬州225009)摘要:串行通信是计算机监控系统中一种常用的通信方式。通过具体程序,介绍了如何利用Vc++6.o中基础类库MFc封装的win32API标准通信函数,实现第一作者:束长宝omroncPMlAPLc与PC间的串口通信。(1969一),男,讲师,关键词:串行通信;API函数;可编程逻辑控制器;VisualC++硕士,主要从事电中图分类号:TN919;TP31l文献标识码:A文章编号:1001—5531(2006)10—0017m4气自动化、计算机控制等方面的教学和科研工作。SerialCommunicationbetweenPLCandPCBasedonWiIl32APIFunctionsHUChcmg-bao,CHENX汛g,sHIW棚tg一协omg,JIANGBu.jun(InstituteofInformationTechnology,YangzhouUniVersity,Yangzhou225009,China)Abstmct:Serialcommunicationisacommonlyusedcommunicationmodeinsystemofcomputersupervisorycontml.Inthispaper,amethodwasintmducedtocommunicatebetween0ⅡlronCPMlAPLCandPCviaserialin—terfacebyusingastandardcommunicationfunctiono“heenc印sulatedWiIl32APIinvisualC++’sMFC.Keywords:serialcommuIIi∞ti蛐;APIfunction;pmgr锄mabIelo西ccontroller(PLC);visualC++O引言该市内河水位控制及引水冲污控制任务。其中,系统关于闸门监控的基本功能要求如下:实现闸可编程逻辑控制器(ProgrammableLogic门开度、闸门上下游水位的检测,闸门的提、落、停controller,PLc)作为工业控制器,以其高可靠性、的手动、自动控制,并根据闸门流量模型计算过闸高性价比被广泛应用于工业生产各领域。由于人流量;实现闸门开度和流量的自动或手动控制。机交互方面的不足,在工控领域PLc一般作为下闸门现场监控系统的主要硬件配置如图1所示。位机使用,而用Pc机或工业计算机(IPC)作为上闸门提落停输入、闸门状态、位机完成数据处理和存储、系统状态显示,实现系开度检测辅助信号水位统的实时监控¨j,达到管理控制一体化目的。在控制系统中,Pc机与PLc需进行串行通信,对实嘲拦到跚爻时性要求较高,多采用Vc++来编程实现。用,竖飘㈢淼竖!!!ll(主弑凳)悉㈣Vc++设计的程序执行速度快、效率高、灵活性罴一I明I】输出控制摄像头、五台控制好,比商用组态软件节省投资,可与windowsAPI(ApplicationProgramInte血ce)函数无缝链接。在图1串行通信程序流程windows9X/NT/2000中,API一般都支持32bit现场监控单元PLC选用0mronCPMlA40cDR主的操作,故又称为Win32API。机单元加cPMlA-20EDR扩展单元及MAD02模1工程实例拟量单元,PLc通过cIF01通信适配器与上位工控机RS-232C串口连接,现场工控机为研华IPC一江苏省某市水利局的黄村闸、三水闸承担着610型。万方数据一17一低压电器(2006№10)基于will32APl函数的PLCsPC串行通信2串行通信方案Rs一232c协议是0SI协议体系中基于物理在PLc与上位机通信过程中,通信数据以“帧”为单位传送。上位机一般具有优先权并启动通信,发命令帧给PLC,PLc收到后自动发响应帧。上位机可通过读写PLcDM数据存储区或TR寄存器区的信息实现PLc的数据采集和输出控制。为了提高计算机获取信息的正确性,数据采用FCS帧校验方式。字符@作为帧的开始;:|:作为命令的结束;不可见字符cHR(13)作为帧的结束一1。如@02RD0000001055:}:cHR(13),意为卜位机读取节点号为2的PLc的DM数据区0000开始的10个字的数据;55为Fcs帧校验码;响应帧为@00RD00478954水;4789为读取的数据;54为FCs校验码。以读取数据存储区DM的数据为例,命令帧与响应帧格式如图2所示。层的通信协议,直接负责与硬件打交道,而Vc++与其他高级语言相比,在通信方面具有较大的优势。应用VC++开发串行通信主要有两种方式’2.3J:①采用Mscomm串行通信控件,通信程序设计简单,但控件占用的资源多、灵活性差,且对二进制通信的支持不够好,只适用于要求不高的小型控制系统;②直接调用win32API函数实现对Rs-232串口的访问,虽程序设计涉及底层编程,较复杂,但控制灵活、响应速度快,适用于要求较高的实时监控系统。2.1串行通信协议OmronPLC串行通信采用HOSTLink协议,命令帧格式响应帧格式图2通信帧格式2.2串行通信实现File()。调用方法为采用异步读写方式打开串口COMl:HANDLEm—hCom;串行通信流程如图3所示‘5I。6nn通信参数的初始化lm—hCom=Create-’ile(“COMl”.GENER【C—READl(;E————1——一l宣垫堡垡堡I《妒卜———一i羔发读命令帧NERIC—WRITE,O,NULL,0PEN—EXISTING,FILE—FLAG一0VERLAPPED,NULL);其中:COMl为要打开的串口逻辑名;GENERIC—READlGENERIC—WRITE表示端口访问类型为向相应的PLc单元l读、写皆可;0表示串口是不共享;NuIJI.为安全性属性结构缺省值;0PEN—ExIsTING意为不创建新串口,仅打开已存在的串口,为必须的设置参数;FILE—FLAG一0VERLAPPED作为一关键参数,表明串口设置采用异步通信模式,可进行重叠操作;最后一个参数是指向模板文件的句柄,对于串口,此值必须为NULL¨J。2.2.2蚤(堕盎)图3串行通信程序流程2.2.1配置串口串口打开后其属性被设置为默认值,配置串口通过改变设备控制块DcB的成员变量值来实现,配置内容主要有串口号、波特率、数据位、有无奇偶校验、停止位等,这些参数应与PLc的设打开串口win32中用于打开串口的API函数为Create.一18一万方数据基于will32AH函数的PLcsPC串行通信置相同。以下程序将串口设置:波特率9600,数据位数7bit,停止位2bit,偶校验,接收缓冲区和发送缓冲区大小均为1024Byte。DCBdcb:Getcommstate(m—hcom,&dcb);//读当前端口的DcB设置dcb.fParity=TRuE;//允许奇偶校验dcb.BaudRate=9600;//波特率9600dcb.Bytesize=7;//7bit数据位dcb.Parity=EVENPARITY;//偶校验dcb.stopBits=7研0sTOPBITS;//2b“停止位setcommstate(m—hcom,&dcb);//将修改后以后的串口设置写入setupcomm(m—hcom,1024,1024);//接收缓冲区和发送缓冲区大小各为】024Byte从监控系统可靠性角度考虑,还需要设定串口通信超时参数、清除接收和发送缓冲区等,分别使用SetcommTimeouts(m—hcom,&Timeout),PurgeComm(m—hCom,PURGE一7ⅨABORTfPURGE—RXABORTPURCE—TXCLEARPURGE—RX.cLEAR)函数实现。2.2.3异步机制及通信事件(1)采用异步L/O。采用异步串口通信方式,并适当定义线程优先级,可以使应用程序有更多的时间处理人机接口和其他任务,最大限度保障通信的实时性。Win32系统环境下异步L/O操作也称作重叠(overlapped)操作,它能使用户程序在执行外部操作时同时处理其他任务MJ。以异步方式打开的设备或文件,其L/o操作都必须指定一个0VERLAPPED数据结构,并初始化它的hEvent成员。当L/0完成后hEvent事件旬柄变为有信号状态,通知线程L/O已完成。初始化了OVERLAPPED结构之后可起动异步L/0了。利用ReadFile和writeFile函数实现异步L/O操作,由Getoverl印pedResult()函数获取结果,该函数最末的参数设为TRUE,表示该函数知道L/0操作完成后才返回;函数调用成功,则返回值不为零;否则返回值为零,线程可以通过调用GetLastError()获取进一步的信息。(2)采用事件驱动L/O方式,在出现期望的串口驱动事件(如收到数据或发送完成)时及时发送事件标志信号,通信线程及时处理该事件,应用程序不需要为接收字节而连续不断地检测端万方数据低压电器(2006№10)口,从而节省CPU时问,极大地提高了串口通信的相应速度∞J。windows可以报告给应用程序的事件由函数GetCommMask(m—hComm,EV—RXCHA)返回。应用程序使用函数SetcommMask(m—hComm,EV—RxcHAEV—RxFLAG)建立事件掩码来监视指定通信资源上的事件。在用setCommMask()指定了有用的事件后,应用程序就调用Waitcom—mEvent()来监视通信事件,等待事件发生。2.2.4读数据(1)启动接收线程。win32提供了两种不同类型的线程,一种是用户接口线程,用于处理接收到的消息;另一种是工作线程,常用于后台执行任务,如串行通信等费时的操作Mo。本文通信线程使用工作线程,用于监视串口事件,为后台采集数据,工作线程用不会引起重入的PostMessage()向用户接口线程发送windows消息,通知用户接口线程一段数据发送完或收到对端发来的数据。串行口打开和设置完成后,通过函数AfxBe.ginnrea“)启动读线程,CWinThread术pRecvThread=AfxBeginThread(RecvThread,this,THREAD—PRl0RITY—NORMAL,0,CREATE—SUSPENDED,NULL)其中,THREAD—PRIORIrI’Y—NORMAL指定了本线程的优先级。(2)读数据。读线程内的读数据过程在自定义的函数ReadComm()中实现,在调用ReadFile()读串行口前,先调用clearcommError()确定接收缓冲区内的数据量,并在此基础上加1,并延时lms,等待帧结束符米后的回车符的到来,这样可读取完整的一帧:length=“n(dwLength,ComStat.cbInQue+1);//确定读缓冲区字节数,加1读回车键if(1en射h>1)Sleep(1);fReadStat=ReadFile(m—hCom,buf,len殍h,&len殍h,&m—osRead);//&m—osRead为0VER—LAPPED结构if(!fReadstat)//读出数据量小于希望的数据量,返回0{if(GetI丑stError()==ERROR—10一PENDING)//一19—低压电器(2∞6№10)基于wiIl32AH函数的PLCsPC串行通信等待结果中2.2.5写数据发送线程和写数据与接收线程和读数据类GetoverlappedResult(m—hCom,&m—osRead,似,此略。本文接收、发送数据分别使用独立线&len封h,TRuE);//获取异步操作结果程,这样做有利于编程,程序流程简洁,尤其适合全双工通信方式。数据读、写完之后,调用closeHandle(m—在接收线程中,用waitcommEvent()函数监hCom)即可关闭串口,释放串口资源、终止线程。视通信事件,等待事件发生:3结束语if(!waitcommEvent(pRecv一>m—hCom,&dwEvtMask,&os))//&os指向一个0VER—本文采用VisualC++6.0Win32API函数,LAPPED结构基于多线程、异步I/O操作和事件驱动的串行通信技术,实现0MRONc系列PLc与IPc之间的if(GetLastError()==ERROR—10一PENDING)串行通信,并成功应用于某水利局的闸门现场实时监控系统中,满足了系统功能要求。经过数年GetoverlappedResult(pRecv一>m—hCom,&os,运行表明,系统具有实时性好、可靠性高、投资少&dwnans,TRuE);//获取异步操作结果if((dwEvtMask&EV—RXFLAG)==EV—Rx—等优点。FLAG)//事件发生【参考文献】length=pRecv一>ReadComm(pRecv一>pNex—l二刘琦,王鹏.用Visualc++实现上位机与PLctRecvchar,MAxBL0cK);//读缓冲区之间通信[J].机电工程,2004,21(2):19-22.PostMessage(pRecv一>m—hTe瑚Wnd,pRecv一>心李晓明,李东晓.基于Visualc++6.0实现Pc与m—Msg,EV—RXFIAG,PLc的通信[J].电测与仪表,2001,38(7):4144.pRecv一>HLdTotalRecvkngth);旧徐世许.可编程序控制器原理应用网络[M].合肥:中国科技大学出版社,2000.M陈细军,谭民.Vc编程中的串口通信技术[J].计算机应用,2001,21(9):94—95.(3)读完完整的一帧数据后,用不会引起重凹1J李现勇.VisualC++串f_:_I通信技术与工程实践人的PostMessage()向指定窗口的消息队列发送(第2版)[M].第2版.北京:人民邮电出版社,通知消息,相应地在该窗口建立消息与成员函数2004.间的映射,用0N—MEssAGE将消息与成员函数№1J罗云虎.一种利用WiIl32API函数实现串l_::1实时通信的方法[J].现代电子技术,2004(11):70一73.名关联。收稿日期:2006D4.08(上接第16页)保护系统[J].低压电器,2000(6):21-24.【参考文献】[3]马忠梅.A四1系列ARM核微控制器结构与开发[1]周捷,宋云翔,徐劲松,等.直流牵引供电系统的[M].北京:北京航空航天大学出版社,2003.微机保护测控探讨[J].电力系统技术,2002(12):[4]苏奎峰.TMS320F2812原理与开发[M].北京:电57和.子工业出版社,2005.[2]蔡彬,陈德桂.城市轨道交通直流供电的控制和收稿日期:2006.0300一20—万方数据
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687428526a9321.html
评论列表(0条)