Показано с 1 по 6 из 6

Тема: Записи данных в файл из ПЛК 110-30

  1. #1

    По умолчанию Записи данных в файл из ПЛК 110-30

    Добрый день! Подскажите пожалуйста, возможно ли изменить формат записи данных из ПЛК в файл.
    Есть программа которая записывает данные в формате [1 2 3 4], для решения задачи нужно чтобы записывались в формате [1234]

    Заранее спасибо!

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    справка КДС => операции со строками
    как то так
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    справка КДС => операции со строками
    как то так
    С этим разобрался, спасибо за ответ

  4. #4

    По умолчанию

    Сразу не отходя от кассы. В Codesys есть функция перевода стандартного представления времени в Unix-time?

  5. #5
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от WeSs Посмотреть сообщение
    Сразу не отходя от кассы. В Codesys есть функция перевода стандартного представления времени в Unix-time?
    По мотивам библиотеки OSCAT
    Захват-1.png

    функция UCT_TO_DWORD выдает Unix время как DWORD число секунд, начиная с 0 часов 1 января 1970 года.
    Код:
    FUNCTION UCT_TO_DWORD : DWORD
    VAR_INPUT
    	year: INT;
    	month: INT;
    	day: INT;
    	hour: INT;
    	minute: INT;
    	second: INT;
    END_VAR
    VAR
    	count: INT;
    	SET_DATE: DWORD;
    END_VAR
    (*------------------------------------------------------------------------*)
    (*Вычислить дату с учетом високосных лет*)
    IF month > 2 THEN
        count := (month - 1) * 30;
        IF month > 7 THEN count := count + SHR(month - 3,1);
    ELSE count := count + SHR(month - 4,1); END_IF;
        (* проверить на високосный год и добавить один день если год високосный *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    SET_DATE := (INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
    (*------------------------------------------------------------------------*)
    UCT_TO_DWORD := SET_DATE
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600;
    Собственно в Codesys DATE_AND_TIME (сокр. DT) и есть время Unix
    По этому вторая функция toDT собирает секунды, минуты, часы, день, месяц и год в стандартное DATE_AND_TIME

    Код:
    FUNCTION toDT : DT
    VAR_INPUT
    	year: INT;
    	month: INT;
    	day: INT;
    	hour: INT;
    	minute: INT;
    	second: INT;
    END_VAR
    VAR
    	count: INT;
    	SET_DATE: DWORD;
    END_VAR
    (*------------------------------------------------------------------------*)
    (*Вычислить дату с учетом високосных лет*)
    IF month > 2 THEN
        count := (month - 1) * 30;
        IF month > 7 THEN count := count + SHR(month - 3,1);
    ELSE count := count + SHR(month - 4,1); END_IF;
        (* проверить на високосный год и добавить один день если год високосный *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    SET_DATE := (INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
    (*------------------------------------------------------------------------*)
    toDT := DWORD_TO_DT(SET_DATE
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600);
    Последний раз редактировалось petera; 08.11.2018 в 10:51.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  6. #6

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    По мотивам библиотеки OSCAT
    Захват-1.png

    функция UCT_TO_DWORD выдает Unix время как DWORD число секундах, начиная с 0 часов 1 января 1970 года.
    Код:
    FUNCTION UCT_TO_DWORD : DWORD
    VAR_INPUT
    	year: INT;
    	month: INT;
    	day: INT;
    	hour: INT;
    	minute: INT;
    	second: INT;
    END_VAR
    VAR
    	count: INT;
    	SET_DATE: DWORD;
    END_VAR
    (*------------------------------------------------------------------------*)
    (*Вычислить дату с учетом високосных лет*)
    IF month > 2 THEN
        count := (month - 1) * 30;
        IF month > 7 THEN count := count + SHR(month - 3,1);
    ELSE count := count + SHR(month - 4,1); END_IF;
        (* проверить на високосный год и добавить один день если год високосный *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    SET_DATE := (INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
    (*------------------------------------------------------------------------*)
    UCT_TO_DWORD := SET_DATE
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600;
    Собственно в Codesys DATE_AND_TIME (сокр. DT) и есть время Unix
    По этому вторая функция toDT собирает секунды, минуты, часы, день, месяц и год в стандартное DATE_AND_TIME

    Код:
    FUNCTION toDT : DT
    VAR_INPUT
    	year: INT;
    	month: INT;
    	day: INT;
    	hour: INT;
    	minute: INT;
    	second: INT;
    END_VAR
    VAR
    	count: INT;
    	SET_DATE: DWORD;
    END_VAR
    (*------------------------------------------------------------------------*)
    (*Вычислить дату с учетом високосных лет*)
    IF month > 2 THEN
        count := (month - 1) * 30;
        IF month > 7 THEN count := count + SHR(month - 3,1);
    ELSE count := count + SHR(month - 4,1); END_IF;
        (* проверить на високосный год и добавить один день если год високосный *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    SET_DATE := (INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
    (*------------------------------------------------------------------------*)
    toDT := DWORD_TO_DT(SET_DATE
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600);
    Спасибо большое! Будем преобразовывать на ST

    ЗЫ Подключил в проект. Выводит Реальную дату, а нужно именно время в UNIXTIMESTAMP. В чем моя проблема и как ее решить?

    ЗЫЫ Неправильный формат данных. Для вывода unixtime нужно было перевести в DWORD
    Последний раз редактировалось WeSs; 08.11.2018 в 14:53.

Похожие темы

  1. Ответов: 2
    Последнее сообщение: 18.08.2017, 11:57
  2. Вопрос по передаче данных в файл
    от a_gricaj в разделе Master SCADA 3
    Ответов: 11
    Последнее сообщение: 23.05.2017, 09:35
  3. Запись данных в файл с помощью CAA.File
    от d-view в разделе ПЛК3хх
    Ответов: 9
    Последнее сообщение: 06.02.2017, 17:49
  4. Ответов: 19
    Последнее сообщение: 21.03.2013, 08:41
  5. ТРМ 212 (проблема записи )
    от evgnik в разделе Master SCADA 3
    Ответов: 9
    Последнее сообщение: 03.02.2011, 06:47

Ваши права

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