Страница 25 из 28 ПерваяПервая ... 152324252627 ... ПоследняяПоследняя
Показано с 241 по 250 из 290

Тема: CODESYS V3.5. Архивация

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,825

    По умолчанию

    Цитата Сообщение от alexander.kinsfator@gmail.com Посмотреть сообщение
    Заработало, моя невнимательность помешала.
    А вот при использовании полного пути '/root/CODESYS/PlcLogic/visu/title.bmp' не работает.
    Так что проблема видимо не в том, что файл находится не во внутренней памяти, а в том, что он "не понимает" полный путь, а значит накопитель SD нам пока не светит.
    Все верно - абсолютные пути не работают из-за соображений безопасности.
    Но это не мешает работать с накопителями.
    Используйте плейсхолдеры $$USB$$ и $$SD$$.

  2. #2

    По умолчанию

    Класс, работает. Получилось скачать файлы с SD через Web- клиента.
    Пора видео переделывать :-). Там Вы говорили, что пока нельзя.

  3. #3
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,825

    По умолчанию

    Цитата Сообщение от alexander.kinsfator@gmail.com Посмотреть сообщение
    Класс, работает. Получилось скачать файлы с SD через Web- клиента.
    Пора видео переделывать :-). Там Вы говорили, что пока нельзя.
    Плейсхолдеры накопителей были добавлены как раз вскоре после записи того видео.)

  4. #4

    По умолчанию

    Привет.
    Подскажите, будут ли траблы или нюансы если использовать код на основе приложенного здесь примера, но:

    1. Запись в файл архивации происходит автоматически при завершении цикла работы оборудования. Записывается структура с данными. Реализовано как тут в примере, но только операции write_to_file.

    2. Пока идет цикл работы оборудования, оператор может через другое меню на ПЛК зайти в пункт меню "Архивы" и листать данные. Т.е. нажимая, на клавиши "вперед" или "назад" происходит разовое чтение структуры с данными. Реализовано как тут в примере, но только операции read_to_file.

    Т.е. запись в файл и чтение из файла не будут конфликтовать? Ведь операции записи и чтения будут асинхронными (независимыми). Могут случится одновременные действия.
    Спасибо.
    Последний раз редактировалось ВладОвен; 11.10.2022 в 16:39.

  5. #5
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,825

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Привет.
    Подскажите, будут ли траблы или нюансы если использовать код на основе приложенного здесь примера, но:

    1. Запись в файл архивации происходит автоматически при завершении цикла работы оборудования. Записывается структура с данными. Реализовано как тут в примере, но только операции write_to_file.

    2. Пока идет цикл работы оборудования, оператор может через другое меню на ПЛК зайти в пункт меню "Архивы" и листать данные. Т.е. нажимая, на клавиши "вперед" или "назад" происходит разовое чтение структуры с данными. Реализовано как тут в примере, но только операции read_to_file.

    Т.е. запись в файл и чтение из файла не будут конфликтовать? Ведь операции записи и чтения будут асинхронными (независимыми). Могут случится одновременные действия.
    Спасибо.

    Добрый день.
    Могу только сказать, что решить вашу задачу, безусловно, можно - в т.ч. используя в качестве основы пример из обсуждаемого в этой теме документа.

    CODESYS позволяет открыть файл одновременно и на чтение, и на запись; если в рамках вашей задачи это допустимое поведение - то можете действовать так.
    Или можно разнести операции чтения из файла и записи в него по времени - это совсем не сложно.

  6. #6

    По умолчанию

    Здравствуйте.
    Подскажите пожалуйста следующий вопрос.
    Можно ли в конфигурации OwenArchiver поставить режим архивирования "по команде", а в качестве команды поставить выход блока BLINK (1 Гц) ?
    Будет ли при этом архивация с периодом 1 сек.?
    И если да, то можно ли поставить аналогичным способом BLINK (0,5 Гц) ?
    Спасибо.

  7. #7
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,825

    По умолчанию

    Цитата Сообщение от ultra76 Посмотреть сообщение
    Здравствуйте.
    Подскажите пожалуйста следующий вопрос.
    Можно ли в конфигурации OwenArchiver поставить режим архивирования "по команде", а в качестве команды поставить выход блока BLINK (1 Гц) ?
    Будет ли при этом архивация с периодом 1 сек.?
    И если да, то можно ли поставить аналогичным способом BLINK (0,5 Гц) ?
    Спасибо.
    Добрый день.
    С периодом 1 сек - можно.
    Меньше - нельзя.

  8. #8

    По умолчанию

    Возникла задача организации записи логов действий и нарушений с СПК107 и ПЛК210 на флеш-накопитель.

    Формат вывода нужен приблизительно такой (накапливается на флешке по файлу в день. Чтоб легко открывался и читался):



    Перечитал файл "CDSv3.5_Archives_v3.0.pdf", скачал и опробовал вложенные примеры.
    С примером OwenArchiver разобраться не сложно, все отлично работает, только это не совсем то что нужно в данном случае.
    с остальными примерами либо не разобрался, либо они неработоспособны. Нажимал кнопки, вводил числа, но ничего не записалось

    Вот такой код был для записи на флеш-накопитель для ПЛК110 (Codesys 2.3) на библиотеке "OwenLibFileAsync.lib":

    Код:
    PROGRAM USB_PRG
    VAR
    Name_old:STRING(12);
    rTMP1,rTMP2,rTMP3,rTMP4:REAL;
    LAG1,LAG2:LAG;
    (*Переменные для обслуживания библиотеки SysLibTime*)
        GetTime: CurTimeEx;
        TimeAndDate: SystemTimeDate;
        Sys_Time: SysTime64;
    
        set_time: BOOL := 0;            (*установить  дату*)
        set_date: BOOL := 0;            (*установить время*)
    
    (*Переменные для обслуживания библиотеки OwenLibFileAsync*)
        pref:STRING:='usb:';             (*префикс названия файла, варианты префиксов:
                                                                                                usb: - съемный flash-носитель;
                                                                                                ffs: (или отсутствие!) - внутренняя память;
                                                                                                ram: тестовый RAM диск*)
        handle:DWORD:=0;            (*дескриптор файла*)
        res: ASYNC_RET_VALUE;    (*переменная для организации работы библиотеки OwenLibFileAsync*)
        result:DWORD;                (*размер буфера*)
    
        StartArchivation: BOOL;                (*Переменная запуска архивации. Для начала архивации задайте переменной значение TRUE, для остановки архивации - FALSE.*)
        timer_archiv: TON;                    (*таймер архивации*)
        header: STRING(255);                (*заголовок таблицы*)
        need_new_header: BOOL := 0;        (*необходимость сформировать новый заголовок*)
        start_archiv: BOOL := 0;
        divider:DWORD;
    
        index_old:WORD;
        R_TRIG:R_TRIG;    
    count:INT;
    END_VAR
    
    VAR RETAIN
        name_of_file: STRING;         (*название файла с префиксом*)
        today: UINT;                    (*сегодняшнее число*)
    END_VAR
    
    IF Messages.ALARM[0] <> '' THEN
    TRIP:=TRUE;
    
    IF Name='' THEN Name:='LOGFILES'; END_IF;
        
    (*Далее сохраняем на USB*)
                                        (*-------------Работа с временем и датой ПЛК------------*)
    (* Получаем текущее время и дату*)
    HH    :=    Hour    ;        (*    Значение времени в часах    *)
    MM    :=    Minute    ;        (*    Значение времени в минутах    *)
    SS    :=    Second    ;        (*    Значение времени в секундах    *)
    DD    :=    Day    ;        (*    Значение даты в днях    *)
    MT    :=    Month    ;        (*    Значение даты в месяцах    *)
    YYYY:=    Year    ;        (*    Значение даты в годах    *)
    
    
    (*Если set_time - истина, то можно менять время*)
        IF set_time THEN
            set_time:=0;
            TimeAndDate.Minute:=MM;
            TimeAndDate.Second:=SS;
            TimeAndDate.Hour:=HH;
            GetTime (SystemTime:=Sys_Time , TimeDate:= TimeAndDate);
        END_IF
    
    (*Если set_date - истина, то можно менять дату*)
        IF set_date THEN
            set_date:=0;
            TimeAndDate.Day:=DD;
            TimeAndDate.Month:=MT;
            TimeAndDate.Year:=YYYY;
            GetTime (SystemTime:=Sys_Time , TimeDate:= TimeAndDate);
        END_IF;
    
    index:=index;
    Messages.FLAG[index]:=Messages.FLAG[index];
    
    IF NOT Messages.FLAG[index] THEN (*если необходимо архивировать, то*)
        IF Name<>Name_old THEN (*если наступил новый день, то формируем новый файл с новым именем даты*)
            name_of_file:=CONCAT(pref,Name);
            name_of_file:=CONCAT(name_of_file,UINT_TO_STRING(DD));
            name_of_file:=CONCAT(name_of_file,'.');
            name_of_file:=CONCAT(name_of_file,UINT_TO_STRING(MT));
            name_of_file:=CONCAT(name_of_file,'.');
            name_of_file:=CONCAT(name_of_file,UINT_TO_STRING(YYYY));
            name_of_file:=CONCAT(name_of_file,'.csv');
            today:=DD;(*запомнить дату *)
            need_new_header:=1;(*далее в новом файле необходимо будет создать "шапку" архива*)
            Name_old:=Name;
        END_IF
    
                                            (*-------------Работа с библиотекой OwenLibFileAsync------------*)
        CASE state OF
            0:    (*Открытие файла -  этап 1*)
                res:=OwenFileOpenAsync(name_of_file,'a',ADR(handle));;(*возвращает дескриптор файла, либо 0 (в некоторых случаях 4 294 967 295 или -1) в случае ошибки*)
                IF res=ASYNC_WORKING THEN
                    state:=1;(*нет ошибок, переход на открытие файла этап 2*)
                ELSE state:=0;
                END_IF
        
            1:    (*Открытие файла -  этап 2*)
                res:=OwenFileOpenAsync(name_of_file,'a',ADR(handle));
                IF res=ASYNC_DONE  THEN (*если "готов", и нет ошибок, то переход в состояние 2*)
                    IF handle<>0 THEN
                        state:=2;(*нет ошибок, переход на  запись этап 1*)
                    ELSE
                        state:=0;(*иначе можно перейти на 1 этап открытия файла, либо предусмотреть собственное действие самостоятельно *)
                    END_IF
                ELSIF res<0 THEN
                    state:=0;
                END_IF
    
            2:    (*Запись в файл - этап 1*)
                IF need_new_header THEN (*если новый день суток, формируем новую" шапку"*)
                    (*формируем колонку Дата*)
                        header:=CONCAT('Индекс',';');(*|число.месяц.год.|*)
                    (*формируем колонку с именем первой переменной var1*)
                        header:=CONCAT(header,'Сообщение');(*|var1*)
                        header:=CONCAT(header,';');(*|var1|*)
                        header:=CONCAT(header, '$0A');(*OA =Line Feed - перевод строки, см. таблицу ASCII -символов*)
                    (*заполняем следующую строку непосредственно данными*)
                        header:=CONCAT(header,UINT_TO_STRING(index));(*|число*)
                        header:=CONCAT(header,';');(*|число.*)
                    (*формируем значение первой переменной var1*)
                        header:=CONCAT(header, Messages.ALARM[index]);(**)
                        header:=CONCAT(header,';');(**)
                        header:=CONCAT(header, '$0A');(*OA =Line Feed - перевод строки, см. ASCII таблицу*)
                        need_new_header:=0;(*сбрасываем необходимость формировать "шапку" в следующий раз*)
    
                ELSE (*иначе, если файл открывается на дозапись,то формируем только строку архива в формате |число.месяц.год|часы.минуты.секунды|значение var1|значение var2|*)
    
                    (*заполняем следующую строку непосредственно данными*)
                        header:=CONCAT(header,UINT_TO_STRING(index));(*|число*)
                        header:=CONCAT(header,';');(*|число.*)
                    (*формируем значение первой переменной var1*)
                        header:=CONCAT(header, Messages.ALARM[index]);(**)
                        header:=CONCAT(header,';');(**)
                        header:=CONCAT(header, '$0A');(*OA =Line Feed - перевод строки, см. ASCII таблицу*)
                END_IF
                
                (*Пишем строку в файл*)
                res:=OwenFileWriteAsync(handle,ADR(header), LEN(header), ADR(result));(*пишем данные *)
                IF res=ASYNC_WORKING THEN
                    state:=3;(*нет ошибок, переход на запись файла этап 2, либо по усмотрению пользователя*)
                ELSE
                    state:=4;(*иначе можно перейти на  этап закрытия файла, либо предусмотреть собственное действие самостоятельно *)
                END_IF
    
            3:    (*Запись в файл - этап 2*)
                res:=OwenFileWriteAsync(handle,ADR(header), LEN(header), ADR(result));
                IF res=ASYNC_DONE THEN
                    IF result=LEN(header) THEN (*если результат равен длине строки, то перейти к закрытию файла, либо по усмотрению пользователя*)
                        state:=4;
                    ELSE
                        state:=4;(*иначе всё равно перейти на закрытие *)
                    END_IF
                ELSIF res<0 THEN
                    state:=0;
                END_IF
        
            4:     (*Закрываем файл - этап 1*)
                res:=OwenFileCloseAsync(handle, ADR(result));
                IF res=ASYNC_WORKING THEN
                    state:=5;(*нет ошибок, переход на закрытие файла этап 2*, либо по усмотрению пользователя*)
                ELSE
                    state:=0;(*иначе можно перейти на  этап открытия файла, либо предусмотреть собственное действие самостоятельно *)
                END_IF
        
            5:    (*Закрываем файл - этап 2*)
                res:=OwenFileCloseAsync(handle, ADR(result));
                Messages.FLAG[index]:=1;
                IF index<=98 THEN index:=index+1; END_IF;
                IF res=ASYNC_DONE THEN header:='';
                    handle:=0;
                    IF result=0 THEN
                        state:=0;(*если файл закрыт успешно, то выходим из условного оператора CASE *)
                    ELSE
                        state:=0;(*иначе всё равно выходим, либо предусмореть собственное действие*)
                    END_IF
                ELSIF res<0 THEN (*выход, либо собственное действие*)
                    state:=0;
                END_IF
    
            ELSE state:=0;
        END_CASE
    END_IF;
    (*
    Messages_ALARM1_old:=Messages.ALARM[99];
    index_old:=index;
    *)
    
        IF index>=99 THEN
            FOR i:=0 TO 98 BY 1 DO
            Messages.FLAG[i]:=0;
            Messages.ALARM[i]:='';
            END_FOR;
             index:=0;
            TRIP:=FALSE;
        END_IF;
    END_IF;
    Messages.FLAG[i]:=Messages.FLAG[i];
    Count:=Count+1;
    Прошу подсказать как можно организовать вывод текстовых сообщений с индексом и временем возникновения события
    +79104444236
    С уважением,
    Лапшин Вячеслав

  9. #9
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,825

    По умолчанию

    с остальными примерами либо не разобрался, либо они неработоспособны.
    Прошу подсказать как можно организовать вывод текстовых сообщений с индексом и временем возникновения события
    Для этого нужно разобраться с остальными примерами. Они, безусловно, работоспособны.

  10. #10

    По умолчанию

    Разобрался)) правда как-то "по-шамански".
    1. Посмотрел Ваш (3 года тому назад) снятый видеоролик на ютубе https://www.youtube.com/watch?v=kZpPiwQ5wEI
    2. Скачал архивный документ v.2.0
    3. Скачал оттуда пример работы с библиотекой CAA File CODESYS V3.5 SP11 Patch 5
    4. Сконвертировал, все обновил на что ругалось, поменял таргет на ПЛК210, загрузил и все заработало
    Последний раз редактировалось krollcbas; 16.10.2023 в 00:42.
    +79104444236
    С уважением,
    Лапшин Вячеслав

Страница 25 из 28 ПерваяПервая ... 152324252627 ... ПоследняяПоследняя

Похожие темы

  1. ОРМ и архивация трм202
    от Vlad$13 в разделе OWEN Proces Manager
    Ответов: 5
    Последнее сообщение: 13.01.2017, 08:44
  2. OPM и Архивация
    от DmitrySoratnik в разделе OWEN Proces Manager
    Ответов: 1
    Последнее сообщение: 30.09.2016, 11:19
  3. Архивация в CoDeSys v3.5 SP7
    от Анатолий К. в разделе СПК2xx (архив)
    Ответов: 3
    Последнее сообщение: 04.03.2016, 11:49
  4. Архивация
    от Salvafion в разделе Master SCADA 3
    Ответов: 7
    Последнее сообщение: 28.09.2011, 07:29
  5. Архивация данных
    от Alor в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 25.11.2008, 11:27

Ваши права

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