一、Modbus通信协议
Modbus协议只有一个主站,可以有1~247个从站。此协议支持传统的RS-232、RS-422、RS-485和以太网设备,许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通信标准。
当控制器设为在Modbus网络上以RTU模式通信,在消息中的每个8Bit字节按照原值传送,不做处理,如63H,RTU将直接发送01100011,这种方式的主要优点是数据帧传送之间没有间隔,相同波特率下传输数据的密度要比ASCII高,传输速度更快。
二、ModbusRTU主站指令
1、Modbus库指令如图1所示,Master为主站0口,Master2为主站1口,Slave为从站,且从站只有0口。
图1
2.西门子Modbus库主站MBUS_CTRL的主站定义参数,如图2所示。
图2
图2中符号说明如下:
EN:一直使能
MODE:允许Modbus通信
Baud:通信速率,波特率(主从一致),默认9600
Parity:奇偶校验,0无校验,1奇校验,2偶校验(主从一致),默认偶校验
Port:通信端口,0口自带,1口扩展(CM01信号板)
Timeout:最大等待时间单位:ms
Done:完成位
Error:错误代码(当出现错误可以查看软件帮助相对应的错误代码)
西门子Modbus库主站MBUS_MSG的主站信息读写参数,如图3所示
图3
图3中符号说明如下:
En:使能
First:首次扫描用沿触发
Slave:从站地址(1-247主站默认2号站,从站地址除2以外)
RW:读写操作,0读,1写
Addr:读写地址功能码
Count:数量
Dataptr:数据指针 (默认指主站而且是以字节的形式显示)
Done:完成位
Error:错误字节(当出现错误可以查看软件帮助相对应的错误代码)
STEP7_Micro/WIN Smart和S7_200SmartCPU支持两种Modbus RTU主站,对于单个Modbus RTU主站,使用指令MBUS_CTRL和MBUS_MSG,在进行0口通信时应用。对于第二个Modbus RTU主站,使用指令MBUS_CTRL2和 MBUS_MSG2,在进行1口通信时应用。如果您在项目中使用两个 Modbus 主站,则要确保 MBUS_CTRL 和 MB_CTRL2 使用不同的端口号。
MBUS_CTRL写在主站里,不管有多少从站,只写一次。MBUS_MSG 写在主站里,比如有一个从站,主从互相控制,需要2条指令,一个读一个写,有多个从站,就写多个读写指令。
三、ModbusRTU从站指令
- 西门子Modbus库从站MBUS_CTRL的从站定义参数,如图4所示。
图4
图4中符号说明如下:
En 使能用沿触发
Mode 允许Modbus通信
Addr 从站地址(1-147)
Baud 通信速率波特率(主从一致)默认9600
Parity 奇偶校验0无校验,1奇校验,2偶校验(主从一致)默认偶校验
Port 通信端口0口自带
Delay 延时
MaxIQ 最大输入输出点数256
MaxAI 最大模拟量输入56
Maxhold 最大缓存区
Holdstart 最大缓存区起始地址
Done 完成位
Error 错误字节
Done 完成位
Error 错误字节
2.西门子Modbus库从站MBUS_SLAVE的从站应答参数,如图5所示。
图5
四、通信程序编写
ModbusRTU两台PLC互相控制通信示例
ModbusRTU 两台PLC分别用I点相互控制Q点,主站程序如图6所示,从站程序如图7所示。写从站程序需要注意,从站定义需要用沿触发,在系统块记得更改从站PLC站地址。
图6
图7
ModbusRTU两台PLC星三角通信示例
两台PLC,主站控制从站的星三角启动停止,主站IW0控制从站VW0(I0.0-V0.0启动,I0.1-V0.1停止),主站程序如图1-1图1-2所示,从站程序如图1-3图1-4图1-5图1-6图1-7图1-8所示。
图1-1
图1-2
图1-3
图1-4
图1-5
图1-6
图1-7
图1-8
ModbusRTU三台PLC星三角通信示例
- 三台PLC通信主站、3号从站和4从站,3号和4号之间互相控制两台电机的启停如图2-1所示,控制程序如图2-2图2-3图2-4图2-5图2-6图2-7所示。
图2-1
图2-2
图2-3
图2-4
图2-5
图2-6
图2-7
2.三台PLC通信主站、3号从站和4从站,3号和4号之间互相控制两台电机的启停,3号从站控制程序如图2-8图2-9图2-10所示。
图2-8
图2-9
图2-10
3.三台PLC通信主站、3号从站和4从站,3号和4号之间互相控制两台电机的启停,4号从站控制程序如图2-11图2-12图2-13所示。
图2-11
图2-12
图2-13
值得注意的是,要记得更改三号站和四号站在系统块内的地址,从站定义用沿来触发。最后记得在程序块中设置库存储区的分配如图2-14。
图2-14