这是一款便于开发者使用的LabVIEW库,专门用于实现与西门子PLC设备之间的高效通信。它简化了编程过程,并提高了数据传输效率和稳定性。
以下是声明的重写版本:
警告:附件中的文件仅为教育目的提供的实验性VI程序,并无任何明示或暗示的质量保证。您应测试自己的代码并完全理解向操作中PLC进行读取或写入可能带来的后果。
PLCs通常用于控制危险过程和/或设备,对正在运行的设备或过程中进行读取或写入可能会导致PLC程序中断或者数据区域受损,进而可能导致经济损失、财产损失以及有害物质生成释放甚至造成人身伤害乃至死亡。请在受控环境中测试软件并确保其合格后再应用于实际操作中的设备或过程。
据我所知,西门子从未公开发布过S7协议的详细信息。许多关于S7的信息是基于他人对协议进行观察而得出的结论。有一个开源的S7数据交换包可以在网上找到,该包记录了许多S7的功能特性。
这些VI程序参考了在某个网站上发布的示例,并通过使用wireshark网络协议分析器和一个专门针对S7-Protokoll的插件来观测并模仿了一个协议转换器与一台S7-300系列PLC之间的数据交换过程。地址区域参数决定目标是哪一个PLC内存区,我仅测试过读取或写入到Data Block(DB)区域的情况。您的应用程序应该从专门用于传输的数据块中进行读取和写入操作以减少意外覆盖的风险。
S7Com_Transport_Size.ctl是一个环变量,包含有关数据传输大小的参数信息。我在一台S7-300系列PLC上仅成功使用过BYTE、INT 和 DINT 三种传输大小设置。其他尺寸的选项保留在环变量中以便在其它PLC 上进行测试。
示例程序包括两个顶级VI:S7Com_Once.vi和 S7Com_W+R_Loop.vi。前者每次执行时仅读取或写入一次,将I32数组中的数据写到目标PLC,并从目标PLC中读取并存于另一个I32数组;后者则定期向一对DB进行写操作和读操作,在使用前您需要在Step7 PLC项目中提供两个Data Blocks(DB11 和 DB12)。这些VI程序的传输大小为DWORD。
附带了示例 VI (S7Com_to_PLC(SubVI).vi and S7Com_from_PLC(SubVI).vi) 用于映射Labview和S7 PLC DBs之间的变量。在例子中,它们使用相同的集群类型定义(S7Com_PLC_Data.ctl),但这不是必需的。当您更改映射时,必须根据要从PLC读取的变量大小来计算正确的读取长度参数;此参数以传输尺寸为单位。
hex byte 和 hex byte array 类型定义用于格式化内部数据结构以便于与wireshark的数据包转储进行比较。
这些VI程序在一台NI 9072 cRIO 上进行了少量测试。仍需进一步完善,包括更好的错误检测、更清晰的S7响应解码以及使用畸形数据的压力测试。