[英]S7NetPlus plc.Write() not changing cartain values in data block (Siemens S7-1500)
[英]Connecting an PLC Siemens S7-1500 to an SQL Server Database
连接指南在这里。 我跟踪指南并做很多事情。 PLC与SQL服务器连接正常,我已成功登录SQL。
我可以insert
表、 update
和执行store procedures
。
但是当我运行select
查询时,我不知道如何检索数据和读取值。
我使用 TIA PORTAL v16。
PLC:S7 1200 西门子
我有一个简单的表格,我想简单地阅读一个 integer,首先是一行。 然后扩展我的工作。
这是我的表结构:
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
我回答了我自己的问题,请注意,西门子最近(11/20/2020)直接发布了关于将 S7-* 系列连接到 Microsoft SQL 服务器数据库的文档。 所以经过验证的anwser是将PLC连接到SQL服务器的经典和正常方式,下一个答案是最新的本地解决方案。 玩得开心
西门子最近(2020 年 11 月 20 日)发布了一篇关于将 S7-* 系列直接连接到 Microsoft SQL 服务器数据库的文档,并且没有像OPC Servers
或S7netplus
package 这样的中间件。 这意味着您可以运行 SQL 查询,如select
并通过 PLC 中的内部 function insert
。
这是一个更快的原生解决方案。
首先,通过 TiaPortal,我在 Program 块中创建了一个字符串数组。
您应该设置如下图所示的连接字符串,其中 Microsoft Sql 服务器的 IP 地址为172.16.62.1
:
然后我按照Simense发布的pdf中的说明制作了一个内置PLC function。
我在我的预定义字符串数组中有一堆查询,我通过索引选择其中一个作为 PLC function 的输入参数。
然后我下载了对 PLC 的更改。 结果,我在 MSSQL Server 中有hello world
。 在此处输入代码 到目前为止,我通过 PLC 本身运行了 SQL 服务器查询!
让我们运行另一个查询,也是最难的一个: select
。
我说的是最难的,因为select
有一堆不同数据类型的记录:比如varchar
, bool
, DateTime
。
“选择”指令 使用“选择”指令,您可以在 controller 中从数据库表中读取数据并对它们执行其他操作。 下面,我们使用一个示例来展示此指令的工作原理以及您需要为查询进行哪些修改。 该示例使用以下查询:
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
我再次激活/停用输入然后我得到我的结果,这里我通过它的 id 得到“Peyman Majidi”字符串。
Output:
'佩曼马吉迪'
我可以通过听tds
协议向您展示Wireshark
的工作原理。
表格数据 Stream 协议 (TDS) 使您能够与 Microsoft SQL 服务器建立直接连接。 使用 TDS,您可以登录到 SQL 服务器数据库并传输 SQL 指令。 这样就可以从数据库中读取数据,或者将它们发送到数据库进行存储。
经过大量搜索和阅读文档,我发现西门子仍在开发 MSSql 服务器模块,现在还没有完成。 数据将在 Receivebuffer 中: 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 object,对于机架 0 中的 plc,CPU 位于插槽 2 中:
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)
这将从给定的 memory 位置读取您指定的所有字节。 如果字节数超过单个请求中可以传输的最大字节数,此方法会自动处理多个请求。
dataType:您必须使用枚举 DataType 指定 memory 位置
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 文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.