自由口通讯概述

S7-200PLC的通讯口支持RS485接口标准。采用正负两根信号线作为传输线路。

工作模式采用串行半双工形式,在任意时刻只允许由一方发送数据,另一方接收数据。

数据传输采用异步方式,传输的单位是字符,收发双方以预先约定的传输速率,在时钟的作用下,传送这个字符中的每一位。

传输速率可以设置为1200、2400、4800、9600、19200、38400、57600、115200。

字符帧格式为一个起始位、7或8个数据位、一个奇/偶校验位或者无校验位、一个停止位。

字符传输从最低位开始,空闲线高电平、起始位低电平、停止位高电平。字符传输时间取决于波特率。

数据发送可以是连续的也可以是断续的。所谓连续的数据发送,是指在一个字符格式的停止位之后,立即发送下一个字符的起始位,之间没有空闲线时间。而断续的数据发送,是指当一个字符帧发送后,总线维持空闲的状态,新字符起始位可以在任意时刻开始发送,即上一个字符的停止位和下一个字符的起始位之间有空闲线状态。

示例:用PLC连续的发送两个字符(16#55和16#EE)(程序如图3和图4),通过示波器测量CPU通讯端口管脚3/8之间的电压,波形如下图1.:

图1.两个字符(16#55和16#EE)的波形图

示例说明:

16进制的16#55换算成2进制等于2#01010101,16进制的16#EE换算成2进制等于2#11101110。如图所示,当数据线上没有字符发送时总线处于空闲状态(高电平),当PLC发送第一个字符16#55时,先发送该字符帧的起始位(低电平),再发送它的8个数据位,依次从数据位的最低位开始发送(分别为1、0、1、0、1、0、1、0),接着发送校验位(高电平或低电平或无)和停止位(高电平)。因为本例中PLC连续的发送两个字符,所以第一个字符帧的停止位结束后便立即发送下一个字符帧的起始位,之间数据线没有空闲状态。假如PLC断续的发送这两个字符,那么当PLC发送完第一个字符帧的停止位后,数据线将维持一段时间空闲状态,再发送下一个字符帧。

字符传输的时间取决于波特率,如果设置波特率为9.6k,那么传输一个字符帧中的一位用时等于1/9600*1000000=104us,如果这个字符帧有11位,那么这个字符帧的传输时间等于11/9600*1000=1.145ms.

通讯口初始化

SMB30(对于端口0)和SMB130(对于端口1)被用于选择波特率和校验类型。SMB30和SMB130可读可写。见下图2.

图2.特殊存储器字节SMB30/SMB130

示例:定义端口0为自由口模式,9600波特率,8位数据位,偶校验,程序如下图3.:

图3.通讯口初始化程序

发送数据

发送指令XMT能够发送一个字节或多个字节的缓冲区,最多为255个。使用边沿触发。

发送缓冲区格式:第一个字节为字符个数,其后为发送的信息字符。

示例:如果PLC连续发送2个字符16#55和16#EE,程序如下图4.:

图4.发送指令程序

示例说明:PLC通过数据块写入数据。XMT指令中TBL缓冲区首地址VB200写入发送字符的个数,VB201和VB202分别写入发送字符。通讯口波形图如图1.

判断发送完成的方法:

方法一:发送完成中断。通过连接中断服务程序到发送结束事件上,在发送完缓冲区中的最后一个字符时,则会产生一个中断。对通讯口0为中断事件9,对通讯口1为中断事件26。连接中断程序到中断事件示例如下图5.:

图5.建立发送完成中断的程序

方法二:发送空闲位。当port0发送空闲时,SM4.5=1。当port1发送空闲时,SM4.6=1.

示例:如果PLC断续的发送2个字符16#55和16#EE.

方法一:利用发送完成中断,在主程序中建立中断事件,执行XMT发送16#55,发送完成后,进入发送完成中断程序中,执行XMT发送16#EE。波形图如图6.

图6.字符波形图

方法二:利用发送空闲位。当执行XMT发送完16#55后,利用SM4.5/4.6的上升沿(确保发送的字符帧发送完成),往XMT的TBL缓冲区写入新字符16#EE,并再次触发发送。波形图如图7.

图7.字符波形图

两种方法均断续发送字符,即两个字符之间有空闲状态。注意:由于SM4.5/4.6的使用受程序扫描周期的影响,编程中推荐使用发送完成中断。

Break断点

Break状态:持续以当前波特率传输16位数据,且一直维持“0”状态。

产生方式:把字符数设置为0并执行XMT指令,可以产生一个Break状态。

Break用途:可以作为接收的起始条件。

示例:通过XMT指令发送一个Break断点。偶校验,8个数据位,9.6K。程序如下图8.:

图8.发送一个断点的程序

Break状态的波形图如下图9.

图9.一个断点波形图

如果通过接收方为上位机或者S7-200PLC,那么它们接收到的字符为16#00.

那么通过发送一个Break断点接收到的16#00与发送一个字符帧16#00有什么不同呢?Break状态是传输16位数据一直为0。而发送一个字符16#00(帧格式为1个起始位,8个数据位,偶校验和停止位)则传输11位该字符帧。如下图10.

图10.一个断点和字符0的波形图

接收数据

接收指令RCV能够接收一个字节或多个字节的缓冲区,最多为255个。使用边沿触发或第一个扫描周期触发。

接收缓冲区格式:第一个字节表示接收的字符个数,其后为接收的信息字符。

RCV使能会将TBL缓冲区中的字符个数清零。

示例:如果发送方给PLC发送2个字符16#55和16#EE,PLC的接收程序如下图11.:

图11.接收指令程序

示例说明:RCV指令TBL缓冲区的首地址VB200保存的是接收字符个数,其后是信息字符。

判断接收完成的方法:

方法一:接收完成中断。通过连接中断服务程序到接收信息完成事件上,在接收完缓冲区中的最后一个字符时,则会产生一个中断。对端口0为中断事件23,对端口1为中断事件24。连接中断程序到中断事件示例如下图12.:

图12.建立接收完成中断的程序

方法二:接收状态字节。SMB86(port0),SMB186(port1)。

当接收状态字节为0,表示接收正在进行。

当接收状态字节不为0,表示接收指令未被激活或者已经被中止。见下图13.

图13.接收状态字节SMB86(port0)/SMB186(port1)

接收指令起始和结束条件

接收指令使用接收信息控制字节(SMB87或SMB187)中的位来定义信息起始和结束条件。必须为接收信息功能操作定义一个起始条件和一个结束条件(最大字符数)。如下图14.

图14.接收控制字节SMB87(port0)/SMB187(port1)

接收指令起始条件

接收指令支持几种起始条件:

1.空闲线检测

定义:在传输线上一段安静或空闲的时间。

当接收指令执行时,接收信息对空闲线时间进行检测。在空闲线时间到之前接收的字符,被忽略且按照SMW90/190给定的时间重新启动空闲线定时器。在空闲线时间到之后,接收的字符存入信息缓冲区。

空闲时间的典型值为在指定波特率下传输3个字符的时间。

示例:PLC接收的起始条件定义为空闲线检测(设置SMB87中的il=1,sc=0,bk=0,空闲线超时时间SMW90=10ms);接收的结束条件定义为最大字符个数SMB94=10。程序如下图15.

图15.空闲线检测程序

示例说明:

(紫色部分:)当启动接收指令后,PLC对空闲线时间进行检测,如果在SMW90中设定的空闲线时间到之前,已经接收到了字符1,则字符1被忽略,并且按照SMW90中设定的时间重新启动空闲定时器。

(橙色部分:)同样的,如果在SMW90中设定的空闲线时间到之前,已经接收到了字符2,则字符2也被忽略且空闲线定时器重新启动。

(绿色部分:)如果在SMW90中设定的空闲线时间到之后,接收到字符3,则字符3作为第一个信息字符存入接收缓冲区。见下图16.

图16.用空闲时间检测来启动接收指令

2.起始字符检测

当接收到SMB88/188指定起始字符后,接收信息功能将起始字符作为信息的第一个字符存入接收缓冲区。

起始字符之前的字符被忽略,起始字符和其后的所有字符存入接收缓冲区。

示例:PLC接收的起始条件定义为起始字符检测(设置SMB87中的il=0,sc=1,bk=0,起始字符SMB88=16#55);接收的结束条件定义为最大字符个数SMB94=4。程序如下图17.

图17.起始字符检测程序

示例说明:PLC接收总线上传来的一串字符,16#01、16#02、16#03、16#55、16#AA、16#BB、16#CC,当PLC检测到起始字符16#55后,开始接收并将16#55作为第一个信息字符存入接收缓冲区,起始字符之前的3个字符被忽略。如下图18.

图18.用起始字符检测来启动接收指令

3.空闲线和起始字符

接收指令执行时,先检测空闲线条件,在空闲线条件满足后,检测起始字符。如果接收的字符不是起始字符,则重新检测空闲线条件。

在空闲线条件满足和接收到起始字符之前接收的字符被忽略。起始字符和字符串一起存入缓冲区。

适用于通讯连接线上有多个设备的情况。

示例:PLC接收的起始条件定义为空闲线和起始字符(设置SMB87中的il=1,sc=1,bk=0,空闲线检测时间SMW90=10ms,起始字符SMB88=16#55),结束条件为最大字符个数2.

示例说明:PLC接收总线上传来的数据,分几种情况:

当空闲线条件不满足,即使空闲后出现起始字符,PLC也不开始接收。如图19.

图19.

当PLC先检测到起始字符,再检测到空闲线条件满足,PLC不启动接收。或者当PLC检测到空闲线条件满足后,接收到除起始字符之外的任意字符,PLC也不启动接收。如图20.

图20.

只有当PLC检测空闲线条件满足后,接收到起始字符,PLC才启动接收,在空闲线条件满足和接收到起始字符之前接收的字符被忽略。起始字符和字符串一起存入缓冲区,缓冲区首地址VB200。如图21.

图21.用空闲线和起始字符来启动接收指令

4.断点检测

大于一个完整字符传输时间的一段时间内,接收数据一直为0.

在断点之前接收的字符被忽略,在断点之后接收的字符存入信息缓冲区。

示例:PLC接收的起始条件定义为断点检测(设置SMB87中的il=0,sc=0,bk=1),结束条件为最大字符个数8。

示例说明:PLC接收总线上传来的一串字符和断点,依次为16#0016#00(连续的两个字符间没有空闲)、16#0016#00(断续的两个字符间有空闲)、第一个Break断点、16#55、第二个Break断点、16#EE。当PLC检测到第一个断点状态后,启动接收,接收的字符存入信息缓冲区(第二个断点),第一个断点之前的字符被忽略。接收缓冲区起始地址为VB200。如下图22.

图22.用断点检测来启动接收指令

5.断点和起始字符

在断点条件满足后,检测起始字符。

在断点条件满足后,如果收到除起始字符外的任意字符,重新检测新的断点。

在满足断点和起始字符之前接收的字符将被忽略,起始字符和字符串一起存入信息缓冲区。

示例:PLC接收的起始条件定义为断点和起始字符(设置il=0,sc=1,bk=1,起始字符SMB88=16#55)。结束条件为最大字符个数8.

示例说明:PLC接收总线上传来的一串字符和断点,依次为16#55、break、16#AA、16#55、break、16#55、16#EE、16#FF. 分几种情况理解:

当PLC先检测到起始字符再检测到断点,PLC不启动接收。(SC+BK)

当PLC检测到断点后,接收到除起始字符外的任意字符,PLC不启动接收。(BK+Char+SC)

只有当PLC检测到断电后,紧接着检测到起始字符,才启动接收并且将起始字符和字符串一同存入信息缓冲区,断点和起始字符之前接收的字符将被忽略。(BK+SC)

如图23.

图23.用断点和起始字符检测来启动接收指令

6.任意字符。

任意字符接收是空闲线检测的特例。

设置方式:il=1,sc=0,bk=0,空闲线时间SMW90/190=0。

接收指令一执行,立即接收任意字符,并把所有接收字符存入信息缓冲区。

允许使用信息定时器监控接收是否超时。当接收指令执行时,信息定时器启动,如果没有其他终止条件满足,信息定时器超时会接收接收功能。

接收指令结束条件

接收指令支持以下一种或几种组合的结束条件:

1.结束字符检测

在起始条件之后,接收指令检查接收的所有字符,如果检测到结束字符,则将其存入缓冲区,结束接收。

示例:PLC接收的结束条件定义为结束字符检测(设置SMB87中的ec=1,定义结束字符SMB89=16#55),接收起始条件定义为起始字符检测(起始字符16#AA)。

示例说明:PLC接收总线上传来的一串字符,依次为16#AA、16#BB、16#CC、16#55、16#EE、16#FF。当PLC检测到起始字符16#AA后,启动接收,当检测到结束字符16#55后,结束接收并将接收的所有字符存入信息缓冲区。如下图24.

图24.用结束字符检测来结束接收指令

2.字符间隔定时器

字符间隔时间定义:从一个字符的结尾(停止位)到下一个字符的结尾(停止位)之间的时间。

接收到字符后,字符间隔定时器重新启动。

两个字符之间的间隔时间超过SMW92/192则结束接收。

示例:PLC接收的结束条件定义为字符间隔定时器(设置SMB87中的c/m=0,tmr=1,信息超时时间SMW92),接收起始条件定义为起始字符检测。

示例说明:PLC接收总线上传来的一串字符,当PLC满足接收条件后启动接收,接收完一个字符的停止位后,重新启动字符间隔定时器,如果检测到下一个字符帧停止位时SMW92时间未到,则重新启动字符间隔定时器,如果当SMW92时间到时还未检测到下一个字符帧的停止位,则结束接收。如下图25.

图25.用字符间隔定时器来结束接收指令

3.信息定时器

当接收启动条件一满足,信息定时器就启动,当时间超过SMW92/192指定的时间,信息定时器时间到结束接收。

示例:PLC接收的结束条件定义为信息定时器(设置SMB87中的c/m=1,tmr=1,信息超时时间SMW92),接收起始条件定义为起始字符检测。

示例说明:PLC接收总线上传来的一串字符,当PLC满足接收条件后启动接收,信息定时器启动,当SMW92时间到时,结束接收。如图26.

图26.用信息定时器来结束接收指令

4.最大字符计数

当接收字符个数达到或超过最大字符个数(SMB94/SMB194),接收功能结束。

由于接收指令需要知道接收信息的最大长度,以保证信息缓冲区之后的数据不被覆盖,所以即使不被用作接收结束条件,也必须指定最大字符个数。

如果没有指定最大字符个数,则SM86.6/186.6=1(输入参数错误或丢失启动或结束条件)

5.校验结束

当接收字符的同时出现硬件信号校验错误时,接收指令会自动结束。

只有在SMB30/130中使能校验位,才有可能出现校验错误。没有办法禁止此功能。

6.用户结束。

通过程序结束接收功能:将SM87.7或SM187.7置为0,且需边沿触发RCV接收指令。

以上内容是通过发送和接收指令实现S7-200PLC的自由口通讯。另外,S7-200PLC还提供了通讯口字符接收中断功能。见下文。

字符中断

使用字符中断方式接收数据,接收每个字符时都会产生中断。在执行与接收字符事件相连的中断程序前,接收的字符存入SMB2寄存器中,校验状态存入SM3.0。 SMB2、SM3.0都是只读的。

Port0/Port1共用SMB2/SMB3。Port0对应于中断事件8。Port1对应于中断事件25。

SMB2使用条件:RCV指令不使能,通讯端口为自由口模式,且建立中断事件8/25。

字符中断使用方法:

以端口0接收字符为例:如图27.

图27.字符中断程序


当CPU通过端口0接收到一个字符后,会将该字符存入接收字符缓冲区SMB2,然后进入相连接的中断程序中。

注意:对于这段程序,如果在中断程序中不作任何编程,那么当CPU接收n个字符时,中断程序将被执行n次,SMB2寄存器存储接收到的最后一个字符。

如上位机通过串口调试软件给CPU发送3个字符16#AA、16#BB和16#CC,如下图28.
图28.通过串口调试软件发送字符


那么与接收字符事件相连的中断程序将被执行3次,SMB2中只能保存最后一个接收到的字符16#CC。如下图29.

图29.状态表监控SMB2

自由口通信例程

为了更好的理解自由口的编程,可参考下面的例程。

该例程涉及到两台S7-200PLC,其中发送方向接收方发送数据,接收方接收到数据后再给发送方发送数据,如此往复。

发送方例程

自由口发送方程序:先发送3个字符'a'、'b'、'c' 到接收方,然后转为接收状态,接收到对方的3个字符'1'、'2'、'3' 后重新启动发送指令,将'd'、'e'、'f' 发送到接收方后再启动接收,随后收到3个字符'4'、'5'、'6'。然后重复上述过程。

接收方例程

自由口接收方程序:先接收3个字符'a'、'b'、'c' ,然后转为发送,给对方发出3个字符'1'、'2'、'3' 后重新启动接收指令,待收到'd'、'e'、'f' 后重新启动发送指令,发出3个字符'4'、'5'、'6'后再次转为接收状态。然后重复上述过程。

注意:此指令库/程序的作者和拥有者对于该软件的功能性和兼容性不负任何责任。使用该软件的风险完全由用户自行承担。由于它是免费的,所以不提供任何担保,错误纠正和热线支持,用户不必为此联系西门子技术支持与服务部门。

S7-200 CPU实现与条码扫描枪通信

例程 1 :S7-200 CPU集成的RS485 端口(端口0)实现与条码扫描枪通信
条码扫描枪通常为 RS232 端口,其与 S7-200 CPU 集成的 RS485 端口连接时需要使用 RS232/485 转换设备或 RS-232/PPI 多主站电缆。
条码扫描枪接收到条码后会自动通过 RS232 端口发送报文,S7-200 CPU 需要调用 RCV 指令接收报文,并在接收完成中断中再次使能 RCV 指令循环接收报文。


CPU 主程序见图1.所示:

图1.CPU 主程序
1.设置 SMB30 = 2#00001001 (自由口通信,波特率 9600,8 位数据位,无校验);
2.设置 SMB87 = 2#10010100,使用空闲线检测为信息接收的起始条件,使用字符间定时器为信息接收的结束条件 ;
3.设置空闲线定时器 SMW90 = 5 ms,字符间定时器 SMW92 = 5 ms,允许最大接收字符个数 SMB94 = 50;
4.连接中断子程序 INT_0 到通信端口 0 接收完成事件,并使能中断;
5. 使用 SM0.1 触发 RCV 指令地执行。


CPU 中断程序见图2.所示:

图2.CPU 中断程序
1.判断信息接收结束是否为字符间超时结束(SM86.2 = 1),若是,则认为接收成功,接收成功计算器 VB200 自加一;
2.消息接收成功时接收的信息拷贝到 VB300 为起始地址的存储区;
3.开始下一次 RCV 指令地执行。
以上描述步骤参考下面的通信例程,例程中的 CPU 类型可能与用户实际使用的类型不同,用户可能需要先对例子程序做修改和调整,才能将其用于测试。

扫描枪通信.mwp

说明: https://www.ad.siemens.com.cn/productportal/prods/s7-200-smart-portal/200smarttop/images/4.gif注意:此指令库/程序的作者和拥有者对于该软件的功能性和兼容性不负任何责任。使用该软件的风险完全由用户自行承担。由于它是免费的,所以不提供任何担保,错误纠正和热线支持,用户不必为此联系西门子技术支持与服务部门。

 

图31.程序


例程2,接收到5个字符后循环接收的程序:如图32.

图32.程序


注意,程序中的的指针不要选择累加器AC,因为累加器不能在主程序和中断程序中传递参数。

2、字符中断和RCV指令之间有什么关系?

简单地说,当RCV指令使能时,接收字符不进入SMB缓冲区。

分析实验如下:

在主程序中我们既定义PLC执行RCV接收指令的起始结束条件(起始条件为起始字符16#AA,结束条件为结束字符16#BB),又建立字符中断事件8,上升沿条件触发RCV指令。

上位机通过串口调试软件给CPU发送字符。如图33.。
图33.通过串口调试软件发送字符

程序如下图34.:

图34.测试程序

状态表监控结果:如下图35.

图35.状态表监控结果

结论:

当RCV指令不触发的话,接收字符只进入SMB2缓冲区,不进入RCV指令的接收缓冲区。

当RCV指令触发后,满足CPU接收的起始和结束条件的字符存入RCV指令对应的TBL缓冲区。起始条件之前的字符既不存入RCV缓冲区,也不存入SMB2缓冲区。结束条件之后接收到的字符,存入SMB2缓冲区。