SCL Косвенная адресация или работа со строками

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
taburedhot
Posts: 3
Joined: Mon Jul 16, 2012 10:26 am

SCL Косвенная адресация или работа со строками

Post by taburedhot »

Как скопировать строку из одной DB в другую?

В одной DB есть массив строк String[15], DB и массив строк и массив строк имеют символьные имена.
т.е. к данным строкам я могу обращаться следующим образом:
Lines.MyStr[3]

строки из данного массива хочется скопировать в другую DB, которая не имеет массива, но адреса строк вычисляются определенным образом.
И ко строкам данной DB я могу обращаться только указывая их адрес:

DB500.DBB - первый байт моей строки
DB500.DBB[i+1] - второй байт моей строки
итд

Могу ли я как то получить адрес строки из первой DB по символьному имени?
sania
Site Admin
Posts: 1387
Joined: Sat Aug 13, 2005 6:15 am

Re: SCL Косвенная адресация или работа со строками

Post by sania »

разговор идёт о портале?
в свойствах дб убери галку "оптимизированный доступ", компильни, у строк появятся адреса(офсеты) и ничего переносить не надо.
копирование из одного места в другое делают при помощи "мув блок".
taburedhot
Posts: 3
Joined: Mon Jul 16, 2012 10:26 am

Re: SCL Косвенная адресация или работа со строками

Post by taburedhot »

нет, речь идет не о портале. для мув блока нужно знать адреса перемещаемого блока данных. вот как раз на этом я и споткнулся.
как получить адрес символьной переменной. Например такой Lines.MyStr[3] (где Lines - DB. А MyStr -строка, или еще того хуже структура..)
kaa1979
Posts: 43
Joined: Sat Mar 27, 2010 8:14 am

Re: SCL Косвенная адресация или работа со строками

Post by kaa1979 »

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;