Как скопировать строку из одной DB в другую?
В одной DB есть массив строк String[15], DB и массив строк и массив строк имеют символьные имена.
т.е. к данным строкам я могу обращаться следующим образом:
Lines.MyStr[3]
строки из данного массива хочется скопировать в другую DB, которая не имеет массива, но адреса строк вычисляются определенным образом.
И ко строкам данной DB я могу обращаться только указывая их адрес:
DB500.DBB - первый байт моей строки
DB500.DBB[i+1] - второй байт моей строки
итд
Могу ли я как то получить адрес строки из первой DB по символьному имени?
SCL Косвенная адресация или работа со строками
-
- Posts: 3
- Joined: Mon Jul 16, 2012 10:26 am
-
- Site Admin
- Posts: 1387
- Joined: Sat Aug 13, 2005 6:15 am
Re: SCL Косвенная адресация или работа со строками
разговор идёт о портале?
в свойствах дб убери галку "оптимизированный доступ", компильни, у строк появятся адреса(офсеты) и ничего переносить не надо.
копирование из одного места в другое делают при помощи "мув блок".
в свойствах дб убери галку "оптимизированный доступ", компильни, у строк появятся адреса(офсеты) и ничего переносить не надо.
копирование из одного места в другое делают при помощи "мув блок".
-
- Posts: 3
- Joined: Mon Jul 16, 2012 10:26 am
Re: SCL Косвенная адресация или работа со строками
нет, речь идет не о портале. для мув блока нужно знать адреса перемещаемого блока данных. вот как раз на этом я и споткнулся.
как получить адрес символьной переменной. Например такой Lines.MyStr[3] (где Lines - DB. А MyStr -строка, или еще того хуже структура..)
как получить адрес символьной переменной. Например такой Lines.MyStr[3] (где Lines - DB. А MyStr -строка, или еще того хуже структура..)
-
- Posts: 43
- Joined: Sat Mar 27, 2010 8:14 am
Re: SCL Косвенная адресация или работа со строками
Code: Select all
VAR_TEMP
TmpPtr: ANY; // временный указатель
TmpPtrStruct AT TmpPtr: STRUCT // рассмотрим указатель как структуру
S7Const: BYTE; // 10h для S7
DataType: BYTE; // тип данных (00h Null pointer; 01h BOOL; 02h BYTE и т.д.)
Repetition: INT; // кол-во элементов типа DataType
DBnumber: WORD; // номер дб или 0
Ptr: DWORD; //указатель на стартовый адрес: Byte0 - область памяти (80h I/Oarea; 81h Input area; 82h Output area и т.д.), Byte1..3 адрес(бит) в этой области
END_STRUCT;
TmpStartAddr: INT;
i: INT;
END_VAR
TmpPtr := Lines.MyStr[3];
TmpStartAddr := DWORD_TO_INT(TmpPtrStruct.Ptr AND 16#00FFFFFF)/8;// обнулили byte0 и сдвинули на 3 бита вправо (деление на 2^3=8) - получили стартовый байт
FOR i:= 0 TO StrLenghtOfMyStr BY 1 DO //StrLenghtOfMyStr - длина строки
DB500.DB[i]:=WORD_TO_BLOCK_DB(TmpPtrStruct.DBnumber).DB[TmpStartAddr+i];
END_FOR;