PC与PLC的串口通信及编程实现.pdf
第 3 期 PC 与 PLC 的串口通信及编程实现 35 PC 与 PLC 的串口通信及编程实现 黄植功 (广西师范大学物理与电子工程学院,广西 桂林 541004)摘 要:在自由口模式下,通信协议由用户自己的梯形图程序控制。用户可以使用梯形图程序调用各种子程序,来进行接收中断、发送中断、发送指令(XMT)、接收指令(RCV)等通信控制操作。研究了在自由端口模式下PC与S7-200型PLC之间的通信,并采用Visual Basic编程来实现上位机与下位机之间的通信。关键词:Visual Basic;自由端口模式;PLC通信;串口通信 中图分类号:TP312 文献标识码:A 文章编号:10037551(2007)03003504 1 引言 由于具有编程方法简单易学、功能强、性能价格比高、可靠性高、抗干扰能力强、体积小、能耗低、硬件配套齐全、设计调试安装维护方便等突出优点,可编程逻辑控制器(PLC)已经广泛地应用在发达国家所有的工业部门,主要应用在数字逻辑控制、运动控制、闭环过程控制、数据处理和联网通信等方面。在联网通信方面,PLC 与其他智能控制设备一起,可以组成“集中管理、分散控制”的分布式控制系统。在这种工业控制系统中,为了避免通信各方争用通信线路,PC 与 PLC 之间的通信一般采用主从方式,通常采用计算机(PC)作为上位机负责完成数据分析、处理和存储、设备状态显示和打印输出等功能以实现对分布在工业现场的被控制系统进行集中的实时监测与控制;PLC 作为下位机使用,承担执行上位机的输出指令、现场数据采集和设备运转状态识别等任务。本文研究了在自由端口模式下 PC 与 S7-200 型 PLC 之间的通信,并采用 Visual Basic 编程来实现上位机与下位机之间的通信。2 PLC 与 PC 的电缆连接和电缆的切换时间 S7-200 的通信接口为 RS-485,PC 可以采用 RS-232 通信接口,RS-232/PPI 多主站电缆可以连接 PC 与 S7-200型 PLC,实现 S7-200 CPU 与 PC 的通信。由于使用 RS-232/PPI 电缆,因此在 S7-200 CPU 的用户程序中应考虑电缆的切换时间,切换时间因波特率的不同而不同,例如,如果采用 9600bit/s 的波特率,则电缆的切换时间为 2ms,电缆上 DIP 开关设置为 010,如果采用 19200bit/s 的波特率,则电缆的切换时间为 1ms。S7-200 CPU接收到 RS-232 设备的请求报文后,到它发送响应报文的延迟时间必须大于电缆的切换时间。在程序中,可以用中断实现切换延时。同理,如果 S7-200 CPU 发送请求报文,在接收到 RS-232 设备的响应报文后,S7-200 CPU下一次发出报文的延时时间也必须大于电缆的切换时间。在中断程序中,必须考虑电缆的切换时间,例如当采用 19200bit/s 的波特率时,通过定时 5ms 来提供 PPI 电缆接收/发送模式的切换时间,用 MOVB 5,SMB34 来实现定时 5ms。3 通信数据单元的结构 *收稿日期:20070704 第28卷 第3期 广西物理 GUANAGXI WULI Vol.28 No.3 2007 36在自由口模式下,通信协议是由用户自己定义的,由梯形图程序控制。PC 与 PLC 通信的基本单元为“帧”。PC 通过串口将指令数据帧发送到 PLC 的 PORT0(或 PORT1)口,PLC 通过 RCV 指令或字符中断来控制接收指令数据帧,然后对指令数据帧进行译码,译码后调用相应的读/写子程序实现指令要求的相关操作,比如启动或停止等,并返回指令执行的状态信息。需要指定 PLC 的接收缓冲区、译码区、发送缓冲区和用于存放 BCC 码等的缓冲区。当 PC 发指令时,指令数据写入指定的目标寄存器。当 PLC 返回信息时,可以从数据区读取事先写入的数据。此外我们必须规定数据帧的结构,包括 PC 的指令格式和 PLC 的反馈信息格式,PC 与 PLC 在发送和接收数据时应采用相同的数据帧格式。例如,PC 的指令格式为:起始字符+指令类型(读/写)+目标 PLC 站地址+目标寄存器地址+读/写字节数 M+要写入的数据+BCC 校验码+结束字符,每个部分的字节长度是固定。起始字符标志着指令的开始,用 ASCII 码小写字符表示,结束字符标志着指令的结束,用 ASCII 码大写字符表示,比如分别用j和J,各占 1 个字节;指令类型分写操作和读操作 2 种,分别向 PLC 写入和读出数据;在 PLC 内部可以用 4 个字节来表示一个寄存器的地址,由于采用 ASCII 码表示,所以需要 8 个字节;读/写字节数 M,对于读操作,一般是读回从目标寄存器开始的连续的固定字节数(比如 8 个)的数据,对于写操作,需要由 PC 指定,但不超过事先指定的最大字节数;要写入的数据区必须填满,但只有前 M 个字节的数据会被写入目标寄存器;BCC 校验码用于判断传输的正确性,BCC 校验码的方法就是将要传送的字符串(从指令类型到要写入的数据的最后)的 ASCII 码以字节为单位作异或和,并将此异或和作为指令的一部分传送出去。PLC 的反馈信息格式为:起始字符+状态信息+数据区+BCC 校验码+结束字符,其中状态信息为指令执行的状态信息,用来说明读/写是否正确、BCC 码错误、指令格式错误。通信数据帧中,一般要使用 ASCII 码。如果直接采用数据原来的格式传输,就可能与指令中的控制字发生混淆。对于本例,结束字符为J,ASCII 码为 4AH,如果传输的十进制数据为 74,表示为十六进制也是 4AH,PLC 会因为接收到了数据中的 4AH 而停止接收,这样 PLC 接收到的指令将是一个不完整的非法指令,很可能造成 PLC 的误动作。为了避免这种情况的发生,我们可以对要传输的每个字节的数据进行 ASCII 编码,得到 2 个字节的 ASCII编码。例如:对数据 4AH 进行 ASCII 编码,得到 2 个字节:34H 和 41H。因为要传输的数据为实际的十进制数,在 PC 中表示为十六进制,任意的 1 个字节可以用 09,AF 中的 2 个表示,余下的字符作为控制字符使用,控制字符直接用 ASCII 码表示,而组成数据的 09,AF 用 ASCII 码表示,这样就可以避免上述情况的发生。4 PLC 程序及其执行过程 在自由端口模式下,通信协议完全可以由用户程序控制。只有当 CPU 处于 RUN 模式时,才能使用自由端口模式,这可以通过特殊存储器位 SM0.7 来控制自由端口模式的进入。PLC 程序主要有主程序、初始化子程序、接收完成中断程序、校验子程序、写操作子程序、读操作子程序和发送完成中断程序等组成。主程序负责控制被控设备的运转,通过调用 PLC 的初始化子程序,对端口及 RCV接收指令进行初始化和 BCC 码寄存器清零。以下是初始化子程序的一段和相应的注释:LD SM0.0 /该位总是 ON MOVB 9,SMB30 /用通信口 0 9600,N,8,1 第 3 期 PC 与 PLC 的串口通信及编程实现 37MOVB 16#EC,SMB87 /允许接收、检测起始和结束字符、超时检测 MOVB 106,SMB88 /设置起始字符为j,ASCII 码值为 106 MOVB 74,SMB89 /设置结束字符为J MOVB+800,SMW92 /设置接收超时为 800 ms MOVB 35,SMB94 /设置接收的最大字符数目为 35,根据帧的长度来定255 R SM87.2,1 /设置若超过 SMW92 的时间则结束接收 ATCH RCVok,23 /口 0 接收完成产生中断,调用 RCVok ATCH XMTok,9 /口 0 发送完成产生中断,调用 XMTok ENI /中断用户允许 MOVB 2,VB197 /本机站地址为 2,装入寄存器 VB197,用于判断接收 初始化完成后,运行 RCV 指令使端口处于接收状态。RCV 以j开头J结尾的指令数据保存到接收缓冲区,并产生接收完成中断。接收完成中断程序负责将收到的 ASCII 编码还原成原来的数据存入译码区,并调用校验子程序计算 BCC 校验码,如果 BCC 码不一致,则向 PC 反馈 BCC 码错误、指令格式错误信息。触发写操作子程序需同时依次满足指令中的站地址与本机站地址相符、指令类型为写指令和 BCC 检验码正确,写操作子程序负责将指令中的 ASCII 码还原成数据写入目标寄存器,并向 PC 发送表示写入正确的反馈信息。触发读操作子程序需同时依次满足指令中的站地址与本机站地址相符、指令类型为读指令和 BCC 检验码正确,读操作子程序根据指令的要求,将数据转换成十六进制 ASCII 码,并写入发送缓冲区、调用校验子程序计算 BCC 校验码、使用 XMT 指令向 PC 发送反馈信息。写操作子程序和读操作子程序中必须禁止 RCV,避免在处理过程中继续接收数据而改变缓冲区。完成 ASCII 码与十六进制码互相转换的指令为 ATH 和 HTA,使用实例为:ATH VB103,VB134,2 /将接收缓冲区的VB103起2个字节的ASCII转换成十六进制存入译码区的VB134;HTA *VD135,VB156,16 /将*VD135 指针指向目标寄存器的数据连续转换成 16 个字节 ASCII 码,从发送缓冲区的 VB156 连续存入。一般地,PLC 收到一条指令后,应该向 PC 发送反馈信息,PC 根据反馈信息采取相应的措施,例如 PLC 接收错误,PC 必须重新发送指令。发送反馈信息完成时,会产生发送完成中断,调用发送完成中断程序用来处理发送完成一些中断事件,包括复位标志位;允许 RCV;寄存器清零;重新装入地址指针等。5 用 VB 实现指令的发送和数据的接收 Visual Basic 是可视化、面向对象的程序设计语言,具有结构化的事件驱动编程模式、编程效率高等特点。利用 VB6.0 提供的串行通信控件 MSComm,只需要设置和监视该控件的属性和事件,就可以方便快捷地实现串行通信。其中主要的属性有:CommPort:设置并返回通信端口号。Settings:以字符串形式设置并返回波特率、奇偶校验、数据位和停止位。PortOpen:设置并返回通信端口的状态,设置 True 则打开,设置 False 则关闭。此外还有 Input、Output、InputMode、InBufferCount、OutBufferCount、InputLen、RThreshold、CommEvent第28卷 第3期 广西物理 GUANAGXI WULI Vol.28 No.3 2007 38等属性。下面代码是串口通信参数的初始化:With MSComm1 串行通信控件名称为 MSComm1.CommPort=1 根据具体情况选择串口号.Settings=9600,n,8,1 对应的 PLC 程序为 MOVB 9,SMB30.InputLen=0 读出接收缓冲区中的所有内容.PortOpen=True 打开串口 1.InputMode=comInputModeBinary 以二进制格式读取接收缓冲区.RThreshold=1 接收到大于等于 1 个字符就会产生接收事件.InBufferCount=0 清空接收缓冲区.OutBufferCount=0 清空发送缓冲区 End With 发送程序负责向某地址编号的 PLC 发送指令,例如采用前面所述的指令格式,即:起始字符+指令类型(读/写)+目标 PLC 站地址+目标寄存器地址+读/写字节数 M+要写入的数据+BCC 校验码+结束字符,由程序生成指令数据帧,包括计算数据的 BCC 码和数据转换为 ASCII 码,以字符串形式存放于数组变量,不妨假设为 SentB 中,最后用语句 MSComm1.Output=SentB 实现报文的发送。PLC 只有在接收到 PC 发送的指令后才会发送回反馈信息,串行通信控件接收到大于等于 1 个字符就会产生接收事件,触发串行通信控件的 OnComm 事件,只要在该事件子程序 Private Sub MSComm1_OnComm()中编写接收数据的代码即可。接收数据的程序根据反馈信息中起始字符和结束字符判断接收的开始和结束,将接收到的ASCII 码还原成数据,计算 BCC 码,处理数据等工作。计算机的VB编程的关键之处在于,保证与PLC程序完全一致地采用事先规定好的指令帧格式和反馈帧格式,特别是 BCC 码的计算方法和所计算的数据段要完全一致。6 应用实例 文中所述的自由端口模式下 PLC 与 PC 的通信方法,由于用户可以很灵活地控制协议,PLC 程序具有模块化、结构化的特点,各种子程序可移植性好,因此在分布式控制系统和需要计算机处理数据的场合中得到很好的运用和发挥。例如在机场的灯光、电梯、空调的控制系统中,事先根据季节、时间、航班等多种因素产生设备运行的策略表,VB 程序能够按该策略表自动地控制分布在机场的灯光、电梯、空调的运行状态,监测各个设备的运行状态和相关的参数,例如温度、流量、报警等,并记录每天的运行数据,实现分布式控制系统的集中管理和分散控制。参 考 文 献 1西门子(中国)有限公司.S7-200 可编程控制器产品目录Z.2004.2SIEMENS AG.SIMATIC S7-200 Programmable Controller System ManualZ.2004.3廖常初主编.PLC 基础及应用M.北京:机械工业出版社,2003.4Evangelos Petroutsos.Visual Basic 5 从入门到精通M.北京:电子工业出版社,1997.