概述

TwinCAT FTP Client 是一项补充，并且为TwinCAT System 和 FTP服务器间的通信提供了一种简单的方法。

TwinCAT FTP Client 提供了一下功能：

连接建立：

- 通过认证

传输功能：

- 上传文件

- 下载文件

文件功能：

- 重命名文件

- 移动文件

- 搜索文件

- 创建文件夹

- 移动文件夹

在功能块的帮助下，所有功能都可以在没有PLC的情况下使用。 您可以创建到不同FTP服务器的连接，他们可以相互区分并使用句柄。 由于有句柄，因此您不必为每个功能再添加认证 值。


文档说明

本手册仅供那些受过适当培训，熟悉各种适用国家标准的“控制、自动化和驱动工程”领域专业人员使用。
在安装和调试这些组件时，操作人员必须严格遵循下列说明和解释。

相关负责人员必须确保所述产品的应用或使用满足所有安全要求，包括相关法律、法规、准则和标准。

责任条款

尽管本文档经过精心编制， 但由于其中所描述的产品仍处于不断更新换代中，
我们可能不会在每次更新后都检查文档中所描述的产品性能数据、标准或其它特性总是与实际产品相一致。
本文档中难免会出现一些技术或者编辑错误，我们保留随时对文档信息作出修改之权力，恕不另行通知。
对于已经变更的产品，如果本文档中的数据、图表以及文字描述没有修改，我们将不再特别加以声明。

商标

Beckhoff®, TwinCAT®, EtherCAT®, Safety over EtherCAT®, TwinSAFE® and XFC® 已为Beckhoff 自动化有限公司的注册商标
本手册中所使用的其它名称可能是商标名称，任何第三方为其自身目的而引用，都可能触犯商标所有者的权利。

申请中的专利

TwinCAT 技术受下列专利申请书和专利权（包括但不限于）的保护：
在许多其他国家有关EP0851348, US6167425的相关申请和注册。

版权声明

© 德国倍福自动化有限公司.
未经德国倍福自动化有限公司书面许可，任何人不得部分或整个复制或者允许第三方使用本手册。
若发生违反行为 , 须履行损失赔偿义务。 德国倍福自动化有限公司保留所有发明、实用新型和外观设计专利权。


要求

TwinCAT FTP Client 的实现需要 .NET2.0 Framework 或者 CE的 Compact Framework

产品需要这些组件：

  • 最低的 TwinCAT PLC
  • Microsoft .NET Framework 2.0 (或更高版本) 或 Microsoft .NET Compact Framework 2.0 (或更高版本)
    几乎所有 Beckhoff CE 设备 默认包含 .NET Compact Framework

例子：

  • Beckhoff CX9001 包含 .NET CF 2.0
  • Beckhoff CX9000 不包含 .NET - 因此 TwinCAT FTP-Client 将不能在此平台上运行。


安装方式

TwinCAT FTP 客户端

在 Windows CE 上安装

安装分为两个步骤：

步骤1：
在主机PC上安装supplement软件。 输入授权码并接受授权协议后，适用于Windows CE的supplement软件将被安装到您电脑下的 ..\TwinCAT\CE子文件夹下。

以 TwinCAT FTP Client CE 为例： 在主机PC上安装软件后将生成一个文件夹 "..\TwinCAT\CE\TwinCAT FTP Client CE" ，其中包含了 CE *.cab安装文件（例如TcFtpClientCe.I586.CAB）。
步骤2：
将CE-cab安装文件传输到CE设备上（可通过U盘/FTP/共享文件夹/CF读卡器等）。 在CE设备上双击cab文件，然后不要改变安装路径，点击OK。 当安装完成后cab文件将自动删除。

安装完成后，需要重启CE设备来激活驱动，在开始菜单中选择reset/suspend。

重要事项！！！

如果TcFTPClient在重启后没有自动启动，并且出现ADS-Error 6的错误，请检查 "StartUp.exe"的版本。 TcFTPClient 自启动需要1.35或更高的版本。

在主机PC上的安装内容：
  • "..TwinCAT\CE\TwinCAT FTP Client CE"文件夹中的CE *.cab安装文件
  • "..TwinCAT\TcFTPClient"文件夹中的XP TwinCAT FTP Client系统文件
  • "..TwinCAT\plc\Lib"文件夹中的TcFTPClient.lib

CE设备中的安装内容：
  • \Hard Disk\System"
    • TcFTPClientCe.exe
    • TcAmsServerCe.dll
    • TwinCAT.Ads.dll
    • TwinCAT.Ads.Server.dll


连接模式

为了发送及接受文件或传输目录列表（默认端口为端口20），每个进程将用到一个独立的TCP连接。 FTP有两种模式连接到这类连接： "active FTP" 和 "passive FTP".

TwinCAT FTP Client 版本 1.0.8 可以使用这两种模式。 之前的版本只支持"passive FTP" 连接模式。.

active FTP

active FTP（“主动模式”）下，客户端开启一个随机端口并且发送一个PORT指令到包含端口和IP地址的FTP服务器。 这是一个典型的大于1023的客户端端口。 在服务器端传输的数据使用端口20。 通过指令通信使用独有的控制端口。 我们将这种控制称为 "Out of Band"。 因此，它可以保持和成员的通信并同时传输数据。

passive FTP

passive FTP(“被动模式”)下，客户端发送一条PASV指令，服务器端打开一个端口并且将这个端口和IP地址一起传送给客户端。 因此客户端使用一个高于1023的端口，而服务器使用它之前传送的端口。 如果服务器连接不到客户端，这些技术将被使用。 这种情况可以是，如果客户端置于一个通过NAT限制地址的路由器之后，或者防火墙拒绝连接到客户端的网络中。


TcFTPClient.Lib

概述

库文件 TcFTPClient.lib 包含了用于控制和配置TwinCAT FTP客户端的功能块。

功能块

名称 | 描述
FB_GetStateTcFTPClient | 调用状态信息。
FB_FTP_HostResolve | 将所给的主机名称分配到一个 IPv4 地址。
FB_FTP_Open | 打开一个到FTP服务器的连接。 （被动）
FB_FTP_OpenEx | 打开一个到FTP服务器的连接。 （被动/主动）
FB_FTP_Close | 关闭一个到FTP服务器的连接。
FB_FTP_CloseAll | 关闭所有到FTP服务器的连接。
FB_FTP_Info | 从所有打开的连接获取信息。
FB_FTP_FileUpload | 复制一个文件到FTP服务器。 使用一个现有的连接。
FB_FTP_FileUploadEx | 复制一个文件到FTP服务器。
FB_FTP_FileDownload | 从一个FTP服务器复制一个文件到一个ADS装置。 使用一个现有的连接。
FB_FTP_FileDownloadEx | 从一个FTP服务器复制一个文件到一个ADS装置。
FB_FTP_DirCreate | 在FTP服务器上创建一个目录
FB_FTP_DirRemove | 在FTP服务器上移动一个目录
FB_FTP_FileList | 选择符合搜索条件的所有文件和文件夹。
FB_FTP_FileListEx | 选择符合搜索条件的所有文件和文件夹及附加信息。
FB_FTP_FileExist | 找到FTP服务器上要搜索的文件。
FB_FTP_FileRemove | 移动FTP服务器上的一个文件。
FB_FTP_FileRename | 重命名一个FTP服务器上的文件。

功能

名称 | 描述
F_GetVersionTcFTPClient | 调用版本信息

数据类型

名称 | 描述
T_HFTP | FTP服务器的句柄。
ST_FTP_ConnInfo | 现有FTP连接的信息。
ST_FTP_FileDetails | FTP "LIST" 指令返回的文件信息。
E_FTP_ConnMode | FTP连接模式（被动/主动）


FUNCTION_BLOCK FB_FTP_HostResolve

使用 FB_FTP_HostResolve 功能块可以将主机名解析到特定的IPv4地址。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
sHostName : T_MaxString :='';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

sHostname : 这条字符串包含了将被解析的主机名。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
sIPv4Addr : T_IPv4Addr;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

sIPv4Addr : 返回给定主机名的 IPv4 地址。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib
TwinCAT v2.10.0 | CX (ARM)


FUNCTION_BLOCK FB_FTP_Open

您可以使用功能块 FB_FTP_Open 来打开一个到FTP服务器的连接。 您可以在FTP服务器上使用返回句柄以进行跟多操作。 将使用"passive FTP"的连接模式。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
sHost : T_IPv4Addr := '127.0.0.1';
nPort : UDINT := 21;
sUsername : STRING := '';
sPassword : STRING := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

sHost : 这条字符串包含了FTP服务器的IPv4地址。

nPort : FTP端口（默认21）.

sUsername : 用于FTP服务器认证的用户名

sPassword : 用于FTP服务器认证的密码

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
hFTP : T_HFTP;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

hFTP : FTP服务器连接的句柄。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_OpenEX

您可以使用功能块 FB_FTP_OpenEx 来打开一个到FTP服务器的连接。 您可以在FTP服务器上使用返回句柄以进行跟多操作。 您可以在主动FTP和被动FTP两种连接方式之间选择。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
sHost : T_IPv4Addr := '127.0.0.1';
nPort : UDINT := 21;
eMode : E_FTP_ConnMode	:= eConnMode_PASSIVE;
sUsername : STRING := '';
sPassword : STRING := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

sHost : 这条字符串包含了FTP服务器的IPv4地址。

nPort : FTP端口（默认21）.

eMode : FTP connection mode (active / passive).

sUsername : 用于FTP服务器认证的用户名

sPassword : 用于FTP服务器认证的密码

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
hFTP : T_HFTP;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

hFTP : FTP服务器连接的句柄。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib (从 TcFTPClient 版本 1.0.8)


FUNCTION_BLOCK FB_FTP_Close

您可以使用功能块 FB_FTP_Close 来打开一个到FTP服务器的连接

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_CloseAll

您可以使用功能块 FB_FTP_CloseAll 来关闭所有现有的与FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_Info

您可以使用功能块FB_FTP_Info 来获取当前存在的到FTP服务器的连接的信息。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
pList : POINTER TO ST_FTP_ConnInfo;
cbList : UDINT := 0;
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

pList : 到类型ST_FTP_ConnInfo中一个变量的指针地址。 这个变量也可以是一个ST_FTPConnInfo类型的数组。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
nEntries : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

nEntries : 现有的连接的个数。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileUpload

您可以使用功能块 FB_FTP_FileUpload 来打开一个到FTP服务器的连接 该功能块使用一个现有的到FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
sSrcFile : T_MaxString := '';
sDesFile : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄

sSrcFile : 将要从FTP服务器拷贝的源文件。

sDesFile : 在ADS设备上的目标文件的路径和地址。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
nProgress : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

nProgress : 按百分比显示数据传输的当前状态。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileUploadEx

您可以使用功能块FB_FTP_FileUpload来打开一个到FTP服务器的连接 将使用"passive FTP"的连接模式。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
sHost : T_IPv4Addr := '127.0.0.1';
nPort : UDINT := 21;
sUsername : STRING := '';
sPassword : STRING := '';
sSrcFile : T_MaxString := '';
sDesFile : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

sHost : 这条字符串包含了FTP服务器的IPv4地址。

nPort : FTP端口（默认21）.

sUsername : 用于FTP服务器认证的用户名

sPassword : 用于FTP服务器认证的密码

sSrcFile : 将要从FTP服务器拷贝的源文件。

sDesFile : 在FTP服务器上的目标文件的路径和地址。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
nProgress : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

nProgress : 按百分比显示数据传输的当前状态。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileDownload

您可以用 FB_FTP_FileDownload 这个功能块从FTP服务器上下载文件。 该功能块使用一个现有的到FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
sSrcFile : T_MaxString := '';
sDesFile : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄

sSrcFile : 将要从FTP服务器拷贝的源文件。

sDesFile : 在ADS设备上的目标文件的路径和地址。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
nProgress : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

nProgress : 按百分比显示数据传输的当前状态。 在CE FTP 服务器上，从0% 到 100% 没有值将被返回。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileDownloadEx

您可以用FB_FTP_FileDownload这个功能块从FTP服务器上下载文件。 将使用"passive FTP"的连接模式。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
sHost : T_IPv4Addr := '127.0.0.1';
nPort : UDINT := 21;
sUsername : STRING := '';
sPassword : STRING := '';
sSrcFile : T_MaxString := '';
sDesFile : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

sHost : 这条字符串包含了FTP服务器的IPv4地址。

nPort : FTP端口（默认21）.

sUsername : 用于FTP服务器认证的用户名

sPassword : 用于FTP服务器认证的密码

sSrcFile : 将从FTP服务器上拷贝的源文件。

sDesFile : ADS设备上目标文件的路径和名称。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
nProgress : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

nProgress : 按百分比显示数据传输的当前状态。 在CE FTP 服务器上，从0% 到 100% 没有值将被返回。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_DirCreate

您可以使用该功能块 FB_FTP_DirCreate 在FTP服务器上创建一个文件夹。 该功能块使用一个现有的到FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP		:= 0;
sDirName : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄。

sDirectory : 新目录的名称。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_DirRemove

您可以用 FB_FTP_DirRemove 这个功能块从FTP服务器上移除一个现有的文件夹。 这个功能块使用一个现有的到FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
sDirectory : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄。

sDirectory : 将被移除的目录的名称。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileList

您可以使用功能块 FB_FTP_FileList 来读取一份文件及文件夹名称的列表。 该功能块使用一个现有的到FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
sMask : T_MaxString := '';
nIndex : UDINT;
pList : POINTER TO ARRAY [0..MAX_FILELIST_ITEMS] OF STRING(80);
cbList : UDINT; bExecute : BOOL;
tTimeout : TIME := T#20s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄

sMask : 通过搜索屏蔽来筛选文件。

例子
*.* | 读取所有文件名
* | 读取所有文件名及文件夹名
*.txt | 读取扩展名为"TXT"的所有文件名。
\Test\*.* | 读取Test子文件夹下的所有文件名。

nIndex : 第一个读取的文件名的索引。

pList : 保存文件名的字符串数组的指针。

cbList : 字符串数组的字节数。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
nItems : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

nItems : 显示所有找到的文件或文件夹的数量。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileListEx

您可以使用功能块 FB_FTP_FileListEx 从FTP服务器上读取一份 文件及文件夹名称的列表。 该功能块使用一个现有的到FTP服务器的连接。 这个功能块返回比 FB_FTP_FileList 更多的文件的细节信息。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
sMask : T_MaxString := '';
bRawValues : BOOL;
nIndex : UDINT;
pList : UDINT;
cbList : UDINT;
bExecute : BOOL;
tTimeout : TIME := T#20s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄

sMask : 通过搜索屏蔽来筛选文件。

例子
*.* | 读取所有文件名
* | 读取所有文件名及文件夹名
*.txt | 读取扩展名为"TXT"的所有文件名。
\Test\*.* | 读取Test子文件夹下的所有文件名。

bRawValues : 返回的文件列表的格式。

bRawValues := TRUE information will be returned as an T_MaxString array.

bRawValues := FALSE informationen will be returned as an ST_FTP_FileDetails array. (未支持所有类型的FTP服务器)

nIndex : 第一个读取的文件名的索引。

pList : 保存文件名的字符串数组的指针。

cbList : 字符串数组的字节数。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
nItems : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

nItems : 显示所有找到的文件或文件夹的数量。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileExist

您可以通过功能块 FB_FTP_FileExist 检查一个指定文件是否存在于FTP服务器上。 该功能块使用一个现有的到FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
sFile : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄

sFile : 查找到的文件的带有路径的文件名。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
bExist : BOOL;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

bExist : 如果搜索的文件存在，变为TRUE。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileRemove

您可以用 FB_FTP_FileRemove 这个功能块从FTP服务器上移除一个现有的文件夹。 该功能块使用一个现有的到FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
sFile : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄

sFile : 将被移除的目录的名称。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_FTP_FileRename

您可以用 FB_FTP_FileRename 这个功能块从FTP服务器上移除一个现有的文件夹。 该功能块使用一个现有的到FTP服务器的连接。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId := '';
hFTP : T_HFTP;
sOLDFilename : T_MaxString := '';
sNEWFilename : T_MaxString := '';
bExecute : BOOL;
tTimeout : TIME := T#15s;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

hFTP : FTP服务器的句柄

sOLDFilename : 旧文件名。

sNEWFilename : 新文件名。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION_BLOCK FB_GetStateTcFTPClient

该功能块允许获取FTP客户端的当前状态。

VAR_INPUT

VAR_INPUT
sNetID : T_AmsNetId;
bExecute : BOOL;
tTimeout : time;
END_VAR

sNetID : 这条字符串包含了ADS命令指向的目标设备的AMS NET ID。

bExecute : 这条命令由上升沿触发。

tTimeout : 在功能结束之前声明时间。

VAR_OUTPUT

VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
nAdsState : UINT;
nDevState : UINT;
END_VAR

bBusy : 指令正处于通过ADS进行传送的过程中。 只要 "bBusy" 保持为TRUE，就不会接受任何新指令。

bError : 当有错误发生时，立刻变为TRUE。

nErrID : 当 bError 输出置为TRUE时，提供ErrorCode

nAdsState : 包含了ADS目标控制器的状态识别码。 这里的代码指定所有的ADS服务器：
  • ADSSTATE_INVALID =0 ;
  • ADSSTATE_IDLE =1 ;
  • ADSSTATE_RESET =2 ;
  • ADSSTATE_INIT =3 ;
  • ADSSTATE_START =4 ;
  • ADSSTATE_RUN =5 ;
  • ADSSTATE_STOP =6 ;
  • ADSSTATE_SAVECFG =7 ;
  • ADSSTATE_LOADCFG =8 ;
  • ADSSTATE_POWERFAILURE =9 ;
  • ADSSTATE_POWERGOOD =10 ;
  • ADSSTATE_ERROR =11;

nDevState : 包含ADS目标设备的特殊状态识别码。 这里的代码指定ADS设备的补充信息。

  • 1 = TwinCAT FTP 客户端已启动

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


FUNCTION F_GetVersionTcFTPClient

这个功能块可以被用来读取PLC库的版本信息。

FUNCTION F_GetVersionTcFTPClient: UINT

VAR_INPUT
nVersionElement : INT;
END_VAR

nVersionElement : 读取的版本元素。 可能的参数：

  • 1 : 主版本号；
  • 2 : 子版本号；
  • 3 : 修正版本号；
开发环境 | 目标系统 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


TYPE T_HFTP

VAR_INPUT

TYPE
T_HFTP : STRUCT
hClient :UDINT;
END_STRUCT
END_TYPE

hClient : FTP连接的句柄。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


TYPE ST_FTP_ConnInfo

VAR_INPUT

TYPE
ST_FTP_ConnInfo : STRUCT
sHost : T_IPv4Addr;
nPort : UDINT;
hFTP : T_HFTP;
sUsername : STRING;
END_STRUCT
END_TYPE

sHost : FTP服务器的IPv4地址。

nPort : FTP端口。

hFTP : FTP连接的句柄。

sUsername : 连接使用者的用户名。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


TYPE ST_FTP_FileDetails

VAR_INPUT

TYPE
ST_FTP_FileDetails : STRUCT
bDir : BOOL;
sPermission : STRING(10);
nSize : UDINT;
nFilecode : UDINT;
tTimestamp : DT;
sOwner : STRING(79);
sGroup : STRING(79);
sFilename : STRING(79);
END_STRUCT
END_TYPE

bDir : 显示它为文件还是文件夹。 （并不被所有FTP服务器支持）

sPermission : 显示文件/文件夹的权限。 （并不被所有FTP服务器支持）

nSize : 提供文件的大小。

nFilecode : 提供文件代码。 （并不被所有FTP服务器支持）

tTimstamp : 返回文件/文件夹得时间戳。

sOwner : 返回文件/文件夹的拥有者。 （并不被所有FTP服务器支持）

sGroup : 显示文件/文件夹的权限。 （并不被所有FTP服务器支持）

sFilename : 显示文件/文件夹的权限。

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


TYPE E_FTP_ConnMode

TYPE
E_FTP_ConnMode :( eConnMode_PASSIVE := 0, eConnMode_ACTIVE := 1 );
END_TYPE

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib (从 TcFTPClient 版本 1.0.8)


常量

TwinCAT FTP Client - TwinCAT PLC Library - Constants

全局变量

VAR_GLOBAL CONSTANT
AMSPORT_FTPADSSRV : UINT := 10900;
FTPADS_IGR_CONNOPEN : UDINT := 16#100;
FTPADS_IGR_RESOLVEDNS : UDINT := 16#101;
FTPADS_IGR_CONNCLOSE : UDINT := 16#200;
FTPADS_IGR_CONNCLOSEALL : UDINT := 16#201;
FTPADS_IGR_CONNINFO : UDINT := 16#300;
FTPADS_IGR_FILEUPLOAD : UDINT := 16#10000;
FTPADS_IGR_FILEDOWNLOAD : UDINT := 16#20000;
FTPADS_IGR_DIRREMOVE : UDINT := 16#30000;
FTPADS_IGR_DIRCREATE : UDINT := 16#30001;
FTPADS_IGR_FILEEXIST : UDINT := 16#40000;
FTPADS_IGR_FILERENAME : UDINT := 16#40001;
FTPADS_IGR_FILEREMOVE : UDINT := 16#40002;
FTPADS_IGR_FILELIST : UDINT := 16#40003;
FTPADS_IGR_FILELISTEX : UDINT := 16#40004;
MAX_FTP_CONNECTIONS : UDINT := 25;
MAX_FILELIST_ITEMS : UDINT := 255;
DEFAULT_FTP_PORT : UDINT := 21;
END_VAR

开发环境 | 目标系统类型 | 需要连接的PLC库
TwinCAT v2.10.0 | PC oder CX (x86) | TcFTPClient.Lib


错误日志文件

TwinCAT FTP Client - Reference

创建一个错误日志文件

为了将发生的错误集中起来并且对错误更好地描述，TwinCAT FTP Client 能够将这些错误拟定到一份文本文件中。

该文本文件叫做 "TcFTPErrorLog.txt" ，位于TwinCAT FTP Client 的"EXE"文件所在的文件夹内。（通常是"\Hard Disk\System"）。
你可以通过以下注册键值来激活该功能：

"HKEY_LOCAL_MACHINE\\Software\\Beckhoff\\TwinCAT FTP Client\\Configuration\ErrorLog"

通过值1开始功能。
通过值0结束功能。
所有改动在TwinCAT System 重启后生效。

注意 		对存储媒介的伤害
过多的写入周期会缩短CF卡的使用寿命。

注意 		对存储媒介的伤害
只在测试时使用错误日志文件的功能！


端口范围（Active FTP）

如果您使用 Active-FTP 模式来连接到FTP服务器，客户端必须选择用于建立连接的端口。 因此可以清空端口范围。 TwinCAT FTP 客户端将选择一个范围之外的空闲的端口来创建一个到FTP服务器的连接。

端口范围将以下面三个注册键配置。

"HKEY_LOCAL_MACHINE\\Software\\Beckhoff\\TwinCAT FTP Client\\Configuration\ErrorLog"[nbsp"
"HKEY_LOCAL_MACHINE\\Software\\Beckhoff\\TwinCAT FTP Client\\Configuration\ErrorLog"[nbsp"
"HKEY_LOCAL_MACHINE\\Software\\Beckhoff\\TwinCAT FTP Client\\Configuration\ErrorLog"

为了激活端口范围你必须设置注册键"ACTIVE_PortRangeEnabled" 到1。 TwinCAT FTP 客户端将使用任何空闲的端口来建立连接。

通过注册键"ACTIVE_MaxPort" 和 "ACTIVE_MinPort"可以清除范围的下限和上限。


返回码概述

TwinCAT FTP Client - Reference

TwinCAT FTP 客户端 错误代码概述

Offset + Error Code | 范围 | 描述
0x00000000 + TwinCAT System Errors | 0x00000000-0x00007800 | TwinCAT 系统错误（包含ADS错误代码）
0x00008000 + Internal TwinCAT FTP Client Errors | 0x00008000-0x000081C4 | TwinCAT FTP客户端内部错误


ADS Return Codes

TwinCAT Diagnostics: ADS返回码

ADS返回码

错误代码： 0x000..., 0x500..., 0x700..., 0x1000..., 0x274C...

全局错误代码

Hex | Dec | 描述
0x0 | 0 | 无错误
0x1 | 1 | 内部错误
0x2 | 2 | 没有 Rtime
0x3 | 3 | 分配锁定内存错误
0x4 | 4 | 插入邮箱错误
0x5 | 5 | 错误接收HMSG
0x6 | 6 | 目标端口未找到
0x7 | 7 | 目标设备未找到
0x8 | 8 | 未知命令ID
0x9 | 9 | 错误任务ID
0xA | 10 | 没有IO
0xB | 11 | 未知AMS命令
0xC | 12 | Win 32 错误
0xD | 13 | 端口未连接
0xE | 14 | 无效AMS长度
0xF | 15 | 无效AMS Net ID
0x10 | 16 | 低安装级别
0x11 | 17 | 无可用调试
0x12 | 18 | 端口不能使用
0x13 | 19 | 端口已链接
0x14 | 20 | AMS 同步 Win32 错误
0x15 | 21 | AMS同步超时
0x16 | 22 | AMS同步AMS错误
0x17 | 23 | AMS同步没有索引地图
0x18 | 24 | 无效AMS端口
0x19 | 25 | 无内存
0x1A | 26 | TCP 发送错误
0x1B | 27 | 主机不可达到

路由错误代码

Hex | Dec | 描述
0x500 | 1280 | ROUTERERR_NOLOCKEDMEMORY 无错定内存可以被分配
0x501 | 1281 | ROUTERERR_RESIZEMEMORY 路由内存的大小不能被分配。
0x502 | 1282 | ROUTERERR_MAILBOXFULL Ams端口的邮箱达到的允许入口的最大数量。 当前发送的信息被废除。
0x503 | 1283 | ROUTERERR_DEBUGBOXFULL Ams调试端口 的邮箱达到了允许入口的最大数量。 发送的信息不会显示在调试监视器中。
0x504 | 1284 | ROUTERERR_UNKNOWNPORTTYPE
0x505 | 1285 | ROUTERERR_NOTINITIALIZED 路由没有被初始化
0x506 | 1286 | ROUTERERR_PORTALREADYINUSE 所需求的端口号已经被分配。
0x507 | 1287 | ROUTERERR_NOTREGISTERED Ams端口未被注册
0x508 | 1288 | ROUTERERR_NOMOREQUEUES 已达到最大Ams端口数。
0x509 | 1289 | ROUTERERR_INVALIDPORT
0x50A | 1290 | ROUTERERR_NOTACTIVATED TwinCAT 路由未激活。

一般ADS错误代码

Hex | Dec | 描述
0x700 | 1792 | 错误类型<设备错误>
0x701 | 1793 | 服务不被服务器支持
0x702 | 1794 | 无效索引组
0x703 | 1795 | 无效索引偏移量
0x704 | 1796 | 读/写不被允许
0x705 | 1797 | 参数尺寸不正确
0x706 | 1798 | 无效参数值
0x707 | 1799 | 设备不在准备状态
0x708 | 1800 | 设备在忙
0x709 | 1801 | 无效环境（必须在Windows中）
0x70A | 1802 | 内存不足
0x70B | 1803 | 无效参数值
0x70C | 1804 | 未找到（文件，...）
0x70D | 1805 | 指令或文件中有语法错误
0x70E | 1806 | 对象不匹配
0x70F | 1807 | 对象已存在
0x710 | 1808 | 标签未找到
0x711 | 1809 | 标签版本无效
0x712 | 1810 | 服务器在无效状态
0x713 | 1811 | Ads传输模式不支持
0x714 | 1812 | 通知句柄无效
0x715 | 1813 | 通知客户端未注册
0x716 | 1814 | 没有更多的通知句柄
0x717 | 1815 | 监视的尺寸太大
0x718 | 1816 | 设备未初始化
0x719 | 1817 | 设备超时
0x71A | 1818 | 询问接口失败
0x71B | 1819 | 需求的接口错误0
0x71C | 1820 | class ID 无效
0x71D | 1821 | 对象ID无效
0x71E | 1822 | 请求待定
0x71F | 1823 | 请求中途取消
0x720 | 1824 | 信号警告
0x721 | 1825 | 无效的数组指针
0x722 | 1826 | 标签未激活->释放句柄并重试
0x723 | 1827 | 使用被拒绝
0x740 | 1856 | 错误类型<客户端错误>
0x741 | 1857 | 服务中的参数无效
0x742 | 1858 | 轮询列表为空
0x743 | 1859 | 连接已在使用中
0x744 | 1860 | 调用ID在使用中
0x745 | 1861 | 超时消逝
0x746 | 1862 | win32子系统发生错误
0x747 | 1863 | 无效的客户端超时值
0x748 | 1864 | ADS端口未打开
0x750 | 1872 | ADS同步中的内部错误
0x751 | 1873 | 散列表溢出
0x752 | 1874 | 在散列表中未找到键
0x753 | 1875 | 缓存中没有更多标签
0x754 | 1876 | 收到无效响应
0x755 | 1877 | 同步端口被锁定

RTime错误代码

Hex | Dec | 描述
0x1000 | 4096 | RTERR_INTERNAL 在 TwinCAT real-time system有内部致命错误
0x1001 | 4097 | RTERR_BADTIMERPERIODS 定时器值无效
0x1002 | 4098 | RTERR_INVALIDTASKPTR 任务指针有无效值ZERO。
0x1003 | 4099 | RTERR_INVALIDSTACKPTR 任务堆栈指针有无效值ZERO。
0x1004 | 4100 | RTERR_PRIOEXISTS 需求的 任务优先级已被分配。
0x1005 | 4101 | RTERR_NOMORETCB 没有更多可用的TCB(Task Control Block)。 TCB的最大个数为64.
0x1006 | 4102 | RTERR_NOMORESEMAS 没有更多可用的信号。 最大的信号个数为64.
0x1007 | 4103 | RTERR_NOMOREQUEUES 没有更多的可用队列。 最大的队列个数为64.
0x1008 | 4104 | TwinCAT 保留
0x1009 | 4105 | TwinCAT 保留
0x100A | 4106 | TwinCAT 保留
0x100B | 4107 | TwinCAT 保留
0x100C | 4108 | TwinCAT 保留
0x100D | 4109 | RTERR_EXTIRQALREADYDEF 一个外部同步中断已经被应用。
0x100E | 4110 | RTERR_EXTIRQNOTDEF 没有外部同步中断被应用。
0x100F | 4111 | RTERR_EXTIRQINSTALLFAILED 外部同步中断的应用失败。
0x1010 | 4112 | RTERR_IRQLNOTLESSOREQUAL 在错误的环境中调用一个服务功能。

Winsock错误代码

Hex | Dec | 描述
0x274c | 10060 | 套接字操作尝试了一个无法连接的主机
0x274d | 10061 | 连接尝试失败，因为连接的对象在一定周期后没有适当回应， 或者建立连接失败，因为连接的主机无法回应。
0x2751 | 10065 | 无法连接，因为目标机器拒绝
 |  | 更多Winsock 错误代码： Win32 Error Codes


FTP Client Return Codes

TwinCAT FTP 客户端 : FTP 返回码

FTP 客户端返回码

Hex | Dez | 描述
0x00008001 | 32768 + 1 := 32769 | TwinCAT FTP 客户端内部错误
0x00008002 | 32768 + 2 := 32770 | 文件错误（例如， 文件未找到，拒绝访问）
0x00008003 | 32768 + 3 := 32771 | 传输错误（例如， 连接断开）
0x00008004 | 32768 + 4 := 32772 | 连接时错误。 无法创建到FTP服务器的连接。
0x00008005 | 32768 + 5 := 32773 | 连接错误。 从FTP服务器上接收不到回应。
0x000081F4 | 32768 + 500 = 33268 | 语法错误，指令未识别。 这可能也包含了如指令太长等错误。
0x000081F5 | 32768 + 501 = 33269 | 参数中的语法错误。
0x000081F6 | 32768 + 502 = 33270 | 指令未执行。
0x000081F7 | 32768 + 503 = 33271 | 指令顺序不正确。
0x000081F8 | 32768 + 504 = 33272 | 指令不能以该参数执行。
0x00008212 | 32768 + 530 = 33298 | 未登录。
0x00008214 | 32768 + 532 = 33300 | 需要考虑存储文件。
0x00008226 | 32768 + 550 = 33318 | 需要的动作未执行。 文件不可得（例如， 文件未找到，无法访问）。
0x00008227 | 32768 + 551 = 33319 | 需要的动作未执行完成。 未知页面类型。
0x00008228 | 32768 + 552 = 33320 | 需要的文件操作未执行完成。 溢出的存储分配（当前目录或数据集）。
0x00008229 | 32768 + 553 = 33321 | 需要的动作未执行。 文件名不允许。
0x000081A5 | 32768 + 421 = 33189 | 服务器不可用，关闭控制连接。 如果设备准备关机，将如此回应所有指令。
0x000081A9 | 32768 + 425 = 33193 | 不能打开数据连接。
0x000081AA | 32768 + 426 = 33194 | 连接关闭； 传输未完成。
0x000081C2 | 32768 + 450 = 33218 | 需要的动作未执行。
0x000081C3 | 32768 + 451 = 33219 | 需要的动作未执行完成。 处理中的本地错误。
0x000081C4 | 32768 + 452 = 33220 | 需要的动作未执行。 系统存储空间不足。文件不可得（例如， 文件在使用中）。


例子

TwinCAT FTP 客户端-例程

TwinCAT FTP 客户端: 上传一个文件到FTP服务器

这个样例介绍了如何从ADS设备上传一个文件到FTP服务器。

若要执行此范例，您必须在FTP服务器上创建一个用户名为“TestUser”的用户和一个为“TestPwd123”的密码。
如果您使用变量“startstop”对变量“bExecute”设置一个上升沿，那么文件名为“\Program Files\TestFile.txt”的文件将从ADS设备被复制到FTP服务器。 在FTP服务器上文件名将被设为“\TestFolder\File1.txt”。 如果“testfolder”文件夹不存在，将会被新建

注意用户“TestUser”有权读和写。

变量声明

PROGRAM MAIN
VAR
FB_FTPFileUpload1 : FB_FTP_FileUploadEx;
startstop : BOOL;
busy : BOOL;
err : BOOL;
errid : UDINT;
progress : UDINT;
END_VAR

PLC 程序

FB_FTPFileUpload1
( sNetID:= ,
sHost:= '172.16.235.100',
nPort:= DEFAULT_FTP_PORT,
sUsername:= 'TestUser',
sPassword:= 'TestPwd123',
sSrcFile:= '\Program Files\TestFile1.txt',
sDesFile:= '\TestFolder\File1.txt',
bExecute:= startstop,
tTimeout:= T#15s,
bBusy=> busy,
bError=> err,
nErrId=> errid,
nProgress=> progress);
"TcFTPClient.lib", "TcSystem.lib", "TcBase.lib" 和 "STANDARD.lib" 等库需要被连接。


例子

TwinCAT FTP 客户端-例程

TwinCAT FTP 客户端: 从一个FTP服务器下载一个文件到一个ADS装置

这个例子解释了从FTP服务器下载文件。

若要执行此范例，您必须在FTP服务器上创建一个用户名为“TestUser”的用户和一个为“TestPwd123”的密码。
如果对变量“startstop”设置上升沿，下载将会开始进行。
首先，FB——FTP_OPEN 功能块会打开一个到FTP服务器的连接。 之后，从FTP服务器给出的文件“\TestFolder\File1.txt”将会被功能块FB_FTP_FileDownload下载下来。 文件将会在ADS设备上按下面的路径“\Program Files\TestFile1.txt”保存。
最后，功能块 FB_FTP_Close 将关闭到FTP服务器的连接。

注意用户“TestUser”有权读和写。

变量声明

PROGRAM MAIN
VAR
RisingEdge : R_TRIG;
startstop : BOOL;
state : BYTE;
FB_FTP_Open1 : FB_FTP_Open;
FB_FTP_FileDownload1 : FB_FTP_FileDownload;
FB_FTP_Close1 : FB_FTP_Close;
busy : BOOL;
err : BOOL;
errid : UDINT;
handle : T_HFTP;
progress : UDINT;
END_VAR

PLC 程序

RisingEdge(CLK:= startstop);
IF RisingEdge.Q THEN state := 1; END_IF
CASE state OF 0: ;
1: FB_FTP_Open1
( sNetID:= '5.0.252.142.1.1',
sHost:= '172.16.9.223',
nPort:= 21,
sUsername:= 'TestUser',
sPassword:= 'TestPwd123',
bExecute:= TRUE,
tTimeout:= T#15s,
bBusy=> busy,
bError=> err,
nErrId=> errid,
hFTP=> handle);
IF NOT busy AND NOT err
THEN FB_FTP_Open1(bExecute:= FALSE);
state := 2;
END_IF
2: FB_FTP_FileDownload1
( sNetID:= '5.0.252.142.1.1',
hFTP:= handle,
sSrcFile:= '\TestFolder\File1.txt',
sDesFile:= '\Program Files\TestFile1.txt',
bExecute:= TRUE,
tTimeout:= T#15s,
bBusy => busy,
bError => err,
nErrId => errid,
nProgress => progress);
IF NOT busy AND NOT err
THEN FB_FTP_FileDownload1
(bExecute:= FALSE);
state := 3;
END_IF
3: FB_FTP_Close1
( sNetID:= '5.0.252.142.1.1',
hFTP:= handle,
bExecute:= TRUE,
tTimeout:= T#15s,
bBusy => busy,
bError => err,
nErrId => errid);
IF NOT busy AND NOT err
THEN FB_FTP_Close1(bExecute:= FALSE);
state := 0;
END_IF
END_CASE
"TcFTPClient.lib", "TcSystem.lib", "TcBase.lib" 和 "STANDARD.lib" 等库需要被连接。


例子

TwinCAT FTP 客户端-例程

TwinCAT FTP 客户端: 用FB_FTP_Info获得连接信息。

这个样例解释了功能块 FB_FTP_Info 的用法。

变量声明

PROGRAM MAIN
VAR
FB_FTP_Info1 : FB_FTP_Info;
list : ARRAY [0..5] OF ST_FTP_ConnInfo;
startstop : BOOL;
busy : BOOL;
err : BOOL;
errid : BOOL;
entries : UDINT;
END_VAR

PLC 程序

FB_FTP_Info1
( sNetID:= ,
pList:= ADR(list),
cbList:= SIZEOF(list),
bExecute:= startstop,
tTimeout:= T#15s,
bBusy=> busy,
bError=> err,
nErrID=> errid,
nEntries=> entries);
"TcFTPClient.lib", "TcSystem.lib", "TcBase.lib" 和 "STANDARD.lib" 等库需要被连接。

您将看到的输出如下图所示：


例子

TwinCAT FTP 客户端-例程

TwinCAT FTP 客户端: 移除FTP服务器上的一个文件

这个样例解释了从FTP服务器移除一个已经存在的文件。

首先，FB——FTP_OPEN 功能块会打开一个到FTP服务器的连接。 之后，功能块FB_FTP_FileExist 检查文件“\TestFolder\File1.txt”在FTP服务器上是否可用。 功能块“FB_FTP_FileRemove”删除指定文件。 最后，功能块 FB_FTP_Close 将关闭到FTP服务器的连接。

您可以通过变量“startstop”用上升沿启动样例

变量声明

PROGRAM MAIN
VAR
RisingEdge : R_TRIG;
startstop : BOOL;
state : BYTE;
FB_FTP_Open1 : FB_FTP_Open;
FB_FTP_FileExist1 : FB_FTP_FileExist;
FB_FTP_FileRemove1 : FB_FTP_FileRemove;
FB_FTP_Close1 : FB_FTP_Close;
busy : BOOL;
err : BOOL;
errid : UDINT;
handle : T_HFTP;
exist : BOOL;
END_VAR

PLC 程序

RisingEdge(CLK:=startstop);
IF RisingEdge.Q THEN state := 1; END_IF
CASE state OF
0: ;
1: FB_FTP_Open1( 	sNetID:= '5.0.252.142.1.1',
                sHost:= '172.16.9.223',
                nPort:= DEFAULT_FTP_PORT,
        sUsername:= 'TestUser',
        sPassword:= 'TestPwd123',
        bExecute:= TRUE,
        tTimeout:= T#15s,
        bBusy=> busy,
        bError=> err,
        nErrID=> errid,
        hFTP=> handle);
   IF NOT busy AND NOT err THEN state := 2; FB_FTP_Open1(bExecute:=FALSE); END_IF
2: FB_FTP_FileExist1( sNetID:= '5.0.252.142.1.1',
        hFTP:= handle,
        sFile:= '\TestFolder\File1.txt',
        bExecute:= TRUE,
        tTimeout:= T#15s,
        bBusy=> busy,
        bError=> err,
        nErrID=> errid,
        bExist=> exist);
   IF NOT busy AND NOT err THEN IF exist THEN state := 3; ELSE state := 4; END_IF FB_FTP_FileExist1(bExecute:= FALSE); END_IF
3: FB_FTP_FileRemove1( sNetID:= '5.0.252.142.1.1',
        hFTP:= handle,
        sFile:= '\TestFolder\File1.txt',
        bExecute:= TRUE,
        tTimeout:= T#15s,
        bBusy=> busy,
        bError=> err,
        nErrID=> errid);
   IF NOT busy AND NOT err THEN state := 4; FB_FTP_FileRemove1(bExecute:=FALSE); END_IF
4: FB_FTP_Close1( sNetID:= '5.0.252.142.1.1',
        hFTP:= handle,
        bExecute:= TRUE,
        tTimeout:= T#15s,
        bBusy=> busy,
        bError=> err,
        nErrID=> errid);
IF NOT busy AND NOT err THEN state := 0; FB_FTP_Close1(bExecute:=FALSE); END_IF
END_CASE
"TcFTPClient.lib", "TcSystem.lib", "TcBase.lib" 和 "STANDARD.lib" 等库需要被连接。


例子

TwinCAT FTP 客户端-例程

TwinCAT FTP 客户端: 从FTP服务器读取一个文件列表

这个样例解释了从FTP服务器读取一个文件列表。

首先，FB——FTP_OPEN 功能块会打开一个到FTP服务器的连接。 之后，功能块“FB_FTP_FileList”将读取所有通过FTP搜索条件的文件和文件夹。 最后，功能块 FB_FTP_Close 将关闭到FTP服务器的连接。

您可以通过变量“startstop”用上升沿启动样例

变量声明

PROGRAM MAIN
VAR
RisingEdge : R_TRIG;
startstop : BOOL;
state : BYTE;
FB_FTP_Open1 : FB_FTP_Open;
FB_FTP_FileList1 : FB_FTP_FileList;
FB_FTP_Close1 : FB_FTP_Close;
busy : BOOL; err : BOOL;
errid : UDINT;
handle : T_HFTP;
FileList : ARRAY [0..MAX_FILELIST_ITEMS] OF STRING; Items : UDINT;
END_VAR

PLC 程序

RisingEdge(CLK:= startstop);
IF RisingEdge.Q THEN state := 1; END_IF
CASE state OF
0: 	;
1:	FB_FTP_Open1( sNetID:= '5.0.252.142.1.1', sHost:= '172.16.9.223', nPort:= 21,
             sUsername:= 'TestUser', sPassword:= 'TestPwd123', bExecute:= TRUE,
             tTimeout:= T#15s, bBusy=> busy, bError=> err, nErrId=> errid, hFTP=> handle);
    IF NOT busy AND NOT err THEN FB_FTP_Open1(bExecute:= FALSE); state := 2; END_IF
2: 	FB_FTP_FileList1( sNetID:= '5.0.252.142.1.1', hFTP:= handle, sMask:= '*.txt',
            nIndex:= 0, pList:= ADR(FileList), cbList:= SIZEOF(FileList), bExecute:= TRUE,
            tTimeout:= T#15s, bBusy=> busy, bError=> err, nErrID=> errid, nItems=> Items);
    IF NOT busy AND NOT err THEN FB_FTP_FileList1(bExecute:= FALSE); state := 3; END_IF
3: 	FB_FTP_Close1( sNetID:= '5.0.252.142.1.1', hFTP:= handle, bExecute:= TRUE,
              tTimeout:= T#15s, bBusy => busy, bError => err, nErrId => errid);
    IF NOT busy AND NOT err THEN FB_FTP_Close1(bExecute:= FALSE); state := 0; END_IF
END_CASE
"TcFTPClient.lib", "TcSystem.lib", "TcBase.lib" 和 "STANDARD.lib" 等库需要被连接。