热门搜索:
西门子6ES71957HB000XA0
上海朕锌电气电气设备有限公司
SIEMENS西门子之前看到有人提出一个问题:
现有一套完整设备,触摸屏+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校验