搜索
bottom↓
回复: 26

西门子S200 Modbus 主站使用方法及库(通过此可以使用西门子S200 PLC外扩Modbus通讯协

[复制链接]

出0入0汤圆

发表于 2010-10-10 17:04:50 | 显示全部楼层 |阅读模式
Modbus RTU 主站指令库
西门子在 Micro/WIN V4.0 SP5 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。

图 1. 西门子标准指令库(Micro/WIN V4.0 SP5)
  注意:

1. Modbus RTU 主站指令库的功能是通过在用户程序中调用预先编好的程序功能块实现的,该库对 Port0 和Port 1 有效。该指令库将设置通信口工作在自由口模式下。
2. Modbus RTU 主站指令库使用了一些用户中断功能,编其他程序时不能在用户程序中禁止中断。
3. Modbus RTU 主站库对CPU的版本有要求。CPU 的版本必须为 2.00 或者 2.01(即订货号为6ES721*-***23-0BA*),1.22版本之前(包括1.22版本)的 S7-200 CPU 不支持。
使用 Modbus RTU 主站指令库,可以读写 Modbus RTU 从站的数字量、模拟量 I/O 以及保持寄存器。
要使用 Modbus RTU 主站指令库,须遵循下列步骤:

Modbus RTU 主站功能编程
1. 调用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 调用 MBUS_CTRL 完成主站的初始化,并启动其功能控制:

用 SM0.0 调用 Modbus RTU 主站初始化与控制子程序
各参数意义如下:

a.        EN        使能:        必须保证每一扫描周期都被使能(使用 SM0.0)
b.        Mode        模式:        为 1 时,使能 Modbus 协议功能;为 0 时恢复为系统 PPI 协议
c.        Baud        波特率:        支持的通讯波特率为1200,2400,4800,9600,19200,38400,57600,115200。
d.        Parity        校验:        校验方式选择
        0=无校验
        1=奇较验
        2=偶较验   
e.        Timeout        超时:        主站等待从站响应的时间,以毫秒为单位,典型的设置值为 1000 毫秒(1 秒),允许设置的范围为1 - 32767。
          注意: 这个值必须设置足够大以保证从站有时间响应。

f.        Done        完成位:        初始化完成,此位会自动置1。可以用该位启动 MBUS_MSG 读写操作(见例程)
g.        Error                初始化错误代码(只有在 Done 位为1时有效):
        0= 无错误
        1= 校验选择非法
        2= 波特率选择非法
        3= 模式选择非法


2. 调用 Modbus RTU 主站读写子程序MBUS_MSG,发送一个Modbus 请求;

调用Modbus RTU 主站读写子程序
各参数意义如下:

a.        EN        使能:        同一时刻只能有一个读写功能(即 MBUS_MSG)使能
          注意:建议每一个读写功能(即 MBUS_MSG)都用上一个 MBUS_MSG 指令的Done 完成位来激活,以保证所有读写指令循环进行(见例程)。
b.        First        读写请求位:        每一个新的读写请求必须使用脉冲触发
c.        Slave        从站地址:        可选择的范围   1 -247
d.        RW        从站地址:        0 = 读, 1 = 写
          注意:

        1. 开关量输出和保持寄存器支持读和写功能
        2. 开关量输入和模拟量输入只支持读功能
e.        Addr        读写从站的        选择读写的数据类型
                数据地址:        00001 至 0xxxx - 开关量输出
        10001 至 1xxxx - 开关量输入
        30001 至 3xxxx - 模拟量输入
        40001 至 4xxxx - 保持寄存器
f.        Count        数据个数        通讯的数据个数(位或字的个数)
          注意: Modbus主站可读/写的最大数据量为120个字(是指每一个 MBUS_MSG指令)
g.        DataPtr        数据指针:        1. 如果是读指令,读回的数据放到这个数据区中
        2. 如果是写指令,要写出的数据放到这个数据区中
h.        Done        完成位        读写功能完成位
i.        Error        错误代码:        只有在 Done 位为1时,错误代码才有效
        0 = 无错误
        1 = 响应校验错误
        2 = 未用
        3 = 接收超时(从站无响应)
        4 = 请求参数错误(slave address, Modbus address, count,RW)
        5 = Modbus/自由口未使能
        6 = Modbus正在忙于其它请求
        7 = 响应错误(响应不是请求的操作)
        8 = 响应CRC校验和错误
        -
        101 = 从站不支持请求的功能
        102 = 从站不支持数据地址
        103 = 从站不支持此种数据类型
        104 = 从站设备故障
        105 = 从站接受了信息,但是响应被延迟
        106 = 从站忙,拒绝了该信息
        107 = 从站拒绝了信息
        108 = 从站存储器奇偶错误


常见的错误:
•        如果多个 MBUS_MSG 指令同时使能会造成 6 号错误
•        从站 delay 参数设的时间过长会造成主站 3 号错误
•        从站掉电或不运行,网络故障都会造成主站 3 号错误
3. 在 CPU 的 V 数据区中为库指令分配存储区(Library Memory)
Modbus Master 指令库需要一个284个字节的全局 V 存储区。

关于 Modbus RTU 主站协议库的补充说明
此为西门子正式推出的标准库指令说明资料。
在 Modbus RTU Master 协议和 PPI 协议之间切换:
Modbus RTU Master 协议指令库使通信口工作在自由口模式下,此时不能与 Micro/WIN 软件通信。要在切换回PPI 协议,可以:
•        将 MBUS_CTRL 指令的 Mode 输入端设置为逻辑“0”
•        将 CPU 的允许模式选择开关置为 STOP 位置
Modbus RTU Master 协议库的执行时间:
Modbus RTU Master 协议库的 MBUS_CTRL 指令不需要很长的执行时间。MBUS_需要 1.11 ms用于初始化,在后续的每个扫描周期中只占用 0.41 ms。
调用 MBUS_MSG 子程序会加长处理时间。大部分时间都用于 CRC 校验的计算。每读、写一个字的数据就需要 1.85 ms扫描时间。数据最多的情况下(读、写 120 字的数据),扫描时间大概会扩增加 222ms。读操作的时间主要消耗在接收数据上;写操作的时间主要消耗在发送数据上。
Modbus 地址
通常 Modbus 地址由 5 位数字组成,包括起始的数据类型代号,以及后面的偏移地址。Modbus Master协议库把标准的 Modbus 地址映射为所谓 Modbus 功能号,读写从站的数据。Modbus Master协议库支持如下地址:
•        00001 - 09999:数字量输出( 线圈)
•        10001 - 19999:数字量输入(触点)
•        30001 - 39999:输入数据寄存器(通常为模拟量输入)
•        40001 - 49999:数据保持寄存器
Modbus Master 协议库支持的功能
为了支持上述 Modbus 地址的读写,Modbus Master 协议库需要从站支持下列功能:
表 1. 需要从站支持的功能
Modbus 地址        读/写        Modbus 从站须支持的功能
00001 - 09999
数字量输出        读        功能 1
        写        功能 5:写单输出点
功能 15:写多输出点
10001 - 19999
数字量输入        读        功能 2
        写        -
30001 - 39999
输入寄存器        读        功能 4
        写        -
40001 - 49999
保持寄存器        读        功能 3
        写        功能 6:写单寄存器单元
功能 16:写多寄存器单元

Modbus 地址和 S7-200 存储区地址的映射
S7-200 通过 Modbus Master 和 Slave 协议库通信时,Modbus 地址和 S7-200 内存储区地址的映射关系都类似。
Modbus 保持寄存器地址映射举例:

Modbus 保持寄存器地址
40001        12 34
40002        56 78
40003        9A BC
         
S7-200 存储区字寻址
VW200        12 34
VW202        56 78
VW204        9A BC
         
S7-200 存储区字节寻址
VB200        12
VB201        34
VB202        56
VB203        78
VB204        9A
VB205        BC


Modbus 数字量地址映射举例:
位地址(0xxxx 和 1xxxx)数据总是以字节为单位打包读写。第一个字节中的最低有效位对应 Modbus地址的起始地址。如下图所示:

数字量地址映射举例
  
常问问题
  Modbus RTU 主站库对 CPU 的版本是否有要求,为什么编译例子程序时,会遇到 4个错误?
Modbus RTU 主站库对 CPU 的版本确实有要求,CPU 的版本必须为 2.00 或者2.01(即订货号为6ES721*-***23-0BA*),1.22 版本之前(包括 1.22 版本)的 S7-200 CPU不支持。
  Modbus 指令库启动后,如何通过同一个通信端口进行 CPU监控?
Modbus 指令库使用的是 CPU 的自由口通信功能,工作在自由口模式下的通讯口不能使用 Micro/WIN 的 PPI编程通信监控。如果通信口都已经被占用,可以考虑:
•        加一个通信模块(如 EM 277、CP 243-1、EM 241 等)扩展出一个编程通信口
•        中止自由口模式,可以将 CPU 上的模式开关从 RUN 拨到 STOP;或者保持处于 RUN 状态,用程序停止指令库的Modbus 模式(参见指令库应用)
  如何理解 Modbus 地址与功能码的区别?
Modbus 地址与 Modbus 的功能码是两个层次的概念。
根据 Modbus 通信协议,Modbus 数据的地址使用 0xxxx、1xxxx、3xxxx 和 4xxxx的形式,分别表示数字量输出、数字量输入、模拟量输入等数据地址。在使用 S7-200 的指令库时,Modbus 数据地址与 S7-200的 I/O 和数据存储区地址间有特定的对应关系。
有些设备表明它支持 Modbus RTU 通信协议,但也详细提供了读写数据的详细通信帧格式,其中包括如何指定 Modbus站的地址,需要读写数据类型、长度等等。数据帧有特定字节指出此指令读写的数据类型和地址,此字节的数据内容即所谓“功能码”,如功能 1指定读取单个/多个数字量输出点的值。
支持 Modbus 协议的设备或软件,使用时用户直接设置或看到的应当是 Modbus 数据地址。Modbus地址所访问的数据,是通过各种“功能”读写而来。功能码是 Modbus 地址的底层。如果 Modbus 通信的一方提供的所谓Modbus 协议只有功能码,则需要注意了解此功能号与 Modbus 地址间的对应关系。
  如何访问大于 9999 的保持寄存器地址?
通常 Modbus 协议的保持寄存器地址范围在 40001 - 49999 之间。对于多数应用来说已经够了。但有些 Modbus从站把地址映射到保持寄存器区的地址超过 9999 的部分。
Modbus Master 协议库支持超过 9999 的保持寄存器地址。地址范围为 400001 - 465536。只需在调用MBUS_MSG 子程序时给 Addr 参数赋相应的值即可,如 416768。
  Modubs Master 扩展地址模式仅支持保持寄存器区,不支持其他地址类型。


审核还未通过,无法上传附件。通过后上传西门子Modbus库函数。希望本文对大家有所帮助

出0入0汤圆

 楼主| 发表于 2010-10-30 18:11:17 | 显示全部楼层
西门子S200 modbus 主站库ourdev_594058RRF7O5.zip(文件大小:1.05M) (原文件名:Tbox_V32_STEP7.zip)

以上为Modbus主站库,需要的可以下载,首先安装本文件,然后便可以在MICROWIN里面找到此指令。根据之上的说明,便可以扩展S200 Modbus 主站,用以连接其他支持Modbus的扩展模块。

出0入0汤圆

发表于 2010-10-30 18:12:39 | 显示全部楼层
xp安装怎么报错呢?

出0入0汤圆

发表于 2010-10-30 18:19:23 | 显示全部楼层

(原文件名:未命名.JPG)

出0入0汤圆

发表于 2010-10-30 18:22:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-30 20:30:07 | 显示全部楼层
是不是说,搞清楚这个协议,用单片机写个程序对上这个协议,就可以“模拟成一个s7-200的扩展模块”用?

出0入0汤圆

 楼主| 发表于 2010-11-10 09:44:54 | 显示全部楼层
回复【3楼】ljt8015  

(原文件名:未命名.jpg)

-----------------------------------------------------------------------

抱歉,好久没看这个帖子了,所以一直没有回复。首先你需要保证你的软件是Micro/WIN V4.0 SP5,因为这个库是此版本才试用的,如果不是此版本,请下载一个吧,那东西太大,200多M,上传上来有点麻烦呀。

出0入0汤圆

 楼主| 发表于 2010-11-10 09:48:16 | 显示全部楼层
回复【5楼】wkman  鱼片
是不是说,搞清楚这个协议,用单片机写个程序对上这个协议,就可以“模拟成一个s7-200的扩展模块”用?
-----------------------------------------------------------------------

相当于可以使用西门子S200的CPU通过MODBUS主站访问任意支持MODBUS协议的扩展模块,西门子开始的时候S200并不支持本功能,其实不支持此功能也是有原因的,如果用户都使用了MODBUS的扩展模块,西门子自身的S200扩展模块市场就会受到冲击,所以,西门子S200都可以支持MODBUS从站,但是开始,并不支持MODBUS主站功能。你想,一个普通模拟量扩展模块,MODBUS通讯的才多少钱,而西门子一个模拟量扩展模块,专用通信协议的又要多少钱?使用了本库,就可以实现随意对MODBUS从站扩展模块的访问。可以将扩展模块的数据映射到西门子S200CPU中。

出0入0汤圆

发表于 2010-11-10 10:02:55 | 显示全部楼层
楼主采集mV级别的信号用的什么方案?

出0入4汤圆

发表于 2010-11-10 10:09:40 | 显示全部楼层
使用这个MODBUS库速度还是很慢的,编程也麻烦些

出0入0汤圆

发表于 2010-11-10 10:31:16 | 显示全部楼层
回复【9楼】electricit  
使用这个modbus库速度还是很慢的,编程也麻烦些
-----------------------------------------------------------------------
我感觉跑在以太网上的modbus RTU更靠谱些,至少速度不是问题.

出0入0汤圆

 楼主| 发表于 2010-11-10 10:32:44 | 显示全部楼层
回复【8楼】tfdsensor  毛毛虫
楼主采集mv级别的信号用的什么方案?
-----------------------------------------------------------------------

24位ADC。

出0入0汤圆

 楼主| 发表于 2010-11-10 10:36:55 | 显示全部楼层
回复【9楼】electricit  
使用这个modbus库速度还是很慢的,编程也麻烦些
-----------------------------------------------------------------------

对于一般的扩展模块,不存在速度问题,还有,这个编程并不麻烦,在向导里面仅仅有2个梯形图指令而已,一个初始化,一个接收发送,非常简单,我写过此程序。

出0入0汤圆

 楼主| 发表于 2010-11-10 10:40:03 | 显示全部楼层
回复【10楼】tfdsensor  毛毛虫
回复【9楼】electricit  
使用这个modbus库速度还是很慢的,编程也麻烦些
-----------------------------------------------------------------------
我感觉跑在以太网上的modbus rtu更靠谱些,至少速度不是问题.

-----------------------------------------------------------------------

MODBUS-TCP速度确实高很多,当然,MODBUSTCP的成本也要高很多。还有,西门子S200本身专用扩展总线的速度也非常之低,带有7扩展模块的情况下,速度并不高,尤其在使用智能扩展模块的情况下,协议内部的有效数据量低于50%。

出0入0汤圆

发表于 2010-11-10 11:31:15 | 显示全部楼层
回复【13楼】unicontrol  
回复【10楼】tfdsensor  毛毛虫
回复【9楼】electricit  
使用这个modbus库速度还是很慢的,编程也麻烦些
-----------------------------------------------------------------------
我感觉跑在以太网上的modbus rtu更靠谱些,至少速度不是问题.
-----------------------------------------------------------------------
modbus-tcp速度确实高很多,当然,modbup的成本也要高很多。还有,西门子s200本身专用扩展总线的速度也非常之低,带有7扩展模块的情况下,速度并不高,尤其在使用智能扩展模块的情况下,协议内部的有效数据量低于50%。
-----------------------------------------------------------------------
你不能把你的模块定位在总是低速应用上(例如作为西门子的从站模块), 如果上位机是计算机,下面连接很多从站, 如果响应速度快, 我相信应用范围可以更广些.
  你说量程范围广从几个mV到10V,因为采用的24BitADC? 靠分辨率而不是加入放大或者衰减来做ADC,是吗?

出0入0汤圆

 楼主| 发表于 2010-11-10 11:58:12 | 显示全部楼层
回复【13楼】unicontrol   
回复【10楼】tfdsensor  毛毛虫
回复【9楼】electricit   
使用这个modbus库速度还是很慢的,编程也麻烦些
-----------------------------------------------------------------------
我感觉跑在以太网上的modbus rtu更靠谱些,至少速度不是问题.
-----------------------------------------------------------------------
modbus-tcp速度确实高很多,当然,modbup的成本也要高很多。还有,西门子s200本身专用扩展总线的速度也非常之低,带有7扩展模块的情况下,速度并不高,尤其在使用智能扩展模块的情况下,协议内部的有效数据量低于50%。
-----------------------------------------------------------------------
你不能把你的模块定位在总是低速应用上(例如作为西门子的从站模块), 如果上位机是计算机,下面连接很多从站, 如果响应速度快, 我相信应用范围可以更广些.
  你说量程范围广从几个mV到10V,因为采用的24BitADC? 靠分辨率而不是加入放大或者衰减来做ADC,是吗?




麻烦你应用一下带内置PGA的ADC再问这些吧。任何一个合格的工程师都不会靠衰减精度来实现多量程采集。

出0入0汤圆

 楼主| 发表于 2010-11-10 12:02:38 | 显示全部楼层
回复【14楼】tfdsensor  毛毛虫
回复【13楼】unicontrol  
回复【10楼】tfdsensor  毛毛虫
回复【9楼】electricit  
使用这个modbus库速度还是很慢的,编程也麻烦些
-----------------------------------------------------------------------
我感觉跑在以太网上的modbus rtu更靠谱些,至少速度不是问题.
-----------------------------------------------------------------------
modbus-tcp速度确实高很多,当然,modbup的成本也要高很多。还有,西门子s200本身专用扩展总线的速度也非常之低,带有7扩展模块的情况下,速度并不高,尤其在使用智能扩展模块的情况下,协议内部的有效数据量低于50%。
--------------------......
-----------------------------------------------------------------------

我请问你,你清楚一个积分型24位ADC在开启工频抑制的情况下单通道转换速度吗?
还有,你清楚西门子模拟量扩展模块的采集速度吗?温度采集模块的速度?如果你看过这些参数,就不会觉得MODBUS速度慢了。

出0入0汤圆

 楼主| 发表于 2010-11-10 12:13:10 | 显示全部楼层
回复【10楼】tfdsensor  毛毛虫
回复【9楼】electricit  
使用这个modbus库速度还是很慢的,编程也麻烦些
-----------------------------------------------------------------------
我感觉跑在以太网上的modbus rtu更靠谱些,至少速度不是问题.

-----------------------------------------------------------------------

每个模块都有自己的定位及应用场合,没人说出来了MODBUS-TCP,然后就没有人用RS-485的MODBUS了。还有,如果布线长度300米的情况下,有30台从设备,我请问你,你使用RS485布线方便还是以太网布线方便呢?

出0入0汤圆

发表于 2010-12-12 20:22:20 | 显示全部楼层
如果多个 MBUS_MSG 指令同时使能会造成 6 号错误            遇到此错误,大家有什么好的解决方案吗?

出0入0汤圆

发表于 2011-8-31 11:36:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-10-26 04:45:55 | 显示全部楼层
mark!!!!!!

出0入0汤圆

发表于 2014-10-26 23:36:29 | 显示全部楼层
西门子S200 Modbus 主站使用方法及库

出0入0汤圆

发表于 2014-10-26 23:36:54 | 显示全部楼层
西门子S200 Modbus 主站使用方法及库

出0入0汤圆

发表于 2014-11-10 12:54:38 | 显示全部楼层
写的比较详细

出0入0汤圆

发表于 2015-7-24 13:01:34 | 显示全部楼层
重要,记录,已做参考

出0入0汤圆

发表于 2015-7-24 13:02:10 | 显示全部楼层
重要,记录,已做参考

出0入0汤圆

发表于 2017-9-28 08:54:43 | 显示全部楼层
谢谢了,备用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 22:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表