Есть 32-х битный накопительный счетчик, представленный в виде двух 16-битных каналов C1HI и C1LO. Необходимо создать канал, вычисляемый по следующей формуле: (C1HI*0x10000+C1LO) - (C1HI_O*0x10000+C1LO_O), где C1HI_O и C1LO_O - значения старшего и младшего слова счетчика на предыдущем измерении. Такое возможно?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Да - такое возможно, но только формулу необходимо переделать: 1) Сначала выполнить вычитание младших байтов, выполнить проверку на неотрицательный результат. Если результат отрицательный - выполнить соответсвующие арифметические действия со старшими байтами. 2) Вычесть между собой старшие байты. 3) Преобразовать результирующие значения старшего и младшего значения в одно число.
В том виде, в котором задана формула у Вас ее можно реализовать только через FBD-блок на Си++.
Posted by fherbeck (Участник № / Member № 1012) on :
А в том варианте, который предложили Вы это можно сделать не через FDB-блок на C++? Объясните пожалуйста конкретно, как и куда это подключать. Я пытался проделать это через трансляцию в канале, но так и не понял как получать из СПАД архива значение предыдущего измерения в FDB программе. Кроме того, как я понимаю, при трансляции в архиве будут отсутствовать исходные значения канала. Мне хотелось бы получить результаты вычислений как отдельный канал.
[ 22.03.2005, 18:29: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Написать программу FBD, реализующую указанный алгоритм. У этой программы должны быть 2 входа, которые будут принимать данные от каналов C1HI и C1LO, и 1 выход. 2. Создать канал RESULT типа FLOAT, в котором должен быть получен ОКОНЧАТЕЛЬНЫЙ РЕЗУЛЬТАТ. 3. Подключить к этому каналу созданную программу в качестве процедуры ТРАНСЛЯЦИИ. При этом входы программы надо привязать к каналам C1HI и C1LO, а ее выход - к атрибуту РЕАЛЬНОЕ канала RESULT. 3. Канал RESULT при архивировании будет сохранять в архиве уже конечный результат.
Надо обратить внимание на то, что необходимо обеспечить синхронность изменения значений каналов C1HI и C1LO с обработкой канала RESULT. Если данные получаются в асинхронном потоке, надо по сигналам "отработки" (в атрибуте СОБЫТИЯ) каждого канала отслеживать актуальность каждого измерения.
Posted by fherbeck (Участник № / Member № 1012) on :
quote:Отправитель / Originally posted by AdAstra Technical Support: Надо обратить внимание на то, что необходимо обеспечить синхронность изменения значений каналов C1HI и C1LO с обработкой канала RESULT.
А как достичь этого средствами TRACE MODE?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Контроль можно осуществлять по атрибуту "СОБЫТИЯ". Смотрите описание этого атрибута в справочной системе.
Posted by fherbeck (Участник № / Member № 1012) on :
А как получить значение предыдущего измерения?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
А другом канале Вы его не можете сохранять? Дело в том, что в программе это можно сделать только через глобальные переменные.