Notes on the documentation

This description is only intended for the use of trained specialists in control and automation engineering who are familiar with the applicable national standards.
It is essential that the following notes and explanations are followed when installing and commissioning these components.

The responsible staff must ensure that the application or use of the products described satisfy all the requirements for safety, including all the relevant laws, regulations, guidelines and standards.

Disclaimer

The documentation has been prepared with care. The products described are, however, constantly under development.
For that reason the documentation is not in every case checked for consistency with performance data, standards or other characteristics.
In the event that it contains technical or editorial errors, we retain the right to make alterations at any time and without warning.
No claims for the modification of products that have already been supplied may be made on the basis of the data, diagrams and descriptions in this documentation.

Trademarks

Beckhoff®, TwinCAT®, EtherCAT®, Safety over EtherCAT®, TwinSAFE® and XFC® are registered trademarks of and licensed by Beckhoff Automation GmbH.
Other designations used in this publication may be trademarks whose use by third parties for their own purposes could violate the rights of the owners.

Patent Pending

The TwinCAT Technology is covered, including but not limited to the following patent applications and patents:
EP0851348, US6167425 with corresponding applications or registrations in various other countries.

Copyright

© Beckhoff Automation GmbH.
The reproduction, distribution and utilization of this document as well as the communication of its contents to others without express authorization are prohibited.
Offenders will be held liable for the payment of damages. All rights reserved in the event of the grant of a patent, utility model or design.


Overview

TwinCAT PLC Serial Communication Modbus RTU

概述

Modbus RTU TwinCAT PLC 软件库中提供了Modbus 终端设备的串行通讯功能块的说明。

典型带有Modbus 驱动的终端设备，通过串行RS-232、RS-422 或 RS-485 接口连接到TwinCAT控制器，并作为操作终端运行。此时，TwinCAT PLC 是Modbus 从站而操作终端是Modbus 主站。在这种组合中，PLC 的编程量很少。

另外， Modbus 主站的功能也能在库中找到相关的描述，通过这些功能，PLC 控制器可以连接一个或多个 Modbus 从站。但是因为程序要求较高，这种主从关系不常见并且也不推荐的。

支持的TwinCAT控制器

  • TwinCAT PC
  • CX1000系列
  • BC and BX总线控制器

支持的接口

  • PC 或CX串口（COM口）
  • BX控制器串口
  • KL6001, KL6011, KL6021, KL6031或KL6041串口总线端子模块以及相应的EL模块。

临界情况

Modbus 协议定义了较精确的时间来保证其通讯的品质，例如，报文中所有字符的完整传送。由于Modbus RTU 通讯是在 PLC 控制器中实现的，PLC 程序的周期执行不能保证精确的时间要求。大多数的终端设备是可以承受的，并且字符之间的时间间隔也不会影响功能的正确执行。个别情况下，应对终端设备的性能进行检测。

更多说明

http://www.modicon.com/
http://www.modbus.org


ModbusRtuMaster_PcCom

ModbusRtuMaster_PcCom功能块

ModbusRtuMaster_PcCom 功能块通过PC串行口（COM口）实现Modbus主站的通讯。这个功能块不是调用它的基本形式，而是在PLC 程序中使用它的各个动作来实现。每个动作执行一个Modbus功能。

ModbusRtuMaster_KL6x5B功能块用于完成串行总线端子KL6001, KL6011 or KL6021通讯。

example program解释了运行原则

支持的Modbus功能（动作）

· ModbusMaster.ReadCoils
Modbus 功能1=读取开关量。
从连接的从站读取二进制输出量（开关量）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。

· ModbusMaster.ReadInputStatus
Modbus功能2= 读取输入状态。
从连接的从站读取二进制输入。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。

· ModbusMaster.ReadRegs
Modbus功能3=读取保持寄存器。
从连接的从站读取数据。

· ModbusMaster.ReadInputRegs
Modbus功能4=读取输入寄存器。
从连接的从站读取输入寄存器。

· ModbusMaster.WriteSingleCoil
Modbus功能5=写单个开关量。
发送一个二进制输出量到连接的从站（开关量）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。

· ModbusMaster.WriteSingleRegister
Modbus功能6=写单个寄存器
发送一个数据字到连接的从站。

· ModbusMaster.WriteMultipleCoils
Modbus功能15=写多个开关量
发送二进制输出到连接的从站（线圈）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。

· ModbusMaster.WriteRegs
Modbus功能16=预置多个寄存器
发送数据到连接的从站

· ModbusMaster.Diagnostics
Modbus功能8=诊断请求
发送一个诊断请求到所连接从站，这个诊断请求的子功能码是用户自定义的。 子功能码是需要通过 MBAddr 参数设置的。

VAR_INPUT

VAR_INPUT
       UnitID         : UINT;
       Quantity               : WORD;
       MBAddr         : WORD;
       cbLength               : UINT;
       pMemoryAddr    : DWORD;
       Execute        : BOOL;
       Timeout        : TIME;
END_VAR

UnitID : Modbus站点地址（station address）(1..247)。Modbus从站只响应在接收的报文中包含其自身站点地址的报文。为了满足各种响应需求，有几种寻址方式可用作选择。地址0被作为保留地址，用于广播式报文，因此不是一个有效的站地址。

Quantity:Modbus 功能码读写数据字的个数。如果是按位为单位的Modbus 功能，Quantity 指的是位的个数 (输入或开关量) 。

MBAddr: Modbus数据地址，它从从站读取数据的地址。此地址将无变化地被传送到从站并作为数据地址。
当使用诊断功能时MBAddr为子功能代码。

cbLength : 指的是发送或接收功能的数据的大小，用字节表示。cbLength必须大于或等于由Quantity指定的传送数据个数。以字操作为例： [cbLength >= Quantity * 2]. cbLength可以用SIZEOF (Modbus data)计算。

pMemoryAddr: PLC内存地址，可以用ADR (Modbus data)计算。对于读取操作，读取的数据储存在变量地址中。对于发送操作，数据从地址变量中传送到从站。

Execute : 启动信号。上升沿触发。

Timeout : 从站响应超时的时间。

VAR_OUTPUT

VAR_OUTPUT
       BUSY                   : BOOL;
       Error   : BOOL;
       ErrorId : MODBUS_ERRORS;
       cbRead  : UINT;
END_VAR

Busy:表示功能块处于激活状态。当Execute 为上升沿时，Busy 变为TRUE，一旦启动功能完成，则又变为 FALSE。在任何情况下，只有一个功能被激活。

Error: 指示功能执行期间发生了错误。

ErrorId: 表示通讯受到干扰或者通讯失败时的错误号（error number）。

cbRead: 返回读操作过程中被读出数据的字节数。

硬件连接

通讯口连接所需的数据结构整合在功能块中。一旦连接到电脑接口并且将PLC 程序嵌入，那么 TwinCAT System Manager中即可看到这些数据结构。详情请参阅Serial PC Interface相关章节。

运行环境 | 服务对象 | PLC 库
TwinCAT from V2.8 | PC (i386), CX1000 | ModbusRTU.lib (Version 2.2 or higher)


ModbusRtuSlave_PcCom

ModbusRtuSlave_PcCom功能块

ModbusRTUslave_PcCom 功能块通过PC串行接口（COM口）完成Modbus从站通讯。 这个块是被动的，从所连接的Modbus主站接收报文。

example program解释了运行原理。

ModbusRTUslave_KL6x5B功能块用于完成串行总线端子KL6001, KL6011 or KL6021的Modbus RTU通讯。

VAR_INPUT

VAR_INPUT
       UnitID         : UINT;
       AdrInputs      : POINTER TO BYTE; (* Pointer to the Modbus input area  *)
       SizeInputBytes  : UINT;
       AdrOutputs     : POINTER TO BYTE; (* Pointer to the Modbus output area *)
       SizeOutputBytes        : UINT;
       AdrMemory      : POINTER TO BYTE; (* Pointer to the Modbus memory area *)
       SizeMemoryBytes        : UINT;
END_VAR

UnitID : Modbus站点地址（station address）(1..247)。Modbus 从站只响应在接收的报文中包含其自身站点地址的报文。为了满足各种响应需求，有几种寻址方式可用作选择。地址0被作为保留地址，用于广播式报文，因此不是一个有效的站地址。

AdrInputs: Modbus输入数组（Modbus input array）的起始地址。该数据数组通常被声明为PLC数组，地址可以用 ADR (输入变量)计算。

SizeInputBytes: Modbus输入数组的大小，用字节表示。其大小可以用SIZEOF (输入变量)计算。

AdrOutputs : Modbus输出数组（Modbus output array）的起始地址。该数组通常被声明为PLC数组，地址可以用 ADR (输出变量)计算。

SizeOutputBytes: Modbus输出数组的大小，用字节表示。其大小可以用SIZEOF (输出变量)计算。

AdrMemory : Modbus内存数组（Modbus memory array）的起始地址。该数组通常被声明为PLC数组，地址可以用 ADR (内存变量)计算。

SizeMemoryBytes : Modbus内存数组的大小，用字节表示。大小可以用SIZEOF (内存变量)计算。

VAR_OUTPUT

VAR_OUTPUT
       ErrorId : Modbus_ERRORS;
END_VAR

ErrorId: 表示通讯受到干扰或者通讯失败时的错误号（error number）。

硬件连接

通讯口链接所需的数据结构整合在功能块中。一旦连接到电脑接口并且将PLC 程序嵌入，那么 TwinCAT System Manager中即可看到这些数据结构。详情请参阅Serial PC Interface相关章节。

环境 | 服务对象 | PLC库
TwinCAT from V2.8 | PC (i386), CX1000 | ModbusRTU.lib


ModbusRtuMaster_KL6x5B

ModbusRtuMaster_KL6x5B功能块

ModbusRtuMaster_KL6x5B 功能块通过串行总线端子KL6001, KL6011或 KL6021完成Modbus主站通讯。这个功能块不是调用它的基本形式，而是在PLC 程序中使用它的各个动作来实现。每个动作执行一个Modbus功能。

示例程序BC bus controller解释了运行原则。

支持的Modbus功能（动作）

· ModbusMaster.ReadCoils
Modbus 功能1=读取开关量。
从连接的从站读取二进制输出量（开关量）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。

· ModbusMaster.ReadInputStatus
Modbus功能2= 读取输入状态。
从连接的从站读取二进制输入。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。

· ModbusMaster.ReadRegs
Modbus功能3=读取保持寄存器。
从连接的从站读取数据。

· ModbusMaster.ReadInputRegs
Modbus功能4=读取输入寄存器。
从连接的从站读取输入寄存器。

· ModbusMaster.WriteSingleCoil
Modbus功能5=写单个开关量。
发送一个二进制输出量到连接的从站（开关量）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。

· ModbusMaster.WriteSingleRegister
Modbus功能6=写单个寄存器
发送一个数据字到连接的从站。

· ModbusMaster.WriteMultipleCoils
Modbus功能15=写多个开关量
发送二进制输出到连接的从站（线圈）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。

· ModbusMaster.WriteRegs
Modbus功能16=预置多个寄存器
发送数据到连接的从站

· ModbusMaster.Diagnostics
Modbus功能8=诊断请求
 发送一个诊断请求到所连接从站，这个诊断请求的子功能码是用户自定义的。子功能码是需要通过 MBAddr 参数设置的。

VAR_INPUT

VAR_INPUT
       UnitID:
 UINT; Quantity               : WORD;
       MBAddr         : WORD;
       cbLength               : UINT;
       pMemoryAddr    : DWORD;
       Execute        : BOOL;
       Timeout        : TIME;
END_VAR

UnitID : Modbus站点地址（station address）(1..247)。Modbus从站只响应在接收的报文中包含其自身站点地址的报文。为了满足各种响应需求，有几种寻址方式可用作选择。地址0被作为保留地址，用于广播式报文，因此不是一个有效的站地址。

Quantity:Modbus 功能码读写数据字的个数。如果是按位为单位的Modbus 功能，Quantity 指的是位的个数 (输入或开关量) 。

MBAddr: Modbus数据地址，它从从站读取数据地址。此地址将无变化地被传送到从站并作为数据地址。
当使用诊断功能时MBAddr为子功能代码。

cbLength : 指的是发送或接收功能的数据的大小，用字节表示。cbLength必须大于或等于由Quantity指的传送数据个数。以字操作为例： [cbLength >= Quantity * 2]. cbLength可以用SIZEOF (Modbus data)计算。

pMemoryAddr: PLC内存地址，可以用ADR (Modbus data)计算。对于读取操作，读取的数据储存在变量地址中。对于发送操作，数据从地址变量中传送到终端设备。

Execute : 启动信号。上升沿触发。

Timeout : 从站响应超时的时间。

VAR_OUTPUT

VAR_OUTPUT
       BUSY                   : BOOL;
       Error   : BOOL;
       ErrorId : MODBUS_ERRORS;
       cbRead  : UINT;
ND_VAR

Busy:表示功能块处于激活状态。当Execute 为上升沿时，Busy 变为TRUE，一旦启动功能完成，则又变为 FALSE。在任何情况下，只有一个功能被激活。

Error: 指示功能执行期间发生了错误。

ErrorId: 表示通讯受到干扰或者通讯失败时的错误号（error number）。

cbRead: 返回读操作过程中被读出数据的字节数。

硬件连接

通讯口链接所需的数据结构整合在功能块中。TwinCAT System Manager如何分配可以参考Serial Bus Terminal章节的描述。对于BC总线控制器，I/O地址要手动赋值。详见.Hardware assignment at the BC bus controller.

环境 | 服务对象 | PLC库
TwinCAT from V2.8 | BC总线控制器 | ModbusRTU.lb6 (Version 2.2 or higher)


ModbusRtuSlave_KL6x5B

ModbusRtuSlave_KL6x5B功能块

ModbusRtuSlave_KL6x5B 功能块通过串行总线端子KL6001, KL6011或 KL6021完成Modbus从站通讯。这个块是被动的，从所连接的Modbus主站接收报文。

示例程序BC bus controller解释了运行原则。

VAR_INPUT

VAR_INPUT
       UnitID         : UINT;
       AdrInputs      : POINTER TO BYTE; (* Pointer to the Modbus input area  *)
       SizeInputBytes  : UINT;
       AdrOutputs     : POINTER TO BYTE; (* Pointer to the Modbus output area *)
       SizeOutputBytes        : UINT;
       AdrMemory      : POINTER TO BYTE; (* Pointer to the Modbus memory area *)
       SizeMemoryBytes        : UINT;
END_VAR

UnitID : Modbus站点地址（station address）(1..247)。Modbus 从站只响应在接收的报文中包含其自身站点地址的报文。为了满足各种响应需求，有几种寻址方式可用作选择。地址0被作为保留地址，用于广播式报文，因此不是一个有效的站地址。

AdrInputs: Modbus输入数组（Modbus input array）的起始地址。该数据数组通常被声明为PLC数组，地址可以用 ADR (输入变量)计算。

SizeInputBytes: Modbus输入数组的大小，用字节表示。其大小可以用SIZEOF (输入变量)计算。

AdrOutputs : Modbus输出数组（Modbus output array）的起始地址。该数组通常被声明为PLC数组，地址可以用 ADR (输出变量)计算。

SizeOutputBytes: Modbus输出数组的大小，用字节表示。其大小可以用SIZEOF (输出变量)计算。

AdrMemory : Modbus内存数组（Modbus memory array）的起始地址。该数组通常被声明为PLC数组，地址可以用 ADR (内存变量)计算。

SizeMemoryBytes : Modbus内存数组的大小，用字节表示。大小可以用SIZEOF (内存变量)计算。

VAR_OUTPUT

VAR_OUTPUT
       ErrorId : Modbus_ERRORS;
ND_VAR

ErrorId: 表示通讯受到干扰或者通讯失败时的错误号（error number）。

硬件连接

通讯口链接所需的数据结构整合在功能块中。TwinCAT System Manager分配的执行可以参考Serial Bus Terminal章节的描述。对于BC总线控制器，I/O地址要手动赋值。详见.Hardware assignment at the BC bus controller.

环境 | 服务对象 | PLC库
TwinCAT from V2.8 | PC (i386), CX1000, | ModbusRTU.lib
TwinCAT from V2.8 | BC总线控制器 | ModbusRTU.lb6


ModbusRtuMaster_KL6x22B

ModbusRtuMaster_KL6x22B功能块

ModbusRtuMaster_KL6x22B 功能块通过串行总线端子 KL6021或KL6041完成Modbus主站通讯。这个功能块不是调用它的基本形式，而是在PLC 程序中使用它的各个动作来实现。每个动作执行一个Modbus功能。

ModbusRtuMaster_PcCom功能块通过串行PC口（COM口）通讯。

一个实例程序PC or CX1000 或BC bus controller 解释了运行原理

支持的Modbus功能（动作）

  • ModbusMaster.ReadCoils
    Modbus 功能1=读取开关量。
    从连接的从站读取二进制输出量（开关量）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。
  • ModbusMaster.ReadInputStatus
    Modbus功能2= 读取输入状态。
    从连接的从站读取二进制输入。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。
  • ModbusMaster.ReadRegs
    Modbus功能3=读取保持寄存器。
    从连接的从站读取数据。
  • ModbusMaster.ReadInputRegs
    Modbus功能4=读取输入寄存器。
    从连接的从站读取输入寄存器。
  • ModbusMaster.WriteSingleCoil
    Modbus功能5=写单个开关量。
    发送一个二进制输出量到连接的从站（开关量）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。
  • ModbusMaster.WriteSingleRegister
    Modbus功能6=写单个寄存器
    发送一个数据字到连接的从站。
  • ModbusMaster.WriteMultipleCoils
    Modbus功能15=写多个开关量
    发送二进制输出到连接的从站（线圈）。数据以压缩形式（每字节8位）储存在 pMemoryAddr的起始地址处。
  • ModbusMaster.WriteRegs
    Modbus功能16=预置多个寄存器
    发送数据到连接的从站
  • ModbusMaster.Diagnostics
    Modbus功能8=诊断请求
     发送一个诊断请求到所连接从站，这个诊断请求的子功能码是用户自定义的。子功能码是需要通过 MBAddr 参数设置的。

VAR_INPUT

VAR_INPUT
       UnitID:
 UINT; Quantity               : WORD;
       MBAddr         : WORD;
       cbLength               : UINT;
       pMemoryAddr    : DWORD;
       Execute        : BOOL;
       Timeout        : TIME;
END_VAR

UnitID : Modbus站点地址（station address）(1..247)。Modbus从站只响应在接收的报文中包含其自身站点地址的报文。为了满足各种响应需求，有几种寻址方式可用作选择。地址0被作为保留地址，用于广播式报文，因此不是一个有效的站地址。

Quantity:Modbus 功能码读写数据字的个数。如果是按位为单位的Modbus 功能，Quantity 指的是位的个数 (输入或开关量) 。

MBAddr: Modbus数据地址，它从终端设备（从站）读取数据地址。此地址将无变化地被传送到从站并作为数据地址。
当使用诊断功能时MBAddr为子功能代码。

cbLength : 指的是发送或接收功能的数据的大小，用字节表示。cbLength必须大于或等于由Quantity指的传送数据个数。以字操作为例： [cbLength >= Quantity * 2]. cbLength可以用SIZEOF (Modbus data)计算。

pMemoryAddr: PLC内存地址，可以用ADR (Modbus data)计算。对于读取操作，读取的数据储存在变量地址中。对于发送操作，数据从地址变量中传送到终端设备。

Execute : 启动信号。上升沿触发。

Timeout : 从站响应超时的时间。

VAR_OUTPUT

VAR_OUTPUT
       BUSY                   : BOOL;
       Error   : BOOL;
       ErrorId : MODBUS_ERRORS;
       cbRead  : UINT;
ND_VAR

Busy:表示功能块处于激活状态。当Execute 为上升沿时，Busy 变为TRUE，一旦启动功能完成，则又变为 FALSE。在任何情况下，只有一个功能被激活。

Error: 指示功能执行期间发生了错误。

ErrorId: 表示通讯受到干扰或者通讯失败时的错误号（error number）。

cbRead: 返回读操作过程中被读出数据的字节数。

硬件连接

通讯口链接所需的数据结构整合在功能块中。TwinCAT System Manager如何分配可以参考Serial Bus Terminal章节的描述。对于BC总线控制器，I/O地址要手动赋值。详见.Hardware assignment at the BC bus controller.

环境 | 服务对象 | PLC 库
TwinCAT from V2.8 | BC总线控制器 | ModbusRTU.lb6 (Version 2.2 or higher)


ModbusRtuSlave_KL6x22B

ModbusRtuSlave_KL6x22B功能块

ModbusRtuSlave_KL6x5B 功能块通过串行总线端子KL6031或KL6041完成Modbus从站通讯。这个块是被动的，从所连接的Modbus主站接收报文。

一个实例程序PC or CX1000 或BC bus controller 解释了运行原理

ModbusRtuMaster_PcCom功能块通过串行PC口（COM口）通讯。

VAR_INPUT

VAR_INPUT
       UnitID         : UINT;
       AdrInputs      : POINTER TO BYTE; (* Pointer to the Modbus input area  *)
       SizeInputBytes  : UINT;
       AdrOutputs     : POINTER TO BYTE; (* Pointer to the Modbus output area *)
       SizeOutputBytes        : UINT;
       AdrMemory      : POINTER TO BYTE; (* Pointer to the Modbus memory area *)
       SizeMemoryBytes        : UINT;
END_VAR

UnitID : Modbus站点地址（station address）(1..247)。Modbus从站只响应在接收的报文中包含其自身站点地址的报文。为了满足各种响应需求，有几种寻址方式可用作选择。地址0被作为保留地址，用于广播式报文，因此不是一个有效的站地址。

AdrInputs: Modbus输入数组（Modbus input array）的起始地址。该数据数组通常被声明为PLC数组，地址可以用 ADR (输入变量)计算。

SizeInputBytes: Modbus输入数组的大小，用字节表示。其大小可以用SIZEOF (输入变量)计算。

AdrOutputs : Modbus输出数组（Modbus output array）的起始地址。该数组通常被声明为PLC数组，地址可以用 ADR (输出变量)计算。

SizeOutputBytes: Modbus输出数组的大小，用字节表示。其大小可以用SIZEOF (输出变量)计算。

AdrMemory : Modbus内存数组（Modbus memory array）的起始地址。该数组通常被声明为PLC数组，地址可以用 ADR (内存变量)计算。

SizeMemoryBytes : Modbus内存数组的大小，用字节表示。大小可以用SIZEOF (内存变量)计算。

VAR_OUTPUT

VAR_OUTPUT
       ErrorId : Modbus_ERRORS;
END_VAR

ErrorId: 表示通讯受到干扰或者通讯失败时的错误号（error number）。

硬件连接

通讯口链接所需的数据结构整合在功能块中。TwinCAT System Manager分配的执行可以参考Serial Bus Terminal章节的描述。对于BC总线控制器，I/O地址要手动赋值。详见Hardware assignment at the BC bus controller.

环境 | 服务对象 | PLC库
TwinCAT from V2.8 | PC (i386), CX1000, | ModbusRTU.lib
TwinCAT from V2.8 | BC总线控制器 | ModbusRTU.lb6


Modbus station address

Modbus站地址

Modbus定义的有效站点地址范围为 1 到 247。Modbus从站只应答包含其自身地址的报文。地址 0 不是有效的站点地址。它是广播式报文用于发送至所有的站点。地址 248 到 255 为保留地址。

ModbusRTU库定义了更多的寻址方式。它可以使一个站点响应多个地址 。

TYPE MODBUS_UNITID :
(
       MODBUS_UNITID_BROADCAST               := 0,
       MODBUS_UNITID_ALLVALID                := 256, (* response on address 1..247 *)
       MODBUS_UNITID_ALLBUTBROADCAST  := 257, (* response on address 1..255 *)
       MODBUS_UNITID_ALL                     := 258  (* response on address 0..255 *)
);
END_TYPE


Modbus address arrays

Modbus地址数组

Modbus定义了不同数据数组的存取功能。这些数组在TwinCAT PLC程序中声明为变量。例如在双字节类型数组中，这些数据数组以输入变量传输到Modbus从站功能块。每个数组有一个不同的Modbus起始地址，因此可以很清楚地区分数组。在寻址时要注意是否有偏移量。

输入

输入数据数组通常定义为只读型的物理输入数据。他们可以是数字量输入（位）或模拟量输入（字）。PLC 程序员可以决定是否允许通讯成员直接进行物理访问。当然也能定义一个与物理输入变量无关的输入数组用于Modbus通讯：

  • 定义一个通过物理输入变量可直接访问的Modbus输入数据。数组的起始地址和长度可以自由定义。但被控制器实际的物理映像大小所限制。
·
·         VAR      Inputs  AT %IW0 : ARRAY[0..255] OF WORD;
·         END_VAR
  • 定义一个与物理输入变量无关的Modbus输入数据。
·         VAR
·          Inputs  : ARRAY[0..255] OF WORD;
·         END_VAR

用下面的Modbus功能，Modbus主站可以访问输入数组：

       2 : Read input status
       4 : Read Input Registers

寻址

输入数组起始地址是0，即地址 0 在传送的报文中作为输入数据数组的第一元素

如下：

PLC变量 | 访问类型 | Modbus报文地址 | 从站地址
Inputs[0] | Word | 16#0 | 30001
Inputs[1] | Word | 16#1 | 30002
Inputs[0], Bit 0 | Bit | 16#0 | 10001
Inputs[1], Bit 14 | Bit | 16#1E | 1001F

输出

输出数组通常定义为可进行读写访问的物理输出数据。他们可以是数字量输出（开关量）或者模拟量输出（输出寄存器）。和输入相同，数组可以通过物理输出变量直接访问或者与物理输出变量无关。

  • 定义一个通过物理输出变量可直接访问的Modbus输出数据。数组的起始地址和长度可以自由定义。但被控制器实际的物理映像大小所限制。
·         VAR
·          Outputs        AT %QW0 : ARRAY[0..255] OF WORD;
·         END_VAR
  • 定义一个与物理输出变量无关的Modbus输出数据。
·         VAR
·          Outputs        : ARRAY[0..255] OF WORD;
·         END_VAR

用下面的Modbus功能，Modbus主站可以访问输出数组：

        1 : Read Coil Status
        3 : Read Holding Registers
        5 : Force Single Coil
        6 : Preset Single Register
       15 : Force Multiple Coils
       16 : Preset Multiple Registers

寻址

输出数组起始地址是16#800，地址16#800在传送的报文中作为输出数据数组的第一元素。

如下：

PLC变量 | 访问类型 | Modbus报文地址 | 从站地址
Outputs[0] | Word | 16#800 | 40801
Outputs[1] | Word | 16#801 | 40802
Outputs[0], Bit 0 | Bit | 16#800 | 00801
Outputs[1], Bit 14 | Bit | 16#81E | 0081F

内存

内存数据数组定义为与物理I/O无关的PLC变量数组。

  • 定义一个有PLC标记地址的Modbus内存数据。数组的起始地址和大小可以自由定义。
·         VAR
·          Memory  AT %MW0 : ARRAY[0..255] OF WORD;
·         END_VAR
  • 定义一个没有PLC标记地址变量的Modbus内存数据。
·         VAR
·          Memory  : ARRAY[0..255] OF WORD;
·         END_VAR

下面的Modbus功能可以通过Mdobus主站访问内存数组：

        3 : Read Holding Registers
        6 : Preset Single Register
       16 : Preset Multiple Registers

寻址

内存数组起始地址是16#4000，地址16#4000在传送的报文中作为输出数据数组的第一个元素。

如下：

PLC 变量 | 访问类型 | Modbus报文地址 | 从站地址
Memory[0] | Word | 16#4000 | 44001
Memory[1] | Word | 16#4001 | 44002


Modbus RTU Fehlernummern

Modbus RTU Error Codes

TYPE MODBUS_ERRORS :
(
    (* Modbus communication errors *)
    MODBUSERROR_NO_ERROR, 				(* 0 *)
    MODBUSERROR_ILLEGAL_FUNCTION, 			(* 1 *)
    MODBUSERROR_ILLEGAL_DATA_ADDRESS, 			(* 2 *)
    MODBUSERROR_ILLEGAL_DATA_VALUE, 			(* 3 *)
    MODBUSERROR_SLAVE_DEVICE_FAILURE, 			(* 4 *)
    MODBUSERROR_ACKNOWLEDGE, 				(* 5 *)
    MODBUSERROR_SLAVE_DEVICE_BUSY, 			(* 6 *)
    MODBUSERROR_NEGATIVE_ACKNOWLEDGE, 			(* 7 *)
    MODBUSERROR_MEMORY_PARITY, 				(* 8 *)
    MODBUSERROR_GATEWAY_PATH_UNAVAILABLE, 		(* A *)
    MODBUSERROR_GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND, 	(* B *)

    (* additional Modbus error definitions *)
    MODBUSERROR_CHARREC_TIMEOUT := 16#20, 		(* 20 hex *)
    MODBUSERROR_ILLEGAL_DATA_SIZE, 			(* 21 hex *)
    MODBUSERROR_ILLEGAL_DEVICE_ADDRESS, 			(* 22 hex *)
    MODBUSERROR_ILLEGAL_DESTINATION_ADDRESS,		(* 23 hex *)
    MODBUSERROR_ILLEGAL_DESTINATION_SIZE, 		(* 24 hex *)
    MODBUSERROR_NO_RESPONSE, 				(* 25 hex *)

    (* Low level communication errors *)
    MODBUSERROR_TXBUFFOVERRUN := 102,			(* 102 *)
    MODBUSERROR_SENDTIMEOUT := 103,			(* 103 *)
    MODBUSERROR_DATASIZEOVERRUN := 107,			(* 107 *)
    MODBUSERROR_STRINGOVERRUN := 110,			(* 110 *)
    MODBUSERROR_INVALIDPOINTER := 120, 			(* 120 *)
    MODBUSERROR_CRC := 150,				(* 150 *)

    (* High level PLC errors *)
    MODBUSERROR_INVALIDMEMORYADDRESS := 232,		(* 232 *)
    MODBUSERROR_TRANSMITBUFFERTOOSMALL			(* 233 *)
);
END_TYPE


Hardware assignment at the BC bus controller

BC总线控制器硬件配置

对于一个PC控制器或一个CX1000控制器，串口和Modbus RTU功能块的连接在TwinCAT System Manager即可实现。然而，对于BC总线控制器，需要在PLC编程环境中进行手动分配。

一旦在PLC程序中建立了一个Modbus RTU功能块，串行总线端子模块的硬件地址就在 variable configuration 中被规定下来。可以在 Resources 下的 Variable_Configuration(VAR_CONFIG)块中选择菜单 Insert - All Instance Paths。

当选择完毕，在功能块中本地I/O地址就被列出。

最初，变量没有地址。需要根据总线控制器下的总线端子模块手动配置。如果该模块是总线控制器后第一个非数字量模块，那么它的地址就是0。如下：

VAR_CONFIG     MAIN.Terminal.com.Port.IO.out AT %QB0 : ModbusKL6outData5B;
       MAIN.Terminal.com.Port.IO.in AT %IB0 : ModbusKL6inData5B;
END_VAR


Terminal Configuration

端子模块组态

KL6001, KL6011, KL6021, KL6031和KL6041总线端子模块可以用KS2000软件进行参数设置。另一方面，系统可以通过包含串口通讯库ComLib.lib中的PLC模块重新组态。如果串口通信库没有可以与 Modbus RTU 库连接的功能块，那么可以通过Modbus RTU 基本库 KL6Config.lib 中提供的功能块连接。该库包括如下几个模块：

  • KL6configuration
  • KL6ReadRegisters
  • KL6WriteRegisters
  • ComReset
运行环境 | 服务对象 | PLC库
TwinCAT from V2.8 | PC (i386), CX1000 | ComLibV2.lib 或KL6config.lib
TwinCAT from V2.8 | BC总线控制器 | ComLibV2.lb6 或KL6config.lb6