西门子S7-1200系列PLC Modbus通信的踩坑记录
目录
- 485接线
- TIA Portal函数块的选用
- MODBUS标准帧结构
- 叠加地址基数
- 根据情况,给地址加一
- 案例1:从力传感器读取重量值
- 案例2:变频电机控制
先放结论,两个大坑:
1.数据地址加4万或40万,来帮助PLC确定Modbus功能代码;
2.和某些设备通信时,需要给数据地址+1。
本文内容:介绍其他文章没有的重要知识点,帮读者找到通信失败的原因,不是完整的教程。
硬件设备:CPU1212C(或其他S7-1200系列PLC),485通信模块CM1241,Modbus从机(比如变送器,变频器)。
编程软件:博途,TIA Portal
485接线
CM1241带一个DB9接头,接线按照 "3号管脚是485+,8号是485-"进行,不要看AB。2根线就够,不需要接GND。
TIA Portal函数块的选用
如下图,函数区里有两个MODBUS的文件夹,上面那个版本比较新。用的时候要统一用其中一个文件夹里的函数,不能混用。大致步骤是先用MB_COMM_LOAD初始化,再用MB_MASTER将PLC作为主机向从机发起通信,具体做法可以网上搜到。新版函数需要设置背景数据块 “Modbus_Comm_Load_DB”.MODE=4,表示485半双工通信方式,算个小坑。我用的老版函数。
MODBUS标准帧结构
Modbus数据帧的一般结构是:
根据命令码的不同,上面“数据内容”会有不同的划分。最常用的命令码是03和06。03表示主机读取从机里多个“字”的数据。“字”的英文是Word,一个字就是2个字节。03功能码的示例:
06表示主机向从机写入1个字的数据:
叠加地址基数
MB_MASTER函数块:
了解了帧结构之后,如果直接把起始地址输入到函数里,会通信失败。这时候就需要看西门子的文档了。
可以发现,函数上不能直接输入Modbus功能码,而且多了一个MODE输入。看一下函数的参数说明:
原来,西门子PLC是通过MODE和数据地址来确定功能码的。上表种的“Modbus地址”就是数据地址。
在Modbus帧结构里,数据地址一般是占用1个字,所以理论上地址可以是0~0xFFFF种的任意一个数,最大值0xFFFF对应十进制的65535。
这时候直接输入原始的数据地址就会出错。比如在MODE=0的情况下,数据地址是2000,PLC就以为要读取一个位;地址是50,000,PLC以为要读取一个字,完全混乱了。
为了避免混乱,正确做法是给数据地址加上一个“基数”,再输入到函数。 具体加什么基数要看上面的表格。比如原地址是2000,想要把功能码设为03,就要把MODE设为0,数据地址加4万或40万,变成42000或402000,让PLC能根据MODE和地址,定位到功能码03。PLC在实际发送的时候会自动减掉基数,来保证正常通信。
为什么有4万和40万两个基数?根据前面的分析,原数据地址最大能到65535,这时候如果加4万,变成105535,就超出表格里49999的范围了。如果加40万,变成465535,正好在表格里40万地址区间之内。所以基数40万适用于所有的Modbus从机,4万可以用于地址范围比较小的设备。
上面就是第一个坑,这个重点居然在各种教程里都没有明确说明,完全得靠自己参悟。
根据情况,给地址加一
解决基数问题之后,还是一直报错,直到看到一篇教程上说:
DATA_ADDR–从站的起始地址(需将从站的地址由16进制转换为10进制,转换成10进制后,数据加1(因为从站地址是从0开始的,而PLC的地址是从1开始的,所以要加1)) ;
于是破案了。至于数据地址要不要加一,需要看具体设备的说明书。一般地址从个位数1开始的,就是已经加过1了,可以直接用;从整数开始的就要自己加1。不确定就做个实验。
放两个案例,把上面的知识融汇贯通一下。
案例1:从力传感器读取重量值
查看变送器说明书:
现在想要读取重量。
确定MODE: 是读取操作,所以MODE设为0.
确定DATA_ADDR:
根据变送器说明书,数据的原地址是1.
根据变送器说明书,数据地址都在一万以内,所以基数采用4万或40万都行。这里采用4万,叠加后地址变为40001.
同时发现,说明书上的地址是从1开始的,所以不用再额外加一了。
确定DATA_LEN: 重量数据占用4个字节,所以DATA_LEN=2(单位是字)。
通信成功后,数据会被放到DATA_PTR指向的PLC存储空间。
案例2:变频电机控制
查阅变频器说明书:
现想要控制电机正转运行。
确定MODE: 是写入操作,MODE=1。
确定DATA_ADDR: 数据原地址是2000H(16进制),转换为10进制是8192。
观察发现,说明书上地址是从个位为0的整数开始的,所以地址要加1.
观察发现,变频器上的数据地址范围比较大,超过了1万,所以统一加基数40万。
综上,输入到PLC函数的数据地址是:400,000+8192+1=408,193.
确定DATA_LEN:命令信息占用1个字,所以DATA_LEN=1.
数据值 :在DATA_PTR指向的变量里,设置命令值0001。
西门子S7-1200系列PLC Modbus通信的踩坑记录相关推荐
- 西门子1200系列PLC的CANopen通信解决方案
背景 智能制造成为趋势,其基础常常是连接各种设备.CANopen协议因其中立和推出时间较长,在变频.伺服驱动.风力发电中有较广泛的应用.西门子的1200系列PLC性价比高,也得到越来越多用户的欢迎,该 ...
- PLC实验—西门子S7 1200读取旋转编码器数据并计算电机转速
PLC实验-西门子S7 1200读取旋转编码器数据并计算电机转速 注意PTO控制步进电机实验博途软件需要V14版本,不然没有PTO功能块 软件的下载请点击下方百度网盘的链接 链接:https://pa ...
- 台达变频器modbus通讯控制程序 西门子s7—200型PLC和昆仑通泰触摸屏程序
台达变频器modbus通讯控制程序 西门子s7-200型PLC和昆仑通泰触摸屏程序,带变频器使用手册,参数设置和接线说明. 可以实现频率设定,频率,电压,电流显示:正转启动,反转启动和停止控制. ID ...
- 西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤
西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤 说明: 西门子精智系列触摸屏支持和三菱Q PLC进行以太网通讯. 但要注意精智系列触摸屏只支持通过TCP协议和三菱Q PLC通讯( ...
- PLC实验—西门子S7 1200 PID控制步进电机转速
PLC实验-西门子S7 1200 PID控制步进电机转速 严格讲并不是PID控制,因为并不是并不研究这个方向,研二又比较忙,时间限制只加了比例系数 这里只是抛砖引玉,希望大家可以进一步完善补充 思路 ...
- 西门子S7-200 SMART系列PLC接线大全
西门子S7-200 SMART系列PLC接线大全 西门子S7-200 SMART系列PLC接线大全,电器人必须收藏!!!_输出_模块_负载
- 【SpringBoot DB系列】Jooq批量写入采坑记录
[SpringBoot DB系列]Jooq批量写入采坑记录 前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入-,这 ...
- C#使用西门子S7 协议读写PLC DB块
教大家使用C#如何方便快速的读写西门子DB块的值,实现上位机跟plc进行通讯的流程 使用的西门子PLC型号,S7 1200 1.Nuget 安装s7 驱动包 2.西门子plc定义一个db块,这个是我们 ...
- 信捷plc modbus通信
信捷plcmodbus通信协议的自我见解 通信指令一览表 MODBUS通信的理解:MODBUS通信分为 ASCLL 和RTU两种,在以前ASCLL通信用的较多现在一般常用RTU模式通信.RTU模式通 ...
- 三菱q系列plc 和电脑socket_三菱Q系列PLC 以太网通信设置方法
当使用三菱Q13UDEH PLC 和组态王6.55 进行通信,使用Melsec_Ethernet.dll(60.3.14.30)驱动.使用该驱动时应注意,勾选"允许RUN中写入(FTP与MC ...
最新文章
- 贝叶斯定理——数学之美
- SAP MM 采购发票上的价格与采购订单上价格的差异
- 用 IDEA 看源码的正确姿势!你掌握了吗?
- 绝了!“修仙模式”学编程是什么体验?
- 计算机组成原理——概述3
- 关于props的注意事项!
- CSS学习笔记 display属性
- java swt 不显示图片_Java SWT按钮图像未刷新
- linux中的man文档结构
- js reduce数组循环相加x+y
- 获取access_token
- linux mint下安装vnc,VNC远程连接Linux mint桌面
- 总结《An Introduction to Ray Tracing》
- SQL标准语句——思维导图
- Android.light.apk,Android_Lightblue.apk
- 最全计算机基础知识竞赛试题,计算机基础知识竞赛试题.doc
- linux安装/卸载microsoft edge
- CF1427E Xum
- ps 图片提取线稿方法2种 转
- echarts饼图label文字颜色