精华内容
下载资源
问答
  • Modbus TCP指令格式说明

    万次阅读 2017-05-13 12:12:34
    这个是一条正确的发送指令指令 : 22 A3 00 00 00 06 FE 05 00 1F FF 00 ...00 00 :表示该条指令遵循ModbusTCP协议; 00 06 :表示后面数据的长度,可以自己数一下是否是6个Bit FE : 设备

    这个是一条正确的发送指令指令 : 22 A3   00 00   00 06   FE   05   00 1F   FF 00

    说明

    22 A3 :为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文,可以理解为id;

    00 00 :表示该条指令遵循ModbusTCP协议;

    00 06  :表示后面数据的长度,可以自己数一下是否是6个Bit

    FE : 设备地址,这个可以用于局域网里面的具体的地址,如果目标机器有固定ip,这个就不起作用,直接上写成 00;

    05 :功能码,这个可以参考:http://blog.csdn.net/m0_37549050/article/details/71794192  这个是线圈,

    00 1f : 操作 线圈的位置;

    FF 00 :开启线圈


    查询指令和返回结果
    指令:0000 0000 0006 fe 01 0000 0004

    最后面4个Bit的意思是:0000 表示从第0个线圈开始;0004表示读取四个

    结果:0000 0000 0004 fe 01 0100

    0000 ;是通信事务处理标识符

    0000; 是协议标识,标识用的是modbustcp

    0004;标识后面有4Bit数据 fe是设备地址

    01:表示的功能码

    0100:表示结果,这个表示第0,1,3位置的线圈是关闭的,第2位置的是开着的。

    如果想了解更多的,可以参考《基于Modbus协议的工业自动化网络规范 第1部分:Modbus应用协议》;

    http://download.csdn.net/detail/m0_37549050/9841423

    如果你没有积分,请联系本人,免费发邮箱。


    展开全文
  • 本文用于介绍S7-200 SMART Modbus TCP 服务器指令的使用。 伴随着STEP 7-Micro/WIN SMART V2.2 和S7-200 SMART CPU 固件V2.2的发布,S7-200 SMART CPU开始支持TCP、ISO-on-TCP和UDP等开放式用户通信。STEP 7-Micro/...
  • Modbus TCP续集

    2020-01-16 17:33:52
    概述 S7-1200CPUV4.1版与STEP7V13SP1一起,扩展了ModbusTCP 的功能,可使用增强型T 块指令。 出于这个原因,S7-1200支持两组PtP指令: ...ModbusTCP指令:这些ModbusTCP指令提供了早期指令的...

    概述

    S7-1200 CPU V4.1 版与 STEP 7 V13 SP1 一起,扩展了 Modbus TCP

    的功能,可使用增强型 T 块指令。 出于这个原因,S7-1200 支持两组 PtP 指令:

    • 早期ModbusTCP 指令: 这些 Modbus RTU 指令存在于 S7-1200 的 V4.0版本之前。
    • ModbusTCP指令: 这些 Modbus TCP 指令提供了早期指令的全部功能。

     

    选择Modbus TCP 指令的版本

    在 STEP 7 中可使用两个版本的 Modbus TCP 指令:

    • 版本0 最初在 STEP 7 Basic/Professional V13 中提供。
    • 版本1 在 STEP 7 Basic/Professional V13 SP1 中提供。 可以从兼容性和移植便利性方面考虑,选择将相应的指令版本插入用户程序中。

    不要在同一 CPU 程序中同时使用 3.0 和 3.1 指令版本。 用户程序的 Modbus TCP 指令必须具有相同的主版本号(1.x、2.y 或 V.z)。 主版本组内的各个指令可具有不同的次版本号 (1.x)。

    单击指令树任务卡上的图标可启用指令树的标题和列。

    要更改 Modbus TCP指令的版本,请从下拉列表中选择相应版本。 可以选择一组指令或分别选择各个指令。

    使用指令树将 Modbus TCP 指令放入程序时,将在项目树中创建新的 FB 实例。 在项目树的“PLC_x > 程序块 > 系统块 > 程序资源”(PLC_x > Program blocks > System blocks > Program resources) 下可看到新的 FB 实例。

    要确认程序中 Modbus TCP 指令的版本,必须检查项目树的属性而不是程序编辑器中显示的框的属性。 选择项目树的 Modbus TCP FB 实例,单击右键,选择“属性”(Properties),然后选择“信息”(Information) 页查看 Modbus TCP 指令的版本号。

    Modbus TCP 指令 

    MB_CLIENT(作为 Modbus TCP 客户端使用 PROFINET 进行通信)指令 

    表格 13- 53 MB_CLIENT 指令

    表格 13- 54 参数的数据类型

    说明

    CPU 固件版本要求

    本手册中所述的 Modbus TCP 指令要求固件版本为 V4.1 或更高版本。

    REQ 参数

    FALSE = 无 Modbus 通信请求

    TRUE = 请求与 Modbus TCP 服务器通信

    如果 MB_CLIENT 的实例没有激活且参数 DISCONNECT=0,当 REQ=1

    时,将启动一个新的 Modbus 请求。 如果尚未建立连接,则建立一个新的连接。

    如果在当前请求完成前 DISCONNECT=0 且 REQ=1,从而再次执行 MB_CLIENT 的同一个实例,则不会进行后续 Modbus 传送。 但是,一旦完成当前请求,如果通过 REQ=1 执行 MB_CLIENT,可处理新的请求。

    完成当前 MB_CLIENT 通信请求后,DONE 位将在一个周期内保持为 TRUE。 DONE位可用作定时门,对多个 MB_CLIENT 请求进行排序。

    说明

    MB_CLIENT   处理期间输入数据的一致性

    Modbus 客户端启动 Modbus 操作后,将在内部保存所有输入状态,然后在每次后续调用时进行比较。 比较用于确定此特定调用是否是活动客户端请求的发起者。 可使用一个公用背景数据块执行多个 MB_CLIENT 调用。

    在主动处理 MB_CLIENT 操作期间应不改变输入,这一点很重要。 若不遵循此规则,MB_CLIENT 无法确定活动实例。

    MB_MODE  MB_DATA_ADDR 参数用于选择 Modbus 通信功能

    MB_CLIENT 指令使用 MB_MODE 输入而非功能代码。MB_DATA_ADDR 分配远程数据的起始 Modbus 地址。

    MB_MODE 和 MB_DATA_ADDR 一起确定实际 Modbus 消息中使用的功能代码。 下表列出了参数 MB_MODE、MB_DATA_ADDR 和 Modbus 功能之间的对应关系。

    表格 13- 55 Modbus 功能

    说明

    MB_DATA_PTR 分配一个缓冲区来存储从 Modbus TCP 服务器读取或写入到该服务器的数据 数据缓冲区可定位于标准全局 DB 或 M 存储区地址中。

    对于 M 存储器中的缓冲区,使用 Any 指针格式。 具体格式为 P#“位地址” “数据类型”“长度”,例如 P#M1000.0 WORD 500。

    MB_DATA_PTR   参数指定一个通信缓冲区

    • MB_CLIENT通信功能:

    –  从 Modbus 服务器地址(00001 到 09999)读写 1 位数据

    –  从 Modbus 服务器地址(10001 到 19999)读取 1 位数据

    –  从 Modbus 服务器地址(30001 到 39999)和(40001 到 49999)读取 16

    位字数据

    –  向 Modbus 服务器地址(40001 到 49999)写入 16 位字数据

    • 向/从MB_DATA_PTR分配的 DB 或 M 储存器缓冲区传输字或位大小的数据。
    • 如果通过MB_DATA_PTR分配 DB 为缓冲区,必须为所有 DB

    数据元素分配数据类型。

    –  1 位 Bool 数据类型代表一个 Modbus 位地址

    –  16 位单字数据类型(如 WORD、UInt 和 Int)代表一个 Modbus 字地址

    –  32 位双字数据类型(如 DWORD、DInt 和 Real)代表两个 Modbus 字地址

    • 可以通过MB_DATA_PTR分配复杂的 DB 元素,例如

    –  数组

    –  指定的结构,其中每个元素都是唯一的。

    –  指定的复杂结构,其中每个元素都具有唯一的名称以及 16 或 32 位数据类型。

    • 不要求MB_DATA_PTR数据区位于同一个全局数据块(或 M 存储区)中。 可分配一个数据块供 Modbus 读取,分配另一个数据块供 Modbus 写入,或分配一个数据块用于各个 MB_CLIENT。

    CONNECT 参数分配用于建立 PROFINET 连接的数据

    必须使用全局数据块并存储所需的连接数据,然后才能在 CONNECT 参数中引用此

    DB。

    1. 创建新的全局DB 或使用现有全局 DB 来存储 CONNECT 数据。 可使用一个 DB 存储多个 TCON_IP_v4 数据结构。 每个 Modbus TCP 客户端或服务器连接使用一个 TCON_IP_v4 数据结构。 可在 CONNECT 参数中引用连接数据。
    2. 使用有帮助的名称对 DB 和静态变量进行命名。例如,将数据块命名为“Modbus连接”,将静态变量命名为“TCPactive_1”(针对 Modbus TCP 客户端连接 1)。
    3. 在 DB 编辑器的“数据类型”(DataType)

    列中为示例静态变量“TCPactive_1”分配系统数据类型“TCON_IP_v4”。

         4.扩展 TCON_IP_v4结构,从而可以修改连接参数,如下图所示。

         5.修改MB_CLIENT 连接的 TCON_IP_v4 结构数据。

         6.输入MB_CLIENT CONNECT 参数的 DB 结构引用。 本示例中应为“Modbus 连接”.TCPactive_1。

    修改各 MB_CLIENT 连接的 TCP_IP_v4 DB 数据

    • InterfaceID:在设备组态窗口中单击 CPU PROFINET 端口图像。 然后单击“常规”(General) 属性选项卡并使用该处显示的硬件标识符。
    • ID:输入一个介于1 和 4095 之间的连接 ID 编号。使用底层 TCON、TDISCON、TSEND 和 TRCV 指令建立 Modbus TCP 通信,用于 OUC(开放式用户通信)。
    • ConnectionType:对于TCP/IP,使用默认值 16#0B(十进制数 = 11)。
    • ActiveEstablished:该值必须为 1 或 TRUE。 主动连接,由 MB_CLIENT 启动

    Modbus 通信。

    • RemoteAddress:将目标 Modbus TCP 服务器的 IP 地址输入到四个 ADDR

    数组单元中。 例如,如上图所示输入 192.168.2.241。

    • RemotePort:默认值为 502。该编号为 MB_CLIENT 试图连接和通信的 Modbus

    服务器的 IP 端口号。 一些第三方 Modbus 服务器要求使用其它端口号。

    • LocalPort:对于 MB_CLIENT 连接,该值必须为 0。

    多个客户端连接

    Modbus TCP 客户端支持的并发连接数最多为 PLC 允许的开放式用户通信最大连接数。 PLC 的连接总数(包括 Modbus TCP 客户端和服务器)不得超过支持的开放式用户通信最大连接数 。

    单独的并发客户端连接必须遵循以下规则:

    • 各MB_CLIENT连接必须使用一个唯一的背景 DB
    • 必须为各MB_CLIENT连接分配一个唯一的服务器 IP 地址
    • 各MB_CLIENT连接分配一个唯一的连接 ID
    • 是否需要唯一的IP端口号取决于服务器组态

    每个背景 DB 必须使用不同的连接 ID。 总之,背景 DB 和连接 ID成对使用,且对每个连接必须是唯一的。

    表格 13- 56 MB_CLIENT 背景数据块: 用户可访问静态变量

    表格 13- 57 MB_CLIENT 协议错误

    STATUS (W#16#)发送到 Modbus

     

    客户端的响应代码

    (B#16#)

    Modbus 协议错误
    838101不支持此功能代码
    838203数据长度错误
    838302数据地址错误或访问的数据超出 MB_HOLD_REG 地址区的界限
    838403数据值错误
    838503不支持该数据诊断代码(功能代码 08)

    表格 13- 58 MB_CLIENT 执行条件代码

    STATUS (W#16#)MB_CLIENT 参数错误
    7001MB_CLIENT 正在等待 Modbus 服务器响应指定 TCP 端口处的连接或断开连接请求。 仅在第一次执行连接或断开操作时才返回此代码。
    7002MB_CLIENT 正在等待 Modbus 服务器响应指定 TCP 端口处的连接或断开连接请求。 等待连接或断开操作完成时,将针对任何后续执行返回此代码。
    7003断开操作已成功完成(仅在一个 PLC 扫描周期内有效)。
    80C8服务器在指定的时间内未响应。 MB_CLIENT 必须在分配的时间内使用最初传送的事务 ID

     

    接收响应,否则将返回此错误。 检查与 Modbus 服务器设备的连接。

    尝试过重试操作(若适用)后,才返回此错误。

    8188模式无效
    8189数据地址无效
    818A数据长度无效
    818B指向 DATA_PTR 区的指针无效。 可以是 MB_DATA_ADDRESS 与 MB_DATA_LEN

     

    的组合。

    818C指针 DATA_PTR 指向优化的 DB 区(必须是标准 DB 区或 M 存储区)
    8200端口正忙于处理现有的 Modbus 请求。
    8380接收到的 Modbus 帧不正确或接收到的字节太少。
    8387分配的连接 ID 参数和用于先前请求的 ID 不同。 只能有一个单个连接 ID 与每个

     

    MB_CLIENT 背景数据块配合使用。

    如果从一个服务器接收到的 Modbus TCP 协议 ID 不是 0,该代码也可作为内部错误返回。

    8388Modbus 服务器返回一些和请求内容不同的数据。 该代码仅适用于 Modbus 功能 15 或

     

    16。

    除了上面列出的 MB_CLIENT 错误外,也可以从底层传输块通信指令(TCON、TDISCON、TSEND 和TRCV)返回错误。

    MB_SERVER(作为 Modbus TCP 服务器通过 PROFINET 进行通信)指令

    表格 13- 59 MB_SERVER 指令

    表格 13- 60 参数的数据类型

    参数和类型数据类 说明
    DISCONNECTINBoolMB_SERVER 尝试与伙伴设备进行“被动”连接。 也就是说,服务器被动地侦听来自任何请求 IP 地址的 TCP 连接请求。

     

    如果 DISCONNECT = 0 且不存在连接,则可以启动被动连接。 如果 DISCONNECT = 1 且存在连接,则启动断开操作。 该参数允许程序控制何时接受连接。 每当启用此输入时,无法尝试其它操作。

    CONNECTINVariant引用包含系统数据类型为“TCON_IP_v4”的连接参数的数据块结构。
    MB_HOLD_RE GIN_OUTVariant指向 MB_SERVER Modbus 保持寄存器的指针: 保持寄存器必须是一个标准全局 DB 或 M 存储区地址。 储存区用于保存数据,允许 Modbus 客户端使用 Modbus 寄存器功能 3(读)、6(写)和 16(写)访问这些数据。
    NDROUTBool新数据就绪: 0 = 没有新数据,1 = 表示 Modbus

     

    客户端已写入新数据

    DROUTBool数据读取: 0 = 没有读取数据,1 = 表示 Modbus

     

    客户端已读取该数据。

    参数和类型数据类 说明
    ERROROUTBoolMB_SERVER 执行因错误而结束后,ERROR 位将在一个扫描周期时间内保持为 TRUE。 STATUS 参数中的错误代码仅在 ERROR = TRUE 的一个循环周期内有效。
    STATUSOUTWord执行条件代码

    说明

    CPU 固件版本要求

    本手册中所述的 Modbus TCP 指令要求固件版本为 V4.1 或更高版本。

    CONNECT 参数分配用于建立 PROFINET 连接的数据

    必须使用全局数据块并存储所需的连接数据,然后才能在 CONNECT 参数中引用此DB。

    1. 创建新的全局DB 或使用现有全局 DB 来存储 CONNECT 数据。 可使用一个 DB 存储多个 TCON_IP_v4 数据结构。 每个 Modbus TCP 客户端或服务器连接使用一个 TCON_IP_v4 数据结构。 可在 CONNECT 参数中引用连接数据。
    2. 使用有帮助的名称对 DB 和静态变量进行命名。例如,将数据块命名为“Modbus连接”,将静态变量命名为“TCPpassive_1”(针对 Modbus TCP 服务器连接 1)。
    3. 在 DB 编辑器的“数据类型”(DataType)列中为示例静态变量“TCPactive_1”分配系统数据类型“TCON_IP_v4”。
    4. 扩展 TCON_IP_v4结构,从而可以修改连接参数,如下图所示。
    5. 修改MB_SERVER 连接的 TCON_IP_v4 结构数据。
    6. 输入MB_SEVER CONNECT 参数的 DB 结构引用。 本示例中应为“Modbus 连接”.TCPpassive_1。

    修改各 MB_SERVER 连接的 TCP_IP_v4 DB 数据

    • InterfaceID:在设备组态窗口中单击 CPU PROFINET 端口图像。 然后单击“常规”(General) 属性选项卡并使用该处显示的硬件标识符。
    • ID:为该连接输入一个介于1 和 4095 之间的唯一编号。 使用底层 TCON、TDISCON、TSEND 和 TRCV 指令建立 Modbus TCP 通信,用于 OUC(开放式用户通信)。 最多允许八个同步 OUC 连接。
    • ConnectionType:对于TCP/IP,使用默认值 16#0B(十进制值 = 11)。
    • ActiveEstablished:该值必须为 0 或 FALSE。 被动连接,MB_SERVER 正在等待

    Modbus 客户端的通信请求。

    • RemoteAddress:有两个选项。

    –  使用 0.0.0.0,则 MB_CLIENT 将响应来自任何 TCP 客户端的 Modbus 请求。

    –  输入目标 Modbus TCP 客户端的 IP 地址,则 MB_CLIENT 仅响应来自该客户端 IP

    地址的请求。 例如,如上图所示输入 192.168.2.241。

    • RemotePort:对于 MB_SERVER 连接,该值必须为 0。
    • LocalPort:默认值为 502。该编号为 MB_SERVER 试图连接和通信的 Modbus

    客户端的 IP 端口号。 一些第三方 Modbus 客户端要求使用其它端口号。

    Modbus  和过程映像地址

    MB_SERVER 允许进入的 Modbus 功能代码(1、2、4、5 和

    15)在输入/输出过程映像中直接对位/字进行读/写。 对于数据传输功能代码(3、6 和

    16),MB_HOLD_REG 参数必须定义为大于一个字节的数据类型。 下表显示了 Modbus

    地址到 CPU 中过程映像的映射。

    表格 13- 61 Modbus 地址到过程映像的映射

    Modbus 功能S7-1200
    代码功能数据区地址范围数据区CPU 地址
    01读位输出18192输出过程映像Q0.0 到 Q1023.7
    02读位输入1000118192输入过程映像I0.0 到 I1023.7
    04读字输入3000130512输入过程映像IW0 到 IW1022
    05写位输出18192输出过程映像Q0.0 到 Q1023.7
    15写位输出18192输出过程映像Q0.0 到 Q1023.7

    进入的 Modbus 消息功能代码(3、6 和 16)在 Modbus 保持寄存器中读取/写入字,该寄存器可以在 M 存储区或数据块中。 保持寄存器的类型由 MB_HOLD_REG 参数指定。

    说明

    MB_HOLD_REG  参数分配

    Modbus 保持寄存器可以位于标准全局 DB 或 M 存储区地址中。 对于 M 存储区地址中的 Modbus 保持寄存器,使用 Any 指针格式。

    其格式为P#“位地址”“数据类型”“长度”。 例如 P#M1000.0 WORD 500下表给出了 Modbus 地址到保持寄存器的映射示例,这种映射用于 Modbus 功能代码 03(读取字)、06(写入字)和 16(写入字)。 DB 地址的实际上限取决于每种 CPU 型号的最大工作存储器限值和 M 存储器限值。

    表格 13- 62 Modbus 地址到 CPU 存储器地址的映射示例

    Modbus 地址MB_HOLD_REG  参数示例
    P#M100.0 Word 5P#DB10.DBx0.0 Word 5"Recipe".ingredient
    40001MW100DB10.DBW0"Recipe".ingredient[1]
    40002MW102DB10.DBW2"Recipe".ingredient[2]
    40003MW104DB10.DBW4"Recipe".ingredient[3]
    40004MW106DB10.DBW6"Recipe".ingredient[4]
    40005MW108DB10.DBW8"Recipe".ingredient[5]

    多个服务器连接

    可以创建多个服务器连接。 单个 PLC 可与多个 Modbus TCP 客户端建立并发连接。

    Modbus TCP 服务器支持的并发连接数最多为 PLC 允许的开放式用户通信最大连接数。 PLC 的连接总数(包括 Modbus TCP 客户端和服务器)不得超过支持的开放式用户通信最大连接数 。 可在客户端和服务器类型的连接之间共享 Modbus TCP 连接。

    单独的并发服务器连接必须遵循以下规则:

    • 各MB_SERVER连接必须使用一个唯一的背景数据块。
    • 必须为各MB_SERVER连接分配一个唯一的 IP 端口号。 每个端口只能用于 1个连接。
    • 必须为各MB_SERVER连接分配一个唯一的连接 ID。
    • 必须为每个连接(带有各自的背景数据块)单独调用MB_SERVER。

    连接 ID 对于每个单独的连接必须是唯一的。 每个单独的背景 DB 必须使用单一的连接ID。 背景 DB 和连接 ID 成对使用,且对每个连接必须是唯一的。

    表格 13- 63 Modbus 诊断功能代码

    MB_SERVER  Modbus 诊断功能
    代码子功能说明
    080x0000返回查询数据回送测试: MB_SERVER 将向 Modbus 客户端回送接收到的数据字。
    080x000A清除通信事件计数器: MB_SEVER 将清除用于 Modbus 功能 11

     

    的通信事件计数器。

    11 获取通信事件计数器: MB_SERVER 使用内部通信事件计数器来记录发送到 Modbus 服务器的 Modbus 成功读取和写入请求次数。 该计数器不会因任何功能 8、功能 11 请求或任何导致通信错误的请求而递增。

     

    广播功能不能用于 Modbus TCP,因为在任何时刻仅存在一个客户端-服务器连接。

    MB_SERVER 变量

    下表给出了存储在 MB_SERVER背景数据块中的公共静态变量(可在用户程序中使用)。

    表格 13- 64 MB_SERVER 公共静态变量

    变量数据类 默认值说明
    HR_Start_OffsetWord0指定 Modbus 保持寄存器的起始地址
    Request_CountWord0该服务器接收到的所有请求的数量。
    Server_Message_Cou ntWord0该特定服务器接收到的请求的数量。
    Xmt_Rcv_CountWord0出现错误的传输或接收的数量。 此外,如果接收到一条无效的 Modbus 消息,该值加 1。
    Exception_CountWord0需要返回例外的 Modbus 特定错误数
    Success_CountWord0该特定服务器接收到的没有协议错误的请求数量。
    已连接Bool0指示与所分配客户端的连接是已接通还是已断开: 1 =

     

    接通,0 = 断开

    用户程序可以将数据写入 HR_Start_Offset ,控制 Modbus 服务器操作。 可读取其它变量以监视 Modbus 的状态。

    HR_Start_Offset

    Modbus 保持寄存器地址从 40001 开始。 这些地址与保持寄存器的 PLC 存储器起始地址对应。 不过,可以使用“HR_Start_Offset”变量将 Modbus 保持寄存器的起始地址定义为除 40001 外的其它数字。

    例如,如果保持寄存器起始于 MW100 且长度为 100 个字, 则偏移量 20 可指定保持寄存器的起始地址为 40021 而不是 40001。小于 40021 和大于 40119 的任何地址都将导致寻址错误。

    表格 13- 66 MB_SERVER 执行条件代码 1

    STATUS (W#16#)发送到 Modbus 服务器的响应

     

    代码 (B#16#)

    Modbus 协议错误
    7001 MB_SERVER 正在等待 Modbus 客户端连接到指定的 TCP 端口。 仅在第一次执行连接或断开操作时才返回此代码。
    7002 MB_SERVER 正在等待 Modbus 客户端连接到指定的 TCP 端口。 等待完成连接或断开操作时,将针对任何后续执行返回此代码。
    7003 断开操作已成功完成(仅在一个 PLC 扫描周期内有效)。
    8187 指向 MB_HOLD_REG 的指针无效: 区域太小
    818C 指针 MB_HOLD_REG 指向优化的 DB 区(必须是标准全局 DB 区或 M

     

    存储区)或受阻的过程超时超过 55 秒的限值。 (仅适用于 S7-1200)

    838101不支持此功能代码
    838203数据长度错误
    838302数据地址错误或访问的数据超出 MB_HOLD_REG 地址区的界限
    838403数据值错误
    838503不支持该数据诊断代码(功能代码 08)

    除了上面列出的 MB_SERVER 错误外,也可以从底层传输块通信指令(TCON、TDISCON、TSEND 和 TRCV)返回错误。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 本文用于介绍 S7-200 SMART Modbus TCP 服务器指令的使用。 伴随着 STEP 7-Micro/WIN SMART V2.2 和 S7-200 SMART CPU 固件 V2.2 的 发布, S7-200 SMART CPU 开始支持 TCP 、 ISO-on-TCP 和 UDP 等开放式用 户通信...
  • S7-200 SMART CPU Modbus TCP

    2017-09-29 12:19:48
    伴随着STEP 7-Micro/WIN SMART V2.2和S7-200 SMART CPU固件V2.2的发布,S7-200 SMART CPU开始支持TCP、ISO...STEP 7-Micro/WIN SMART V2.2版本软件安装MODBUS TCP指令库后,S7-200 SMART CPU还可以支持Modbus TCP通讯。
  • modbusTCP协议

    2015-05-28 10:20:11
    描述modbusTCP通信过程,介绍modbusTCP客户端,服务器指令的使用方法,并举例说明modbusTCP协议应用
  • S7-200 SMART CPU 调用MB_Client指令库作为MODBUS TCP客户端时支持相应的功能MB_Client_0.smartlibMB_Client_1.smartlibMB_Client_2.smartlibMB_Client_3.smartlibMB_TCP_Client_Example.smartMB_TCP_Client_...
  • Modbus TCP协议解析

    千次阅读 2019-07-07 17:13:54
    在之前的文章中,我们介绍了Modbus RTU协议的内容和...文章目录一、Modbus TCP协议解析Modbus TCPModbus RTU的区别Modbus TCP协议的构成Modbus TCP的报文头Modbus TCP的功能码Modbus TCP的数据码二、持续更新:Mo...

    在之前的文章中,我们介绍了Modbus RTU协议的内容和实现方法。最近在进行网络通讯的时候又用到了Modbus TCP协议,因此这里把自己对Modbus TCP的了解总结一下。

    一、Modbus TCP协议解析

    Modbus TCP和Modbus RTU的区别

    这两个都是Modbus协议,但是两者之间有有何区别呢?在我看来,Modbus TCP协议是一个运行在TCP/IP网络连接中的一种协议,而Modbus RTU则是运行在工业控制领域的一种协议,就传递数据的功能来说,两者都能实现。就传递数据的路径来说,Modbus TCP可能更多的是在网络环境下的数据传输。就传递的数据的格式来说,二者存在着一定的区别,但是又有相同的地方。下面我们通过具体的例子,来说明。

    Modbus TCP协议的构成

    Modbus TCP的协议构成可以分为 报文头 功能码 数据码 (校验码)这几个部分,这里校验码在一般的Modbus TCP中是没有的。对比Modbus RTU,我们可以看到这两个协议的组成基本上是一样的。

    Modbus TCP的报文头

    Modbus TCP的报文头一般来说又分为以下几个码:

    名称长度示例备注
    事务处理标识符2个字节97 79客户机发起,服务器复制,用于事务处理配对,可以自行设定
    协议标识符2个字节00 00客户机发起,服务器复制,表示该协议是TCP协议,是固定值,不可以更改
    长度标识符2个字节00 06表示该数据帧中,从本子节到最后一个字节的字节个数,根据当前数据帧的情况设定
    单元标识符1个字节03客户机发起,服务器复制,这是一个站点号,在多设备通讯时,用来表示该数据的来源于哪个设备或者该数据要去往哪个设备

    Modbus TCP的功能码

    除了Modbus的构成基本相似,其中的功能码、数据码两部分也是采用通用的格式,例如3为读寄存器功能码,16为写寄存器功能码等等。这里对功能码和数据码不做深入的展开。

    名称长度示例备注
    功能码1个字节05功能码根据Modbus通用功能码的定义进行设定,这里05表示对线圈进行写操作

    Modbus TCP的数据码

    这里数据码也是同Modbus RTU协议一样,不同的功能码后面的数据码是不同的。这里具体什么样的功能码对应什么样的数据码,请自行查阅资料。这里只是简单的举几个例子。

    名称长度示例备注
    线圈地址2个字节00 10表示对地址为17的线圈进行操作
    操作命令2个字节FF 00FF 00 表示将该线圈置1,00 00 表示将该线圈置0

    二、持续更新:Modbus TCP实现各种功能码的示例

    1.功能码 05 (0x05)

    功能码0x05表示写指令线圈,也就是控制某线圈通断。代码的构成如下:

    结构名称长度示例备注
    报文头
    事务处理标识符2个字节97 79 客户机发起,服务器复制,用于事务处理配对,可以自行设定
    协议标识符2个字节 00 00 客户机发起,服务器复制,表示该协议是TCP协议,是固定值,不可以更改
    长度标识符2个字节 00 06 表示该数据帧中,从本子节到最后一个字节的字节个数,根据当前数据帧的情况设定
    单元标识符1个字节 03 客户机发起,服务器复制,这是一个站点号,在多设备通讯时,用来表示该数据的来源于哪个设备或者该数据要去往哪个设备
    功能码功能码1个字节0505表示对线圈进行写操作
    数据码
    线圈地址2个字节00 10 表示对地址为17的线圈进行操作
    操作命令2个字节 FF 00 FF 00 表示将该线圈置1,00 00 表示将该线圈置0

    发送:97 79 00 00 00 06 03 05 00 10 FF 00
    收到:97 79 00 00 00 06 03 05 00 10 FF 00

    因为这里不需要主机返回数据,因此主机将收到的指令复制一下直接发送回来表示接受正常。

    展开全文
  • ModbusTCP协议学习

    2021-03-20 22:07:57
    文章目录ModbusTCP协议学习1、简介2、ModbusTCP数据帧2.1、报文头MBAP2.2、帧结构PDU2.2.1、功能码2.2.2、PDU详细结构3、ModbusTCP通信3.1、通信方式3.2、在linux下使用modbusTCP连接4、Modbus poll / Modbus slave ...

    ModbusTCP协议学习


    1、简介

    modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的modbus协议:modbusTCP。

    Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。

    标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

    2、ModbusTCP数据帧

    ModbusTCP的数据帧可分为两部分:MBAP+PDU。

    2.1、报文头MBAP

    MBAP为报文头,长度为7字节,组成如下:

    事务处理标识协议标识长度单元标识符
    2字节2字节2字节1字节

    事务处理标识:可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
    协议标识符 :00 00表示ModbusTCP协议。
    长度 :表示接下来的数据长度,单位为字节。
    单元标识符 :可以理解为设备地址。

    2.2、帧结构PDU

    PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

    2.2.1、功能码

    modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。

    • 线圈:PLC的输出位,开关量,在MODBUS中可读可写
    • 离散量:PLC的输入位,开关量,在MODBUS中只读
    • 输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在MODBUS中只读
    • 保持寄存器:PLC中用于输出模拟量信号的寄存器,在MODBUS中可读可写

    根据对象的不同,modbus的功能码有:

    • 0x01:读线圈
    • 0x05:写单个线圈
    • 0x0F:写多个线圈
    • 0x02:读离散量输入
    • 0x04:读输入寄存器
    • 0x03:读保持寄存器
    • 0x06:写单个保持寄存器
    • 0x10:写多个保持寄存器
    2.2.2、PDU详细结构

    0x01:读线圈
    在从站中读1~2000个连续线圈状态,ON=1,OFF=0

    • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
    • 响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)
    • 如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位
      00 01 00 00 00 06 01 01 00 02 00 08
    • 回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF
      00 01 00 00 00 04 01 01 01 01

    0x05:写单个线圈
    将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF

    • 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
    • 响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
    • 如:将地址为0x0003的线圈设为ON
      00 01 00 00 00 06 01 05 00 03 FF 00
    • 回:写入成功
      00 01 00 00 00 06 01 05 00 03 FF 00

    0x0F:写多个线圈
    将一个从站中的一个线圈序列的每个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF

    • 请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L
    • 响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L

    0x02:读离散量输入
    从一个从站中读1~2000个连续的离散量输入状态

    • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
    • 响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))
    • 如:从地址0x0000开始读0x0012个离散量输入
      00 01 00 00 00 06 01 02 00 00 00 12
    • 回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF
      00 01 00 00 00 06 01 02 03 01 04 00

    0x04:读输入寄存器
    从一个远程设备中读1~2000个连续输入寄存器

    • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
    • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
    • 如:读起始地址为0x0002,数量为0x0005的寄存器数据
      00 01 00 00 00 06 01 04 00 02 00 05
    • 回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00
      00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00

    0x03:读保持寄存器
    从远程设备中读保持寄存器连续块的内容

    • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
    • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
    • 如:起始地址是0x0000,寄存器数量是 0x0003
      00 01 00 00 00 06 01 03 00 00 00 03
    • 回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
      00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

    0x06:写单个保持寄存器
    在一个远程设备中写一个保持寄存器

    • 请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
    • 响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
    • 如:向地址是0x0000的寄存器写入数据0x000A
      00 01 00 00 00 06 01 06 00 00 00 0A
    • 回:写入成功
      00 01 00 00 00 06 01 06 00 00 00 0A

    0x10:写多个保持寄存器
    在一个远程设备中写连续寄存器块(1~123个寄存器)

    • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)
    • 响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
    • 如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
      00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
    • 回:写入成功
      00 01 00 00 00 06 01 10 00 00 00 01

    3、ModbusTCP通信

    3.1、通信方式

    modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。

    • 主站请求:功能码+数据
    • 从站正常响应:请求功能码+响应数据
    • 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
    • 注意:需要超时管理机制,避免无期限的等待可能不出现的应答

    3.2、在linux下使用modbusTCP连接

    IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。

    通信过程:
    1.connect 建立TCP连接
    2.准备modbus报文
    3.使用send命令发送报文
    4.在同一连接下等待应答
    5.使用recv命令读取报文,完成一次数据交换
    6.通信任务结束时,关闭TCP连接

    4、Modbus poll / Modbus slave

    modbus poll 和modbus slave是一组modbus仿真软件,可以实现modbus RTU、TCP、串口仿真等。

    在modbusTCP中,modbus poll 作为客户端请求数据,modbus slave 作为服务器端处理请求。

    使用c语言编写客户端连接modbus slave时,注意数据格式,一条指令一次性发出,否则连接会出错。

    使用软件时,需要指定功能码,在setup->slave definition或者poll definition中进行设置。

    • slave ID:从站编号(事务标识符)
    • function:功能码,0x01对应线圈操作,0x02对应离散量操作,0x03对应保持寄存器操作,0x04对应输入寄存器操作
    • address:开始地址
    • quantity:寄存器/线圈/离散量 的数量

    Linux C作为客户端连接modbus slave的源码:
    链接:https://pan.baidu.com/s/146svXpit0umpk809TV1Sdw 密码:b6gn

    参考:
    https://wenku.baidu.com/view/c2a9e1cc376baf1ffd4fad5c.html
    https://blog.csdn.net/zwxue251/article/details/24154951
    https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1

    展开全文
  • 通过“MB_CLIENT”指令,可以在客户端和服务器之间建立连接、发送 Modbus 请求、接收响应并控制 Modbus TCP 客户端的连接终端。通过“MB_SERVER”指令将处理 Modbus TCP 客户端的连接请求、接收并处理 Modbus 请求并...
  • Modbus Tcp协议详解

    万次阅读 多人点赞 2017-08-02 16:44:04
    一、ModbusTcp简介 什么是ModbusTcp? /1、Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MODBUS寄存器地址来交换数据; /2、但所用的硬件接口不一样,Modbus RTU一般采用串口RS232C或RS485/422,而...
  • modbus tcp 服务端

    2012-10-16 12:55:57
    modbus tcp 服务器端,只能实现AI点的传输,其他的可以自己加
  • Qt Modbus TCP 通讯读写操作

    千次阅读 热门讨论 2019-11-16 21:36:01
    Qt Modbus TCP通讯读写Modbus TCP 协议Modbus TCP/IP协议格式Qt Modbus 模块 读写 Modbus TCP 协议 Modbus协议是一个master/slave架构的协议。有一个节点是master节点,其他使用Modbus协议参与通信的节点是slave节点...
  • 立即注册 x汇川H3u与三菱Q/L系列PLC MODBUS TCP通信说明MODBUS-TCP作为一种工业通信协议,在自动化设备中的应用越来越多,由于其灵活的特性(既可作客户端,又可作服务器)及强大的数据传输功能,倍受工程师青睐,尤其...
  • ModbusTCP协议

    2021-02-03 11:12:14
    1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。 Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。 标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用...
  • ModbusTCP概述02. ModbusTCP数据帧2.1 **报文头MBAP**2.2 **帧结构PDU**03. PDU详细结构04. Modbus TCP报文示例4.1 读输入寄存器报文分析4.2 写多个保持寄存器报文分析05. Modbus TCP通信06. Modbus仿真软件07. ...
  • 三菱 Q 系列 PLC 的 modbusTCP 通讯 三菱 Q 系列 PLC 的 modbusTCP 通讯
  • 一、ModbusTcp简介什么是ModbusTcp? 1、Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MODBUS寄存器地址来交换数据; 2、但所用的硬件接口不一样,Modbus RTU一般采用串口RS232C或RS485/422,而Modbus...
  • ModbusTcp和ModbusRtu

    2021-06-19 10:09:22
    ModbusTcp和ModbusRtu 1、何为Modbus通信协议 1.1 Modbus基本介绍 Modbus协议介绍:Modbus是 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。包括了ASCII、...
  • 倍福ModbusTCP_Server程序
  • ModbusTcp常用功能代码

    2012-11-06 13:05:48
    ModbusTcp常用功能代码,介绍功能码01 02 03 04 05 06 15 16
  • modbus tcp 协议详解

    千次阅读 2021-01-24 02:53:42
    modbus-tcp 协议详解
  • 欧姆龙PLC以太网modbusTCP通讯

    千次阅读 2020-06-30 10:23:04
    摘要 工业通讯桥接器NET30-CS,可以用于欧姆龙CP和CJ系列PLC的以太网通讯...一、通讯桥接器内部集成了Modbustcp的服务器,支持标准的modbus协议,支持功能码包括,FC1,FC2,FC3,FC5,FC6,FC16。所有支持ModbusT...
  • Modbus RTU与Modbus TCP的区别

    千次阅读 2021-02-28 22:24:41
    Modbus通信协议具有多个变种,支持串口(主要是RS-485总线),以太网多个版本,其中最著名的是Modbus RTU,Modbus ASCII和Modbus TCP三种。 在工业现场一般都是采用Modbus RTU协议,一般而言,大家说的基于串口通信...
  • PLC作为Modbus TCP客户端

    2020-11-27 15:23:53
    PLC作为Modbus TCP客户端,Modbus Slave作为服务器
  • modbus tcp 入门详解

    千次阅读 2018-07-22 23:00:00
    Modbus tcp 格式说明 通讯机制 附C#测试工具用于学习,测试   前言:  之前的博客介绍了如何用C#来读写modbus tcp服务器的数据,文章:http://www.cnblogs.com/dathlin/p/7885368.html 当然也有如何创建...
  • PLC作为Modbus TCP服务器

    2020-11-27 15:21:52
    PLC作为Modbus TCP服务器,Modbus Poll实现客户端模拟
  • S7-1200PLC与上位机ModbusTCP通信

    千次阅读 2020-08-21 15:27:20
    西门子PLC作为市场占有率非常高的一款PLC,支持Profinet、Profibus、S7、Modbus、TCP等多种通信协议,本案例以S7-1200 PLC为例,主要讲述使用西门子PLC作为ModbusTCP服务器,上位机作为ModbusTCP客户端的应用场景。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,311
精华内容 524
关键字:

modbustcp指令