Время UTC в GPS для поиска TOW в Simulink

для моего проекта мне нужно рассчитать TOW (время недели) в Simulink. Я знаю, что этого можно добиться путем преобразования времени UTC во время GPS.

Я написал простой m-файл в Matlab, который выполняет следующие действия для меня в Matlab:

date_gps_int = 10000*y + 100*m + d
date_gps_str = int2str(date_gps_int)
date_gps_str_to_serial = datenum(date_gps_str,'yyyymmdd')
date_str_format = datestr(date_gps_str_to_serial,'dd-mmmm-yyyy')
Num_Days = daysact('06-jan-1980',date_str_format)
Num_Weeks = Num_Days/7
TOW = Num_Weeks - 1024

Мое первое намерение состояло в том, чтобы использовать это как функцию в simulink. Но, видимо, из-за 'datenum' и 'datestr' это невозможно, так как simulink не обрабатывает строки.

Теперь мне интересно, может ли кто-нибудь помочь мне с этой проблемой. Есть ли способ рассчитать TOW по дате UTC в Matlab без использования этих предопределенных функций?

Я также попытался написать алгоритм для подсчета количества дней с «6 января 1980 года», а затем подсчета количества недель путем деления на 7. Но, поскольку я не очень хорошо знаком с расчетом високосного года и не знаю формулы для таких расчетов мой результат отличается от реального TOW.

Буду признателен, если кто-нибудь может мне помочь в этом.


person Behrooz    schedule 10.12.2018    source источник
comment
Если вам не нужна генерация кода, вы можете создать внешнюю функцию, назвать ее внешней и вызывать ее из блока MATLAB Function в Simulink.   -  person Navan    schedule 10.12.2018
comment
На самом деле не отвечаю, но вы должны проверить, действительно ли вам нужно заботиться о дополнительных секундах. Часто преобразования времени выполняются только для отчета (для человека), поэтому вы можете отказаться от лишней секунды. Если вам нужна точная разница во времени, вам может понадобиться хорошее преобразование, и поэтому посмотрите настоящие ответы.   -  person Giacomo Catenazzi    schedule 15.01.2019


Ответы (1)


Matlab обрабатывает время в трех форматах: форматированные строки даты - что выводит datestr -, последовательная дата - скалярное двойное число, что выводит datenum - и векторы даты (см. datevec). Функции преобразования работают с этими тремя, и наиболее удобный способ преобразовать отдельные переменные (год, месяц и т. д.) в дату — построить вектор даты [yyyy mm dd HH MM SS].

date_gps_str_to_serial = datenum([y m d 0 0 0]); % midnight on day y-m-d
date_Jan_6_1980 = datenum([1980 01 06 0 0 0]);   % midnight on Jan 6th, 1980
Num_Days = date_gps_str_to_serial - date_Jan_6_1980;

Теперь остерегайтесь високосных секунд...

Время GPS вычисляется из времени, прошедшего с 6 января 1980 года. Возьмите количество секунд, прошедших с того дня, измеренное атомными часами спутников, разделите на (24 * 3600), чтобы получить количество дней, остаток равен время суток (в секундах с полуночи).

Но время от времени Международная служба вращения Земли и систем отсчета решает, что день будет длиться на одну секунду дольше, чтобы учесть замедление вращения Земли. Это может происходить два раза в год, 30 июня или 31 декабря. Расчет времени GPS неверен, потому что он не принимает во внимание, что некоторые дни длятся 86401 секунд (поэтому деление на 24*3600 не работает) и будет опережать на 1 секунду по отношению к UTC каждый раз, когда это происходит. Таких дней было 18 с 6 января 1980 года, поэтому нужно вычесть 18 секунд из времени GPS, чтобы найти время UTC. В следующий раз дополнительная секунда может быть добавлена ​​в июне 2019 года.

person Brice    schedule 11.12.2018