modbus 订阅
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。 展开全文
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
信息
连接组成
带智能终端通过公用线路连接
定    义
一个工业通信系统
发明时间
1979年
中文名
Modbus通讯协议
外文名
Modbus protocol
Modbus通讯协议简介
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。 [1]  Modbus比其他通信协议使用的更广泛的主要原因有: [2]  Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。
收起全文
精华内容
下载资源
问答
  • Modbus测试工具ModbusPoll与Modbus Slave使用方法

    万次阅读 多人点赞 2017-09-14 13:15:39
    Modbus测试工具ModbusPoll与Modbus Slave使用方法

    一、介绍

    Modbus Poll :Modbus主机仿真器,用于测试和调试Modbus从设备。该软件支持ModbusRTU、ASCII、TCP/IP。用来帮助开发人员测试Modbus从设备,或者其它Modbus协议的测试和仿真。它支持多文档接口,即,可以同时监视多个从设备/数据域。每个窗口简单地设定从设备ID,功能,地址,大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器,简单地双击这个值即可。或者你可以改变多个寄存器/线圈值。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换)。

    Modbus Slave: Modbus从设备仿真器,可以仿真32个从设备/地址域。每个接口都提供了对EXCEL报表的OLE自动化支持。主要用来模拟Modbus从站设备,接收主站的命令包,回送数据包。帮助Modbus通讯设备开发人员进行Modbus通讯协议的模拟和测试,用于模拟、测试、调试Modbus通讯设备。可以32个窗口中模拟多达32个Modbus子设备。与Modbus Poll的用户界面相同,支持功能01, 02, 03, 04, 05, 06, 15, 16, 22和23,监视串口数据。

    二、Modbus Poll使用

    1)、安装注册:  

     安装完毕,在桌面能够看到ModbusPoll的快捷方式,双击该快捷方式,打开软件,打开后界面如下图所示。

    单击Connection->Connect,弹出注册窗口;打开压缩包解压后的readme文件,复制ModbusPoll的序列号,粘贴到注册窗口的注册栏,如下图所示,点击OK,破解完毕。

    2)、程序主窗口:

    按照上面破解流程,按“OK”按钮即可完成注册。然后直接进入主窗口,如下图所示:

    modbus poll 4.3.4程序主窗口

    其中:Tx = 4表示向主站发送数据帧次数,图中为4次; Error = 0表示通讯错误次数,图中为0次; ID = 1表示模拟的Modbus子设备的设备地址,图中地址为1;F = 03表示所使用的Modbus功能码,图中为03功能码; SR = 1000ms表示扫描周期。红字部分,表示当前的错误状态,“No Connection”表示未连接状态。

     

    3)、参数设置:

    单击菜单【Setup】中【Read/Write Definition.. F8】进行参数设置,会弹出参数设置对话框。

     

     

     

    其中:A. Slave为要访问的Modbus从站(从机)的地址,对应主窗口(主画面)中的ID值,默认为1。  B. Function 为寄存器功能码的选择,共四种,分别对应关系如下:

    代码

    中文名称

    寄存器PLC地址

    位操作/字操作

    操作数量

    01

    读线圈状态

    00001-09999

    位操作

    单个或多个

    02

    读离散输入状态

    10001-19999

    位操作

    单个或多个

    03

    读保持寄存器

    40001-49999

    字操作

    单个或多个

    04

    读输入寄存器

    30001-39999

    字操作

    单个或多个

    05

    写单个线圈

    00001-09999

    位操作

    单个

    06

    写单个保持寄存器

    40001-49999

    字操作

    单个

    15

    写多个线圈

    00001-09999

    位操作

    多个

    16

    写多个保持寄存器

    40001-49999

    字操作

    多个

     C. Address 为寄存器起始地址,默认从0开始。  

    D. Length为寄存器连续个数,默认为10个,对应组态软件的通道数量。  

    E. Scan Rate为读取数据周期,单位毫秒,默认为1000ms。   

    设置完成单击OK按钮,模拟窗口将显示定义的寄存器列表。

    4)、显示设置:  

    数据显示方式设置:  

    默认情况下,寄存器数据的显示方式为Signed方式(16进制无符号二进制),数据范围为-32768~32767。如果用户要以其他数值方式显示,可以通过菜单【Display】进行选择设置,如下图所示:

     

    地址格式设置: Modbus Slave默认使用PLC地址,【Display】菜单中【PLC Addresses(Base 1)】为默认选中状态,默认寄存器的起始地址为1开始,此点与组态软件的Modbus串口和TCP数据转发驱动是相同的。如果测试时需要设置起始地址为0开始,可选择【Protocol Addresses(Base 0)】。一般情况下使用默认PLC地址即可。

    使用工具栏的”Communication Traffic”按钮,可以显示出当前发送命令和接受的数据。

    5)、串口连接:  

    单击菜单【Connection】中【Connect.. F3】进行串口连接,如下图 :

     其中:Port3,表示使用的串口(COM3),根据实际情况选择不同的串口或者TCP/IP进行连接。Mode,表示Modbus协议模式,使用串口时有效;使用TCP/IP时自动为TCP模式。Response Timeout,表示读取超时时间,从站在超时时间内没有返回数据,则认为通讯失败。Delay Between Polls,每次扫描的最小间隔时间,默认为10ms。Remote Server,表示TCP/IP模式时的终端从站设备的网络设置。IP Address,表示TCP/IP模式时从站IP地址。  Port,表示TCP模式时从站网络端口。用户可根据需要对参数进行设置,默认为:串口1、波特率9600、数据位8位、无校验位、1位停止位。确认设置后点击OK按钮即可。如果连接并读取正确,此时主窗口将显示读取寄存器的相关信息。

     6)、寄存器值改变:  

    在主窗口寄存器地址上双击鼠标,弹出修改对话框,如下图:

     

    在Value输入框中输入值确认即可。范围为-32768——32767。  

    其中:Slave为要访问的Modbus从站的地址,对应主画面中的ID值,默认为1。  Address 为当前操作的寄存器的地址。图中为对寄存器40001操作。  Use Function为所使用的功能码,可以选择06或16功能码进行写入。

    7)、查看通讯数据帧:  

    单击【Display】菜单中的【Communication…】或者单击工具栏上【101】按钮,可以调出串口收发数据帧监视信息对话框“CommunicationTraffic”,用来查看分析收发的数据帧。如下图所示: 

     其中:前6位为数据帧的序号。  Rx表示接收的数据帧。  Tx表示发送的数据帧。  

    8)、断开连接:  

    点击【Disconnect  F4】即可断开连接结束测试,此时主窗口中出现红色的“No Connection”表示未连接状态。

     

    三、Modbus Slave使用

    1)、安装注册:
    安装软件,安装完成之后,双击执行ModbusSlave快捷方式即可。

    注册方法:单击Connection->Connect,弹出注册窗口;打开压缩包解压后的readme文件,复制ModbusPoll的序列号,粘贴到注册窗口的注册栏,点击OK,破解完毕。ModbusSlave的安装破解与ModbusPoll类似,在此不再赘述。

    2)、主窗口:
    软件主窗口如下图所示:

    此时处于“Noconnection”未连接状态,如果只测试“04输出保持寄存器”,则可直接点击跳到第3.步,直接进行连接即可。

    3)、参数设置:
    点击菜单“Setup”中“Slave Definition.. F2”进行参数设置,会弹出如下图对话框。

    其中:A.Slave为Modbus从站地址,对应主画面中的ID值,默认为1。
    B. Function 为寄存器功能码的选择,共四种,分别对应关系如下:

    代码

    中文名称

    寄存器PLC地址

    位操作/字操作

    操作数量

    01

    读线圈状态

    00001-09999

    位操作

    单个或多个

    02

    读离散输入状态

    10001-19999

    位操作

    单个或多个

    03

    读保持寄存器

    40001-49999

    字操作

    单个或多个

    04

    读输入寄存器

    30001-39999

    字操作

    单个或多个

    05

    写单个线圈

    00001-09999

    位操作

    单个

    06

    写单个保持寄存器

    40001-49999

    字操作

    单个

    15

    写多个线圈

    00001-09999

    位操作

    多个

    16

    写多个保持寄存器

    40001-49999

    字操作

    多个

    C. Address 为寄存器起始地址。默认从1开始。
    D. Length为寄存器连续个数。默认为10个。

    设置OK按钮,模拟窗口将显示定义的寄存器列表:

    其中:ID,表示模拟的Modbus子设备的设备地址;F,表示功能码
    点击对应的寄存器,即可修改对应寄存器的值或者状态。比如2寄存器值修改成9,9寄存器值修改成100。

    4)、显示设置:
    数据显示方式设置:
    默认情况下,寄存器数据的显示方式为Signed方式(16进制无符号二进制),数据范围为范围为-32768——32767。如果用户要以其他数值方式显示,可以通过菜单“Display”进行选择设置,如下图所示:

    地址格式设置:
    Modbus Slave默认使用PLC地址,“Display”菜单中“PLC Addresses(Base 1)”为默认选中状态,默认寄存器的起始地址为1开始,此点与组态软件的Modbus串口和TCP数据转发驱动是相同的。如果测试时需要设置起始地址为0开始,可选择“Protocol Addresses(Base 0)”。一般情况下使用默认PLC地址即可。

    5)、连接:
    点击菜单“Connection”中“Connect.. F3”进行连接。弹出连接对话框:

    其中:Port2,表示使用的串口(COM2),根据实际情况选择不同的串口或者TCP/IP进行连接
    Mode,表示Modbus协议模式,使用串口时有效;使用TCP/IP时自动为TCP模式
    Flow Control,表示流控制,串口模式时有效;
    Ignore Unit ID,表示TCP模式时忽略无效的组编号
    用户可根据需要对串口参数进行设置,默认为:串口1,波特率9600,数据位8位,无校验位,1位停止位。确认设置后点击“OK”按钮即可。此时主窗口中红色的“No connection”表示未连接状态的信息消失,表明从站处于正常连接状态。

    6)、寄存器值改变:
    在主窗口寄存器地址上双击鼠标,弹出修改对话框,如下图:

    在输入框中输入值确认即可。范围为-32768——32767。
    其中:Auto increment选项钩选上后,对应寄存器的值可以每1秒种增加1。

    7)、查看通讯数据帧:
    点击“Display”菜单中的“Communication…”,可以调出串口收发数据帧监视信息对话框,用来查看分析收发的数据帧。如下图所示:

    其中:前6位为数据帧的序号。
    Rx:表示接收数据帧。
    Tx: 表示发送数据帧。

    8)、断开连接:
    点击“Disconnect F4”即可断开连接结束测试,此时主窗口中出现红色的“No connection”表示未连接状态。

     

    四、Modbus主机/从机模拟程序

    1)、安装vspd虚拟串口工具。通过工具添加COM2和COM3两个端口。

    2)、接下来打开已经安装的modbuspoll和modbus slave软件,分别按“F8”配置主从端的相关配置,如图:


    以上配置的是10个计数器从机设备ID为1但只读取前6个计数器的数据,可根据自己的情况设置。

    2、接下来按分别按“F3”进行连接,注意修改连接界面的端口,主从机分别选择我们虚拟出来的com2和com3端口,因为我只用到了RTU模式,所以其他选项如波特率9600,比特位8,校验位1,无等价位等可以保持不变,然后点击确定进行连接,未连接成功窗口第二行会给出提示信息。

    通讯开始,主机端显示:TX=232,Err=0,ID=1,F=03,SR=1000ms。意思是,发送232次命令,错误次数,从机ID,功能号,轮询间隔。

    使用工具栏的”Communication Traffic”按钮,可以显示出当前发送命令和接受的数据。

     

    Modbus Poll 4.3.4 破解版下载:http://www.cr173.com/soft/21405.html

    Modbus Slave调试工具下载:http://www.cr173.com/soft/21410.html

    Modbus调试精灵 7.04绿色版下载:http://www.cr173.com/soft/5480.html

     

     

    展开全文
  • modbus

    千次阅读 多人点赞 2017-12-01 17:39:01
    Modbus基础 1简述,modbus是一种工业用的多设备之间的主从通信协议。只要两台设备之间,是采用modbus协议的主从关系,并连接到相同网络,即可互相通信。因为Modbus只是协议,而且只规定了数据帧,底层连接,可以是...

     

    Modbus基础

    1简述,modbus是一种工业用的多设备之间的主从通信协议。只要两台设备之间,是采用modbus协议的主从关系,并连接到相同网络,即可互相通信。因为Modbus只是协议,而且只规定了数据帧,底层连接,可以是232,485或者以太网。设备一般采用232和485进行通信,因为成本低。当然要是考虑远距离传输和多卖钱的话,也会采用以太网,不过应该就会相应复杂一些了。

    2模式,modbus有两种模式,一种叫RTU模式,另一种叫acsii模式,RTU模式是纯二进制的,而acsii模式,一个信息中的每8位字节作为2个ascii字符传输的,这种模式的主要优点时允许字符之间的时间间隔长达1秒,也不会出现错误。而较acsii模式,RTU模式的优点是用最少的字节,表达更多的内容。但同时也要求设备必须连续传输。

    3通讯,modbus属于主从通讯,可以是一主一从或者一主多从。通讯的方式为主机向从机发送命令(或者叫请求)从机向主机发送响应。主机不发送,从机不返回,一发,一收,不发不收。而且一个时间,只有一个机器发送请求或者响应,否则的话,则会出错。

    4信息帧RTU帧,开始时,必须要有3.5个静止的时间,也就是时间间隔,用来区分上一帧和下一帧,如果没有时间间隔的话,则会分辨不出哪里是帧开始,哪里是帧结束了。3.5个时间间隔依据波特率不同而不同。同样,结束时也需要时间。除了时间以外,还有地址,功能码,数据,crc校验四个部分,每个部分的字节数不同,地址功能码各1个字节,crc是2个字节其完整表达如下:

          

    开始

    地址

    功能

    数据

    校验

    结束

    3.5t 

    1字节 8b

    1字节 8b

    n字节 n*8b

    2字节16b

    3.5t 

     

    4.1、地址:主要用于区分从机,在下位机程序中,的宏定义中设置不同的从机地址。

           #defineModbus_addr 0x01

    设备响应时,第一位也是本机地址。地址的范围是从0-247,地址0为广播地址,所有机器均可以识别。

      4.2、功能码:表示主机要命令这个设备的什么功能,执行什么程序。我看了一下正规的modbus的功能码多达24个,不同厂家生产的不同型号的设备,可能会支持不同的功能码,所以买之前需要注意一下。具体功能如下:

          

    01读线圈状态 

    02读输入状态 

    03读保持寄存器

    04读输入寄存器 

    05强制单个线圈

    06 预置单个寄存器

    07读不正常状态

    08诊断

    09程序484

    10查询484

    11通讯事件控制

    12通讯事件记录

    13程序控制器

    14查询控制器

    15强制多个寄存器

    16 预置多个寄存器

    17报告从机id

    18程序884/M84

    19通讯链路复位

    20读通用参考值

    21 写通用参考值

    22 Mask Write 4X Register

    23 Read/Write 4X Registers

    24 Read FIFO 队列

    常用01 02 03 04 05 06 15 和16功能码。

    4.3、数据区,根据功能码的不同数据的长度是不同的。

    4.4、crc校验 包含两个字节,发送端发送时,一帧的所有数据统一计算出一个crc校验码,然后加在一帧的最后两位中,然后等到发送到接收端时接收端重新计算一次除最后两位的一帧所有数据,然后根据两个数据的对比,来判断接收到的数据是否正确。

     

    MODBUS报文模型

     

     

     

    展开全文
  • Modbus

    千次阅读 2011-04-30 22:20:00
    ①ASCII码模式: ⑴MODBUS 主机询问请求 MODBUS 主机采用ASCII码模式,向地址为1的从机,询问起始地址为0的线圈(继电器和输出光耦)的输出状态,总共询问的数量为8。 请求代码:3A 30 31 30 31 ...

    ASCII码模式:

    MODBUS 主机询问请求

    MODBUS 主机采用ASCII码模式,向地址为1的从机,询问起始地址为0的线圈(继电器和输出光耦)的输出状态,总共询问的数量为8

    请求代码:3A 30 31 30 31 30 30 30 30 30 30 30 38 46 36 0D 0A

    说明

    字节说明

    使用举例

    前导码

    1 BYTE

    0X3A(‘:’)

    MODBUS从机地址

    1 BYTE

    0X30(‘0’)

    MODBUS从机地址

    1 BYTE

    0X31(‘1’)

    功能码高位

    1 BYTE

    0X30(‘0’)

    功能码低位

    1 BYTE

    0X31(‘1’)

    起始地址高字节高位

    1 BYTE

    0X30(‘0’)

    起始地址高字节低位

    1 BYTE

    0X30(‘0’)

    起始地址低字节高位

    1 BYTE

    0X30(‘0’)

    起始地址低字节低位

    1 BYTE

    0X30(‘0’)

    读取数量高字节高位

    1 BYTE

    0X30(‘0’)

    读取数量高字节低位

    1 BYTE

    0X30(‘0’)

    读取数量低字节高位

    1 BYTE

    0X30(‘0’)

    读取数量低字节低位

    1 BYTE

    0X38(‘8’)

    LRC校验码低字节

    1 BYTE

    0X46

    LRC校验码高字节

    1 BYTE

    0X36

    尾码 CR

    1 BYTE

    0X0D

    尾码 LF

    1 BYTE

    0X0A

    MODBUS 从机响应

    MODBUS地址为1的从机接收到请求后,采用ASCII码模式,将起始地址为0的线圈(继电器和输出光耦)的输出状态,总数量为8,发送给Modbus主机。

    其中继电器地址7-0状态为1-0-0-0-|0-0-0-1

    响应代码:3A 30 31 30 31 30 31 38 31 37 43 0D 0A

    说明

    字节说明

    使用举例

    前导码

    1 BYTE

    0X3A(‘:’)

    MODBUS从机地址高位

    1 BYTE

    0X30(‘0’)

    MODBUS从机地址低位

    1 BYTE

    0X31(‘1’)

    功能码高位

    1 BYTE

    0X30(‘0’)

    功能码低位

    1 BYTE

    0X31(‘1’)

    返回的读取数量高位

    1 BYTE

    0X30(‘0’)

    返回的读取数量低位

    1 BYTE

    0X31(‘1’)

    返回的数据值(1)高位

    (地址7数据-地址4数据)

    1 BYTE

    0X38(‘8’)

    返回的数据值(1)低位

    (地址3数据-地址0数据)

    1 BYTE

    0X31(‘1’)

    1=ON;   0=OFF第一个返回数据的数据字节的LSB 为查询中的寻址地址,其他的线圈按顺序在该字节中由低位向高位排列,直至8个为止,下一个字节也是从低位向高位排例。

    若返回的线圈数不是 8的倍数,则在最后的数据字节中的剩余位至字节的最高位全部填零。返回的数据值的数量N =读取数量/8   如果余数不为0 N=N+1

    LRC校验码低字节

    1 BYTE

    0X37

    LRC校验码高字节

    1 BYTE

    0X43

    尾码 CR

    1 BYTE

    0X0D

    尾码 LF

    1 BYTE

    0X0A

     

    ⑶错误 响应

    MODBUS地址为1的从机接收到请求后,发现命令格式错误或者校验通不过去,采用ASCII码模式,把相关错误代码发送给Modbus主机。

    错误回传代码:3A 30 31 38 31 30 31 37 44 0D 0A

    说明

    字节说明

    使用举例

    前导码

    1 BYTE

    0X3A(‘:’)

    MODBUS从机地址高位

    1 BYTE

    0X30(‘0’)

    MODBUS从机地址低位

    1 BYTE

    0X31(‘1’)

    功能码高位+8

    1 BYTE

    0X38(‘8’)

    功能码低位

    1 BYTE

    0X31(‘1’)

    错误类型码高位

    1 BYTE

    0X30(‘0’)

    错误类型码低位

    1 BYTE

    0X31(‘1’)

    LRC校验码低字节

    1 BYTE

    0X37

    LRC校验码高字节

    1 BYTE

    0X44

    尾码 CR

    1 BYTE

    0X0D

    尾码 LF

    1 BYTE

    0X0A

    RTU模式:

    MODBUS 主机询问请求

    MODBUS 主机采用RTU模式,向地址为1的从机,询问起始地址为0的线圈(继电器和输出光耦)的输出状态,总共询问的数量为8

    请求代码:01 01 00 00 00 08 3D CC

    说明

    字节说明

    使用举例

    MODBUS从机地址

    1 BYTE

    0X01

    功能码

    1 BYTE

    0X01

    起始地址高字节

    1 BYTE

    0X00

    起始地址低字节

    1 BYTE

    0X00

    读取数量高字节

    1 BYTE

    0X00

    读取数量低字节

    1 BYTE

    0X08

    CRC校验码低字节

    1 BYTE

    0X3D

    CRC校验码高字节

    1 BYTE

    0XCC

    MODBUS 从机响应

    MODBUS地址为1的从机接收到请求后,采用RTU模式,将起始地址为0的线圈(继电器和输出光耦)的输出状态,总数量为8,发送给Modbus主机。

    其中继电器地址7-0状态为1-0-0-0-|0-0-0-1

    响应代码:01 01 01 81 91 E8

    说明

    字节说明

    使用举例

    MODBUS从机地址

    1 BYTE

    0X01

    功能码

    1 BYTE

    0X01

    返回的读取数量

    1 BYTE

    0X01

    返回的数据值(1)

    (地址7数据-地址0数据)

    1 BYTE

    0X81

    1=ON;   0=OFF第一个返回数据的数据字节的LSB 为查询中的寻址地址,其他的线圈按顺序在该字节中由低位向高位排列,直至8个为止,下一个字节也是从低位向高位排例。

    若返回的线圈数不是 8的倍数,则在最后的数据字节中的剩余位至字节的最高位全部填零。返回的数据值的数量N =读取数量/8   如果余数不为0 N=N+1

    CRC校验码低字节

    1 BYTE

    0X91

    CRC校验码高字节

    1 BYTE

    0XE8

     

    ⑶错误 响应

    MODBUS地址为1的从机接收到请求后,发现命令格式错误或者校验通不过去,采用RTU模式,把相关错误代码发送给Modbus主机。

    错误回传代码:01 81 01 81 90

    说明

    字节说明

    使用举例

    MODBUS从机地址

    1 BYTE

    0X01

    功能码+0X80

    1 BYTE

    0X81

    返回的读取数量

    1 BYTE

    0X01

    CRC校验码低字节

    1 BYTE

    0X81

    CRC校验码高字节

    1 BYTE

    0X90

    展开全文
  • modbus modbus

    2012-12-24 17:20:23
    modbus仿真
  • Modbus Poll是一款实用的modbus开发和调试工具,可以非常方便的进行modbus调试,是一款非常有用的Modbus主机模拟程序。
  • Modbus协议,什么是Modbus协议,Modbus协议的应用。
  • ModbusRtu通信报文
  • modbus_modbus_源码

    2021-09-30 17:43:45
    modbus protocol document
  • modbus 仿真工具
  • MODBUS学习笔记——modbus tk modbus TCP主机实现

    万次阅读 多人点赞 2014-03-23 20:11:44
    0.前言 ...在不能运行linux的嵌入式系统中,freemodbus是一个完善的从机协议栈,在能够运行linux的嵌入式系统中存在多种选择,而modbus tk是使用python语言实现的modbus协议栈,该函数库即支持主机也...
    0.前言
        modbus是一种古老但是高效的应用层协议。在嵌入式和PC机领域有多种方法实现modbus协议栈,modbus又分为从机和主机,从机和主机在协议栈的实现上存在不同。在不能运行linux的嵌入式系统中,freemodbus是一个完善的从机协议栈,在能够运行linux的嵌入式系统中存在多种选择,而modbus tk是使用python语言实现的modbus协议栈, 该函数库即支持主机也支持从机,即支持RTU也支持TCP。
        有了modbus TK,那么在树莓派中加入一个modbus TCP实现从机功能,也就是分分钟的事情。
        【有用的博客】
     
    1.modbus tk安装
        【1】请确保安装python 2.5以上,并安装pyserial(使用python 控制串口)
        【2】下载modbus tk安装包并解压。例如安装包解压至E:\modbus-tk-0.4.2
        【3】打开控制台,进入E:\modbus-tk-0.4.2,输入:
                    python setup.py install
                setup.py为文件名,install为运行该文件的参数。安装过程非常快。
        【4】验证安装是否完成。import modbus_tk,若输入该命令python没有提示错误的话,那么表示modbus_tk安装成功。
    图1 验证modbus tk安装成功
                
    2.示例代码
        请参考 freemodbus modbus TCP 学习笔记博文,建立一个modbus TCP从机。
        从机IP地址    192.168.1.15
        侦听端口       502
        准备一些默认寄存器,共调试使用。
        【输入寄存器】共16个,依次为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
        【保持寄存器】共16个,依次为16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
        【线圈寄存器】共16个,依次为0xFF,0x00
        【离散输入寄存器】共16个,一次为0x00,0xFF
        
        【 代码】
    # -*- coding: utf_8 -*-
    import sys
    import logging
    import modbus_tk
    import modbus_tk.defines as cst
    import modbus_tk.modbus_tcp as modbus_tcp
    logger = modbus_tk.utils.create_logger("console")
    if __name__ == "__main__":
        try:
            # 连接MODBUS TCP从机
            master = modbus_tcp.TcpMaster(host="192.168.1.15")
            master.set_timeout(5.0)
            logger.info("connected")
            # 读保持寄存器
            logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 16))
            # 读输入寄存器
            logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 0, 16))
            # 读线圈寄存器
            logger.info(master.execute(1, cst.READ_COILS, 0, 16))
            # 读离散输入寄存器
            logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 16))
            # 单个读写寄存器操作
            # 写寄存器地址为0的保持寄存器
            logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 0, output_value=21))
            logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 1))
            # 写寄存器地址为0的线圈寄存器,写入内容为0(位操作)
            logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 0, output_value=0))
            logger.info(master.execute(1, cst.READ_COILS, 0, 1))
            # 多个寄存器读写操作
            # 写寄存器起始地址为0的保持寄存器,操作寄存器个数为4
            logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 0, output_value=[20,21,22,23]))
            logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 4))
            # 写寄存器起始地址为0的线圈寄存器
            logger.info(master.execute(1, cst.WRITE_MULTIPLE_COILS, 0, output_value=[0,0,0,0]))
            logger.info(master.execute(1, cst.READ_COILS, 0, 4))
        except modbus_tk.modbus.ModbusError, e:
            logger.error("%s- Code=%d" % (e, e.get_exception_code()))

     

         【运行结果】

     

    图2 运行结果
         【简要说明】
        【1】master = modbus_tcp.TcpMaster(host="192.168.1.15")

            构造一个modbus主机对象,此处为TcpMaster对象,构造参数为IP地址192.168.1.15,若IP地址为空则为localhost。

            若需要构造一个modbus RTU主机,可使用以下代码:
                master = modbus_rtu.RtuMaster(serial.Serial(“COM1”, baudrate=9600))
            构造参数和modbus TCP稍有差异。
        【2】master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 16)
            读保持寄存器操作,execute为执行函数,共有4个参数,原型如下:
        @threadsafe_function
        def execute(self, slave, function_code, starting_address,
                    quantity_of_x=0, output_value=0, data_format="", expected_length=-1):
    slaver
    从机地址
    modbus TCP时可以忽略该参数
    function_code
    功能码
    modbus_tk.modbus_tcp中定义
    starting_address
    寄存器起始地址
    可设定
    quantity_of_x
    寄存器数量
    可设定
    output_value
    输出内容
    读操作是无效,写操作是输入为List类型
     
    3.总结
        modbus tk的代码看了几天,对python或许有了更深的理解。前些年就知道python也有modbus库,但是由于不会python一直搁浅。去年尝试了树莓派,在使用树莓派的过程中真的开了眼界,慢慢接触了python和restful,真的感觉学了东西提高了自己。还是那句话,工程师没有过去只有去创造。继续努力吧。
     
    展开全文
  • modbus调试工具 modbus调试工具
  • modbus-1_modbus_labviewmodbus.zip
  • modbus的TCP客户端简单测试,用于通讯交互
  • modbus小程序,实现了设备间的tcp通信
  • modbus资料 modbus资料 modbus资料 modbus资料
  • Modbus TCP on visual stdio
  • ModBusTCP 和 ModBusRtu

    2020-10-11 00:42:55
    找了好多ModBus 的资源,只有这个可以真的用起来了。包含了ModBusTCP 和 ModBusRtu 两个部分。
  • modbus主从站设备modbus poll与modbus slave modbus主从站设备modbus poll与modbus slave
  • 实现ModbusTCP网络通讯功能,支持01 02 03 04 05 16 10 功能码
  • modbus协议说明
  • modbus_MODBUS通讯源码_modbus_libmodbus.zip
  • Modbus RTU从站地址与s7-200 的地址对应
  • 简易的modbus rtu通讯,可在此基础上扩展
  • 组态MODBUS 组态MODBUS 组态MODBUS 组态MODBUS 组态MODBUS
  • Modbus_modbus资料_源码

    2021-10-01 18:39:31
    协议逆向工程之Modbus协议格式,可用于生成Modbus标准协议数据集
  • 使用libmodbus进行MODBUS通讯的源码
  • C#与PLC进行Modbus通讯,实现读取功能
  • MODBUS模拟量输出模块,Modbus-RTU 8 通道模拟量输出模块技术资料
  • Modbus_modbusRTU_源码

    2021-10-01 02:38:01
    Modbus serial in ATmega32
  • modbus_master_modbus_源码

    2021-10-03 11:06:06
    Modbus Simulation for use in testing modbus communications

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,905
精华内容 10,762
关键字:

modbus