台达dvp plc与abb变频器通讯

台达dvp plc与abb变频器通讯,第1张

PLC 与交流变频器通讯的实现 你可以参考这边文章试试看

张素文,贺凯歌

武汉理工大学自动化学院,武汉 (430070)

E-mail:[email protected]

摘 要:构建了由工控机、PLC、变频器组成的基于Profibus-DP 总线的控制系统,详细的

分析了变频器通讯前的参数设置及Profibus-DP 通讯协议, 并给出了程序源代码.

关键词:交流变频器;PROFIBUS-DP;PLC;通讯协议;FR-A740

0 引言

变频器由于其应用简便和性能可靠,已成为工业传动装置中首选的电机控制器,现代变频器采用微计算机数字控制技术构成,并提供了标准的工业通讯接口和内置协议(如PROFIBUS、CCLINK 等),为变频器的远程监控提供了必要的基础。PROFIBUS-DP 做为现场总线PROFIBUS 标准中一种,是一种高速(数据传输率为9.6kb/s~12Mb/s)、经济、可靠的现场级网络,已经在工业控制得到了广泛的应用。本文以三菱公司的FR-A740 变频器为基础,研究了SIMENZ S7-300 PLC 与FR-A740在PROFIBUS-DP 网络中通讯的实现,它在笔者所参与的胎面挤出生产线中得到了实践论证。为后续建立变频器的集中监控打下了基础。

1 基于PROFIBUS-DP 控制系统结构的构建

FR-A740 与PROFIBUS-DP 网络的连接是通过安装A7NP 通讯卡来实现的,其典型配置如图1 所示,我们可以把系统分为三层结构,分别为监控层、控制层、执行层。IPC 作为监控层,采用MCGS 组态软件,用于对系统进行监控,PLC 做为控制层,它作为工控机与变频器之间的桥梁,一方面,它对变频器进行控制,另一方面将生产线上信息(如变频器的速度、报警等)传达给工控机,其中IPC 与PLC 采用MPI(Multipoint Interface)。变频器作为执行层,将PLC 下达的指令执行,实现对电机的控制。

2 变频器数据通讯的实现

2.1 参数设置

在进行设备通讯之前,必须对变频器的相关参数进行设置,首先在A7NP 卡上设置网络节点地址,必须要与STEP 7 硬件组态中设置的地址完全一致,这个设置主要通过A7NP 上SW3,SW1 两个旋钮开关来调节的,另外其他主要参数设置如表1 所示 ,它们是在FR-A740的 *** 作面板设置的。

2.2 PROFIBUS 通讯协议

对于调速驱动装置,根据变速驱动行规,在周期型通道中传输的数据结构被定义为参数过程数据对象PP0(Parameter Process Object) [2]。这个通道经常被称为标准通道,其中包含有用的用户数据。可用的数据结构分为两个部分且能用报文分别传送:过程通道PZD 部分、参数通道PKW 部分,具体的协议报文结构如图2 所示。

变速驱动行规对PPO 的结构、长度作了更具体的规定,常用的参数过程数据对象PPO一共有5 种类型,按照可用数据有无参数通道及过程通道的数据字的多少来划分:(1)可用数据有数据区而无参数区,有两字或六个字的过程数据,如PPO3 和PP04。(2)可用数据有参数区和数据区,且有两个字、六个字或是个字的过程数据,如PPO1、PPO2、PPO5。常用的PPO 类型如表2 所示。选用那种类型的PP0,取决于在硬件组态中的设置。过程数据在传动系统中总是以最高优先级进行传送和处理,它主要传送传动装置的状态信息和控制信息。参数数据运行存取传动系统的所有参数。因而,它能够在不影响过程数据传输性能的情况下,从上一级系统调用参数值、诊断值、故障信号等。

PKW 区说明参数数值(PKW)的数据接口处理方式。PKW 接口并非物理意义的接口,而是一种通讯机理。这一机理确定了参数在两个通讯伙伴之间(如PLC 和变频器之间)的传输方式。PKW 参数区一般包含4 个字。前两个字(PKE 和IND)的信息是关于主站请求任务(任务识别标记ID)和从站应答响应(应答识别标记ID)的报文。PKW 的后两个字(PWE1和PWE2)用来读写具体的参数数值。

PKW 参数通道的第一个字是参数标识符PKE。位0 到10(PNU)包括所请求的参数号,它决定所要执行的参数读写任务访问的是数组参数中的哪一个元素。位11(SPM)是用来参数变更报告的触发位。位12 到位15(AK)包括任务标识ID 和应答标识ID.

PKW 参数通道的第二个字变址IND 的位12 到15 位是参数号PNU 的扩展页号,它和参数标识符基本参数号PNU 共同产生完整的传动装置参数号。变址IND 的0 到7 位为带数组的参数寻址提供数组下标,决定访问数组参数的哪一个元素。

第三和第四字为参数数值(PWE)。参数值总是以双字来传送,在PPO 报文中,一次只能传送一个参数值,由PWE1(高位字)和PWE2(低位字)共同组成一个32 位参数数值。当用PWE2 传送一个16 位参数值,必须在DP 主站中设置高位字PWE1 为零。

利用PKW 参数通道修改驱动装置参数必须遵守以下规则:(1)一个任务或一个应答仅能涉及一个参数。(2)主站必须重复地发送任务报文直到从从站那里得到相应的应答报文。主站通过对应答识别ID、参数号、变址下标和参数值的处理识别任务的应答。(3)完成的任务必须送出一个报文,对于应答也一样。(4)在应答报文中重复的实际值总是当前的最新值。(5)如果在周期工作中不需要PKW 参数通道的信息而只需要PZD 过程通道的信息,则任务ID 被发布为“无任务(用0 表示)”。

过程通道PZD 区是为监测和控制调速驱动装置而设计的,在DP 主站和从站中收到的PZD 报文总是以最高的优先级处理,即处理PZD 过程通道的优先级高于处理参数通道PKW的优先级,而且PZD 过程通道总是传送调速驱动装置上当前最新的有效数据。通常DP 主站给传动装置的任务报文中,第一个PZD 字为控制字,第二个字为主设定值;传动装置给DP 主站的响应报文中,第一个PZD 字为状态字,第二个字为主实际值。

本文中FR-A740 采用PP03 的数据传输结构,即使用过程通道(PZD)控制和监测变频器的工作,而没有使用参数通道(PKW)修改变频器的内部参数。PP03 的数据结构如表3所示

协议的本身就是一个程序的一种,所以无需要其它程序帮助来实现TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。

TCP/IP整体构架概述

TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:

应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

传输层:在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。

网络接口层(主机-网络层):接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

TCP/IP中的协议

以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的:

1. IP

网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。

IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

2. TCP

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

3.UDP

UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。

欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。

4.ICMP

ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。

5. TCP和UDP的端口结构

TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。

两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:

源IP地址 发送包的IP地址。

目的IP地址 接收包的IP地址。

源端口 源系统上的连接的端口。

目的端口 目的系统上的连接的端口。

端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。

TCP/IP协议的主要特点:

(1)开放的协议标准,可以免费使用,并且独立于特定的计算机硬件与 *** 作系统;

(2)独立于特定的网络硬件,可以运行在局域网、广域网,更适用于互联网中;

(3)统一的网络地址分配方案,使得整个TCP/IP设备在网中都具有惟一的地址;

(4)标准化的高层协议,可以提供多种可靠的用户服务。

TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。

TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第

三层(对应OSI的第四层)。

TCP和IP是TCP/IP协议簇的中间两层,是整个协议簇的核心,起到了承上启下的作用。

1、接口层

TCP/IP的最低层是接口层,常见的接口层协议有:

Ethernet 802.3、Token Ring 802.5、X.25、Frame reley、HDLC、PPP等。

2、网络层

网络层包括:IP(Internet Protocol)协议、ICMP(Internet Control Message Protocol)

控制报文协议、ARP(Address Resolution Protocol)地址转换协议、RARP(Reverse ARP)反向

地址转换协议。

IP是网络层的核心,通过路由选择将下一跳IP封装后交给接口层。IP数据报是无连接服务

ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。

Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。

ARP是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址。

RARP是反向地址解析协议,通过MAC地址确定IP地址。比如无盘工作站和DHCP服务。

3、传输层

传输层协议主要是:传输控制协议TCP(Transmission Control Protocol)和用户数据报协

议UDP(User Datagram rotocol)。

TCP是面向连接的通信协议,通过三次握手建立连接,通讯时完成时要拆除连接,由于TCP

是面向连接的所以只能用于点对点的通讯。

TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠

性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用

以限制发送方的发送速度。

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要

连接,所以可以实现广播发送。

UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求

在程序员编程验证。

4、应用层

应用层一般是面向用户的服务。如FTP、TELNET、DNS、SMTP、POP3。

FTP(File Transmision Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口

是20H,控制端口是21H。

Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。

DNS(Domain Name Service)是域名解析服务,提供域名到IP地址之间的转换。

SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,用来控制信件的发送、中

转。 

POP3(Post Office Protocol 3)是邮局协议第3版本,用于接收邮件。

数据格式:

数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC地址及类型,帧尾是校验字)

IP数据包:IP头部+TCP数据信息 (IP头包括源和目标主机IP地址、类型、生存期等)

TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校

验字等) OSI中的层

功能

TCP/IP协议族

应用层

文件传输,电子邮件,文件服务,虚拟终端

TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet

表示层

数据格式化,代码转换,数据加密

没有协议

会话层

解除或建立与别的接点的联系

没有协议

传输层

提供端对端的接口

TCP,UDP

网络层

为数据包选择路由

IP,ICMP,RIP,OSPF,BGP,IGMP

数据链路层

传输有地址的帧以及错误检测功能

SLIP,CSLIP,PPP,ARP,RARP,MTU

物理层

以二进制数据形式在物理媒体上传输数据

ISO2110,IEEE802。IEEE802.2

单片机通信协议

现在大部分的仪器设备都要求能过通过上位机软件来 *** 作,这样方便调试,利于 *** 作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。

1.自定义数据通信协议

这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的 *** 作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个 *** 作方法之上。

通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。

帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。

地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。

数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。

校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CRC运算等等,可以根据运算速度、容错度等要求来选取。

2.上位机和下位机中的数据发送

物理通信层中提供了两个基本的 *** 作函数,发送一个字节数据则为数据发送的基础。数据包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方法也有不同。

在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即的出现在通信线路上,能够立即被接收端接收到。另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小,但是可能出现需要发送的数据不能立即被发送的情况,不过这种时延相当的小。对于51系列单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,而且对比直接发送来说也没有太多的优点。以下是51系列单片机中发送单个字节的函数。

void SendByte(unsigned char ch)

{

SBUF = ch

while(TI == 0)

TI = 0

}

上位机中关于串口通信的方式也有多种,这种方式不是指数据有没有缓冲的问题,而是 *** 作串口的方式不同,因为PC上数据发送基本上都会被缓冲后再发送。对于编程来说 *** 作串口有三种方式,一、使用windows系统中自带的串口通信控件,这种方式使用起来比较简单,需要注意的是接收时的阻塞处理和线程机制。二、使用系统的API直接进行串口数据的读取,在windows和linux系统中,设备被虚拟为文件,只需要利用系统提供的API函数即可进行串口数据的发送和读取。三、使用串口类进行串口 *** 作。在此只介绍windows环境下利用串口类编程的方式。

CSerialPort是比较好用的串口类。它提供如下的串口 *** 作方法:

void WriteToPort(char* string, int len)

串口初始化成功后,调用此函数即可向串口发送数据。为了避免串口缓冲所带来的延时,可以开启串口的冲刷机制。

3.下位机中的数据接收和协议解析

下位机接收数据也有两种方式,一、等待接收,处理器一直查询串口状态,来判断是否接收到数据。二、中断接收。两种方法的优缺点在此前的一篇关于串口通信的文章中详细讨论过。得出的结论是采用中断接收的方法比较好。

数据包的解析过程可以设置到不同的位置。如果协议比较简单,整个系统只是处理一些简单的命令,那么可以直接把数据包的解析过程放入到中断处理函数中,当收到正确的数据包的时候,置位相应的标志,在主程序中再对命令进行处理。如果协议稍微复杂,比较好的方式是将接收的数据存放于缓冲区中,主程序读取数据后进行解析。也有两种方式交叉使用的,比如一对多的系统中,首先在接收中断中解析“连接”命令,连接命令接收到后主程序进入设置状态,采用查询的方式来解析其余的协议。

以下给出具体的实例。在这个系统中,串口的命令非常简单。所有的协议全部在串口中断中进行。数据包的格式如下:

0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D

其中0x55, 0xAA, 0x7E为数据帧的帧头,0x0D为帧尾,0x12为设备的目的地址,0xF0为源地址,0x02为数据长度,后面接着两个数据0x23, 0x45,从目的地址开始结算累加、异或校验和,到数据的最后一位结束。

协议解析的目的,首先判断数据包的完整性,正确性,然后提取数据类型,数据等数据,存放起来用于主程序处理。代码如下:

if(state_machine == 0) // 协议解析状态机

{

if(rcvdat == 0x55) // 接收到帧头第一个数据

state_machine = 1

else

state_machine = 0 // 状态机复位

}

else if(state_machine == 1)

{

if(rcvdat == 0xAA) // 接收到帧头第二个数据

state_machine = 2

else

state_machine = 0 // 状态机复位

}

else if(state_machine == 2)

{

if(rcvdat == 0x7E) // 接收到帧头第三个数据

state_machine = 3

else

state_machine = 0 // 状态机复位

}

else if(state_machine == 3)

{

sumchkm = rcvdat// 开始计算累加、异或校验和

xorchkm = rcvdat

if(rcvdat == m_SrcAdr)// 判断目的地址是否正确

state_machine = 4

else

state_machine = 0

}

else if(state_machine == 4)

{

sumchkm += rcvdat

xorchkm ^= rcvdat

if(rcvdat == m_DstAdr)// 判断源地址是否正确

state_machine = 5

else

state_machine = 0

}

else if(state_machine == 5)

{

lencnt = 0 // 接收数据计数器

rcvcount = rcvdat // 接收数据长度

sumchkm += rcvdat

xorchkm ^= rcvdat

state_machine = 6

}

else if(state _machine == 6 || state _machine == 7)

{

m_ucData[lencnt++] = rcvdat// 数据保存

sumchkm += rcvdat

xorchkm ^= rcvdat

if(lencnt == rcvcount)// 判断数据是否接收完毕

state_machine = 8

else

state_machine = 7

}

else if(state_machine == 8)

{

if(sumchkm == rcvdat)// 判断累加和是否相等

state_machine = 9

else

state_machine = 0

}

else if(state_machine == 9)

{

if(xorchkm == rcvdat)// 判断异或校验和是否相等

state_machine = 10

else

state_machine = 0

}

else if(state_machine == 10)

{

if(0x0D == rcvdat) // 判断是否接收到帧尾结束符

{

retval = 0xaa // 置标志,表示一个数据包接收到

}

state_machine = 0// 复位状态机

}

此过程中,使用了一个变量state_machine作为协议状态机的转换状态,用于确定当前字节处于一帧数据中的那个部位,同时在接收过程中自动对接收数据进行校验和处理,在数据包接收完的同时也进行了校验的比较。因此当帧尾结束符接收到的时候,则表示一帧数据已经接收完毕,并且通过了校验,关键数据也保存到了缓冲去中。主程序即可通过retval的标志位来进行协议的解析处理。

接收过程中,只要哪一步收到的数据不是预期值,则直接将状态机复位,用于下一帧数据的判断,因此系统出现状态死锁的情况非常少,系统比较稳定,如果出现丢失数据包的情况也可由上位机进行命令的补发,不过这种情况笔者还没有碰到。

对于主程序中进行协议处理的过程与此类似,主程序循环中不断的读取串口缓冲区的数据,此数据即参与到主循环中的协议处理过程中,代码与上面所述完全一样。

4.上位机中的数据接收和命令处理

上位机中数据接收的过程与下位机可以做到完全一致,不过针对不同的串口 *** 作方法有所不同。对于阻赛式的串口读函数,例如直接进行API *** 作或者调用windows的串口通信控件,最好能够开启一个线程专门用于监视串口的数据接收,每接收到一个数据可以向系统发送一个消息。笔者常用的CSerialPort类中就是这样的处理过程。CSerialPort打开串口后开启线程监视串口的数据接收,将接收的数据保存到缓冲区,并向父进程发送接收数据的消息,数据将随消息一起发送到父进程。父进程中开启此消息的处理函数,从中获取串口数据后就可以把以上的代码拷贝过来使用。

CSerialPort向父类发送的消息号如下:

#define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.

因此需要手动添加此消息的响应函数:

afx_msg LONG OnCommunication(WPARAM ch, LPARAM port)

ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)

响应函数的具体代码如下:

LONG CWellInfoView::OnCommunication(WPARAM ch, LPARAM port)

{

int retval = 0

rcvdat = (BYTE)ch

if(state_machine == 0) // 协议解析状态机

{

if(rcvdat == 0x55) // 接收到帧头第一个数据

state_machine = 1

else

state_machine = 0 // 状态机复位

}

else if(state_machine == 1)

{

if(rcvdat == 0xAA) // 接收到帧头第二个数据

state_machine = 2

else

state_machine = 0 // 状态机复位

......

5.总结

以上给出的是通信系统运作的基本雏形,虽然简单,但是可行。实际的通信系统中协议比这个要复杂,而且涉及到数据包响应、命令错误、延时等等一系列的问题,在这样的一个基础上可以克服这些困难并且实现出较为稳定可靠的系统


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12057953.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存