之前看到有人提出一个问题:
现有一套完整设备,触摸屏+6只传感器,屏和传感器用RS485总线通信,采用ModbusRtu协议,但没有屏的程序。这种情况,在不改变屏和传感器的条件下,实现用一个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毫秒。刚好S7-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,用Modbus scan测试。OK
程序:主程序
中断程序
子程序 CRC校