硬件:cpu 1214C
目的:建立两台cpu之间的Modbus RTU通信
软件:Portal V14SP1
Modbus RTU是一种单主站的主从通信模式,Modbus网络上只能有一个主站存在,主站在Modbus网络上没有地址,每个从站必须有唯一的地址,从站的地址范围为0 - 247,其中0为广播地址,从站的实际地址范围为1 - 247。
本例中使用的为CM1241 RS422/485模块,将其组态为Mdbus RTU主站时,支持最多与32个Modbus RTU从站建立通信。
西门子Modbus通信使用的是DB9针RS485串行接口
*RS422和RS485其实并没有定义接口标准,具体采用什么接口,接口中使用哪些引脚,完全取决于设备设计生产商自己的定义
CM1241 RS422/RS485模块针脚的定义如下,RS485通信模式下,我们需要用到的针脚为3号和8号针脚
设备RS485接口之间的接线可以参考下图,本例中T/R+和485+对应的就是DB9针3号引脚,T/R-和485-对应的是DB9针8号引脚
1.插入两台cpu 1214C,为两台PLC分别添加CM1241 RS422/RS485模块
2.分别对PLC_1和PLC_2的RS485模块进行组态配置
1.我们将PLC_1作为Modbus主站,在OB1中插入Modbus_Comm_Load 指令和Modbus_Master 指令
调用指令后系统会自动生成背景数据块Modbus_Comm_Load_DB与Modbus_Master_DB
Modbus_Comm_Load指令的PORT参数填入之前我们记录的PLC_1的通信模块硬件标识符
Modbus_Comm_Load指令的MB_DB参数连接到Modbus_Master_DB的MB_DB
Modbus_Master指令参数
MB_ADDR:填入从站的地址,本例中定义从站的地址为2
DATA_PTR:数据读取或者数据写入的地址
*MODE与DATA_ADDR参数的组合可以用来选择各种Modbus功能代码,具体组合查询手册可得
MODE=0 DATA_ADDR=40001 LEN=1,相当于读取从站保持寄存器从地址0开始的一个字的数据
MODE=1 DATA_ADDR=40001 LEN=1,相当于往从站保持寄存器从地址0开始写入一个字的数据
2.将Modbus_Comm_Load指令的背景数据块Modbus_Comm_Load_DB中的静态变量“MODE”修改为4
该变量MODE默认值为0,需要更具实际情况修改成相应的数值
0 = 全双工 (RS232)
1 = 全双工 (RS422) 四线制模式(点对点)
2 = 全全双工 (RS 422) 四线制模式(多点主站,CM PtP (ET 200SP))
3 = 全全双工 (RS 422) 四线制模式(多点从站,CM PtP (ET 200SP))
4 = 半双工 (RS485) 二线制模式
3.因为RS485属于半双工通信,如果我们需要对Modbus从站进行多个读或写操作,那我们需要采用轮询的方式来实现这个功能。
1.我们将PLC_2作为Modbus从站,在OB1中插入Modbus_Comm_Load 指令和Modbus_Slave 指令
调用指令后系统会自动生成背景数据块Modbus_Comm_Load_DB与Modbus_Slave_DB
Modbus_Comm_Load指令的PORT参数填入PLC_2的通信模块硬件标识符
Modbus_Comm_Load指令的MB_DB参数连接到Modbus_Slave_DB的MB_DB
Modbus_Slave指令参数:
MB_ADDR:设定该Modbus从站的地址
MB_HOLD_REG:指定Modbus从站的保持寄存器区域(本例中定义的为DB3中的前10个字)
*从站中Modbus功能代码与PLC输入输出地址的对应关系可查询手册得到,如下图
2.和上面主站的操作一样,将Modbus_Comm_Load指令的背景数据块Modbus_Comm_Load_DB中的静态变量“MODE”修改为4
3.至此,主站和从站的程序就全都编写完成了,将PLC_1与PLC_2程序编译后下载到cpu中。
1.进入监控界面,调用一遍主站和从站的Modbus_Comm_Load指令,然后开始轮询
2.主站中两个Modbus_Master指令的功能如下:
通过Modbus读取功能,将PLC_2中DB3.DBW0读取到PLC_1中DB3.DBW32
通过Modbus写入功能,将PLC_1中DB3.DBW54写入到PLC_2中DB3.DBW0
3.监控PLC_1中DB3.DBW32和DB3.DBW54的变量值, PLC_2中DB3.DBW0的变量值,我们可以通过修改
DB3.DBW54的值,来观察各个变量的变化。