SIMATIC Automation Tool V3.1 SP4 产品信息

章节中 说明 示例 基础知识 过程 其它
启动 返回 继续

SIMATIC Automation Tool V3.1 SP4 产品信息

该章节包括以下主题的信息:
  • SIMATIC Automation Tool 功能
  • 已知问题


SIMATIC Automation Tool 功能

V3.1 SP4 的新增功能

SIMATIC Automation Tool 功能

可使用 SIMATIC Automation Tool 进行网络设备的网络维护和调试。

SIMATIC Automation Tool 具有以下功能：

  • 扫描网络，创建映射网络上可访问设备的表格。

  • 通过闪烁的设备 LED 或 HMI 画面定位设备

  • 将地址（IP、子网、网关）下载到设备中

  • 将 PROFINET 名称（站名称）下载到设备中

  • 将 CPU 置于 RUN 或 STOP 模式

  • 将 CPU 中的时间设置为编程设备中的当前时间

  • 将程序下载到 CPU 或 HMI 设备

  • 上传、添加或删除 CPU 中的配方数据

  • 上传或删除 CPU 中的数据日志数据

  • 将 CPU 或 HMI 设备的数据备份至备份文件/从备份文件中恢复数据

  • 检索 CPU 中的服务数据

  • 读取 CPU 的诊断缓冲区

  • 执行 CPU 存储器复位

  • 将 CPU 复位为出厂默认值

  • 复位通信参数

  • 更新设备固件

  • 导出设备诊断

  • 导出设备信息

  • 导出 PC 数据

有关产品操作的详细信息，请参阅用户指南。

V3.1 SP4 的新增功能

SIMATIC Automation Tool 的 3.1 SP4 版本支持设备目录中列出的其它设备和版本。


已知问题

已知问题

该章节包括以下主题的信息:
  • ET 200 设备上的 IP 地址更改操作失败
  • API DeleteDataLog 方法的示例程序
  • API DeleteRecipe 方法的示例程序
  • API UploadDataLog 方法的示例程序
  • API UploadRecipe 方法的示例程序
  • API DownloadRecipe 方法的示例程序


ET 200 设备上的 IP 地址更改操作失败

原因 补救措施

ET 200 设备上的 IP 地址更改操作失败

原因

在 IP 地址更改操作之前执行了 PROFINET 名称更改操作。

补救措施

请按以下步骤操作：

  1. 将设备复位为出厂设置

  2. 设置 IP 地址。

  3. 设置 PROFINET 名称。


API DeleteDataLog 方法的示例程序

API DeleteDataLog 方法的示例程序

用户指南中 API DeleteDataLog 方法的代码示例缺少设置 CPU 密码后刷新状态所需的代码。

以下更正后的代码示例实现了使用 DataLogFolder 属性迭代 CPU 存储卡中的所有数据日志并删除每个数据日志：

Network myNetwork = new Network();

        List<String> interfaces = new List<String>();
Result retVal = myNetwork.QueryNetworkInterfaceCards(out interfaces);
if (retVal.Succeeded)
{
//-----------------------------------------------------
//
        此方法会返回一个字符串列表。
//
        列表中的每个字符串表示一个
// 可用的网络接口。
//
        可以使用数组表示法迭代列表。
//-----------------------------------------------------
for (Int32 index1 = 0; index1 < interfaces.Count; index1++)
{
String strInterfaceName = interfaces[index1];
}
retVal = myNetwork.SetCurrentNetworkInterface(interfaces[3]);
if (retVal.Succeeded)
{
//---------------------------------------------------
//
        动作已成功执行。继续操作。
//---------------------------------------------------
}
else
{
//---------------------------------------------------
//
        SetCurrentNetworkInterface 动作失败。
//---------------------------------------------------
return;
}

           string currentInterface = myNetwork.CurrentNetworkInterface;
}
else
{
//---------------------------------------------------
//
        QueryNetworkInterfaceCards 动作失败。

           //
        继续操作。
//---------------------------------------------------
return;
}

IProfinetDeviceCollection devices;

        IScanErrorCollection scanResult = myNetwork.ScanNetworkDevices(out devices);
if (scanResult.Succeeded)
{
foreach (IProfinetDevice dev in devices)
{
ICPU devAsCpu = dev as ICPU;
if (devAsCpu != null)
{
if (devAsCpu.Protected)
{
retVal = devAsCpu.SetPassword(new EncryptedString("Password"));
if (retVal.Failed)
{
//---------------------------------------------------
//
        SetPassword 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}
}

                 retVal = devAsCpu.RefreshStatus();
if (retVal.Failed)
{
//---------------------------------------------------
//
        RefreshStatus 动作失败。
//
        继续下一台设备
        .
//---------------------------------------------------
continue;
}

                 if (devAsCpu.RemoteDataLogsAllowed)
{
//------------------------------------------
//
        检查存储卡中的数据日志是否可用
//------------------------------------------
if (devAsCpu.DataLogFolder.Exists)
{
//------------------------------------------
//
        搜索所有数据日志文件
//------------------------------------------
foreach (IRemoteFile datalog in
devAsCpu.DataLogFolder.Files)
{
datalog.Selected = true;
//------------------------------------------
//
        删除数据日志
//------------------------------------------
retVal = devAsCpu.DeleteDataLog(datalog.Name);
if (retVal.Failed)
{
//-----------------------------------------
//
        DeleteDataLog 动作失败。
//
         继续操作。
//-----------------------------------------
continue;
}
}
}
}
}
}
}


API DeleteRecipe 方法的示例程序

API DeleteRecipe 方法的示例程序

用户指南中 API DeleteRecipe 方法的代码示例缺少设置 CPU 密码后刷新状态所需的代码。

以下更正后的代码示例实现了使用 RecipeFolder 属性迭代 CPU 存储卡中的所有配方并删除每个配方：

Network myNetwork = new Network();

        List<String> interfaces = new List<String>();
Result retVal = myNetwork.QueryNetworkInterfaceCards(out interfaces);
if (retVal.Succeeded)
{
//-----------------------------------------------------
//
        此方法会返回一个字符串列表。
//
         列表中的每个字符串表示一个
//
        可用的网络接口。
//
         可以使用数组表示法迭代列表。
//-----------------------------------------------------
for (Int32 index1 = 0; index1 < interfaces.Count; index1++)
{
String strInterfaceName = interfaces[index1];
}

           retVal = myNetwork.SetCurrentNetworkInterface(interfaces[3]);
if (retVal.Succeeded)
{
//---------------------------------------------------
//
        动作已成功执行。继续操作。
//---------------------------------------------------
}
else
{
//---------------------------------------------------
//
        SetCurrentNetworkInterface 动作失败。
//---------------------------------------------------
return;
}

           string currentInterface = myNetwork.CurrentNetworkInterface;
}
else
{
//---------------------------------------------------
//
        QueryNetworkInterfaceCards 动作失败。
//
        继续操作。
//---------------------------------------------------
return;
}

IProfinetDeviceCollection devices;

        IScanErrorCollection scanResult = myNetwork.ScanNetworkDevices(out devices);
if (scanResult.Succeeded)
{
foreach (IProfinetDevice dev in devices)
{
ICPU devAsCpu = dev as ICPU;
if (devAsCpu != null)
{
if (devAsCpu.Protected)
{
retVal = devAsCpu.SetPassword(new EncryptedString("Password"));
if (retVal.Failed)
{
//---------------------------------------------------
//
        SetPassword 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}
}

                 retVal = devAsCpu.RefreshStatus();
if (retVal.Failed)
{
//---------------------------------------------------
//
        RefreshStatus 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}

                 if (devAsCpu.RemoteDataLogsAllowed)
{
//------------------------------------------
//
        检查存储卡中的配方是否可用
//------------------------------------------
if (devAsCpu.RecipeFolder.Exists)
{
//------------------------------------------
//
        搜索所有配方
//------------------------------------------
foreach (IRemoteFile recipe in devAsCpu.RecipeFolder.Files)
{
recipe.Selected = true;
//------------------------------------------
//
        删除配方。
//------------------------------------------
retVal = devAsCpu.DeleteRecipe(recipe.Name);
if (retVal.Failed)
{
//-------------------------------------------
//
        DeleteRecipe 动作失败。
//
        继续操作。
//-------------------------------------------
continue;
}
}
}
}
}
}
}


API UploadDataLog 方法的示例程序

API UploadDataLog 方法的示例程序

用户指南中 API UploadDataLog 方法的代码示例缺少设置 CPU 密码后刷新状态所需的代码。

以下正确的代码示例实现了使用 DataLogFolder 属性迭代 CPU 存储卡中的所有数据日志并将每个数据日志的副本上传到文件夹 C:\MyDataLogs：

Network myNetwork = new Network();

        List<String> interfaces = new List<String>();
Result retVal = myNetwork.QueryNetworkInterfaceCards(out interfaces);
if (retVal.Succeeded)
{
//-----------------------------------------------------
//
        此方法会返回一个字符串列表。
//
        列表中的每个字符串表示一个
//
        可用的网络接口。
//
        可以使用数组表示法迭代列表。
//-----------------------------------------------------
for (Int32 index1 = 0; index1 < interfaces.Count; index1++)
{
String strInterfaceName = interfaces[index1];
}

           retVal = myNetwork.SetCurrentNetworkInterface(interfaces[3]);
if (retVal.Succeeded)
{
//---------------------------------------------------
//
        动作已成功执行。继续操作。
//---------------------------------------------------
}
else
{
//---------------------------------------------------
//
        SetCurrentNetworkInterface 动作失败。
//---------------------------------------------------
return;
}

           string currentInterface = myNetwork.CurrentNetworkInterface;
}
else
{
//---------------------------------------------------
//
        QueryNetworkInterfaceCards 动作失败。
//
         继续操作。
//---------------------------------------------------
return;
}

IProfinetDeviceCollection scannedDevices;

        IScanErrorCollection scanResult = myNetwork.ScanNetworkDevices(out scannedDevices);
if (scanResult.Succeeded)
{
foreach (IProfinetDevice dev in scannedDevices)
{
ICPU devAsCpu = dev as ICPU;
if (devAsCpu != null)
{
if (devAsCpu.Protected)
{
retVal = devAsCpu.SetPassword(new EncryptedString("Password"));
if (retVal.Failed)
{
//---------------------------------------------------
//
        SetPassword 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}
}

                 retVal = devAsCpu.RefreshStatus();
if (retVal.Failed)
{
//---------------------------------------------------
//
        RefreshStatus 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}

                 if (devAsCpu.RemoteDataLogsAllowed)
{
//------------------------------------------
//
        检查存储卡中的数据日志是否可用
//------------------------------------------
if (devAsCpu.DataLogFolder.Exists)
{
//------------------------------------------
//
        搜索所有数据日志文件
//------------------------------------------
foreach (IRemoteFile datalog in devAsCpu.DataLogFolder.Files)
{
datalog.Selected = true;
//------------------------------------------
//
        上传每个数据日志的副本
//------------------------------------------
retVal = devAsCpu.UploadDataLog(datalog.Name, @"C:\MyDataLogs");
if (retVal.Failed)
{
//-------------------------------------------
//
        UploadDataLog 动作失败。
//
        继续操作。
//-------------------------------------------
continue;
}
}
}
}
}
}
}


API UploadRecipe 方法的示例程序

API UploadRecipe 方法的示例程序

用户指南中 API UploadRecipe 方法的代码示例缺少设置 CPU 密码后刷新状态所需的代码。

以下更新的代码示例实现了使用 RecipeFolder 属性迭代 CPU 存储卡中的所有配方并将每个配方的副本上传到文件夹 C:\MyRecipes：

Network myNetwork = new Network();

        List<String> interfaces = new List<String>();
Result retVal = myNetwork.QueryNetworkInterfaceCards(out interfaces);
if (retVal.Succeeded)
{
//-----------------------------------------------------
//
        此方法会返回一个字符串列表。
//
        列表中的每个字符串表示
//
        一个可用的网络接口。
//
        可以使用数组表示法迭代列表。
//-----------------------------------------------------
for (Int32 index1 = 0; index1 < interfaces.Count; index1++)
{
String strInterfaceName = interfaces[index1];
}

           retVal = myNetwork.SetCurrentNetworkInterface(interfaces[3]);
if (retVal.Succeeded)
{
//---------------------------------------------------
//
        动作已成功执行。继续操作。
//---------------------------------------------------
}
else
{
//---------------------------------------------------
//
        SetCurrentNetworkInterface 动作失败。
//---------------------------------------------------
return;
}

           string currentInterface = myNetwork.CurrentNetworkInterface;
}
else
{
//---------------------------------------------------
//
        QueryNetworkInterfaceCards 动作失败。
//
        继续操作。
//---------------------------------------------------
return;
}

        IProfinetDeviceCollection devices;
IScanErrorCollection scanResult = myNetwork.ScanNetworkDevices(out devices);
if (scanResult.Succeeded)
{
foreach (IProfinetDevice dev in devices)
{
ICPU devAsCpu = dev as ICPU;
if (devAsCpu != null)
{
if (devAsCpu.Protected)
{
retVal = devAsCpu.SetPassword(new EncryptedString("Password"));
if (retVal.Failed)
{
//---------------------------------------------------
//
        SetPassword 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}
}

                 retVal = devAsCpu.RefreshStatus();
if (retVal.Failed)
{
//---------------------------------------------------
//
        RefreshStatus 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}

                 if (devAsCpu.RemoteRecipesAllowed)
{
//------------------------------------------
//
        检查存储卡中的配方是否可用。
//------------------------------------------
if (devAsCpu.RecipeFolder.Exists)
{
//------------------------------------------
//
        搜索所有配方文件
//------------------------------------------
foreach (IRemoteFile recipe in devAsCpu.RecipeFolder.Files)
{
recipe.Selected = true;
//------------------------------------------
//
        上传每个配方的副本。
//------------------------------------------
retVal = devAsCpu.UploadRecipe(recipe.Name, @"C:\MyRecipes");
if (retVal.Failed)
{
//-------------------------------------------
//
        UploadRecipe 动作失败。
//
        继续操作。
//-------------------------------------------
continue;
}
}
}
}
}
}
}


API DownloadRecipe 方法的示例程序

API DownloadRecipe 方法的示例程序

用户指南中 API DownloadRecipe 方法的代码示例缺少设置 CPU 密码后刷新状态所需的代码。

以下更新的代码示例显示了如何向 CPU 存储卡写入配方：

Network myNetwork = new Network();

        List<String> interfaces = new List<String>();
Result retVal = myNetwork.QueryNetworkInterfaceCards(out interfaces);
if (retVal.Succeeded)
{
//-----------------------------------------------------
//
        此方法会返回一个字符串列表。
//
        列表中的每个字符串表示
//
        一个可用的网络接口。
//
        可以使用数组表示法迭代列表。
//-----------------------------------------------------
for (Int32 index1 = 0; index1 < interfaces.Count; index1++)
{
String strInterfaceName = interfaces[index1];
}

           retVal = myNetwork.SetCurrentNetworkInterface(interfaces[3]);
if (retVal.Succeeded)
{
//---------------------------------------------------
//
        动作已成功执行。继续操作。
//---------------------------------------------------
}
else
{
//---------------------------------------------------
//
        SetCurrentNetworkInterface 动作失败。
//---------------------------------------------------
return;
}

           string currentInterface = myNetwork.CurrentNetworkInterface;
}
else
{
//---------------------------------------------------
//
        QueryNetworkInterfaceCards 动作失败。
//
        继续操作。
//---------------------------------------------------
return;
}

uint targetIPAddress = 0xC0A80001; // 192.168.0.1
string rcpFile = @"C:\NewRecipe.csv";

IProfinetDeviceCollection devices;

IScanErrorCollection scanResult = myNetwork.ScanNetworkDevices(out devices);
if (scanResult.Succeeded)
{
   foreach (IProfinetDevice dev in devices)
   {
      ICPU devAsCpu = dev as ICPU;

      if (devAsCpu == null)
      continue;

              if ((devAsCpu.IP == targetIPAddress) &&
(devAsCpu.RemoteRecipesAllowed))
{
if (devAsCpu.Protected)
{
retVal = devAsCpu.SetPassword(new EncryptedString("Password"));
if (retVal.Failed)
{
//---------------------------------------------------
//
        SetPassword 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}
}

                  retVal = devAsCpu.RefreshStatus();
if (retVal.Failed)
{
//---------------------------------------------------
//
        RefreshStatus 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}

                  IRemoteFolder recipes = devAsCpu.RecipeFolder;
recipes.Selected = true;
retVal = recipes.SetRemoteFile(rcpFile);
if (retVal.Failed)
{
//---------------------------------------------------
//
        SetRemoteFile 动作失败。
// 继续操作
        .
//---------------------------------------------------
continue;
}

                  retVal = devAsCpu.DownloadRecipe(rcpFile);
if (retVal.Failed)
{
//---------------------------------------------------
//
        DownloadRecipe 动作失败。
//
        继续操作。
//---------------------------------------------------
continue;
}
}
}
}