Здравствуйте!
Возникла потребность менять время в контроллере Деконт-А9. Стандартные блоки Разработчика такую возможность не дают.
Ваши специалисты посоветовали воспользоваться блоком Си, но все попытки написать данный блок были неудачными, т.к. опыта написания программ на Си не имеем. Просьба: не могли бы Вы помочь нам написать данный блок? Подскажите пожалуйста синтакис обращения к функции изменения времени.
Задача ставилась такая: изменить текущее время контроллера, взяв время (часы, минуты, секунды) и дату (день, месяц, год) из базы аналоговых сигналов. В базу эти сигналы попадают от Модбас Мастера раз в час. В общем этакая синхронизация времени по Модбасу.
Заранее огромное спасибо!
Изменение времени в Деконте через блок Си
Вот примерный код:
DWORD Sec;
TTime Time;
TBinTime BinTime;
ANALOG Analog[6];
int i;
BYTEBOOL NotValid;
NotValid = FALSE;
for(i=0;i<6;i++){
AnalogRead(i+1,&Analog[i]);
NotValid |= IFSET(Analog[i].state,flagU);
}
if (!NotValid) {
BinTime.msec = 0;
BinTime.sec = Analog[0].value;
BinTime.min = Analog[1].value;
BinTime.hour = Analog[2].value;
BinTime.day = Analog[3].value;
BinTime.month = Analog[4].value;
BinTime.year = Analog[5].value;
BinToZTime(&BinTime,&Time);
Sec = Time.Second;
smSetValue(SMP_DEF_DATETIME_WINTER,&Sec,0);
}
Раскладка в базе параметров:
номер 1 - секунды
номер 2 - минуты
номер 3 - часы
номер 4 - день
номер 5 - месяц
номер 6 - год
DWORD Sec;
TTime Time;
TBinTime BinTime;
ANALOG Analog[6];
int i;
BYTEBOOL NotValid;
NotValid = FALSE;
for(i=0;i<6;i++){
AnalogRead(i+1,&Analog[i]);
NotValid |= IFSET(Analog[i].state,flagU);
}
if (!NotValid) {
BinTime.msec = 0;
BinTime.sec = Analog[0].value;
BinTime.min = Analog[1].value;
BinTime.hour = Analog[2].value;
BinTime.day = Analog[3].value;
BinTime.month = Analog[4].value;
BinTime.year = Analog[5].value;
BinToZTime(&BinTime,&Time);
Sec = Time.Second;
smSetValue(SMP_DEF_DATETIME_WINTER,&Sec,0);
}
Раскладка в базе параметров:
номер 1 - секунды
номер 2 - минуты
номер 3 - часы
номер 4 - день
номер 5 - месяц
номер 6 - год
В такой синхронизации есть алгоритмические проблемы((
Надо устанавливать время только когда все аналоги изменились (стали новыми) и дата и время. Представьте на переходе суток время уже новое, а дата ещё старая, или на переходе часа минуты новые, час старый ... Кратковременно в контроллере будет установлено неправильное время. На следующем такте оно исправится.
Вам надо продумать какой-то дополнительный алгоритм проверки корректности нового времени. Если новое время несущественно отличается от текущего, то не устанавливать (учет задержки передачи параметров по MODBUS и такта Вашего компонента). И если новое время, сильно отличается от полученного в прошлом такте, тоже видимо его не устанавливать.
Надо устанавливать время только когда все аналоги изменились (стали новыми) и дата и время. Представьте на переходе суток время уже новое, а дата ещё старая, или на переходе часа минуты новые, час старый ... Кратковременно в контроллере будет установлено неправильное время. На следующем такте оно исправится.
Вам надо продумать какой-то дополнительный алгоритм проверки корректности нового времени. Если новое время несущественно отличается от текущего, то не устанавливать (учет задержки передачи параметров по MODBUS и такта Вашего компонента). И если новое время, сильно отличается от полученного в прошлом такте, тоже видимо его не устанавливать.