技术论坛

 S7-200smart侦听ModbusRtu返回数据简单测试

返回主题列表
作者 主题
水煮花生
侠士

经验值:1973
发帖数:209
精华帖:3
楼主    2021-02-08 17:02:52
主题:S7-200smart侦听ModbusRtu返回数据简单测试 精华帖 

之前看到有人提出一个问题:

现有一套完整设备,触摸屏+6只传感器,屏和传感器用RS485总线通信,采用MosbusRtu协议,但没有屏的程序。这种情况,在不改变屏和传感器的条件下,实现用一个PLC也能采集到6只传感器的数据。

刚好有点空,以此为引,测试一个简单的逻辑。

一,实现构想,S7-200SMART本体具有一个RS485接口,ModbusRTU的指令库,也可以通过自由口协议进行编程。PLC的串口能发送和接收指令,如果把PLC串口接到总线上,打开端口,不发送数据,接收线路上的消息,对信息进行甄别,如果接收到来自传感器的信息,通过消息数据串的协议格式,将有效数据提取出来。

 

二,硬件和软件的搭建,首先,硬件上是支持的。通过双绞线把PLC的RS485接口接到已经存在总线上就可以了,主要的工作在于软件怎么实现。

思路,modbus-rtu消息帧 起始和结束,是通过空闲线时间来分辨的,3.5个字符的空闲时间。假设通信格式为:起始位1,数据位8,校验位1,停止位1,传输一个字符需11位,3,5个字符,总的位数等于3.5*11=38.5,在9.6k的波特率下,空闲时间约38.5/9600=4.0104167毫秒。刚好200smart有两个定时器指令BITIM和CITIM,可以用来做毫秒级的时间间隔处理。自由口打开,接收字符,采用中断8,即每接收一个字符就中断一次。

PLC上电运行时,进行一次BITIM,打开接收端口,

1,接收到第一个字符,

2中断,

    A,执行CITIM计算时间间隔,并重新执行BITIM记录时间,并如果大于4秒(空闲线检测),进入B,如果小于4毫秒,表示正在接收消息,若接收标志位1,进入C,若接收标志为0,表示信息错误,进入I

B,时间间隔大于4秒,上一步中接收的字符是第一个字符,接收标志位置1,

C,把SMB2(接收到的字符)存放到缓冲区第一个字符,缓冲区数据个数自增1。

D,如果数据个数=预设的数据长度,认为消息已经接收完成,判定接收完成,进入E,如果小于,表示信息没有接收完,进入I,

E,比较通信指令,一般modbus-rtu 读寄存器指令为03H,如果接收到的第二个字符时03h,下一步进行CRC校验计算,核对校验字符。

F,CRC校验计算,核对校验字符,

G,核对成功,提取数据。否则进入H。

H,复位接收标志位。

I,中断返回。

3,回到第1步,继续接收字符。

 

三,编程测试,测试条件,根据现有条件布置,手上刚好有两台S7-200smart,一台作为modbus-rtu服务器,使用Modbus 从站指令库。通信格式 1位起始位,8位数据位,偶校验,停止位默认1位,波特率9600,设备地址3;电脑作为客户端,读取服务器(从站)的数据,测试时,只读了一个字的数据。

1,用串口测试工具commix测试。OK

 

 2,用modbusscan测试 ,ok

 

 程序:

主程序

 

中断程序

子程序 CRC校验


简单测试,仅供探讨,如有错漏,请不吝指点!

多学长知识 多问长见识
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。