与西门子PLC通讯的Labview库

2022-09-15

与西门子PLC通讯的Labview库

描述

这是一个用于与西门子PLC进行通讯的Labview库。该库提供了一些实验性的VI(虚拟仪器),主要用于教育目的。请注意,这些文件是实验性的,不提供任何形式的保证。在使用这些文件时,您应该完全理解从操作中的PLC读取或写入数据的后果。

PLC通常用于控制危险的过程和/或设备。向正在控制设备或过程的PLC写入或读取数据可能会导致PLC程序或数据区域的干扰,从而可能导致经济损失、财产损失、危险物质的产生或释放,以及个人伤害,甚至包括死亡。因此,请在受控环境中测试您的软件,并在将其用于活动设备或过程之前进行验证。

据我所知,西门子从未公开S7协议的详细信息。许多公开的S7信息都是基于其他人对该协议的观察。有一个开源的S7数据交换包(libnodave),其中记录了许多S7特性。

这些VI基于http://decibel.ni.com/content/docs/DOC-5467上的示例进行修改。通过观察和模仿协议转换器与S7-300系列PLC之间的S7数据交换,对这些VI进行了修改。观察是通过Wireshark网络协议分析器和Wireshark插件S7-Protokoll完成的。

地址区域参数决定了读取和写入的目标PLC内存区域。我只测试了数据块(DB)区域的读取和写入。您的应用程序应仅读取和写入专门用于传输的读取和写入DB。通过将读取和写入限制在专用的数据块中,可以减少意外覆盖的风险。

数据类型:S7Com_Transport_Size.ctl是一个环形变量,包含传输的大小或类型的参数。我在S7-300系列PLC上仅成功使用了BYTE、INT和DINT传输大小。其他大小保留在环形变量中,以便在其他PLC上进行测试。我不知道多字节变量的字节是否是原子读取或写入的。

示例包含两个顶层VI:S7Com_Once.vi和S7Com_W+R_Loop.vi。

  • S7Com_Once.vi每次执行时执行一次读取或写入操作。它从I32数组向目标PLC写入数据,并从目标PLC读取数据到I32数组中。写入的字节数与要写入的数组元素数量和传输大小参数成正比。
  • S7Com_W+R_Loop.vi定期向目标PLC中的一对DB写入和读取数据。为了使用它,您的Step7 PLC项目应提供两个数据块DB11和DB12。请参见屏幕截图db11&12.PNG以了解它们的布局。下载DB到您的PLC后,使用VAT监控和更改DB值。如VI中所示,传输大小为DWORD。

还包括示例VI(S7Com_to_PLC(SubVI).vi和S7Com_from_PLC(SubVI).vi),用于在Labview和S7 PLC DB之间映射变量。在示例中,它们使用相同的集群类型定义(S7Com_PLC_Data.ctl),但这不是必需的。当您更改映射时,必须计算要从PLC读取的变量的大小,以便使用正确的读取长度参数。读取长度参数以传输大小单位表示。写入长度参数取自写入数据数组的大小,因此如果写入数据数组大于预期,数据可能会被覆盖。

十六进制字节和十六进制字节数组类型定义是为了将内部数据结构格式化为十六进制值,以便于与Wireshark数据包转储进行比较。

这些VI已在NI 9072 cRIO上进行了最小测试。

这还不是最终版本。需要更好的错误检查、更清晰的S7响应解码以及对格式错误数据的应力测试。

注意事项

  • 请在受控环境中测试您的软件,并在将其用于活动设备或过程之前进行验证。
  • 仅在专门用于传输的读取和写入DB中进行读取和写入操作,以减少意外覆盖的风险。
  • 这些VI是实验性的,不提供任何形式的保证。

下载链接

与西门子PLC通讯的Labview库