SIEMENS, DF&PD

Предыдущее посещение: Вс июл 10, 2016 16:37 Текущее время: Вс июл 10, 2016 16:37

Часовой пояс: UTC + 3 часа




 [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: STL step5, абсолютная адресация к слову блока данных
СообщениеДобавлено: Вс ноя 23, 2014 0:03 
Не в сети
Новый писатель

Зарегистрирован: Пн авг 18, 2014 19:31
Сообщения: 18
Добрый вечер. Переписываю функциональный блок с языка step5 (cpu928) на step7. Ниже дан начальный кусок этого функционального блока. Все комментарии сделал я, и возможно где-то ошибся. В этом куске не понятны строки 000Fh и 0010h. А именно, если я правильно всё понял, в строке 000Fh в ACCU1 записывается стартовый адрес блока данных (DB231) минус 1 (т.к. АДР[DW10]-11). Вопрос: что же находится по этому адресу?
П.С. Я предполагаю, что DB231.DW255. Но так ли это?

Код:
0008  :A  DB231   //вызов блока данных 231
0009  :L  BS34    //загрузка базового адреса списка адресов DB
000A  :ADD KF+231 //прибавить 231 к ACCU1 (получили адрес строки, в которой находится стартовый адрес DB231)
000C  :LIR  1     //Загрузить в ACCU1 стартовый адрес блока данных DB231
000D  :ADD BN 10  //прибавить к ACCU1 число 10 (получили абсолютный адрес DW10)
000E  :T DW3      //передать абсолютный адрес DW10 в DW3
000F  :ADD BN -11 //прибавить к ACCU1 число -11 (что мы тут получили?)
0010  :LIR  1     //загрузить в ACCU1 содержимое ячейки по адресу в ACCU1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 23, 2014 16:26 
Не в сети
Новый писатель

Зарегистрирован: Пн авг 18, 2014 19:31
Сообщения: 18
Я, кажется, понял в строке 000Fh мы получаем адрес 5-го слова заголовка блока данных №231, в котором содержится количество слов в блоке данных, включая размер заголовка блока данных. А как получить длину блока данных в step7 на STL?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 23, 2014 17:44 
Не в сети
Новый писатель

Зарегистрирован: Пн авг 18, 2014 19:31
Сообщения: 18
И подскажите, пожалуйста, что из себя представляет длина блока данных в заголовке блока данных? Это количество занятных слов в текущий момент или это максимальное количество слов в блоке данных?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 24, 2014 9:25 
Не в сети
Ведущий специалист

Зарегистрирован: Вт янв 11, 2005 9:27
Сообщения: 5029
Откуда: SIEMENS I IA AS Москва
Скачиваем документацию по CPU928B по ссылке
http://support.automation.siemens.com/W ... en/1085940
Открываем эту документацию. И на стр. 405 совершенно случайно находим прекрасное описание структуры заголовка блока.
Что такое "количество занятных слов в текущий момент"? Блок данных находится в контроллере. У него есть определенная длина. Вот эта длина этого конкретного блока данных с конкретным номером и находится в заголовке этого блока.
Информацию о длине блока данных можно получить, например, посредством SFC24 в S7-300.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 25, 2014 17:53 
Не в сети
Новый писатель

Зарегистрирован: Пн авг 18, 2014 19:31
Сообщения: 18
Сергей, спасибо! Я новичок в STL, поэтому сильно не пинайте. У меня в step 5 программе происходит чтение и запись по абсолютному адресу за пределами блока данных. Такое возможно? Я застрял в непонимании как это можно переписать на step7...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 25, 2014 18:15 
Не в сети
Новый писатель

Зарегистрирован: Пн авг 18, 2014 19:31
Сообщения: 18
В коде ниже в строке 0013h, как я понял происходит проверка, превышает ли смещение, записанное в MW202, длину блока. И если да, то в строке 0018h происходит чтение с этого смещения в слова DW9 и DW10.
Код:
0008  :A  DB231   //вызов блока данных 231
0009  :L  BS34    //загрузка базового адреса списка адресов DB
000A  :ADD KF+231 //прибавить 231 к ACCU1 (получили адрес строки, в которой находится стартовый адрес DB231)
000C  :LIR  1     //Загрузить в ACCU1 стартовый адрес блока данных DB231
000D  :ADD BN 10  //прибавить к ACCU1 число 10
000E  :T DW3      //передать абсолютный адрес DW10 в DW3
000F  :ADD BN -11 //прибавить к ACCU1 число -11 (получили адрес, указывающий на 5-е слово заголовка блока данных DB231 - количество слов в блоке данных, включая заголовок (5 слов))
0010  :LIR  1     //загрузить в ACCU1 размер блока данных 231 (из 5-го слова заголовка блока данных 231)
0011  :ADD BN -16 //вычесть из размера блока данных число 16 (т.е. 5 слов заголовка и 11 используемых первых слов блока данных №231)
0012  :L  MW202   //загрузка содержимого слова меркеров MW202 в ACCU1 (содержимое ACCU1 при этом записывается в ACCU2)
0013  :<F         //Если ACCU2 меньше, чем ACCU1 (т.е. количество незанятых слов блока данных №231 меньше указанного количества слов в MW202), то RLO=1, иначе RLO=0
0014  :BEC        //завершение обработки фукционального блока, если RLO=1
0015  :L DW 3     //загрузка данных из DW3 в ACCU1 (загружается абсолютный адрес DW10). При этом в ACCU2 записывается содержимое ACCU1 (значение MW202)
0016  :+F         //ACCU1=ACCU1-L + ACCU2-L (ACCU1-L и ACCU2-L как числа с фиксированной запятой по 16 бит): к абсолютному адресу DW10 прибавляется значение MW202
0017  :L DW 3     //загрузка данных из DW3 в ACCU1 (загружается абсолютный адрес DW10). При этом в ACCU2 записывается АБС_АДР(DW10)+MW202
0018  :TNW 2      //передать 2 слова: 1 слово из адреса (АБС_АДР(DW10)+MW202) в АБС_АДР(DW10), 2 слово из адреса (АБС_АДР(DW10)+MW202-1) в (АБС_АДР(DW10)-1)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 28, 2014 23:00 
Не в сети
Новый писатель

Зарегистрирован: Пн авг 18, 2014 19:31
Сообщения: 18
Добрый день!
Может этот код (в комментарии выше) является шаблонным или похож на библиотечный? Допустимо ли писать/читать за пределами блока данных - как это делается в коде выше через абсолютную адресацию? Верно ли, что в коде выше выполняется чтение/запись за пределами блока данных (после строки 0014: BEC)? Помогите пожалуйста разобраться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 30, 2014 16:18 
Не в сети
Ведущий специалист

Зарегистрирован: Вт янв 11, 2005 9:27
Сообщения: 5029
Откуда: SIEMENS I IA AS Москва
При переходе с контроллеров серии S5 на S7 необходимо усвоить одну очень важную вещь - программный язык Step5 позволяет написать программу, которая будет работать с ячейками памяти контроллера напрямую, более того, можно (и я с этим реально сталкивался) написать такую программу, которая будет изменять сама себя. Это возможно по той-же самой причине - наличию возможности прямой работы к любой ячейкой памяти контроллера и полного описания структуры памяти контроллеров S5. Известны также все машинные коды команд Step5.
Такой возможности в Step7 нет - структура памяти контроллера известно только поверхностно, команд работы напрямую с ячейками памяти нет.
По причине, которая изложена выше, во многих случаях перехода с S5 на S7 программу гораздо проще написать заново, имея представление какую функцию выполняет тот или иной FB.

"Верно ли, что в коде выше выполняется чтение/запись за пределами блока данных (после строки 0014: BEC)". За пределами или не за пределами очевидно будет определяться содержимым MW202 (значения которого кроме вас никто не знает). Ну и потом скорее всего в строках 10, 11 и 12 как раз идет проверка достаточности длины для записи в блоке данных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 30, 2014 20:11 
Не в сети
Новый писатель

Зарегистрирован: Пн авг 18, 2014 19:31
Сообщения: 18
Кухаренко Сергей писал(а):
При переходе с контроллеров серии S5 на S7 необходимо усвоить одну очень важную вещь - программный язык Step5 позволяет написать программу, которая будет работать с ячейками памяти контроллера напрямую, более того, можно (и я с этим реально сталкивался) написать такую программу, которая будет изменять сама себя. Это возможно по той-же самой причине - наличию возможности прямой работы к любой ячейкой памяти контроллера и полного описания структуры памяти контроллеров S5. Известны также все машинные коды команд Step5.
Такой возможности в Step7 нет - структура памяти контроллера известно только поверхностно, команд работы напрямую с ячейками памяти нет.
По причине, которая изложена выше, во многих случаях перехода с S5 на S7 программу гораздо проще написать заново, имея представление какую функцию выполняет тот или иной FB.


я немного ознакомился с системой команд и организацией памяти в Step 5 и Step7 и в принципе понимаю как переписать все части программы, кроме той, которая приведена в куске кода. Человека, который писал код или который знал бы, что там делается к сожалению не найти уже.

Кухаренко Сергей писал(а):
"Верно ли, что в коде выше выполняется чтение/запись за пределами блока данных (после строки 0014: BEC)". За пределами или не за пределами очевидно будет определяться содержимым MW202 (значения которого кроме вас никто не знает).

В MW202 периодически записываются чётные числа 2, 4, 8... и т.д. примерно до 160. Затем вызывается данный кусок кода, находящийся в функциональном блоке motor (остальной код этого функционального блока я не привёл, т.к. он тривиален и легко преобразуется в step7).

Кухаренко Сергей писал(а):
Ну и потом скорее всего в строках 10, 11 и 12 как раз идет проверка достаточности длины для записи в блоке данных.

Я тоже так подумал сначала, но оказалось наоборот:

1) в строке 10, 11 определяется длина незанятой области блока данных 231 (L1)
2) в строке 12, 13 сравнивется эта длина с той, что находится в MW202 (L2)
3) Если эта длина меньше, чем MW202 (L1<L2, т.е. длина блока данных недостаточна), то выполняются строки 15-18 (как показано на рисунке ниже), иначе выход из функционального блока motor. На рисунке границы блока данных 231 обозначены жирной линией.
Судя по названию функционального блока motor, он управляет работой некоторого двигателя, если это как-то может помочь в понимании этого кода.

Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн дек 01, 2014 9:07 
Не в сети
Ведущий специалист

Зарегистрирован: Вт янв 11, 2005 9:27
Сообщения: 5029
Откуда: SIEMENS I IA AS Москва
Уважаемый albertyak! Я не собираюсь вас в чем то убеждать. Если вы думаете, что все происходит так, как вы изобразили на своей картинке, то можете так считать дальше! Но на самом деле за пределы блока DB231 действия функции не выходят. Еще раз повторяю - в строках кода 0010-0013 выясняется является ли длина блока данных после DW10 больше чем величина записанная в MW202. И именно эти команды определяют то условие, что мы никогда не выдем за пределы блока данных DB231 при копировании двух слов командой TNW2.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 02, 2014 0:52 
Не в сети
Новый писатель

Зарегистрирован: Пн авг 18, 2014 19:31
Сообщения: 18
Кухаренко Сергей писал(а):
Уважаемый albertyak! Я не собираюсь вас в чем то убеждать. Если вы думаете, что все происходит так, как вы изобразили на своей картинке, то можете так считать дальше! Но на самом деле за пределы блока DB231 действия функции не выходят. Еще раз повторяю - в строках кода 0010-0013 выясняется является ли длина блока данных после DW10 больше чем величина записанная в MW202. И именно эти команды определяют то условие, что мы никогда не выдем за пределы блока данных DB231 при копировании двух слов командой TNW2.

Сергей, спасибо огромное!
Вы супермен!
Я строку 13-14 не правильно интерпретировал. А ведь 100 раз там всё перепроверил - чудеса да и только. Запутал сам себя. Нету больше к себе доверия.

П.С.
Для тех, кто будет переводить программу со step5 на step7 советую полезную статью для быстрого понимания косвенной адресации http://www.plcdev.com/siemens_s7_indirect_addressing


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group