Решил сравнить часы ПЛК160 с часами ПК. В течение одного часа я двумя¹² нехитрыми программами записывал в файл показания ФБ CurTimeEx, функции TIME() и класса DateTime (.NET). Показания ПЛК снимались через модбас с периодом 50-100 мс (все регистры разом). Отдельно сравнивались часы двух ПК — накапливающегося расхождения не было. Затем файл прогонялся через программы-анализаторы³.
Вложение 22341
Существенные наблюдения:
TIME() идёт равномерно, но убегает на 12 секунд за час (100,(3)% нормальной скорости *).
CurTimeEx идёт неравномерно, но через час сохраняет верный ход.
Лучше всего эти эффекты видно графически.
Снимок 1: синяя линия ( TIME() ) равномерно уходит от зелёной (CurTimeEx).
Вложение 22343
Снимок 2: неравномерный ход CurTime:
Вложение 22345
Снимок 3: сильная трёхсекундная заминка CurTime. Чёрные точки — референсное время ПК. Каждая точка — успешное считывание показаний ПЛК. Все графики имеют одинаковый набор точек по X.
Вложение 22347
Снимок 4: красным — референсное время округлено до целых (так должен выглядеть CurTime).
Вложение 22349
¹ 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 — расшифрованные, смещённые к нулю и переведённые в текст результаты.
Влияние загруженности ПЛК в данном эксперименте не оценивалось.