将 PLC Siemens S7-1500 连接到 SQL Server 数据库

Posted

技术标签:

【中文标题】将 PLC Siemens S7-1500 连接到 SQL Server 数据库【英文标题】:Connecting an PLC Siemens S7-1500 to an SQL Server Database 【发布时间】:2020-10-05 18:37:03 【问题描述】:

连接指南是here。我跟踪指南并做很多事情。 PLC 与 SQL 服务器的连接ok,我已成功登录 SQL。 我可以insert 到表,update,然后执行store procedures

但是当我运行select 查询时,我不知道如何检索数据和读取值。

我使用 TIA PORTAL v16。

PLC:S7 1200 西门子

我有一个简单的表,我想简单地读取一个整数,首先是一行!然后扩展我的工作。

这是我的表结构:

CREATE TABLE MyTable(
[id] [int] IDENTITY(1,1) NOT NULL,
[value] [int] NOT NULL,
)
) ON [PRIMARY]

这是我的select 查询:

SELECT [value]
FROM [dbo].[MyTable]
WHERE id = 12033

预期结果:

20

https://support.industry.siemens.com/tf/ww/en/posts/connecting-an-plc-siemens-s7-1500-to-an-sql-server-database/239392/?page=0&pageSize=10#post939400

更新

我回答了我自己的问题,请注意,西门子最近(2020 年 11 月 20 日)发布了一篇关于将 S7-* 系列直接连接到 Microsoft SQL Server 数据库的文档。因此,verfied anwser 是将 PLC 连接到 SQL Server 的经典且正常的方式,下一个答案是最新的本机解决方案。 玩得开心

【问题讨论】:

【参考方案1】:

值得注意的更新!!!

Siemens 最近(2020 年 11 月 20 日)发布了一篇关于将 S7-* 系列连接到 Microsoft SQL Server 数据库的文档,直接并且 em> 中间件,如 OPC ServersS7netplus 包。这意味着您可以通过 PLC 中的内部函数运行 SQL 查询,例如 selectinsert。 这是一种更快的原生解决方案。

首先,我通过 TiaPortal 在程序块中创建了一个字符串数组。

如下图所示设置连接字符串,Microsoft Sql Server的IP地址为172.16.62.1

然后我按照Simense发布的pdf中的说明做了一个内置的PLC功能。

我在我的预定义字符串数组中有一堆查询,我通过索引选择其中一个作为 PLC 函数的输入参数。 然后我下载了对 PLC 的更改。结果我在 MSSQL Server 中有hello world。在此处输入代码 到目前为止,我通过 PLC 本身运行了 SQL Server 查询! 让我们运行另一个查询,也是最难的一个:select。 我说的最难是因为select 有一堆不同数据类型的记录:比如varcharboolDateTime

“选择”指令 使用“选择”指令,您可以从数据库表中读取数据并在控制器中对它们执行其他操作。下面,我们使用一个示例来展示此指令的工作原理以及您需要为查询进行哪些修改。该示例使用以下查询:

Select * from Mytable

查询的数据存储在数据类型结构“typeUseCaseSpecificData”中的“SqlReceive”数据块中。您必须为每个查询单独修改这些数据类型。您可以按以下方式执行此操作: 1. 开始 Wireshark 录制以查找元数据的数据包长度。 2. 运行查询“Select Amount from PLCDATA_2 where Fruit = $'Apple$'”。 3. 停止 Wireshark 记录并使用过滤器“TDS”从 SQL 服务器搜索响应帧。 4. 选择框架,点击“Token – ColumnMetaData”行。

好的,现在我想在 sqlqueries 数组中选择 select 查询:

SELECT _barcode FROM mytable where id = 4

我再次激活/停用输入然后我得到我的结果,这里我通过它的 id 得到“Peyman Majidi”字符串。

输出:

'佩曼马吉迪'

我可以通过收听tds 协议向您展示Wireshark 的工作原理。 表格数据流协议 (TDS) 使您能够与 Microsoft SQL 服务器建立直接连接。使用 TDS,您可以登录到 SQL 服务器数据库并传输 SQL 指令。这样就可以从数据库中读取数据,或者发送到数据库进行存储。

【讨论】:

【参考方案2】:

经过大量搜索和阅读文档,我发现西门子仍在开发MSSql Server Module,现在还没有完成。 数据将在接收缓冲区内:InstLsql_Microsoft.statRcvData.bytes[]。但是你必须搜索你的信息。

但是,在 PLC 寄存器上读写的最佳方法仍然是使用 S7netplus 库(用于 Siemens S7 Connectivity 的 .NET 库)。 S7.Net Plus 是 Juergen1969 在 S7.Net 项目上所做工作的延续。我发现该库简单而有效,但该项目自 2009 年底以来一直停滞不前。

在 C# 项目上下载并安装:

PM> Install-Package S7netplus -Version 0.4.0

要创建驱动程序的实例,您需要使用此构造函数:

public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot)

例子:

此代码为 IP 地址为 127.0.0.1 的 S7-300 plc 创建一个 Plc 对象,为机架 0 中的 plc 和插槽 2 中的 cpu:

Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 2);

连接到 PLC

public void Open()

例如这行代码打开连接:

plc.Open();

从 PLC 断开

public void Close()

例如关闭连接:

plc.Close();

读取字节/写入字节

该库提供了几种读取变量的方法。最基本也是最常用的是ReadBytes。

public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count)

public void WriteBytes(DataType dataType, int db, int startByteAdr, byte[] value)

这会从给定的内存位置读取您指定的所有字节。此方法自动处理多个请求,以防字节数超过单个请求可传输的最大字节数。

dataType:你必须用枚举DataType指定内存位置

public enum DataType

    Input = 129,
    Output = 130,
    Memory = 131,
    DataBlock = 132,
    Timer = 29,
    Counter = 28

db:dataType的地址,例如要读取DB1,该字段为“1”;如果要读取 T45,此字段为 45。 startByteAdr:要读取的第一个字节的地址,比如要读取DB1.DBW200,这个是200。 count:包含您要读取的字节数。 Value[]:要写入 PLC 的字节数组。 示例:该方法读取 DB1 的前 200 个字节:

var bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 200);

更多文档在这里:S7.Net documentation

【讨论】:

以上是关于将 PLC Siemens S7-1500 连接到 SQL Server 数据库的主要内容,如果未能解决你的问题,请参考以下文章

西门子S7协议数据采集内存读写调试软件工具

20200424 昌黄井场调试 组态一个汇川HE200 一个HMI TP900 一个智能从站 一个S7-1500 PLC ProfiNet IO 通信 测试OK, 收获大

C#与西门子PLC S7-1500 S7协议通信 环境搭建

西门子s7-1500如何与第三方plc通过tcp

siemens plc 如何与其它品牌PLC通讯?

三分钟轻松实现连接西门子PLC