Как выбрать из таблицы требуемое значение.

Автоматизация технологических процессов, системы управления, АСУ ТП, АСКУЭ, программирование ПЛК, человеко-машинный интерфейс, сетевое оборудование, протоколы

Как выбрать из таблицы требуемое значение.

Сообщение dimon64 » 10 янв 2018, 16:39

Здравствуйте, коллеги!
Есть задача определить количество газа в ёмкости. К ёмкости подключены датчики давления и температуры и есть таблица,
в которой по горизонтали значения давления, а по вертикали - температуры. Соответственно искомое значение лежит на их пересечении.
Контроллер должен выбрать ближайшее значение давления и температуры к показаниям датчиков и исходя из этого определить табличное значение Контроллер S7-300. Формулы не предлагать, по ряду причин они не прокатывают.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
dimon64
Любитель
 
Сообщения: 51
Зарегистрирован: 12 мар 2015, 14:30

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 10 янв 2018, 17:41

Это типовая задача для использования косвенной адресации.
Первое, что приходит в голову:
Сделать массивы:
Код: Выделить всё
   P : ARRAY  [1 .. 15 ] OF //значения давления
   REAL ;   
   T : ARRAY  [1 .. 24 ] OF //значения температуры
   REAL ;   
   S : ARRAY  [1 .. 15, 1 .. 24 ] OF //значения веса
   REAL ;   


Перебором находим индекс ближайшего значения давления в массиве Р. И индекс температуры в массиве Т.
А по известным индексам ищем в массиве S вес. Поиск в массиве делается с помощью оператора LOOP

Про массивы
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

Re: Как выбрать из таблицы требуемое значение.

Сообщение Михайло » 10 янв 2018, 18:29

И ещё вот длинную формулу применить отсюда:
https://ru.wikipedia.org/wiki/Билинейная_интерполяция

Изображение

x1, x2 - это координаты, которые окружают искомую координату x (температура).
y1, y2 - это координаты, которые окружают искомую координату y (давление).
f(x,y) - вес
Михайло
Администратор
 
Сообщения: 3749
Зарегистрирован: 19 сен 2012, 19:16

Re: Как выбрать из таблицы требуемое значение.

Сообщение dimon64 » 11 янв 2018, 08:33

Автоматизатор, Михайло, спасибо, но нет опыта программирования подобных вещей, не знаю как подступиться. Мне бы пример подобного кода...
dimon64
Любитель
 
Сообщения: 51
Зарегистрирован: 12 мар 2015, 14:30

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 11 янв 2018, 13:49

Делал как-то динамически наполняемую таблицу, по которой выбиралось значение. В текстовом файле исходник.
Нелинейность.pdf

Example.txt
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

Re: Как выбрать из таблицы требуемое значение.

Сообщение dimon64 » 12 янв 2018, 09:56

Автоматизатор писал(а):Делал как-то динамически наполняемую таблицу, по которой выбиралось значение. В текстовом файле исходник.

Спасибо.
Сделал тестовый блок данных, определил значения и температуры, это как бы координаты искомого веса. Как их теперь подставить в нужное место?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
dimon64
Любитель
 
Сообщения: 51
Зарегистрирован: 12 мар 2015, 14:30

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 12 янв 2018, 14:14

В программе, которую я выложил, для поиска используется адресный регистр. Как с ним работать обучают на углубленных курсах Step7 за 3 дня. По книгам дольше. Но надо понимать команды кода.

Еще один упрощенный пример. С подробным комментарием. Грузит время #WD_T.ET в ячейку с номером State массива ArrTime

Код: Выделить всё
VAR
  ArrTime : ARRAY  [0 .. 10 ] OF //Контроль времени нахождения в состоянии
  TIME  := T#0MS;
  State : INT ;   //Состояние станка
  WD_T : "TON";   //Таймер контроля длительности нахождения в состоянии
END_VAR

TITLE =Сохранение времени нахождения в состоянии в памяти
//Индекс элемента массива соответствует номеру текущего состояния
      L     P##ArrTime; // Загрузка адреса начала  массива в аккумулятор, тип POINTER
      LAR1  ; // загрузка адреса начала  массива в регистр
      L     #State; // загрузка номера элемента
      ITD   ; // Преобразование в двойное целое
      L     L#32; // Двойное целое=32 бита
      *D    ; // умножение
      TAR2  ; // Запоминание смещения в битах в адресном регистре-2
      +D    ; // в АСС1 - адрес нужного элемента БЕЗ СМЕЩЕНИЯ!
      TAR1  ; // Загрузка в аккумулятор адреса начала массива
      +D    ; // Сложение со смещением
      LAR1  ; // Загрузка адреса нужного элемента в AR1
      L     #WD_T.ET; // Загрузка текущего времени
      T     DID [AR1,P#0.0]; // Загрузка значения в элемент массива
      T     MD   222; // и в ячейку памяти для контроля
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

Re: Как выбрать из таблицы требуемое значение.

Сообщение Andrey.wys » 12 янв 2018, 14:15

Мне кажется, что подобные вещи проще в scl сделать.
Andrey.wys
Любитель
 
Сообщения: 53
Зарегистрирован: 10 янв 2016, 00:35

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 12 янв 2018, 14:18

Andrey.wys писал(а):проще в scl

Очень может быть. В STL нельзя пользоваться обращением к элементу массива, заданной переменной.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 12 янв 2018, 14:27

В 300-ом я с SCL не работал, поэтому не вспомнил. А в ТИА-портале с 1200 действительно получалось просто можно опрашивать i-
тый элемент массива:
Код: Выделить всё
T_P[i]


тогда и с адресными регистрами и указателями не разбираться.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

Re: Как выбрать из таблицы требуемое значение.

Сообщение Andrey.wys » 12 янв 2018, 15:19

В scl программа будет состоять из 3 массивов и 2-х циклов для определения номера элемента третьего массива.
Andrey.wys
Любитель
 
Сообщения: 53
Зарегистрирован: 10 янв 2016, 00:35

Re: Как выбрать из таблицы требуемое значение.

Сообщение Михайло » 12 янв 2018, 17:10

Никто не мешает написать простую функцию на STL, которая будет извлекать для SCL i-ый элемент некоторого массива.
Михайло
Администратор
 
Сообщения: 3749
Зарегистрирован: 19 сен 2012, 19:16

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 12 янв 2018, 17:28

Как раз все наоборот: простая - она на SCL! :)
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

Re: Как выбрать из таблицы требуемое значение.

Сообщение Михайло » 12 янв 2018, 17:46

У тебя все примеры на языке STL. SCL - это паскалеподобный язык.
Михайло
Администратор
 
Сообщения: 3749
Зарегистрирован: 19 сен 2012, 19:16

Re: Как выбрать из таблицы требуемое значение.

Сообщение Михайло » 12 янв 2018, 17:52

Я имел в виду, что на Step 7 v5.x для извлечения элемента из массива по индексу проще делать на STL.
Михайло
Администратор
 
Сообщения: 3749
Зарегистрирован: 19 сен 2012, 19:16

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 12 янв 2018, 18:04

Михайло писал(а):У тебя все примеры на языке STL. SCL - это паскалеподобный язык.

Да, почти.
Михайло писал(а):Я имел в виду, что на Step 7 v5.x для извлечения элемента из массива по индексу проще делать на STL.

Да, я так ипонял.

Автоматизатор писал(а):T_P[i]

Это "код" на SCL! :)

STL не дает извлекать данные так (где i - целое число).

В ТИА SCL стал гораздо удобней из-за стандартного интерфейса объявления переменных.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

Re: Как выбрать из таблицы требуемое значение.

Сообщение Михайло » 12 янв 2018, 18:07

Погоди, давай вернёмся к Step 7 v5.x, в котором я начинал когда-то писать программы. Как тут объявляется массив и как извлекать элемент массива по индексу-переменной?
Михайло
Администратор
 
Сообщения: 3749
Зарегистрирован: 19 сен 2012, 19:16

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 12 янв 2018, 18:17

Михайло писал(а):Погоди, давай вернёмся к Step 7 v5.x, в котором я начинал когда-то писать программы. Как тут объявляется массив и как извлекать элемент массива по индексу-переменной?

На STL - только так, как я привел примеры (через косвенную адресацию)
Но если есть доп. пакет (или проф. версия Степ7) - то можно (и удобней) это делать на SCL.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

Re: Как выбрать из таблицы требуемое значение.

Сообщение Михайло » 12 янв 2018, 18:28

ааа. ну теперь вспомнил, что Step7 Классик не только слабоват, но и ещё просит много денег. :)
Михайло
Администратор
 
Сообщения: 3749
Зарегистрирован: 19 сен 2012, 19:16

Re: Как выбрать из таблицы требуемое значение.

Сообщение Автоматизатор » 12 янв 2018, 18:45

Я заказал для проекта

6ES7810-5CC12-0YA5
SIMATIC S7 STEP 7 Prof 2017/V14 SP1 combo incl. TIA Portal floating license for 1 user E-SW, SW and docu. on DVD, license key on USB-Stick, Class A, 5/6 languages (Ge,En,Fr,It,Sp)/(Cn), excecutable under Windows Server 2008 R2 SP1, Windows Server 2012 R2, Windows Server 2016, Windows 7 SP1, Windows 10 Professional, Windows 10 Enterprise Reference-HW: S7-300/400 (S7-1200/1500)

Я так понимаю, что сейчас для 300 и 1500 надо брать профессиональную.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 943
Зарегистрирован: 09 окт 2012, 05:18

След.

Вернуться в АВТОМАТИЗАЦИЯ

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2