При нажатии на кнопку "скопировать тренд" в СП-270, запись останавливается, происходит копирование тренда, далее тренд выгружается на компьютер и предоставляется возможность либо продолжить запись трендов, либо скачать следующую часть.
В свойствах тренда нужно указать первый регистр вручную (по умолчанию выбирается автоматически), рассчитать требуемый объем памяти для этого тренда в регистрах и соответственно для следующего тренда выбрать исходя из этого.
Первый регистр для доступной для скачивания памяти выбрал 1030, но надо помнить, что по протоколу он доступен под 1030+10000 = 11030, и так для всех.
Скрипт кнопки представлен ниже. Каждому графику своя кнопка. Еще отдельно кнопка "Старт", для возобновления записи. Можно дописать, что при обнаружении незаконченного тренда, выводится сообщение, что есть следующая часть.
Код:
int FirstPnt = 126065; // первый регистр тренда (смотреть в св-вах)
int LengthTrnd = 6000; // длина тренда в точках
int iw = 1030; // первый регистр памяти для копирования
int readed; // буферная переменная
int cnt = 1; // индексы
int startAddress;
int IterOfCopy;
int Ntrnds = 1; // количество трендов в графике (рассм только 1 или 2)
int ix;
ResetPSB(503); // остановить запись трендов, потом отдельно кнопкой старт вернуть
Delay(100); // подождем на всякий случай
Read(HMI_LOCAL_MCH, 0, TYPE_PSW, 1001, 0, TYPE_WORD, &IterOfCopy); // смотрим какая часть по счету (по умолч = 0)
if (Ntrnds == 1){ix = 7;}else if (Ntrnds == 2) {ix = 8;} // множитель зависящий от кол-ва трендов
if (LengthTrnd > 6500)
{
startAddress = FirstPnt + (6500*ix*IterOfCopy); // если длина превысила 6500, то делим на части
} else {startAddress = FirstPnt;}
cnt = 1;
iw = 1030 + (6500*ix*IterOfCopy); // первый регистр для записи зависит от текущей части
while ((cnt <= LengthTrnd*ix) && (cnt <=52000)) //пока не превысит длину или допустимую область
{
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, startAddress, 0, TYPE_WORD, &readed);
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, iw, 0, TYPE_WORD, readed);
iw++;
cnt++;
startAddress++;
}
IterOfCopy++;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 1001, 0, TYPE_WORD, IterOfCopy); // записываем, что первая часть скачана
Решение довольно сыровато, конечно, но тестировалось и работает.