C# 将PLC西门子S7-1500连接到SQL Server数据库

C# 将PLC西门子S7-1500连接到SQL Server数据库,c#,sql-server,plc,siemens,tia-portal,C#,Sql Server,Plc,Siemens,Tia Portal,连接指南为。我跟踪导游,做了很多事情。 PLC和SQL server之间的连接正常,我已成功登录SQL。 我可以将插入到表中,更新,并执行存储过程 但是当我运行select查询时,我不知道如何检索数据和读取值 我使用TIA门户v16 PLC:S7 1200西门子 我有一个简单的表格,我想简单地读一个整数,第一行!然后扩展我的工作 这是我的表格结构: CREATE TABLE MyTable( [id] [int] IDENTITY(1,1) NOT NULL, [value] [int] NO

连接指南为。我跟踪导游,做了很多事情。 PLC和SQL server之间的连接正常,我已成功登录SQL。
我可以
插入到表中,
更新
,并执行
存储过程

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

我使用TIA门户v16

PLC:S7 1200西门子

我有一个简单的表格,我想简单地读一个整数,第一行!然后扩展我的工作

这是我的表格结构:

CREATE TABLE MyTable(
[id] [int] IDENTITY(1,1) NOT NULL,
[value] [int] NOT NULL,
)
) ON [PRIMARY]
这是我的
选择
查询:

SELECT [value]
FROM [dbo].[MyTable]
WHERE id = 12033
预期结果:

20

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

经过大量搜索和阅读文档,我发现西门子仍在开发MSSql服务器模块,但现在还没有完成。 数据将在Receivebuffer内:
InstLsql\u Microsoft.statRcvData.bytes[]
。但是你必须搜索你的信息

但是,读写PLC寄存器的最佳方法是使用
S7netplus
库(西门子S7连接的.NET库)。 S7.Net Plus是Juergen1969在S7.Net项目上所做工作的延续。我发现这个库简单而有效,但这个项目自2009年底以来一直没有改变

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

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

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

该代码为IP地址为127.0.0.1的S7-300 Plc创建Plc对象,用于cpu位于插槽2中的机架0中的Plc:

Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 2);
连接到PLC

public void Open()
例如,这行代码打开连接:

plc.Open();
plc.Close();
断开与PLC的连接

public void Close()
例如,这会关闭连接:

plc.Open();
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:数据类型的地址,例如,如果要读取DB1,此字段为“1”;如果要读取T45,则此字段为45。 startByteAdr:要读取的第一个字节的地址,例如,如果要读取DB1.DBW200,则为200。 计数:包含要读取的字节数。 值[]:要写入plc的字节数组。 示例:此方法读取DB1的前200个字节:

var bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 200);
更多文档如下:

值得注意的更新!!! 西门子最近(2020年11月20日)发布了一份关于将S7-*系列连接到Microsoft SQL Server数据库的文件,直接,并使用中间件,如
OPC服务器
S7netplus
软件包。这意味着您可以通过PLC中的内部函数运行SQL查询,如
select
insert

这是一个更快的本地解决方案

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

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

然后,我按照Simense发布的指令制作了一个内置PLC功能。

我在预定义的字符串数组中有一组查询,我通过其索引选择其中一个作为PLC函数的输入参数。
然后,我将更改下载到PLC。因此,我在MSSQL服务器中有了
hello world
。在这里输入代码 到目前为止,我自己运行了一个SQL Server查询
让我们运行另一个查询和最难的查询:
select

我说的最难是因为
select
有一堆不同数据类型的记录:比如
varchar
bool
DateTime

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

从Mytable中选择*
查询的数据存储在数据类型结构“typeUseCaseSpecificData”中的“SqlReceive”数据块中。必须为每个查询分别修改这些数据类型。你可以这样做:1。启动Wireshark录制以查找元数据的数据包长度。2.运行查询“从PLCDATA_2中选择金额,其中水果=$'Apple$”。3.停止Wireshark录制并使用筛选器“TDS”从SQL server搜索响应帧。4.选择框架并单击行“Token–ColumnMetaData”

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

从id=4的mytable中选择_条形码

我再次激活/取消激活输入,然后得到结果,这里我通过id得到“Peyman Majidi”字符串

输出:

“佩曼·马吉迪”

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