1.1自由口通信模式介绍
CPU的串行通信口可以由用户程序控制,这种操作模式称为自由端口模式,当选择了自由端口模式时,用户程序可以使用接收中断,发送中断,发送指令(XMT)和接收指令(RCV)来进行通信操作。在自由端口模式下,通信协议完全由用户程序控制,有很大的灵活性。SMB30(用于端口0)和SMB130(如果CPU有两个端口,则用于端口1)用于选择波特率、奇偶校验、数据位数、通信协议。
只有CPU处于RUN模式下时,才可以进行自由端口通信,通过向SMB30(端口0)和SMB130(端口1)的协议选择区置1,可以允许自由端口模式。处于自由端口模式时,PPI通信协议被禁止,此时不可以于编程设备通信(比如对程序进行监控或对CPU进行操作)当CPU处于STOP模式时,自由端口被禁止,通信口自动切换为PPI协议,从新建立与编程设备的正常通信。
在程序中可以用SM0.7(反应CPU当前方式的模式开关)来控制自由端口模式进入,当SM0.7为“0”时,模式开关处于TREM位置;当SM0.7为“1”时,模式开关处于RUN位置。只有模式开关位于RUN位置时,才允许自由端口模式,当需要使用编程设备对程序进行状态监控或对CPU进行操作可以将模式开关改变到其他位置。
1.2 发送与接收指令介绍
用XMT指令可以方便的发送一个或多个字节缓冲区的内容,最多为255个字节。如果有一个中断服务程序连接到发送结束事件上,在发完缓冲区的最后一个字符时,则会产生一个中断(对端口0的中断事件为9,对端口1的中断事件为26),当然也可以不用中断 来判断发送指令是否完成,而是监控SM4.5或SM4.6的状态,以此来判断发送是否完成。
用RCV指令可以方便的接收一个或多个字节缓冲区的内容,最多为255个字节。这些字符存储在接收缓冲区中。如果有一个中断程序连接到接收完成事件上,在接收到缓冲区中的最后一个字符时,则会产生一个中断(对端口0为中断事件23,对端口1为中断事件24)。当然还是可以不用中断事件来判断接收信息是否结束,而是通过监视SMB86(端口0)或SMB186(端口1)状态的变化来判断接收状态的结束。当接收指令没有被激活或者是接收已经结束时,SMB86或SMB186为1,当正在接收时,它们为0。
1.3 RS-485串行通信硬件实现
图1 串行通信实现
由于S7-200 PLC采用RS485标准接口,MSP430开发板也是标准的RS485接口,所以PLC与MSP430的连接可以直接通过一根RS485电缆相连接。但是由于电脑的端口为RS232端口,所以PLC与电脑的连接需要用到RS232转RS485,硬件连接如图1。
二、通信协议设计
……
图2 PLC与单片机通信结构图
如图2示:
1、PLC与单片机采用自由口通信模式,PLC与单片机之间是主从关系。S7-200的通信端口是半双工RS-485芯片,发送指令和接收指令不能同时有效,其通信采用主从轮询的方式:PLC始终处于主导地位,始终具有初始传送优先权,所有通讯均由PLC来启动,向从站发送数据或者从从站中读取数据都是主站以命令帧形式发送。PLC与单片机初始化状态时均处于接收信息状态
2、PLC可以主动的向各单片机发送数据,各单片机依据PLC所发数据的站地址来区分该信息是否该自己响应。单片机在需要主动向PLC发送数据的时候,必须先向PLC发送申请。PLC在接收到某个单片机的申请信号后,会根据实际情况先向所有单片机发送禁止向主机发送数据的命令,然后向申请通讯的单片机发送命令允许其发送数据给主机。PLC接收完该单片机的数据后,再向所有单片机发广播允许所有单片机向其发送申请。
2.1 通信设备参数设置
S7-200系列PLC(CPU226)与自由口模式通信有关的寄存器为SMB30、SMB130及其它特殊寄存器,它们主要用于通讯方式的设置与运行管理。
在本次设计中,用到CPU226端口0,其通讯控制由SMB30设置。
表1自由端口控制寄存器
| PP 奇偶选择 00:无奇偶校验 01:偶校验 10:无奇偶校验 11:奇校验 |
| D 每个字符的数据位 0:每个字符8位 1:每个字符7位 |
| BBB 自由口波特率(bit/s) 000:384000 100:2400 001:192000 101:1200 010:9600 110:600 011:4800 111:300 |
| MM 协议选择 00:点到点接口协议(PPI/从站模式) 01:自由口协议 10:点到点接口协议(PPI/主站模式) 11:保留(默认设置为PPI/从站模式) |
2.2 数据格式
2.2.1 广播
PLC作为主站,可以直接向单片机发送数据;而单片机作为从站不能主动向PLC发送数据。当单片需要主动向PLC发送数据的时候,可先向PLC发送申请。PLC接收到申请以后,判断此时通讯通道是否空闲,如果空闲则响应申请,并向所有单片机广播此时通信繁忙不允许发送申请,然后只允许已发送申请的单片机发送数据;当PLC与该单片机通讯完毕后,PLC向所有单片机发广播,此时通信空闲,允许单片机发送申请。同时,当单片机接收到广播消息的时候,首先判断是通信繁忙的信号还是通信空闲的信号,只有当接收到了通信空闲信号时,才可以向PLC发申请。单片机对PLC的广播信号不做反馈处理。
通信忙碌(字符@,ASCII码为)、通信空闲(字符$,ASCII码为36),单片机在接收到@时,不可向PLC发送申请。只有当接收到$且需要向PLC传输数据的时候才能发送申请。
广播数据格式:
| 字符数 | 起始符 | 广播标志 | 结束符 |
| VB300 | 字符数 | |
| VB301 | 起始字符(STX)ASCII为2 | Byte0 |
| VB302 | 标志字符(%空闲:&忙碌) | Byte1 |
| VB303 | 结束字符(ETX)ASCII为3 | Byte2 |
经过分析得知:
PLC向单片机发送的数据包括两种,一种是控制单片机动作的控制信号;另一种是当接收到单片机发送来的数据以后,经过比较校验要发送一个反馈信息给单片机告之单片机PLC接收到的信息是否正确。数据格式如表3示:
| 字符数 | 起始符 | 目标地址 | 指令类型 | 字节数 | 数 据 | BCC校验码 | 结束符 |
| VB100 | 字符数 | ||
| VB101 | 起始字符(STX)ASCII为2 | Byte0 | |
| VB102 | 目标站地址(十六进制ASCII码)(单片机地址) | Byte1 | |
| VB103 | Byte2 | ||
| VB104 | 指令类型 读(05H)/写(06H)/反馈(07H) | Byte3 | |
| VB105 | 读/写字节数 (VB107~~VB118共12个) | Byte4 | |
| VB106 | Byte5 | ||
| VB107 | 数据 区(十六进制ASCII码) | 控制命令: (A表示步1启动) (B表示步2启动) (C表示步3启动) 反馈信息: 正确(00)指令错误(01) 校验错误(02)) | Byte6 |
| VB108 | Byte7 | ||
| VB109 | 备用1 | Byte8 | |
| VB110 | Byte9 | ||
| VB111 | 备用2 | Byte10 | |
| VB112 | Byte11 | ||
| VB113 | 备用3 | Byte12 | |
| VB114 | Byte13 | ||
| VB115 | 备用4 | Byte14 | |
| VB116 | Byte15 | ||
| VB117 | 备用5 | Byte16 | |
| VB118 | Byte17 | ||
| VB119 | BCC校验码 (十六进制ASCII码) | Byte18 | |
| VB120 | Byte19 | ||
| VB121 | 结束字符(ETX)ASCII为3 | Byte20 | |
字符数占用一个字节,设置发送数据的个数。
2、起始符 (VB101)
起始符占用一个字节,标志通讯的开始,在本次设计中被定义为ASCII码为2的“STX”。
3、目标地址(VB102~~VB103)
目标地址占用两个字节,主要用于单片机判断PLC所发送信息是否是发送给自己,目标的站地址以ASCII码的格式表示。
4、指令类型 (VB104)
指令类型占用一个字节,指令类型分读、写、反馈三种,在次设计中05H代表读操作,06H代表写操作,07H代表反馈。
5、字节数 (VB105~~VB106)
字节数为数据个数,在本次设计中所发送数据的长度是固定的12个字节,写入0BH,即十进制的12。
6、数据(VB107~~VB118)
数据在指令中以十六进制ASCII码的格式表示,占用指令的12个字节。数据区必须填满,但单片机只是选取其中有用的部分执行指令。(本次设计中只在VB107和VB108中发送数据,当指令类型为写时,VB107和VB108中发送的是单片机的控制信号;当指令类型为反馈时,VB107和VB108中发送的是校验后给单片机的反馈信息)
7、BCC校验码 (VB119~~VB120)
在传输过程中,指令有可能受到干扰而使原来的数据信号发生扭曲,此时的指令是错误的,为了侦测指令在传输过程中发生的错误,接收方必须对指令作进一步的确认工作,以防止错误的指令被执行,最简单的方法就是使用校验码。在本次设计中,采用BCC校验码的方法即:将要传送字符串的ASCII码以字节为单位作异或和,并将此异或和作为指令的一部分传送出去;同样地,接收方在接到指令后,以相同的方式对接收到的字符串作异或和,并与传送方所送过来的值作对比,若其值相等,则代表接收到的指令是正确的,反之则是错误的
8、结束符 (VB121)
结束字符标志着发送信息的结束,在本次设计中被定义为ASCII码为3的“ETX”。
2.2.3 PLC接收数据
同理, PLC所接收的数据也包括两种:一种是当单片机动作完成时,会发送一个标志给PLC说明动作已经完成,PLC可以执行下一步动作;另一种是当单片机接收到控制信号时,比较校验以后发送回来的反馈信号。数据格式如表4所示。
| 字符数 | 起始符 | 目标地址 | 指令类型 | 字节数 | 数 据 | BCC校验码 | 结束符 |
| 字符数 | VB200 | ||
| Byte0 | 起始字符(STX)ASCII为2 | VB201 | |
| Byte1 | 目标站地址(十六进制ASCII码)(单片机地址) | VB202 | |
| Byte2 | VB203 | ||
| Byte3 | 指令类型 [读(05H)/写(06H)/反馈(07H)] | VB204 | |
| Byte4 | 读/写字节数: (VB207~~VB218共12个) | VB205 | |
| Byte5 | VB206 | ||
| Byte6 | 数据区(十六进制ASCII码) | 命令执行状况: 完成阶段1——a 完成阶段2——b 完成阶段3——c 反馈信息: 正确(00) 指令错误(01) 校验错误(02) | VB207 |
| Byte7 | VB208 | ||
| Byte8 | 备用 | VB209 | |
| Byte9 | VB210 | ||
| Byte10 | 备用 | VB211 | |
| Byte11 | VB212 | ||
| Byte12 | 备用 | VB213 | |
| Byte13 | VB214 | ||
| Byte14 | 备用 | VB215 | |
| Byte15 | VB216 | ||
| Byte16 | 备用 | VB217 | |
| Byte17 | VB218 | ||
| Byte18 | BCC校验码 (十六进制ASCII码) | VB219 | |
| Byte19 | VB220 | ||
| Byte20 | 结束字符(ETX)ASCII为3 | VB221 | |
字符数占用一个字节,记录在此次数据接收过程中接收数据的个数。
2、起始字符 (VB201)
起始符占用一个字节,标志接收数据的开始,在本次设计中定义为ASCII码为2的“STX”。
3、目标地址(VB202~~VB203)
目标地址占用两个字节,主要作用是让PLC能够分别出所接受到的信息是来源于某一个单片机。目标的站地址以ASCII码的格式表示。
4、指令类型 (VB204)
指令类型占用一个字节,指令类型分读、写、反馈三种,在次设计中05H代表读操作,06H代表写操作,07H代表反馈。
5、字节数 (VB205~~VB206)
字节数为单片机发送给PLC的数据个数,在本次设计中所发送数据的长度是固定的12个字节,写入0BH,即十进制的12。
6、数据(VB207~~VB218)
数据在指令中以ASCII码的格式表示,占用指令的12个字节。数据区必须填满,但PLC只是选取其中有用的部分执行指令。(本次设计中只有VB207和VB208中所接收数据有用,当指令类型为写时,VB207和VB208中所接收到的信息是单片机完成动作以后的标志信息;当指令类型为反馈时,VB207和VB208中所接收的信息是校验后单片机给PLC的反馈信息)
7、BCC校验码 (VB219~~VB220)
在传输过程中,指令有可能受到干扰而使原来的数据信号发生扭曲,此时的指令是错误的,为了侦测指令在传输过程中发生的错误,接收方必须对指令作进一步的确认工作,以防止错误的指令被执行,最简单的方法就是使用校验码。在本次设计中,采用BCC校验码的方法即:将要传送字符串的ASCII码以字节为单位作异或和,并将此异或和作为指令的一部分传送出去;同样地,接收方在接到指令后,以相同的方式对接收到的字符串作异或和,并与传送方所送过来的值作对比,若其值相等,则代表接收到的指令是正确的,反之则是错误的。
8、结束符 (VB221)
结束字符标志着接收信息的结束,在本次设计中被定义为ASCII码为3的“ETX”。
三、通讯程序设计
3.1 PLC的通讯程序设计
3.1.1 主程序设计
3.1.2 BCC校验码程序设计
3.2 单片机的通讯程序设计下载本文