14

连接指南在这里。我跟踪指南并做很多事情。PLC和SQL服务器连接正常,我已经成功登录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

SQL 截图

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 的经典且正常的方式,下一个答案是最新的本机解决方案。玩得开心

4

2 回答 2

6

重要更新!!!

西门子最近(2020 年 11 月 20 日)发布了一篇关于将 S7-* 系列直接连接到 Microsoft SQL Server 数据库的文档,无需中间件OPC ServersS7netplus软件包。这意味着您可以通过 PLC 中的内部函数来运行 SQLselect查询insert
这是一个更快的原生解决方案。

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

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

在此处输入图像描述

然后我按照Simense发布的 这些pdf中的说明制作了一个内置的PLC功能。设置PLC功能

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

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

Select * from Mytable

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

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

SELECT _barcode FROM mytable where id = 4

选择

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

选择结果

输出:

'佩曼马吉迪'

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

线鲨

于 2021-01-12T10:21:27.707 回答
2

经过大量搜索和阅读文档,我发现西门子仍在开发 MSSql 服务器模块,现在还没有完成。数据将在 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 中的 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 文档

于 2020-07-02T21:02:21.440 回答