plc串行通信

2025-01-21 版权声明 我要投稿

plc串行通信(精选8篇)

plc串行通信 篇1

HG-2003型温升测控装置是笔者与我国北京某科学研究联联合开发的一套专门用于高压晶闸管阀温升检测试验的测控装置。考虑到PLC及其网络已被公认为现代测控装置开发的几大支柱之一,而且从近几年的统计数字来看,PLC产品在世界范围内的产量、销量高居各测控器件榜首,因此笔者决定本测控系统的核心器件采用可编程控制器(PLC),其基本功能可通过软件编程实现。PLC的三大亮点是:(1)集电控、电传、电仪三电于一体;(2)网络的性能价格比高;(3)可靠性高。这些亮点就使得整个测控设备结构简单、可靠性高,同时也为实现系统控制功能的二次开发奠定了良好的技术基础。本文主要讨论设备中所采用的西门子公司的S7-200型PLC和PC机之间的串行通信问题。

1、温升测控系统整体介绍

1.1 HG-2003测控装置的测控对象及结构

先来介绍一下该温升试验测控装置的基本工作流程。10kV电源进线经过进线框中的高压断路器CB和高压隔离开关柜中的隔离开关G(用于在设备检修或维护时形成一个明显的断点)后,加在10kV转换变压器T1上。该变压器将三相电转化为单相电。这主要是由于做实验时负载电流很大,如果使用三相电源,容易造成负荷电流的不平衡从而造成试验故障。在转换变压器的输出端(二次侧)连接单相温升试验变压器T2。该温升变压器的一次侧应加装用于无功功率补偿的电容柜,二次侧则通过有载分接开关直接连接试验品(即高压晶闸管阀)进行温升试验。

从基本工作流程不难知道测控装置的测控对象,本装置的具体测控对象如表1所示。

表1 测控对象表

测控装置的物理结构分为两部分:操作控制台和试区控制箱。其中,试区控制箱即PLC控制箱被安装在试验区的隔离开关框内。操作控制台即PC机人机办是非曲直操作台则安装在控制室内。由于二者之间相距约40m,所以采用PC/PPI电缆传输测控信号时需加装中继器。

1.2 HG-2003测控装置的基本功能

本测控系统的基本功能包括:开关分合控制指示功能;设备和试品的过流、过压、过热报警及保护功能;各种操作连锁功能,如电源开关柜内10kV电源断路器和隔离开关柜内的手动隔离开关、控制室门触点、试验大厅门触点间的连锁保护功能等,并设有相关的报警提示画面。这些功能可以避免操作顺序出错。

2、S7-200通信程序的设计与实现 2.1 PC机与S7-200的通信方式

西门子S7-200 PLC的通信功能较强,有多种通信方式可供用户选择,如:单主站方式、多主站方式以及使用调制解调器的远程通信方式等。在本测控装置中,笔者采用单主站方式。在运行Windows或Windows NT操作操作的个人计算机(PC机)上安装STEP 7-Micro/WIN32编程软件后,PC机就可作为通信中的主站。它可与一个或多个从站相连,STEP 7-Micro/WIN 32每次和一个S7-200 CPU通信,但可以访问网络上的所有CPU。该通信方式的硬件配置为PLC到PC机通信口的电缆连接器,即带RS-232口的隔离型PC/PPI电缆,用五个DIP开关设置波特率和其它配置项。它支持的波特率为9.6kbps或19,2kbps,支持的协议为PPI协议。这里并没有使用PPI协议,而是使用PC/PPI电缆和自由端口通信功能来实现S7-200 CPU与PC机间的通信。自由端口模式是计算机或其它带有串行通信接口的设备与S7-200 CPU之间通信的一种廉价和灵活的方法。它以用户定义的通信协议为基础,通过使用相关的中断指令和专用的通信指令控制S7-200 CPU通信口的操作模式,实现与多种智能设备的连接。

具体地说,所谓自由通信端口模式是指CPU的串行通信接口可由用户程序控制的一种通信操作模式,其梯形图程序可以使用接收完成中断、字符接收中断、发送完成中断、发送指令(XMT)和接收指令(RCV)等控制通信过程。在该模式下,通信协议完全由用户程序控制。

CPU处于STOP模式时,自由通信端口模式被禁止,CPU重新建立使用其它协议的通信,例如与编程设备的通信。只有当CPU处于RUN模式时,才能使用自由通信端口模式。通过将特殊寄存器字节SM30或SM130的协议选择域(mm)置1可以将通信端口设置为自由端口模式,处于该模式时不能与编程设备通信。

可以用反映CPU模块上的工作方式开关当前位置的特殊存储器位SM0.7来控制自由端口模式的进入。当SM0.7为1时,工作方式开关处于RUN位置,可选择自由端口模式;当SM0.7为0时,工作方式开关处于TEM位置,应选择PC/PPI协议模式,以便用于编程设备监视或控制CPU模块的操作。

2.2 自由端口模式下PLC串行通信程序的编程要点

计算机与可编程控制器通信时,为了避免通信中的各方争用通信线,一般采用主从工作方式,即计算机为主机,可编程控制器为从机;只有主机才有权主动发送请求报文,从机收到后返回响应报文。下面主要谈一谈编程过程中应注意的几个问题。

首先是电缆切换时间的处理。因为使用了PC/PPI电缆,所以在S7-200 CPU的用户程序中应考虑电缆的切换时间。S7-200 CPU接收到RS232设备的请求报文到它发送响应报文的延迟时间必须大于等于电缆的切换时间。波特率为9600bps和19200bps,电缆的切换时间分别为2ms和1ms。在梯形图程序中可用定时中断实现切换延时。

其次就是通信可靠性的处理,校验码的采用是提高通信可靠性最常用的措施之一。用得较多的是异或校验,即将每一帧中的第一个字符(不包括起始字符)到该帧中正文的最后一个字符作异或运算,并将异或的结果(展品或校验码)作为报文的一部分发送到接收端。接收方接收到数据后计算出所接收到的数据的展品或校验码,再与发送方传过来的校验码比较,如果不同,可以判断通信有误。

最后需注意的是防止起始字符、结束字符与数据字符的混淆。因为报文的起始字符和结束字符只有8位,接收到的报文数据区内出现与起始字符或结束字符相同的数据字符的机率很大,这可能会引起字符混淆。可以在发送前对数据作某种处理,例如选择起始字符和结束字符为某些特殊的值,而将数字字符转化为BCD码或ASCII码后再发送,这样可以避免出现上述的情况,但是会增加编程的工作量和数据传 送的时间。2.3 通信程序中关键指令的使用与说明

发送指令XMT(Transmit)用于启动自由端口模式下数据缓冲区(TBL)数据的发送,指令格式如图1所示。通过指定的通信端口(PORT),将存储在数据缓冲区(TBL)中的信息发送。使ENO=0的错误条件:SM4.3(运行时间),0006(间接寻址),009(在端口0同时XMT/RCV),000B(在端口1同时XMT/RCV)。

XMT指令可以方便地发送1~255个字符,如果有中断程序连接到发送结束事件上,在发送完缓冲区中的最后一个字符时,端口0会产生中断事件9,端口1会产生中断事件26。可以监视发送完成状态位SM4.5和SM4.6的变化,而不是用中断进行发送。数据缓冲区中的起始字符和结束字符是可选项,第一个字节的“字符数”是要发送的字节数,它本身并不发送出去。

接收指令RCV(Receive)可以方便地接收一个或多个字符,最多可接收255个字符。通过指令的通信端口(PORT),将接收信息存储在数据缓冲区(TBL)中。数据缓冲区中的第一个字节用来累计接收到的字节数,它本身不能接收到,起始字符和结束字符是可选项。如果有中断程序连接到接收结束事件上,在接收完最后一个字符时,端口0产生中断事件23,端口1产生中断事件24。

使ENO=0的错误条件:SM86.6和SM186.6(RCV参数错误),SM4.3(运行时间),0006(音接寻址),009(在端口0同时XMT/RCV),000B(在端口1同时XMT/RCV)。CPU不是在自由端口模式。

可以监视SM86.6或SM186.6的变化,而不是用中断进行报文接收。SM86.6或SM186.6为非零时,RCV指令未被激活或接收已经结束。正在接收报文时,它们为0。

当超时或校验错误时,要自动中止报文接收功能。必须为报文接收功能定义一个启动条件和一个结束条件。

RCV指令允许通过参数设定选择报文开始条件和报文结束条件,即设定特殊存储器字节SM86~SM94(用于端口0)和SM186~SM194(用于端口1)。

另外两个比较重要的指令是获取与设置通信口地址指令。获取通信口地址指令(GET ADDR指令)用来读取PORT指定的CPU口的站地址,并将数值放入ADDR指定的地址中。设置通信口地址指令(SET ADDR指令)用来将通信口(PORT)站地址设置为ADDR指定的数值。设置的新地址不能永久保存,断电后又上电,通信口地址将恢复为上次的地址值(用系统块下载的地址)。图2为使用RCV指令和接收完成中断接收数据的通信程序流程图。

3、计算机通信程序的设计与实现

3.1 Windows环境下的PC机通信程序 在Windows环境下,操作系统通过驱动程序控制各硬件资源,不允许用户像在DOS环境下那样直接对串口进行底层的操作。为此,Visual Basic提供了一个串行通信控件:MSComm控件。程序员只需设置和监视MSComm控件的属性和事件,就可以劲易而易举地实现串行通信。

3.2 MSComm控件的属性

MSComm控件主要属性如下:(1)Comm Port:设置并返回通信端口号。(2)Settings:以字符的形式设置并返回波特率、奇偶校验位、数据位和停止位。其中字符n、o、e分别代表无校验、奇校验、偶校验。(3)Port Open:设置并返回通信端口状态。设置为Ture时,打开端口;设置为Flase时,关闭端口。另外,还有Input、Output、Input Mode、In Buffer Count等属性,这里不再一一介绍。3.2 MSComm控件处理接收信息的方式

MSComm控件提供两种处理方式:(1)事件驱动方式:RTHreshold属性非0时,收到字符或传输线发生变化时就会产生串口事件On Comm。通过查询CommEvent属性可以捕获并处理这些通信事件。(2)查询方式:通过查询Iuput Buffer Count(接收缓冲区的字节数)属性值,处理接收到的信息。本装置中采用事件驱动方式。

用Visual Basic语言设计串行通信程序简单实用,关键是如何形成一个友好的用户界面。编程的细节这里不再详述。

plc串行通信 篇2

关键词:PLC,通信协议,VB6.0,串行通讯

可编程逻辑控制器 (PLC) 以其高可靠性、模块化结构、编程简单等优点, 在工控领域得了广泛应用。在绝大多数中小型控制系统中, 上位机与PLC的数据交换必不可少, 比如上位机对PLC的监控等, 如何实现两者的快速稳定通讯是每个控制系统需要考虑的问题。本文在VB6.0平台下, 依据三菱PLC的通信协议, 使用MSComm串行端口控件, 仅以简单串口连接线作为硬件连接, 即实现了PC机与FX2N系列PLC的稳定、快速通讯, 且该上位机系统可实现即插即用, 使用非常方便。

1 FX2n系列PLC的通信协议

使用三菱FX系列PLC通信协议进行PC与PLC的串行通讯时, 采用RS-232C设计标准, 需将PC通讯串口的通讯参数设置为9600, e, 7, 1。

1.1 PLC通信命令代码

对PLC的串行通讯所用命令如 (表1) 所示, 其中X表示输入开关量;Y表示输出开关量;M表示辅助开关量;S表示状态开关;T和C分别是定时器和计数器;D表示数据存储单元。

1.2 PLC通信控制指令

PC与PLC串行通讯的通信命令代码表明了PC对PLC可操作的对象及其状态, 那么用什么指令去控制这些对象使其实现所需的状态, 如表2所示, 使用表中相应控制指令实现, 其中的字符代码需用其ASCII码的十六进制 (0X) 表示。在VB6.0平台下, 若想使用“ENQ”, “ACK”, “STX”, “NAK”来代替相应的Ascii码值, 需要在程序段中加入“ENQ$=Chr$ (5) ”等程序语句。单字符数据传送格式如 (图1) 所示, 每个ASCII字符都遵循此原则, 首位起始位, 紧接7个数据位 (前低位, 后高位) , 1位偶校验, 1位停止位, 其波特率应设置为9600bps[4]。

2 基于通信协议的通讯报文分析

PC与PLC的通讯采用的“请求发送-回复应答”的通讯方式, 在此过程中, PC首先发送通讯请求给PLC, 即发送ENQ字符, 等待PLC的回复应答, 如果PLC返回ACK字符, PC读到给字符后, 则认为回复正确, 然后发送报文信息, 待PLC收到报文命令后会回复PC相应回复报文, 通讯就是以这个过程逐次发送报文的。如果PLC回复给PC的是NAK, 说明应答错误, 这种情况下, PC会再重新发送请求。下面通过实例对PC-PLC串行通讯的报文进行分析。

3 VB平台下通讯编程

VB6.0平台下, 有个串口专用控件, 名称为MSComm, 通过对该控件进行指令控制, 即可实现对表1中所有软元件的读和写操作, 也可置位或复位软开关。此过程不受PLC是否处于RUN状态影响[5]。

使用VB中的控件MSComm进行串行通讯设计, 其具体步骤如下: (1) 对通讯对象及所使用端口号进行属性设置; (2) 通讯协议设定及通讯报文准备; (3) 开通讯、传数据; (4) 通讯应答信号反馈; (5) 关通讯。

4 结语

系统所设计的通信设备的硬件连接方式和通信程序已成功应用于以FX2N系列PLC为主控器的剪切系统中, 通过实践证明, 系统有以下几个突出优点: (1) 系统不需外加三菱的任何专用通信板, 即可实现PC机-触摸屏-PLC的完美通信; (2) 应用三菱PLC通信协议进行通信, 不需对D8120进行设置, 不但简化了PLC程序, 而且通讯稳定可靠。 (3) 在有触摸屏进行现场控制的同时, VB开发的PC机监控程序可同时实现远程监控, 更独特的是PC机监控系统是即插即用模式, 可随时与系统分离, 这样对实验数据可方便地进行离线处理。 (4) 基于vb6.0平台的监控软件, 功能强大、经济实用界面友好、针对性强。

参考文献

[1]三菱公司.FX2N系列微型可编程控制器使用手册[M].上海:2008.

[2]三菱公司.MITSUBSHI FX通讯手册 (RS-232C, RS485) [M].上海:2007.

plc串行通信 篇3

关键词:串行通信;RS-232串口;LabVIEW

中图分类号:TP273 文献标识码:A文章编号:1007-9599 (2011) 11-0000-01

Double Computer Serial Communication Based on LabVIEW

Xu Qiujing1,Zhao Qiuying2,Song Yi1

(1.Harbin Huade University,Harbin150025,China;2.Northeast Petroleum University Huarui Institute,Harbin150028,China)

Abstract:When Terminal and computer orbetween computers exchanging information,in addition to the use of parallel means of communication,often uses serial communication mode.The paper used LabVIEW as a programming language,introducing in the LabVIEW programming environment,how to realize the double computer serial communication.

Keywords:Serial communication;RS-232 serial port;LabVIEW

一、串行通信

串行通讯是我们最容易接触到的一种通讯方式。终端与计算机之间或者计算机与计算机之间进行交换信息时,除了采用并行通讯方式之外,还经常采用串行通讯方式。串行通讯是指数据一位一位地按顺序传送,当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需三根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。当两台RS-232串口设备通信距离较近时(一般在十米左右),可以用电缆线直接将两台设备的RS-232端口连接;若通信距离较远时,需附加调制解调器。

在实际使用中常使用串口通信线将两个串口设备连接起来。串口线的制作方法非常简单:准备两个9针的串口接线端子(因为计算机上的串口为公头,因此连接线为母头),准备3根导线(最好采用3芯屏蔽线),按图1所示将导线焊接到接线端子上。

图1.串口通信线的制作

图1所示的2号接收脚与3号发送脚交叉连接是因为在直连方式时,把通信双方都当作数据终端设备看待,双方都可发也可收。在这种方式下,通信双方的任何一方,只要请求发送RTS有效和数据终端准备好DTR有效就能开始发送和接收。

二、LabVIEW

LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。

LabVIEW中有关串口的函数选板它位于函数→仪器I/O→串口,主要包括VISA配置串口、VISA写入、VISA读取、VISA关闭、VISA串口字节数、VISA串口中断、VISA设置I/O缓冲区大小、VISA清空I/O缓冲区八个函数构成。注意:在LabVIEW需安装VISA的驱动程序才能正常使用串口。

三、LabVIEW主要程序面板设计如图2

图2.LabVIEW程序面板设计

四、LabVIEW前面板设计及运行

在两台计算机上分别运行此程序,运行结果如图3所示:

图3.LabVIEW前面板设计及运行结果

参考文献:

[1]马秀龙,董浩斌.基于LabVIEW串口通讯的多路数据采集系统[J].工业控制计算机,2008,21(5):14-15

[2]张桐,陈国顺.精通LabVIEW程序设计[M].北京:电子工业出版社,2008

plc串行通信 篇4

(1)打开和关闭串行端口

CreateFile函数用于打开串行口。

hPort=CreateFile(TEXT(“COM1:”),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL)。注意COM1后要有一个冒号。最后一个参数dwFlagsAndAttributes必须为0,因为Windows CE只支持非重叠I/O。第3个参数dwShareMode也必须为0,通信端口不能像文件一样被共享。这个函数的返回值是已打开的串行端口的句柄或者是INVALID_HANDLE_VALUE。

关闭串行口可以调用CloseHandle(hPort)。

(2)配置串行端口

配置串行口主要是用DCB结构配置端口设置,包括波特率、停止位、数据位长度、校验位、流量控制等等,还有配置超时值。

首先打开串行端口,用GetCommState函数获得当前打开串口配置,然后根据需要修改DCB成员,最后用SetCommState函数设置新的串口配置。

DCB PortDCB; //创建DCB变量

Port.DCB.DCBlength=sizeof(DCB);

GetCommState(hPort,&PortDCB); //获取当前串口配置修改DCB成员

PortDCB.BaudRate=9600; //波特率

PortDCB.Parity=NOPARITY; //校验位

PortDCB.StopBits=ONESTOPBIT; //停止位

PortDCB.ByteSize=8;

.

.

.

SetCommState(hPort,&PortDCB); //设置新的串口配置

对串行端口来说,必须配置超时值,否则程序可能陷入到一个循环来等待来自串口的字符。这对采用Windows CE的设备来说,将大大减少设备电池的使用时间,所以超时值是需要配置的。另外一种解决办法就是采用多线程。多线程将在下一部分讲述。

通常,配置超时值和配置串口类似。首先用GetCommTimeouts函数获得当前串口的超时值。然后可以修改COMMTIMEOUT成员,最后用SetCommTimeouts函数设定超时值。

COMMTIMEOUTS CommTimeouts; //定义COMMTIMEOUTS结构

GetCommTimeouts(hPort,&CommTimeouts); //获得当前的超时值

//修改COMMTIMEOUT成员

CommTimeouts.ReadIntervalTimeout=MAXDWORD;

CommTi

meouts.ReadTotalTimeoutMultiplier=0;

CommTimeouts.ReadTotalTimeoutConstant=0;

CommTimeouts.WriteTotalTimeoutConstant=1000;

CommTimeouts.WriteTotalTimeoutMultiplier=10;

SetCommTimeouts(hPort,&CommTimeouts); //设定超时值

(3)读写串行端口

用ReadFile和WriteFile函数读写串行口。

int rc;

DWORD cBytes;

BYTE ch;

Rc=ReadFile(hPort,&ch,1,&cBytes,NULL);

其中第一个参数是串口句柄,第2个参数是读回的字符,第3个参数是要读取的字符数量,第4个参数返回实际读取到的字符数量。

Int rc;

DWORD cBytes;

BYTE ch=TEXT(“a”);

Rc=WriteFile(hPort,&ch,1,&cBytes,NULL);

其中第一个参数是串口句柄,第2个参数是要写入的字符,第3个参数是要写入的字符数量,第4个参数返回字符写入的字符数量。

需要注意的是Windows CE不支持重叠I/O,所以如果在主线程进行大量读写串口操作时,有可能使整个程序陷入缓慢的串口等待中去,因此一般都采用多线程来进行读写串口操作。

(4)通信事件

在Windows CE编程中,除了可以采用单独的线程来处理读写串口操作外,还可以采用利用通信事件的方法。通信事件就是当发生重要事件时,Windows CE向应用程序发送的通知。利用WaitCommEvent函数阻塞线程,直到特定的事件发生。一般的使用方法是:先用SetCommEvent函数指定要查找的一个或多个事件,然后,调用WaitCommEvent函数,并指定导致这个函数返回的事件。当WaitCommEvent函数返回后,循环调用ReadFile函数,读回所有接收到的字符。最后再次调用SetCommEvent函数,指定下次要查找的事件。

3 Windows CE下的多线程

Windows CE是一个完全的多任务、多线程的操作系统。Windows CE同时最多可以运行32个进程。每个进程有一个主线程,而且可以有多个附加线程。附加线程的多少仅受可用内存和线程堆栈的进程地址空间的限制。

Windows CE是以抢先方式调度线程的。线程以时间片为单位来运行,通常是25ms。线程拥有优先级,所有高优先级的线程都将在低优先级的线程之前运行。在可以调度被设定为特定优先级的线程之前,所有拥有高优先级的线程都必须被阻塞。同等优先级的线程以循环方式来调度。如果高优先级的线程停止阻塞,而低优先级的线程目前正在运行,则低优先级的线程会立刻被挂起,同时去调度高优先级的线程。低优先级的线程永远不会抢占高优先级的线程,当然也有例外:一种是线程具有优先级THREAD_PRIORITY_TIME_CRITICAL,它永远不会被抢占;另一种就是低优先级的线程拥有高优先级的线程正在等待的`资源,出现优先级倒置。在Windows CE中,线程可以有8种优先级。

下面是一个创建线程和线程函数的例子:

HANDLE hThread;

DWORD dwThreadID=0;

Int nParameter=5;

HThread=CreateThread(NULL,0,Thread,nParameter,0,&dwThreadID); //创建线程

CloseHandle(hThread); //关闭线程

//线程函数

DWORD WINAPI Thread (PVOID pArg)

{

int nParam=(int)pArg;

.

.

.

return 0x15;

}

CreateT

hread函数在许多参数在Windows CE下都不支持,所以被设为NULL或0。第3个参数指向线程函数的开始,第4个参数是CreateThread函数传到线程函数的唯一参数。CreateThread函数返回线程句柄,当这个句柄不需要时,调用CloseHandle函数关闭它。线程函数在被终止之前一直运行,调用ExitThread函数可终止线程的执行。

对于在系统中运行的多个线程,需要协调它们的活动,也就是实现同步。在Windows CE中,采用的方法是使用同步对象。一个线程等待一个同步对象,当用信号通知该对象时,解除阻塞正在等待的线程并调度该线程。同步对象包括事件和互斥体。在这里我们只介绍事件。

事件对象就是一种有两种状态――有信号和元信号的同步对象。事件被创建后自动被置为信号状态。事件可以被命名,从而被不同进程共享。采用下面的函数创建事件:

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPTSTR lpName);

函数的第1个参数应为0,第2个参数表示事件成为有信号后应该人工重置或自动重置为无信号状态,第3个参数表示创建时事件是有信号还是无信号状态,最后一个参数指向事件名。被命名的事件可以被进程共享,否则就设为NULL。创建事件后,就可以采用SetEvent函数或者是PulseEvent函数用信号通知该事件。

SetEvent函数是自动重置事件,只释放一个线程来运行;PulseEvent函数是人工重置事件,释放所有等待那个事件的线程。最后可以用CloseHandle函数破坏事件对象。

事件的用法通常是,线程使用了下列函数中的一个来等待事件:WaitForSingleObject、WaitForMultipleObjects、MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx。当线程被这些函数的其中一个阻塞时,线程只消耗少量的电能和CPU处理能力。需要注意的是:应用程序的主线程不能被WaitForSingleObject或WaitForMultipleObjects阻塞,否则主线程无法处理消息循环。通常的做法是采用多线程,主线程处理消息循环,附加线程处理需要在事件上阻塞的共享资源。

4 实际应用

在车载定位系统中,导般计算机需要接受多种传感器的数据输入,其中最常用到的就是GPS数据。通常GPS接收机的通信方式是串行RS232接口,所以导航程序的GPS模块的功能就是接收从串口收到的数据,然后进行处理。

程序采用多线程,主线程负责消息处理,另外还有读写两个附加线程,使用一个事件触发。读线程负责从串口读回GPS数据,写线程由事件触发。在网络补充版(收集整理)中给出GPS数据接收程序的代码。

plc串行通信 篇5

摘要:详细论述在VC++6.0中使用ActiveX控件通过串口与单片机进行二进制数据传输的具体方法。

关键词:VC++ ActiveX 串行通信

在单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。目前在各种操作系统中,Microsoft的Windows较为常见,而且大多为Windows95/98等32位平台。以往在Windows平台上的串行通信多使用其提供的API函数来实现,这种方法使用起来需要许多底层设置,因而较为繁琐,并且难以理解。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为简单,而且非常实用。尤其是Visual C++这种可视化面向对象的编程环境中,可以真正把串口看作一个对象,编程时只需简单的设置,理解起来也很容易。下面详细讨论Microsoft提供的串行通信ActiveX控件的使用方法。该控件的相应文件是MSCOMM32.OCX,以下简称为MSCOMM控件。

一、MSCOMM控件

MSCOMM控件,即Microsoft Communication Control,是Microsoft为简化Windows下串行通信编程而提供的ActiveX控件。它提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他通信设备(如调制解调器),发出命令,交换数据以及监视和响应串行连接中发生的事件和错误。MSCOMM控件可用于创建电话拨号程序、串口通信程序和功能完备的终端程序。

MSCOMM控件提供了两种处理通信的方式:

(1)事件驱动方式。当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。

(2)查询方式。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。例如,如果写一个简单的电话拨号程序,则没有必要每接收1个字符都产生事件,因为惟一等待接收的字符是调制解调器的“确定”响应。

在使用MSCOMM控件时,1个MSCOMM控件只能同时对应1个串口。如果应用程序需要访问和控件多个串口,那么必须使用多个MSCOMM控件。

在VC++中,MSCOMM控件只对应着1个C++类--CMSComm。由于MSCOMM控件本身没有提供方法,所以CMSComm类除了Create成员函数外,其他的函数都是Get/Set函数对,用来获取或设置控件的属性。MSCOMM控件也只有1个OnComm事件,用来向调用者通知有通信事件发生。

MSCOMM控件有许多很重要的属性,限于篇幅只给出几个较为重要和常用的属性,如表1所列。

表1 MSCOMM控件的重要属性

属  性说      明CommPort通信端口号Settings以字符串形式表示的波特率、奇偶校验、数据位PortOpen通信端口的状态,打开或是关闭Input接收数据Output发送数据InputMode接收数据的类型:0为文本;1为二进制

二、编程实现

从表1可以看到,MSCOMM可以两种不同的形式接收数据,即以文本形式和以二进制形式。用MSCOMM控件进行字符数据传输的文献和资料可以找到很多,在Microsoft的MSDN(Microsoft Developer Network)中就可以找到这样的例子,即VCTERM。可是几乎所有以单片机为核心的测量系统所得到的原始数据都是二进制形式的,所以,以二进制形式传输数据将是最为直接而又简洁的办法。不仅如此,由于MSCOMM控件在文本形式下,其传输的`是宽字符格式的字符,要想得到有用信息,还要额外处理。因此本文主要讨论在二进制形式下的使用方法。

在VC++6.0中,用APPWizard可以生成三种应用程序:单文档(SDI)、多文档(MDI)和基于对话框的应用程序。为了说明问题和省去不必要的细节,下面以基于对话框的应用程序为例。

1.创建一个基于对话框的应用程序

打开VC++6.0集成开发环境,选择菜单项File/New,在出现的对话框中选中Projects标签中的MFC AppWizard(exe),然后在Project Name框中填入MyCOMM(可根据需要命名),之后点OK按钮。在接着出现的对话框中选中Dialog Based项,然后点NEXT按钮。以下的各对话框都按照缺省设置,这样即可生成一个基于对话框的应用程序。在资源编程器中会出现其对话框模板。

2.插入MSCOMM控件

选择菜单项Project/Add to project/Components and Controls…,在弹出的对话框中选择Registered ActiveX Controls文件夹下的Microsoft Communications Control,version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可实现控件的插入。这时在对话框的控件工具栏 上会多出一个电话机模样的控件图标,Workspace的Classview中也多了一个类CMSComm。

此时即可将MSCOMM控件加入到对话框模板,加入方法与其他控件一样。然后还要在对话框类中相应加入一个成员变量,此处我们将其命名为m_comm。加入方法为:首先,在对话框模板中,用鼠标右键点击该控件,选择ClassWizard,在出现的对话框的Member Variables标签的Control Ids项下,选中IDC_MSCOMM1。然后,按Add Variable…按钮,在出现的对话框的Member Variable Name项中输入m_comm。最后,按OK按钮即可。

3.设置属性

可以在两个地方对控件的属性进行设置:

(1)对话框资源编辑器中。在对话框模板上,用右键单击MSCOMM控件,然后选择Properties…菜单项,最后便可设置各项属性。此处只对以下几处进行改动,其他接受缺省设置:Rthershold:1,InputLen:1,DTREnable:不选,InputMode:1-Binary。

(2)对话框类的OnInitDialog函数中。下面是以上设置的函数实现:

BOOL CMyCOMMDlg::OnlnitDialog()

{

CDialog::OnlnitDialog();

//此处为应用框架自动生成代码,不予列出

//TODO:Add extra initialization here

m_comm.SetCommPort(1);//使用串口1

m_comm.SetSettings(“9600,N,8,1”);

//波特率为9600,无奇偶校验,8位数据位,1位停止位

m_comm.SetRThreshold(10); //每接收10个字符就触发1次接收事件

m_comm.SetSThreshold(0); //不触发发送事件

m_comm.SetInputLen(10); //每次读操作从缓冲区中取10个字符

m_comm.SetInputMode(1); //二进制数据传输形式

m_comm.SetPortOpen(TRUE); //打开串口

return TRUE;//return TRUE unless you set the focus to a control

}

4.发送二进制数据

如果需要发送二进制数据,可将数据作如下处理。具体代码如下:

CByteArray bytOutArr;

bytOutArr.Add(0x0); //给数组赋值

bytOutArr.Add(0x1);

bytOutArr.Add(0x2);

bytOutArr.Add(0x3);

bytOutArr.Add(0x4);

COleVariant varOut;

varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型

m_comm.SetOutput (varOut); //发送数据

5.接收二进制数据

当需要接收大量的数据时,最好采用事件驱动方式进行编程。具体步骤如下:

(1)响应OnComm事件。在对话框资源编程器中,双击对话框模板上的MSCOMM控件,在弹出的对话框中填入您所希望的事件响应函数名,此处将其命名为OnCommMscomm1()。

(2)在事件响应函数中接收和处理数据。接收来的数据为变体数据,所以需要做一些处理,具体代码如下:

void CMyCOMMDlg::OnCommMscomm1()

{

COleVariant varRcv;

CByteArray byt;

int i;

long num;

switch (m_comm.GetCommEvent())

{

cass 1://数据发送事件

break;

case 2://数据接收事件

varRcv=m_comm.GetInput();

varRcv.ChangeType (VT_ARRAY |VT_UI1);

BYTE HUGEP *pbstr;

HRESULT hr;

hr=SafeArrayAccessData (varRcv.parray,(void HUGEP*FAR*)&pbstr);//获取安全数组指针

if (FAILED (hr)){

AfxMessageBox(“获取数组指针失败!”);

break;}

num=0;

hr=SafeArrayGetUBound (varRcv.parray,1,&num);//获取数组上界

if (FAILED (hr)){

AfxMessageBox(“获取数组上界失败!”);

break;}

for(i=0;i< p>

byt.Add(pbstr [i]);

SafeArrayUnaccessData (varRcv.parray);

//此时数据已保存在二进制数组byt中,可根据需要进行相关处理

break;

default:

break;

}

}

以上代码中的处理部分可以做成一个单独的函数,在此处调用即可。经过以上代码的处理,接收来的数据已存放在二进制数组byt中,可以根据自己的需要对其进行相关处理,如保存和显示等。

三、硬件接口

单片机与微机之间的硬件接口可以用1片MAX232或ICL232与几个电容即可实现,有许多文献讨论过,此处不再多述。

plc串行通信 篇6

触摸屏与s7300通信可以有direct MPI、ISO TCP通信、with PC adapter通信,现对前两种通信方式设置过程进行介绍。

1、所需软件

①Screen Editor 2.00.18(可从台达官网下载)用于对触摸屏的相关参数进行设置。

②Step7用于对plc参数进行组态。

2、设置步骤 2.1 MPI通信 2.1.1连线接口定义

2.1.2PLC组态设计

1、组态主机架,插入CPU315-2PN/DP,设置参数对话框如下图所示

2、插入新站点,在工程上点击右键插入新站点如下图所示

3、双击other station,弹出对话框中,在“interface”选项卡中选择“new”在“type”中选择MPI,点击“ok”

4、设定MPI站号,在address栏中填入站号,此处为“0”点击“ok”此处站号即为触摸屏的站号,触摸屏设置应于此一致。

5、在工程目录CPU下双击“connections”进入连接界面

6、将分站和PLC分别连接在MPI总线上

连接前

连接后

编译下载即可。2.1.3触摸屏参数设置

1、打开scredit 新建项目设置工程名称,HMI型号和PLC型号如下图所示,点击“确定”

2、在“选项”-“设置模块参数”-“通信”设定“人机站号”此处为“0”需与PLC内部设定一致

3、编辑所需画面,编译下载即可建立通信 2.2ISO TCP 通信 2.2.1PLC组态配置

1、新建工程配置主机架。插入CPU模块在弹出对话框中设置CPU的IP,此处为192.168.0.2

2、在项目上右键插入新站点

3、双击“other station”弹出对话框中选择 “Industrial Ethernet”点击“ok”

4在弹出对话框中设定IP地址,此地址即为HMI的地址,需与人机界面的设定一致。点击“OK”此处为“192.168.0.3”

5、在CPU目录下点击“connections”进入链接界面,在PLC绿点上点右键选择“object properties”弹出对话框中选择“new新建一个网线连接”

新建前

新建后

6、建立将新增站与plc建立连接

7、编译下载即可

2.2.2 HMI配置

1、打开“scredit”新建一工程设置好参数如下图所示

2、在“选项”-“设置模块参数”-“通信”-”Ethernet”设定人机界面的IP此处需与PLC是、中设置的分站的IP一致

3、在“选项”-“设置模块参数”-“通信”-”baseport”设定PLC的IP此处需与PLC的IP一致。

4、编译下载即可通信

plc串行通信 篇7

PLC作为新一代工业控制器,以其高性能价格比在工业测控系统中获得了广泛应用。随着微电子及控制技术的不断发展,PLC己逐渐成为一种智能型、综合型控制器,由PLC构成的集散控制是现代工业控制的一个重要组成部分。

VC++6.0是一种Windows应用程序开发工具,在图形处理和数据库管理等方面具有较强的功能,用它来实现底层的通信控制有着更快的速度。以水电站水轮发电机调速系统为例,具体探讨使用MSComm控件对PC与SIMATIC S7-200系列PLC串行通信的一种实现方法。

1 实现方案

水轮发电机调速系统由机组频率、导叶开度、水头、在线修改参数、监视系统等组成。在本程序采用时时通讯,人—机介面及监控软件由Visua C++6.0编制而成,由WINDOWS环境支持。

1.1 通信连接。

S7-200应用专用通信电缆-PC/PPI电缆与PC机连接。PC/PPI电缆的一端用网络连接器连接到PLC上,另外一端直接连接到PC机的串行口上。当数据从RS232传送到RS485口时,PC/PPI电缆为发送模式;当数据从RS485传送到RS232口时,PC/PPI电缆为接收模式。当检测到RS232的发送线有字符时,电缆立即从接收模式转换到发送模式。整个通信电路结构框图如图1所示:

1.2 PLC的通信协议。

S7-200系列PLC支持多种通信协议,在此使用用户定义协议即自由口通信。

自由口通信模式是用户通过程序控制S7-200 CPU通信口的操作模式。用户通过编程与配置,可以使S7-200系列PLC与任何您需要的设备如变频器、调制解调器、打印机、终端或其它S7-200 PLC等灵活地进行通信。

1.3 串口通信方案。

应用VC++开发串行通信通常有几种方法:使用Microsoft Visual C++的通信控件(MSComm)。由于MSComm在串口编程时非常方便,程序员不必花费时间去了解较为复杂的API函数,就能通过串行端口传输和接收数据,故采用此方法。

2 PC机及PLC的程序实现

2.1 PLC的通信编程。

本通信系统采用自由口通信模式。在通信之前需要选择通讯模式,设定波特率以及数据长度和校验位。对于数据发送,采用专用发送指令XMT TABLE,PORT。对于数据接收,使用接收指令RCV TABLE,PORT。在通讯过程中,利用中断来实现发送数据和接收数据的切换,当数据发送完成,会产生发送字符中断事件,在中断程序中切换到接收状态;当接收数据完成,会产生接收信息完成中断事件,在中断程序中切换到发送状态,由于收发切换有一定的间隔,所以必须延时一段时间再发送数据,用定时中断来产生延时。

该程序主要包括以下几部分:

主程序:根据SM0.7判断PLC处于何种模式,若SM0.7=1,则调用子程序SBR_0;若SM07=0,则设置位PPI协议并禁止各中断;

子程序SBR_0:进行串口初始化并开中断;

子程序SBR_1:将接收到的字符依次放入接收缓冲区;

中断程序INT_0:接收报文起始字符;

中断程序INT_1:接收报文数据区字节数;

中断程序INT_2:接收数据区;

中断程序INT_3:处理校验码。

2.2 PC机程序的设计。

在水轮发电机组调速过程中,有多个控制量需要与PC机时时进行通讯、同时也需要通过PC机在线修改参数等,PC机与PLC的通信软件用VC++6.0开发。采用循环方式使系统按一定的周期自动接收数据。当用户需要修改参数到PLC时,P C就会将参数采用中断优先级别送到PLC的接收数据区。整个程序可以很方便地进行功能扩展。

主要程序清单:

a.初始化子程序:

b.发送程序:

PC要发送给PLC的控制参数,需要把参数值赋给数组i_send,下面是部分发送程序:

结束语

介绍了在Windows环境下使用VC++6.0中的MSComm控件实现串行通信的编程方法。采用这种方法开发的水轮发电机调速系统与监控系统人—机界面实际运行证明,该系统可靠性高、界面友好、实时性强。同时,该方法对其它的PC、PLC机监控系统也具有一定的借鉴意义。

摘要:详细介绍了西门子S7-200系列PLC的自由口通信模式及在Windows环境下应用VC++6.0通过使用MSComm通信控件实现PC机与PLC串行通信的编程方法,并结合具体实例编写了基本的通信程序。

关键词:VC++6.0,可编程控制器,串行通信,自由口模式

参考文献

[1]SIMATIC S7-200,可变程序控制器系统手册.

plc串行通信 篇8

【关键词】可编程控制器;单片机;串行通信

串行通信是一种广泛应用于各个领域的通信方式,西门子S7-226可编程控制器与AT89S51单片机的结合作为一种新的串行通信方式,它在工业领域有广泛的运用,无论是从实用性还是灵活度的角度分析,该设计的结构都相对比较简单,且制作成本也相对较低,具有较强的发展价值。

一、参与试验中的通信硬件综述

1、试验中的单片机通信功能概况

AT89S51单片机是一种低功耗,高性能的单片机,包括4k字节的网络服务提供商能够对Flash只读程序存储器反复擦写一千次,另外还有128字节的随机存储器和一个全双工串行通信端口,不仅可以进行网络间通讯,而且还可以实现串行的异步通讯,甚至可作为一个同步的移位寄存器进行使用。一般来说,这种单片机可通过串口的中断实现数据的传输,由于它的串行通信口输出为TTL电平,在外在端口变为RS232端口进行全双工通信时,可以通过相应可靠型号的芯片等进行电平转换。而与外设含有RS-485接口时,则必须选择与之相对应型号的配套芯片实现电平的转换来进行半双工通信。

2、试验中的可编程控制器通信功能概况

西门子S7-226可编程控制器具有13K字节程序的数据存储量,两个9针RS-485端口与24路输入和16路输出,共包含40个数字量的I/O点,支持点至点、多点接口,自由通信等协议。PPI协议作为主从协议中的主站必须按照所要求的指令向从站设备传输信息。而从站设备只有响应的职能却不能够提供有效的信息反馈给主站的一方。PPI协议广泛应用于可编程控制器同触摸屏之间的通讯中。这其中主站是触摸屏,从站是可编辑控制器,通过触摸屏来传输指令,可编程控制器进行响应,但是并不向触摸屏发送反馈信息。而相对于许多的端口来说,可编程控制器允许主站与主站,主站与从站之间的通讯,而如果控制器是相对较大的规模的话,并且这个控制系统具有大量的控制器和集成线路端口,完成通信过程则需要借助其他的协议才能实现。针对自由方式的通信,则可以依据用户的需求对通讯协议进行配置和编程,就可以达成像单片机、打印机和变频器等一系列类似设备之间的联通灵活通信了。

二、参与试验的项目设计

1、参与试验的项目硬件构成

AT89S51单片机同西门子S7-226可编程控制器之间实现信息传输与反馈需要遵守以下流程来实现。西门子S7-226控制器上只有唯一一个RS-485端口,通过此端口接受发送器来连接单片机。因此需要选择有效可靠的端口来达成,可编程控制器所发出的485电平信号就可以通过转换进而变为单片机可以接收的信号,并借助相应形式的串口联结线实现内部寄存器的输入。可编程控制器同单片机间无法同时进行接收和发送主要是由于端口处所使用的是半双工的方式。这样,它们在进行信息的实时发送过程中,需要一个来自外部的硬件握手信号来实现二者的联结。

此次试验项目里在可编程控制器端选用的是1个数字量的输入口I0.0和输出口Q0.0,而内部寄存器端口采用的是并口P1中的P1.0、P1.1以及P1.2。以下是二者實现联结的具体操作事宜:当单片机需要向可编程控制器反馈信息的时候,置位P1.2可通过光耦PC817进行24V高电平向I0.0的输出,当前可编程控制器便是处于接收端的状态,要中断并对接收信息进行相应地设置,微控制器置P1.0低电平时也可以实现与指定端口之间的传输。这样,信息便通过相应的端口向选定好的端口实现传输发送,并且又转换为可编程控制器端口可以接收到的信号。而可编程控制器需要向单片机进行信息的发送时,可编程控制器可借助输出口Q0.0向单片机的P1.1进行高平点的发送,微控制单元进行串口中断的设置,置P1.0作为高电平接收信息。

2、参与试验的项目通信协议的设计

可编程控制器和单片机二者实现串口通信需要借助RS-485来完成,RS-485作为一种标准协议必须规定并提供指定对应的七层网络协议模型中最底层的规定,双方还需要进行其他的一些协议规定,比如字符格式以及波特率等内容。依照参与试验中各个具体项目的实际特性,在传送过程中进行相应的规定,无奇偶校验,并选择相对应的波特率。同时,加入帧校验码或者对起始字符和结束字符进行相应的标准化规定以保障在发送数据时整个通信过程的稳定和可靠。在计算帧校验码的过程中,必须以字节为依据对所传输的数据通过异或运算方式得出最终的数据,将所得结果发送给接收方,后者再进行相同的运算。然后将后者得出的结果与前者相较,如果前后运算结果出现了偏差,那么就要对发送过来的错误信息予以放弃并要求重新发送,数据传输格式如下所示:

起始字符状态信息有效数据帧校验码(FCS)结束字符

实际上,无论什么样的可编程控制器都能够与单片机通过串口完成通信,关键是要掌握该可编程控制器的通讯协议,了解帧的传送格式,这样便可以达成两者之间的串行通信了。

结语

如今,单片机与可编程控制器的结合使用已被广泛应用于许多领域,掌握可编程控制器的通信协议,使其与单片机通过串口完成通信的设计具有重要的现实意义。

参考文献

[1]李生军,李少蒙.单片机与PLC之间的串行通信实现[J].化工自动化及仪表,2010,37(2):78-80.

[2]武德庆.单片机与PLC串行通信数据传输模式实现[J].民营科技,2010,(09).

[3]刘慧龙,陈高辉.单片机与PLC的串口通信设计[J].科技创新与应用,2012,(11).

上一篇:中职英语教学设计案例下一篇:上帝和父亲