косвенная адресация
-
- Posts: 27
- Joined: Sat May 30, 2015 3:44 pm
косвенная адресация
нужно сделать пересылку данных из одной ДБ в другую, через заданное время, не получается настроить "как нужно" счетчик LOOP.. В голову лезет только переделать все на обычный счетчик и привязать к нему AR1/2. Подскажите пожалуйста ребята...Вроде задачка простая, но не один час сижу. И еще вопрос могу ли я на не открытую ДБ пересылать данные например:
L DBD [AR1,P#0.0]
T Dd44.DBD0 ????//пробовал так SF загарается(
//косвенную адресацию только познаю не ругайтесь пжл.
///////////////////////////////////////////////////
L #DB_1
T #Num_DB_Gas
OPN DB [#Num_DB_Gas]
L #db_2
T #numdb_2
OPN DI [#numdb_2]
L #ADDR_AR1
SLD 3
LAR1
L #ADDR_AR2
SLD 3
LAR2
L #Num_Loop
next: T #Num_temp_loop
L DBD [AR1,P#0.0]
T DID [AR2,P#0.0]
+AR1 P#4.0
+AR2 P#4.0
L #Num_temp_loop
LOOP next
L DBD [AR1,P#0.0]
T Dd44.DBD0 ????//пробовал так SF загарается(
//косвенную адресацию только познаю не ругайтесь пжл.
///////////////////////////////////////////////////
L #DB_1
T #Num_DB_Gas
OPN DB [#Num_DB_Gas]
L #db_2
T #numdb_2
OPN DI [#numdb_2]
L #ADDR_AR1
SLD 3
LAR1
L #ADDR_AR2
SLD 3
LAR2
L #Num_Loop
next: T #Num_temp_loop
L DBD [AR1,P#0.0]
T DID [AR2,P#0.0]
+AR1 P#4.0
+AR2 P#4.0
L #Num_temp_loop
LOOP next
-
- Site Admin
- Posts: 1122
- Joined: Wed Sep 06, 2006 12:03 pm
- Location: CIS
-
- Posts: 62
- Joined: Tue Dec 22, 2009 12:45 am
- Location: Москва
Re: косвенная адресация
Ну вы явно забыли инкремент (или декремент, не знаю как вам удобнее) на #Num_temp_loop забыли. Еще вопрос на счет инкремента адреса в P#4.0 - вы уверенны, что у вас DB будет кратен 4 байтам? Может, лучше по 2 прибавлять?
Ну и помянуть для проформы, что AR2 и DINO надо сохранять, а потом восстанавливать, иначе, при работе с FB есть шанс получить по лбу своей же косвенной адресацией.
Ну и помянуть для проформы, что AR2 и DINO надо сохранять, а потом восстанавливать, иначе, при работе с FB есть шанс получить по лбу своей же косвенной адресацией.
-
- Posts: 374
- Joined: Wed Oct 13, 2010 8:44 am
- Location: Russian Federation
Re: косвенная адресация
Декремент счётчика и проверку на ноль выполняет сам оператор LOOP.
А AR'ы таки да - оба надо сохранять в начале и восстанавливать в конце.
Непонятна в целом причина этого секса в гамаке стоя. Что мешает использовать SFC20 MOVBLK?
А AR'ы таки да - оба надо сохранять в начале и восстанавливать в конце.
Непонятна в целом причина этого секса в гамаке стоя. Что мешает использовать SFC20 MOVBLK?
-
- Posts: 27
- Joined: Sat May 30, 2015 3:44 pm
Re: косвенная адресация
смысл передать не всю DB а по 2 адреса с каждого массива через определенное время, фиксированным адресам например: DB500.DBD0 и DB500.DBD4
DB 1 имеет два: имя1 ARRAY [1..256]REAL и имя2 ARRAY [1..256]REAL
через 4 байта нужно передавать т.к REAL
"А AR'ы таки да - оба надо сохранять в начале и восстанавливать в конце." вот с этим та я и гадаю(
LOOP вырезал , формирование нового адреса сделал и работать только хочет половина...
//первая передача идет
L DBD [AR1,P#0.0]
T DB500.DBD0
//а вот нижняя не хочет
L DBD [AR2,P#0.0]
DB500.DBD4
Извращался как мог, все по "0", с AR-ами сталкиваюсь первый раз, и потом они пригодятся т.к это только "скелет" программы, так бы косвенную через память написал и не мучался. Подскажите ребятки!
DB 1 имеет два: имя1 ARRAY [1..256]REAL и имя2 ARRAY [1..256]REAL
через 4 байта нужно передавать т.к REAL
"А AR'ы таки да - оба надо сохранять в начале и восстанавливать в конце." вот с этим та я и гадаю(
LOOP вырезал , формирование нового адреса сделал и работать только хочет половина...
//первая передача идет
L DBD [AR1,P#0.0]
T DB500.DBD0
//а вот нижняя не хочет
L DBD [AR2,P#0.0]
DB500.DBD4
Извращался как мог, все по "0", с AR-ами сталкиваюсь первый раз, и потом они пригодятся т.к это только "скелет" программы, так бы косвенную через память написал и не мучался. Подскажите ребятки!
-
- Posts: 27
- Joined: Sat May 30, 2015 3:44 pm
Re: косвенная адресация
"при работе с FB", мне попадались FC а переменные засовывали в TEMP, я понял будем разбираться как " сохранять, а потом восстанавливать"
-
- Posts: 62
- Joined: Tue Dec 22, 2009 12:45 am
- Location: Москва
Re: косвенная адресация
Rex2701, спасибо, не знал. Просто всегда использую JCN по интересным мне условиям.
panf, давайте играть в телепатов дальше. Сама #Num_Loop у вас, часом, не TEMP переменная? Дальше, какие значения она принимает и откуда? Может, вы туда засылаете 1 вместо 2, например?
Ну и значение DINO в дополнение к AR1/AR2 тоже надо обязательно сохранять и восстанавливать после "косвенной адресации". А то, в лучшем случае, есть шанс попасть в несуществующую память, но это всяко лучше, чем попасть в левую область и всё там порушить.
panf, давайте играть в телепатов дальше. Сама #Num_Loop у вас, часом, не TEMP переменная? Дальше, какие значения она принимает и откуда? Может, вы туда засылаете 1 вместо 2, например?
Ну и значение DINO в дополнение к AR1/AR2 тоже надо обязательно сохранять и восстанавливать после "косвенной адресации". А то, в лучшем случае, есть шанс попасть в несуществующую память, но это всяко лучше, чем попасть в левую область и всё там порушить.
-
- Posts: 374
- Joined: Wed Oct 13, 2010 8:44 am
- Location: Russian Federation
Re: косвенная адресация
Ваш блок - это FC или FB?
Если FC, то есть подозрение, что контроллеру не нравится обращение к InstanceDB (L DID...), которая существует только у FB.
Если FC, то есть подозрение, что контроллеру не нравится обращение к InstanceDB (L DID...), которая существует только у FB.
-
- Posts: 27
- Joined: Sat May 30, 2015 3:44 pm
Re: косвенная адресация
Marrenoloth и Rex2701 вы можете прислать листинг с AR1/2 при условии соблюдения требований отправленного сообщения в Чт авг 25, 2016 6:03 pm ? хотелось бы увидеть Вашу точку зрения на данную задачу.
По коду комментирую:
"panf, давайте играть в телепатов дальше. Сама #Num_Loop у вас, часом, не TEMP переменная? Дальше, какие значения она принимает и откуда? Может, вы туда засылаете 1 вместо 2, например?"
#Num_Loop мы отбрасываем я же говорил что LOOP вырезал т.к цикл идет по таймеру предачи, соответсвенно #Num_Loop не имеет смысла использовать в него забивалось количество циклов и уменьшалось с помощью LOOP на 1 в ACCU-1L. она и должна быть TEMP т.к хронятся только во время обработки блока, и восстановливаем в конце чтоб не терялись.
Че та как то либо я не понимаю Вас либо Вы меня:) Напишите свои коды с комментариями все сразу прояснится для меня, только в STL.
По коду комментирую:
"panf, давайте играть в телепатов дальше. Сама #Num_Loop у вас, часом, не TEMP переменная? Дальше, какие значения она принимает и откуда? Может, вы туда засылаете 1 вместо 2, например?"
#Num_Loop мы отбрасываем я же говорил что LOOP вырезал т.к цикл идет по таймеру предачи, соответсвенно #Num_Loop не имеет смысла использовать в него забивалось количество циклов и уменьшалось с помощью LOOP на 1 в ACCU-1L. она и должна быть TEMP т.к хронятся только во время обработки блока, и восстановливаем в конце чтоб не терялись.
Че та как то либо я не понимаю Вас либо Вы меня:) Напишите свои коды с комментариями все сразу прояснится для меня, только в STL.
-
- Posts: 62
- Joined: Tue Dec 22, 2009 12:45 am
- Location: Москва
Re: косвенная адресация
Spoiler
Show
Code: Select all
FUNCTION_BLOCK "Class_VisuCfg_Before"
TITLE =
AUTHOR : Marr
FAMILY : Visu
NAME : VisuCfg
VERSION : 0.1
VAR
me : "UDT_Class_VisuCfg";
END_VAR
VAR_TEMP
tmp : "UDT_Class_VisuCfg";
AR1_tmp : DWORD ;
AR2_tmp : DWORD ;
DBNO_tmp : INT ;
DINO_tmp : INT ;
Byte_Count : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =Проверка на новый элемент
A( ;
L #me.SwapDB_Old;
L #me.SwapDB;
<>I ;
) ;
O( ;
L 0;
<=I ;
) ;
O( ;
L #me.TargetDB_Old;
L #me.TargetDB;
<>I ;
O( ;
L 0;
<=I ;
) ;
) ;
O( ;
L #me.TargetItemNo_Old;
L #me.TargetItemNo;
<>I ;
O( ;
L 0;
<I ;
) ;
) ;
S #me.ValueChangedOnVisu;
A #me.ValueChangedOnVisu;
L S5T#3S; // Preset 3 seconds into ACCU 1.
SD T 10; // Start On-Delay Timer
A T 10;
S #me.ValueOkOnVisu;
A #me.ValueOkOnVisu;
JCN new2;
L #me.SwapDB;
T #me.SwapDB_Old;
L #me.TargetDB;
T #me.TargetDB_Old;
L #me.TargetItemNo;
T #me.TargetItemNo_Old;
R #me.ValueOkOnVisu;
R #me.ValueChangedOnVisu;
BEC ;
new2: NOP 0;
A #me.ValueChangedOnVisu;
O #me.ValueOkOnVisu;
BEC ;
NETWORK
TITLE =Сохраняем регистры и открытые DB
TAR1 #AR1_tmp;
TAR2 #AR2_tmp;
L DBNO;
T #DBNO_tmp;
L DINO;
T #DINO_tmp;
NETWORK
TITLE =Загружаем параметры в памямять
L #me.SwapDB;
T #tmp.SwapDB;
L #me.TargetDB;
T #tmp.TargetDB;
L #me.TargetItemNo;
T #tmp.TargetItemNo;
L #me.TargetItemLenght;
T #tmp.TargetItemLenght;
NETWORK
TITLE =Цикл копирования
L 0;
T #Byte_Count;
L #tmp.TargetItemNo;
L 1;
-I ;
L #tmp.TargetItemLenght;
*D ;
SLD 3;
L P#DBX 0.0;
+D ;
LAR1 ;
OPN DB [#tmp.TargetDB];
LAR2 P##me;
OPN DI [#tmp.SwapDB];
main: L W [AR2,P#0.0];
T W [AR1,P#0.0];
+AR1 P#2.0;
+AR2 P#2.0;
L #Byte_Count;
L 2;
+D ;
T #Byte_Count;
L #tmp.TargetItemLenght;
>=D ;
JCN main;
NETWORK
TITLE =Возвращаем регистры и открытые DB
LAR1 #AR1_tmp;
LAR2 #AR2_tmp;
OPN DB [#DBNO_tmp];
OPN DI [#DINO_tmp];
END_FUNCTION_BLOCK
LAR2 P##me; - это, по факту, загрузить P#DIX0.0. Сам редактор сильно больно умный - меняет.
Это написать за вас ваш код? О.оMarrenoloth и Rex2701 вы можете прислать листинг с AR1/2 при условии соблюдения требований отправленного сообщения
Не возникало проблем никогда. Контроллер априори имеет DI, DB, AR1 и AR2. И его мало волнует какой блок программист пишет. Вообще, чертовски похоже, что, с технической точки зрения, разделение FB|FC больше формальное для возможности обозвать статические переменные памяти DI человеческими именами.Если FC, то есть подозрение, что контроллеру не нравится обращение к InstanceDB (L DID...), которая существует только у FB.
-
- Posts: 27
- Joined: Sat May 30, 2015 3:44 pm
Re: косвенная адресация
Спасибо за код Marrenoloth!Вы указывали на мои ошибки, но вся проблема та и была, в том что я не знал как их исправить или грамотно донести до Вас( Извините за дерзость пол кода та было у меня, а вот в некоторые Ваши строчки придется вникать...
-
- Posts: 27
- Joined: Sat May 30, 2015 3:44 pm
Re: косвенная адресация
знакомые специалисты при слове AR-ры делают квадратные глаза и мямлят про "пиши попроще код", так и получается спросить не у кого, безнадега, и первый блин комом, может дальше будет по проще...
-
- Posts: 62
- Joined: Tue Dec 22, 2009 12:45 am
- Location: Москва
Re: косвенная адресация
Тут могу только порекомендовать писать какие-то системные функции для упрощения основного технологического кода. Т.е. написали один раз, что важно, максимально вылизали от косяков, потом годами тиражируете решение. А то, при интеграции этой радости в большое количество подпрограмм, сами-то не вспомните через пару месяцев что этим всем сказать хотели. А уж представители заказчика вас поминать будут регулярно. Зачем вам эта порча кармы и людям и себе? Проще написать, например, клапан, который вот точно работает, когда ему дают вкл. И точно отлавливает ошибки. Всё, как он там внутри работает с третьего проекта вы уже не вспомните потому, что не надо и голова у вас будет думать не что он делает при включении, а когда его включать. А вот если вы такие конструкции в описание техпроцесса включите, то вот тут-то и начнутся проблемы.panf wrote:знакомые специалисты при слове AR-ры делают квадратные глаза и мямлят про "пиши попроще код", так и получается спросить не у кого, безнадега, и первый блин комом, может дальше будет по проще...
-
- Posts: 6
- Joined: Sun Nov 06, 2016 10:54 am
Re: косвенная адресация
Извените за глупый вопрос, ноя не смог разобраться с записью в блоке. Гуру, если не сложно подскажите, как это работает
Итак первая запись:
L P##CM // Any datapointer for CM
LAR1
L W [AR1,P#4.0]
T #i_DB // Number of DB
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data
LAR1
OPN DB [#i_DB]
L D [AR1,P#0.0] // Data transfer to Local Area
T LD 0
L D [AR1,P#4.0] // Data transfer to Local Area
T LD 4
L D [AR1,P#8.0] // Data transfer to Local Area
T LD 8
И в конце запись такая:
OPN DB [#i_DB]
L LD 0
T D [AR1,P#0.0] // Data transfer back to DB Area
L LD 4
T D [AR1,P#4.0] // Data transfer back to DB Area
L LD 8
T D [AR1,P#8.0] // Data transfer back to DB Area
Собственно вопрос в записи, где
L W [AR1,P#4.0]
T #i_DB // Здесь загружается из внешней DB первое слово (их там 4 подряд), а до этотго с адресса 0.0 по 3.7 записаны биты
L D [AR1,P#6.0]
T #i_Pointer // зачем эта запись? Нигде далее i_Pointer не учавствует!! Подскажите?
Итак первая запись:
L P##CM // Any datapointer for CM
LAR1
L W [AR1,P#4.0]
T #i_DB // Number of DB
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data
LAR1
OPN DB [#i_DB]
L D [AR1,P#0.0] // Data transfer to Local Area
T LD 0
L D [AR1,P#4.0] // Data transfer to Local Area
T LD 4
L D [AR1,P#8.0] // Data transfer to Local Area
T LD 8
И в конце запись такая:
OPN DB [#i_DB]
L LD 0
T D [AR1,P#0.0] // Data transfer back to DB Area
L LD 4
T D [AR1,P#4.0] // Data transfer back to DB Area
L LD 8
T D [AR1,P#8.0] // Data transfer back to DB Area
Собственно вопрос в записи, где
L W [AR1,P#4.0]
T #i_DB // Здесь загружается из внешней DB первое слово (их там 4 подряд), а до этотго с адресса 0.0 по 3.7 записаны биты
L D [AR1,P#6.0]
T #i_Pointer // зачем эта запись? Нигде далее i_Pointer не учавствует!! Подскажите?
-
- Posts: 374
- Joined: Wed Oct 13, 2010 8:44 am
- Location: Russian Federation
Re: косвенная адресация
Сначала AR1 выставляют на полученный указатель, а затем
его переписывают на нужные данные. И все дальнейшие инструкции, где есть AR1 - работают уже данными от указателя.
Возможно это хвост от старого кода, потому что в для приведённого отрывка сохранение во временную переменную действительно бесполезно.
Если только i_Pointer не находится где-то среди LD0...LD8.
Code: Select all
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data
LAR1
Возможно это хвост от старого кода, потому что в для приведённого отрывка сохранение во временную переменную действительно бесполезно.
Если только i_Pointer не находится где-то среди LD0...LD8.
-
- Posts: 6
- Joined: Sun Nov 06, 2016 10:54 am
Re: косвенная адресация
Rex2701, спасибо за пояснение, но странное то, что если убрать этот поинтер, то ничего не работает..
Я уже взмок, в попытках понять это.. Может есть смысл как-то подругому спрасить, например подшить исходный файл, дабы не пропустить чего нить?
Я уже взмок, в попытках понять это.. Может есть смысл как-то подругому спрасить, например подшить исходный файл, дабы не пропустить чего нить?
-
- Posts: 374
- Joined: Wed Oct 13, 2010 8:44 am
- Location: Russian Federation
Re: косвенная адресация
Покажи область TEMP для блока, чтобы видеть адрес #i_Pointer.
-
- Posts: 6
- Joined: Sun Nov 06, 2016 10:54 am
Re: косвенная адресация
Rex2701, что я все понял, а может и нет.
Так как переменная СМ является в формате ANY, то следовательно в 4 байте лежит номер ДБэшки, которую необходимо потом открыть, то есть с записью вида
L P##CM // Any datapointer for CM
LAR1
L W [AR1,P#4.0]
T #i_DB // Number of DB
уже понятно, так как в #i_DB загоняется номер DB.
и затем открываем необходимую DB
OPN DB [#i_DB]
Немного полистав формат ANY, я пришел к выводу, что данные из ДБэшки лежат в 6 и 8 слове. Я так понимаю, что запись в низу нужна для того, что бы при прерывании контроллера инфа оставалась во временной переменной FC, которая не имеет своей ДБ.
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data
нужно загонять во временную переменную дабы
Так как переменная СМ является в формате ANY, то следовательно в 4 байте лежит номер ДБэшки, которую необходимо потом открыть, то есть с записью вида
L P##CM // Any datapointer for CM
LAR1
L W [AR1,P#4.0]
T #i_DB // Number of DB
уже понятно, так как в #i_DB загоняется номер DB.
и затем открываем необходимую DB
OPN DB [#i_DB]
Немного полистав формат ANY, я пришел к выводу, что данные из ДБэшки лежат в 6 и 8 слове. Я так понимаю, что запись в низу нужна для того, что бы при прерывании контроллера инфа оставалась во временной переменной FC, которая не имеет своей ДБ.
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data
нужно загонять во временную переменную дабы
-
- Posts: 6
- Joined: Sun Nov 06, 2016 10:54 am
Re: косвенная адресация
а тут скрин ТЕМРа
-
- Posts: 6
- Joined: Sun Nov 06, 2016 10:54 am
Re: косвенная адресация
L D [AR1,P#6.0]
T #i_Pointer // Pointer for data
Короче, как бы необходима эта запись, вот только за чем?
T #i_Pointer // Pointer for data
Короче, как бы необходима эта запись, вот только за чем?
-
- Posts: 6
- Joined: Sun Nov 06, 2016 10:54 am
Re: косвенная адресация
Всем спасибо, разобрался - на картинке пояснение
Для доступа адресного регистра к данным...
Для доступа адресного регистра к данным...
-
- Posts: 13
- Joined: Tue Nov 29, 2016 1:34 pm
- Location: germany
Re: косвенная адресация
Приветствую!
Помогите начинающему разобраться...
Есть задание:
Когда на входе E0.0 "1", в блок DB1 (ARRAY(1..100) INT)записываются числа от 1 до 100.
Когда на входах E0.0 и E0.1 "1", то эти же числа записываются в тот же блок DB, но в обратном порядке, то есть от 100 до 1.
Вот реализация в симатике (используется блок FC ):
U E 0.0
SPBN M001
L 100
loop: T MW 0 // Schleifenzähler
SLW 4 // Pointer in Verdoppelung da INT
L P#2.0 // möglich auch:L 16 (nicht 2!)
-D // 2 Byte von Pointer abziehen
T MD 2 // Vermittler, enthält die DB-Adresse
U E 0.1
SPBN M002
L P#198.0 // Adresse "umdrehen"
L MD 2 // hoher Schleifenzähler = niedrige Adresse
-D // niedriger Schleifenzähler = hohe Adresse
T MD 2
M002: AUF DB 1 Вот в этом и проблема! -
ОШИБКА СИНТАКСИСА
L MW 0 // aktueller Wert des Schleifenzählers (100 ... 0)
T DBW [MD 2] // im DB an die entsprechende Adresse speichern
L MW 0
LOOP loop
M001: BE
В обычном SIMATIC Step7 всё хорошо получилось, а вот в TIA v.14 в AWL (STL) не получается - говорит "Ошибка синтаксиса"
Помогите разобраться -как открыть блок DB в данном случае?
Помогите начинающему разобраться...
Есть задание:
Когда на входе E0.0 "1", в блок DB1 (ARRAY(1..100) INT)записываются числа от 1 до 100.
Когда на входах E0.0 и E0.1 "1", то эти же числа записываются в тот же блок DB, но в обратном порядке, то есть от 100 до 1.
Вот реализация в симатике (используется блок FC ):
U E 0.0
SPBN M001
L 100
loop: T MW 0 // Schleifenzähler
SLW 4 // Pointer in Verdoppelung da INT
L P#2.0 // möglich auch:L 16 (nicht 2!)
-D // 2 Byte von Pointer abziehen
T MD 2 // Vermittler, enthält die DB-Adresse
U E 0.1
SPBN M002
L P#198.0 // Adresse "umdrehen"
L MD 2 // hoher Schleifenzähler = niedrige Adresse
-D // niedriger Schleifenzähler = hohe Adresse
T MD 2
M002: AUF DB 1 Вот в этом и проблема! -
ОШИБКА СИНТАКСИСА
L MW 0 // aktueller Wert des Schleifenzählers (100 ... 0)
T DBW [MD 2] // im DB an die entsprechende Adresse speichern
L MW 0
LOOP loop
M001: BE
В обычном SIMATIC Step7 всё хорошо получилось, а вот в TIA v.14 в AWL (STL) не получается - говорит "Ошибка синтаксиса"
Помогите разобраться -как открыть блок DB в данном случае?