Подключение ПЛК Siemens S7-1500 к базе данных SQL Server

Руководство по подключению находится здесь. Я слежу за гидом и делаю много вещей. Соединение между ПЛК и SQL-сервером в порядке, я успешно вошел в SQL.
Я могуinsert к столам, update, и выполнить store procedures.

Но когда я запускаю selectзапрос Я не знаю, как получить данные и прочитать значения.

Использую TIA PORTAL v16.

ПЛК: S7 1200 siemens

У меня простая таблица, я хочу просто прочитать целое число, сначала с одной строкой! затем расширите мою работу.

Это моя структура таблицы:

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

2 ответа

Решение

После долгих поисков и чтения документов я обнаружил, что Siemens все еще разрабатывает серверный модуль MSSql, и теперь он не завершен. Данные будут внутри буфера приема:InstLsql_Microsoft.statRcvData.bytes[]. Но вы должны искать свою информацию.

Но все же лучший способ читать и писать в регистры ПЛК - это использовать S7netplusбиблиотека (.NET-библиотека для подключения Siemens S7). S7.Net Plus - это продолжение работы, проделанной Juergen1969 над проектом S7.Net. Библиотека мне показалась простой и эффективной, но с конца 2009 года проект не претерпел изменений.

Загрузите и установите в C# Project:

PM> Install-Package S7netplus -Version 0.4.0

Для создания экземпляра драйвера вам необходимо использовать этот конструктор:

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

Пример:

Этот код создает объект Plc для plc S7-300 с IP-адресом 127.0.0.1 для plc в стойке 0 с процессором в слоте 2:

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

Подключение к ПЛК

public void Open()

Например, эта строка кода открывает соединение:

plc.Open();

Отключение от ПЛК

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: адрес типа данных, например, если вы хотите прочитать DB1, это поле будет "1"; если вы хотите прочитать T45, это поле - 45. startByteAdr: адрес первого байта, который вы хотите прочитать, например, если вы хотите прочитать DB1.DBW200, это 200. count: содержит, сколько байтов вы хотите читать. Value[]: массив байтов для записи в ПЛК. Пример: этот метод считывает первые 200 байтов DB1:

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

Дополнительная документация находится здесь:
документация S7.Net

Заметное обновление!!!

Компания Siemens недавно (20.11.2020) опубликовала документ о подключении серии S7-* к базе данных Microsoft SQL Server напрямую и без промежуточного программного обеспечения, такого как OPC Serversили S7netplusупаковка. Это означает, что вы можете выполнять запросы SQL, такие как и insertчерез внутреннюю функцию в ПЛК.
Это более быстрое и родное решение.

Сначала через TiaPortal я сделал массив строк в программном блоке.

Вы должны настроить строки подключения, как показано на рисунке ниже, где IP-адрес сервера Microsoft Sql 172.16.62.1:

Затем я сделал встроенную функцию ПЛК, следуя инструкциям в этих pdf -файлах, опубликованных Simense.

У меня есть куча запросов в моем предопределенном массиве строк, я выбираю один из них по его индексу в качестве входного параметра функции ПЛК.
затем я загрузил изменения в ПЛК. в результате у меня hello worldв MSSQL Server. введите код здесь До сих пор я запускал SQL Server Query с помощью самого ПЛК!
Запустим еще один запрос и самый сложный: .
Я сказал самый сложный, потому что у него куча записей с разными типами данных: например varchar, bool, DateTime.

Инструкция «выбрать» Используя инструкцию «выбрать», вы можете считывать данные из таблицы базы данных и выполнять с ними другие операции в вашем контроллере. Ниже мы используем пример, чтобы показать, как работает эта инструкция и какие изменения вам нужно будет внести для вашего запроса. В примере используется следующий запрос:

      Select * from Mytable

Запрошенные данные хранятся в блоке данных "SqlReceive" в структуре типа данных "typeUseCaseSpecificData". Вы должны изменять эти типы данных отдельно для каждого запроса. Это можно сделать следующим образом: 1. Запустите запись Wireshark, чтобы определить длину пакета метаданных. 2. Запустите запрос «Выберите сумму из PLCDATA_2, где Fruit = $'Apple$'». 3. Остановите запись Wireshark и найдите кадр ответа от SQL-сервера, используя фильтр «TDS». 4. Выберите фрейм и нажмите на строку «Token — ColumnMetaData».

Хорошо, теперь я хочу выбрать selectзапрос в массиве sqlqueries:

      SELECT _barcode FROM mytable where id = 4

Я снова активирую/деактивирую ввод, затем получаю результат, здесь я получаю строку «Пейман Маджиди» по ее идентификатору.

Выход:

'Пейман Маджиди'

Я могу показать вам, как это работает, Wiresharkслушая tdsпротокол.
Протокол Tabular Data Stream (TDS) позволяет установить прямое соединение с сервером Microsoft SQL. Используя TDS, вы можете войти в базу данных SQL-сервера и передавать SQL-инструкции. Таким образом можно считывать данные из базы данных или отправлять их в базу данных для хранения.

Другие вопросы по тегам