图6-52 通信的硬件接线图
1.Modbus协议
Modbus协议是Modicon公司提出的一种报文传输协议,Modbus协议在工业控制中得到了广泛的应用,它已经成为一种通用的工业标准,许多工控产品都有Modbus通信功能。
根据传输网络类型的不同,Modbus分为串行链路上的Modbus和基于TCP/IP的Modbus。
Modbus串行链路协议是一个主-从协议,采用请求-响应方式,总线上只有一个主站,主站发送带有从站地址的请求帧,具有该地址的从站接收到后发送响应帧进行应答。从站没有收到来自主站的请求时,不会发送数据,从站之间也不会互相通信。
Modbus串行链路协议有ASCⅡ和RTU(远程终端单元)这两种报文传输模式,S7-1200采用RTU模式。主站在Modbus网络上没有地址,从站的地址范围为0~247,其中0为广播地址。使用通信模块CM 1241(RS232)作Modbus RTU主站时,只能与一个从站通信。使用通信模块CM1241(RS485)或CM 1241(RS422/485)作Modbus RTU主站时,最多可以与32个从站通信。
报文以字节为单位进行传输,采用循环冗余校验(CRC)进行错误检查,报文最长为256B。
2.组态硬件
在博途中生成一个名为“Modbus RTU通信”的项目(见随书光盘中的同名例程),生成作为主站和从站的PLC_1和PLC_2,它们的CPU均为CPU 1214C。设置它们的IP地址分别为192.168.0.1和192.168.0.2,分别启用它们默认的时钟存储器字节MB0。
打开主站PLC_1的设备视图,将右边的硬件目录窗口的文件夹“\通信模块\点到点”中的CM 1241(RS422/485)模块拖放到CPU左边的101号槽。选中该模块以后,选中下面的巡视窗口的“属性>常规>RS422/485接口>端口组态”,按图6-49设置通信接口的参数。“操作模式”为“半双工(RS485),2线制模式”。
打开从站PLC_2的设备视图,将RS422/485模块拖放到CPU左边的101号槽。该模块的组态方法与主站的RS422/485模块相同。
3.主站调用Modbus_Comm_Load指令
必须在主站的初始化组织块OB100中,对每个通信模块调用一次Modbus_Comm_Load指令,来组态它的通信接口。执行该指令之后,就可以调用Modbus_Master或Modbus_Slave指令来进行通信了。只有在需要修改参数时,才再次调用该指令。
打开OB100,再打开指令列表的“通信”窗格的文件夹“\通信处理器\MODBUS(RTU)”,将Modbus_Comm_Load指令拖拽到梯形图中(见图6-53)。自动生成它的背景数据块Modbus_Comm_Load_DB(DB4)。该指令的输入/输出参数的意义如下:
在输入参数REQ的上升沿时启动该指令,由于OB100只在S7-1200启动时执行一次,因此将REQ设为TRUE(1状态),电源上电时端口就被设置为Modbus RTU通信模式。
PORT是通信端口的硬件标识符,输入该参数时两次单击地址域的<???>,再单击出现的按钮,选中列表中的“Local~CM_1241_(RS422_485)_1”,其值为259。
BAUD(波特率)可选300~115200bit/s。
PARITY(奇偶校验位)为0、1、2时,分别为不使用校验、奇校验和偶校验。
FLOW_CTRL、RTS_ON_DLY和RTS_OFF_DLY用于RS-232接口通信。
RESP_TO是响应超时时间,采用默认值1000ms。
MB_DB是Modbus_Master或Modbus_Slave函数块的背景数据块中的静态变量。
DONE为1状态时表示指令执行完且没有出错。
ERROR为1状态表示检测到错误,参数STATUS中是错误代码。
生成符号地址为BF_OUT和BF_IN的共享数据块DB1和DB2,在它们中间分别生成有10个字元素的数组,数据类型为Array[1..10]of Word。
在OB100中给要发送的DB1中的10个字赋初值16#1111,将保存接收到的数据的DB2中的10个字清零。在OB1中用周期为0.5s的时钟存储器位M0.3的上升沿,将要发送的第一个字“’BF_OUT’.To从站[1]”的值加1。
图6-53 主站OB100中的程序
4.主站调用Modbus_Master指令
Modbus_Master指令用于Modbus主站与指定的从站进行通信。主站可以访问一个或多个Modbus从站设备的数据。
Modbus_Master指令不是用通信中断事件来控制通信过程,用户程序必须通过轮询Modbus_Master指令来了解发送和接收的完成情况。Modbus主站调用Modbus_Master指令向从站发送请求报文后,用户必须继续执行该指令,直到接收到从站返回的响应。
在OB1中两次调用Modbus_Master指令(见图6-54),读取1号从站中Modbus地址从40001开始的10个字中的数据,保存到主站的DB2中;将主站DB1中的10个字的数据写入从站的Modbus地址从40011开始的10个字中。
用于同一个Modbus端口的所有Modbus_Master指令,都必须使用同一个Modbus_Master背景数据块,本例为DB3。
图6-54 OB1中的Modbus_Master指令(www.xing528.com)
5.Modbus_Master指令的输入、输出参数
在输入参数REQ(见图6-54)的上升沿,请求向Modbus从站发送数据。
MB_ADDR是ModbusRTU从站地址(0~247),地址0用于将消息广播到所有Modbus从站。只有Modbus功能代码05H、06H、15H和16H可用于广播方式通信。
MODE用于选择Modbus功能的类型(见表6-2)。
表6-2 Modbus模式与功能
对于“扩展寻址”模式,根据功能所使用的数据类型,数据的最大长度将减小1个字节或1个字。
DATA_ADDR用于指定要访问的从站中数据的Modbus起始地址。Modbus_Master指令根据参数MODE和DATA_ADDR一起来确定Modbus报文中的功能代码(见表6-2)。
DATA_LEN用于指定要访问的数据长度(位数或字数)。
DATA_PTR为数据指针,指向CPU的数据块或位存储器地址,从该位置读取数据或向其写入数据。DONE为1状态表示指令已完成请求的对Modbus从站的操作。
BUSY为1状态表示正在处理Modbus_Master任务。
ERROR为1状态表示检测到错误,并且参数STATUS提供的错误代码有效。
6.从站的初始化程序
在从站的初始化组织块OB100中调用Modbus_Comm_Load指令,来组态串行通信接口的参数。其输入参数PORT的值为270,参数MB_DB的实参为"Modbus_Slave_DB".MB_DB,其他参数与图6-53的相同。
生成符号地址为BUFFER的共享数据块DB1,在它中间生成有20个字元素的数组DATA,数据类型为Array[1..20]ofWord。在OB100中给数组DATA要发送的前10个元素赋初值16#2222,将保存接收到的数据的数组DATA的后10个元素清零。在OB1中用周期为0.5s的时钟存储器位M0.3的上升沿,将要发送的第一个字"BUFFER".DATA[1]的值加1。
7.从站调用Modbus_Slave指令
在从站的OB1中调用Modbus_Slave指令(见图6-55),它用于为Modbus主站发出的请求服务。开机时执行OB100中的Modbus_Comm_Load指令,通信接口被初始化。从站接收到ModbusRTU主站发送的请求时,通过执行Modbus_Slave指令来响应。
Modbus_Slave的输入/输出参数的意义如下:
MB_ADDR是ModbusRTU从站的地址(1~247)。
MB_HOLD_REG是指向Modbus保持寄存器数据块的指针,其实参的符号地址为“BUFFER”.DATA,该数组用来保存供主站读写的数据值。生成数据块时,不能激活“优化的块访问”属性。DB1.DBW0对应于Modbus地址40001。
图6-55 Modbus_Slave指令
NDR为1状态表示Modbus主站已写入新数据,反之没有新数据。
DR为1状态表示Modbus主站已读取数据,反之没有读取。
ERROR为1状态表示检测到错误,参数STATUS中的错误代码有效。
8.Modbus通信实验
硬件接线图如图6-52所示。用监控表监控主站的DB2的DBW0、DBW2和DBW18,以及从站的DB1的DBW20、DBW22和DBW38。
用外接的小开关将请求信号I0.0置为1状态后马上置为0状态,启动主站读取从站的数据。用主站的监控表观察DB2中主站的DBW2和DBW18读取到的数值是否与从站在OB100中预置的值相同。多次发出请求信号,观察DB2.DBW0的值是否增大。
用外接的小开关将请求信号I0.1置为1状态后马上置为0状态,启动主站改写从站的数据。用从站的监控表观察DB1中改写的结果。多次发出请求信号,观察DBW20的值是否增大。
可以将1个Modbus主站和最多31个Modbus从站组成一个网络。它们的CM1241RS422/485通信模块的通信接口用PROFIBUS电缆连接。
9.S7-1200/1500与其他S7PLC的Modbus通信
S7-1200/1500也可以与S7-200和S7-200 SMART CPU集成的RS-485接口进行Modbus RTU通信,S7-1200的串行通信模块较为便宜。S7-1500具有Modbus RTU主/从通信功能的CM PtP RS422/485高性能型通信模块的价格,大约是ET 200SP的CMPtP串行通信模块的3倍。
S7-300/400的Modbus RTU通信需要高性能的串行通信模块,例如CP 341。还需要购买用于ModbusRTU通信的硬件加密狗,Modbus RTU通信的硬件成本较高。S7-300/400通过ET 200S的串行通信模块实现Modbus RTU通信的成本低得多。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。