Решил сравнить часы ПЛК160 с часами ПК. В течение одного часа я двумя¹² нехитрыми программами записывал в файл показания ФБ CurTimeEx, функции TIME() и класса DateTime (.NET). Показания ПЛК снимались через модбас с периодом 50-100 мс (все регистры разом). Отдельно сравнивались часы двух ПК — накапливающегося расхождения не было. Затем файл прогонялся через программы-анализаторы³.
clockdrift2.png
Существенные наблюдения:
TIME() идёт равномерно, но убегает на 12 секунд за час (100,(3)% нормальной скорости *).
CurTimeEx идёт неравномерно, но через час сохраняет верный ход.
Лучше всего эти эффекты видно графически.
Снимок 1: синяя линия ( TIME() ) равномерно уходит от зелёной (CurTimeEx).
plot_overall.png
Снимок 2: неравномерный ход CurTime:
plot_curtime.png
Снимок 3: сильная трёхсекундная заминка CurTime. Чёрные точки — референсное время ПК. Каждая точка — успешное считывание показаний ПЛК. Все графики имеют одинаковый набор точек по X.
plot_gap.png
Снимок 4: красным — референсное время округлено до целых (так должен выглядеть CurTime).
plot_ref_round.png
¹ http://pastebin.com/XJSKnDPUКод:PLCInfo PLC model MODEL PLC 160 Binary VERSION 2.14.0 Need Target version 2.10 Compiled: 10:35:22 Apr 29 2011 MAC 6B:77:00:01:D0:D1 IP 10.1.6.10 GATE 10.0.6.1 MASK 255.255.255.0 PIC upper version is 15 Licence unlimited
² http://pastebin.com/8pCiR5aa
³ http://pastebin.com/YRKmbGSe
Файл clock1.zip — записанные данные (int32 — CurTimeEx, приведённый к DT, int32 — TIME(), long — DateTime.Now.ToBinary()).
Файл dump.zip — расшифрованные, смещённые к нулю и переведённые в текст результаты.
Влияние загруженности ПЛК в данном эксперименте не оценивалось.