将 PLC Siemens S7-1500 连接到 SQL 服务器数据库

Connecting an PLC Siemens S7-1500 to an SQL Server Database

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

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

我使用的是 TIA PORTAL v16。

PLC:S7 1200西门子

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

这是我的 table 结构:

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 服务器数据库的文档。因此经过验证的答案是将 PLC 连接到 SQL 服务器的经典且正常的方法,下一个答案是最新的本机解决方案。 玩得开心

经过大量的搜索和阅读文档,我发现西门子仍在开发MSSql Server Module,现在还没有完成。 数据将在 Receivebuffer 中:InstLsql_Microsoft.statRcvData.bytes[]。但是你要搜索你的资料。

但是,读写 PLC 寄存器的最佳方法仍然是使用 S7netplus 库(用于西门子 S7 连接的 .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 中插槽 2 中 cpu 的 plc:

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)

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

数据类型:您必须使用枚举数据类型指定内存位置

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

重要更新!!!

西门子最近 (11/20/2020) 发布了一份关于将 S7-* 系列连接到 Microsoft SQL 服务器数据库的文档,直接 并使用 NOOPC ServersS7netplus 包这样的中间件。这意味着您可以通过 PLC 中的内部函数 运行 SQL 查询 selectinsert
这是一个更快的原生解决方案。

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

你应该设置连接字符串如下图所示,微软Sql服务器的IP地址是172.16.62.1:

然后我按照Simense出版的这些pdf中的说明做了一个内置的PLC功能。

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

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

Select * from Mytable

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

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

SELECT _barcode FROM mytable where id = 4

我再次 Active/deactive 输入然后得到结果,在这里我得到 'Peyman Majidi' 字符串的 ID。

输出:

'Peyman Majidi'

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