大家知道S7‑200 SMART的串口可以配置为自由模式,这给通讯实现提供了很大方便,当启用接收消息RCV时消息帧的长度限定为不超过255字节,但当ADU长度超过255字节时怎么完成通讯?
1.概述
S7‑200 SMART CPU集成 RS485 端口(端口 0)或CM01 信号板 (SB) RS232/RS485 端口(端口 1)配置成自由口通讯,并启用接收中断(对于端口 0 为中断事件 23,对于端口 1 为中断事件 24)时。
CPU 会在接收消息完成事件(可设置为:结束字符检测、字符间定时器、消息定时器、最大字符计数)到来后终止接收消息功能并生成接收中断。如当接收到的字符数达到设置的最大字符数(端口 0对应SMB94,端口 1对应SMB194)。
而接收缓冲区最大可设置为255字节,这就决定了接收到的应用数据单元(ADU)长度不能大于255字节。那有没有办法接收超过255字节的ADU?本文给大家介绍一种方法。
2.字符中断
方法的核心就是使用接收字符中断控制接收数据。启用接收字符中断(对于端口 0 为中断事件8,对于端口 1 为中断事件 25),接收每个字符时都会产生中断。执行连接到接收字符事件的中断例程之前,接收到的字符存入 SMB2,自由端口模式下接收到的每一个字符都会存入这一位置,便于用户程序访问。
由于接收中断并不启用,接收指令的结束条件无法通过设置接收消息控制字节(端口 0对应SMB87,端口 1对应SMB187)完成,所以需编写接收超时程序来判断ADU帧的结束。
3.示例程序
端口初始化
示例程序使用端口0自由模式,参数配置为波特率9600、数据位8位、停止位1位、无奇偶校验(SMB30=2#1001), 接收消息控制字节SMB30=2#10000000。要接收的最大字符数SMB94=255,即使程序没有使用字符计数消息终止。
启动端口 0 发送完成中断(事件9) 、端口 0 接收字符中断(事件8)以及定时中断 0(SMB34 控制时间间隔,设置为最大255ms)(事件10)。
此定时中断 0作为接收超时定时功能的实现,在接收消息过程中,在接收字符中断程序中不停复位定时中断 0。当消息所有字符接收完后,定时中断将在设定的255ms后动作,然后执行定时中断程序处理接收到的数据(如帧校验、PDU移入数据存储区等)。
接收字符中断程序
在程序的开始通过调用ATCH指令复位定时器中断0,因为重新连接时,定时中断功能会清除先前连接的所有累计时间,并开始重新计时。
然后通过控制指针把接收到的字符(SMB2)放入VB102开始的接收缓冲区
注意当以较高波特率(38.4 Kbps 到 115.2 Kbps)使用字符中断时,字符到达的时间间隔会非常短。例如,波特率为 38.4 Kbps 时的字符到达为 260 微秒,57.6 Kbps 时为 173 微秒,115.2 时为 86 微秒。这就要确保接收字符中断程序执行时间足够短,以避免字符丢失。
定时器0中断程序
端口空闲时,定时中断程序会被周期的(255ms)调用执行,所以如果未接收到数据应该跳过PDU处理程序的执行,及判断VW100=0 执行JMP。
当接收完ADU处理PDU时首先通过复位SM87.7禁用接收消息功能,处理完后再置位SM87.7以启用接收消息功能。
3.接收测试
通过串口调试软件发送包含1155个字符的data.txt文本到PLC
地址MW10表示接收到的字符数
推荐阅读:
若觉得文章对你有帮助,随手点在看、分享转发,也是支持和鼓励。
扫描下面二维码、关注后,在底部菜单中可查看更多内容!
长按识别图中二维码关注