S7-200作MODBUS RTU从站的补充说明

本文是对官方文档S7-200 Modbus RTU 通信的补充。

由于官方文档并未提供从建立工程到使用MODSCAN 32进行测试的完整步骤,这里再提供一篇更为完整的教程:
ModScan(主站)与200PLC(从站)的Modbus通讯

前提

为了在S7-200上创建MODBUS RTU通信协议,Micro/WIN的软件版本应当是STEP 7-Micro/WIN V3.2以上,并安装Micro/WIN32 V3.2的Instruction Library(指令库)软件包(通常没有被预装)。

梯形图

由于官方教程已包含例程,可以直接引用官方例程,无需自己创建。
S7-200作MODBUS RTU从站的补充说明
这里要注意MBUS_INIT的Addr(从站地址)、MaxHold(最大保持寄存器区)和HoldSt~(保持寄存器区起始地址)。
从站地址取值1~247,不可与其它从站冲突。
S7-200作MODBUS RTU从站的补充说明
由子程序参数HoldStart和MaxHold指定的保持寄存器区,是在S7-200 CPU的V数据存储区(CPU型号不同V数据存储区大小不同)中分配,其中MaxHold规定了保持寄存器区的大小,HoldSt规定了保持寄存器区起始地址,默认为VB0。要注意的是MaxHold以字为单位(VW),HoldSt以字节为单位(VB),而1W=2B。当HoldStart = VB0,MaxHold=1000时,保持寄存器区并非VB0~VB999,而是VB0~VB1999共2000个字节。

Modbus RTU 从站地址与S7-200的地址对应关系如下表所示:
S7-200作MODBUS RTU从站的补充说明
举例,若HoldStart为VB1000,则按照公式,40001对应VB1000,40002对应VB10002;更确切的说VB1000和VB1001对应40001,VB1002和VB1003对应40002。

库指令区
库指令数据区不能和保持寄存器区有任何重叠,否则在运行时会产生错误,不能正常通信。
库指令数据区是相应库的子程序和中断程序所要用到的变量存储空间,如果在编程时不分配库指令数据区,编译时会产生许多相同的错误。该区缺省情况下是从VB0开始。建议不要使用"Suggest Address"按钮进行自动分配,容易造成混乱。

向V数据储存区的变量写值
默认情况下该区变量的值为0,若想要改变变量值,需要使用MOV_B指令。
当HoldStart=VB1000时,若想令40001=0102H,则:
S7-200作MODBUS RTU从站的补充说明

特别提示

Modbus 指令库启动后(即将MODBUS程序下载进PLC并启动CPU后),将无法通过同一个通信端口进行 CPU 监控,也无法下载新工程。如要重新下载程序,必须先将CPU手动置STOP。
MODSCAN 32也是同样的道理,使用STEP 7-Micro/WIN下载完成后如果不退出软件,MODSCAN将无法与PLC建立通信;同理,MODSCAN与PLC建立通信后,即使将PLC的CPU拨至STOP也无法建立通信。