根据客户需求,需要在西门子S7-1200控制系统中集成MODBUS RTU通信功能,为此我们采购了一款CM1241(RS422/485)通信模块,其CPU型号为1217C,具体版本信息暂未记录。尽管最初认为这是一个常规任务,但实际操作过程中耗费了大量时间,最终成功完成并记录了整个过程,以供后续参考,避免重复犯错。
1. 使用博图软件进行硬件组态
在博图软件中,找到CM1241模块,选择对应的型号并直接插入到硬件配置中。关键在于选择“半双工RS485两线制模式”,其他参数可根据实际需求进行调整,具体设置请参考下图。
图1:硬件组态配置
图2:硬件组态详细设置
2. 确认硬件标识符
务必牢记这个标识符,因为不同的组态会有不同的代码。虽然可以暂时不记,但在后续编程时,系统会自动调用该硬件并生成相应代码。
图3:硬件标识符确认
3. 编写程序
在OB1中编写程序,或者创建一个新的FC块或FB块,但无论选择哪种方式,都必须在OB1中调用,绝对不能在OB100中调用。
在通信指令库中,应使用MODBUS(RTU)指令,而不是MODBUS指令集。尽管MODBUS指令集在程序中不会报错,但实际通信会失败,这一点经过实际测试验证。网络上的一些攻略可能存在错误,因为他们并未进行实际验证。
图4:OB1中调用MODBUS(RTU)指令
根据需要选择做主站还是从站,分别调用MASTER或SLAVE指令。必须确保使用同一指令集下的指令,不可混用。
初始化中的MB_DB端口对应主站或从站的背景数据块MB_DB,调用时根据实际情况选择。
图5:OB1中调用MODBUS(RTU)指令
4. 调整数值设置
这一步至关重要,否则通信将无法成功。在初始化数据块中,找到MODE项,将其数值修改为4(默认为422通信模式)。
完成编译后,将程序下载到PLC中。
图6:修改MODE值为4
5. 硬件连接步骤一
购买一个九针公头,其锁紧螺杆也为公头形式,否则难以插入。使用万用表测量公头十根线与数字1-9的对应关系,并做好记录。重点在于确定3号和8号管脚,通常这两者之间存在DC3V的电压。
图7:九针公头电压测量
6. 硬件连接步骤二
购买一个RS485转U口数据线,以便使用电脑中的MODSAN32软件进行测试。将九针公头的3号和8号管脚分别连接到转换器的TR+和TR-端口。一般情况下,CM1241采用3+8-的接线方式,但实际使用中可能有同事反馈为3-8+,因此建议使用万用表确认正负极,确保正确连接。
图8:RS485转换器连接
7. 数据块配置
新建一个数据块,在属性中将“优化块的访问”的钩子去掉,以便显示地址偏移量。当然,即使不去掉钩子,通信也能正常进行,但为了方便管理,建议去掉。
根据需要声明变量类型,此处以WORD类型为例。
优化后,只能使用寻址方式P#进行访问。
图9:数据块配置
8. 监控数据块
为数据块添加监控功能,并修改数据块数值。这一操作可以在后续进行,没有时间限制。
图10:数据块监控设置
9. 确认COM口编号
打开计算机管理器,进入设备管理器,找到端口选项,展开后即可看到U口转换后的虚拟COM口编号,务必记录下来。
图11:COM口编号确认
10. MODSAN32软件设置
打开MODSAN32软件,这是一个绿色版软件,直接运行EXE文件即可。软件提供中文版,但未找到,英文版操作逻辑清晰,易于理解。
在连接选项中,选择正确的COM口,并确保其他设置与CM1241模块完全一致。同时,OB1中的程序调用块参数也必须保持一致。
图12:MODSAN32连接参数设置
11. MODSAN32运行测试
完成参数设置后,点击OK即可。需要注意的是,地址0001、地址长度20、设备地址1、读取类型03等参数可以直接在界面修改,也可以在SETUP中进行一次性设置。特别关注地址长度,必须与OB1中的程序调用参数一致,否则可能导致地址丢失。
成功通信后,右侧会显示通信成功次数。也可以使用其他串口调试软件进行测试。
图中标注的区域显示的数据与数据块监视中修改的数据完全一致,说明通信成功。
图13:MODSCAN32运行测试
40003:4代表读取1200中的寄存器地址,0003代表第3个地址,即DB11.DBW4.0
核心要点总结:一是使用万用表测量电压确定3号和8号管脚的正负极;二是将MODE值修改为4;三是确保使用MODBUS(RTU)指令集。
PS:CB1241为MODBUS通信板卡,与CM1241通信模板存在细微差异,板卡支持使用MODBUS指令集,且采用接线柱式连接方式。