А у эти переменных чередование байт какое?
У двухбайтовых чисел обычно используется чередование байт "Старшим байтом вперед".
А у эти переменных чередование байт какое?
У двухбайтовых чисел обычно используется чередование байт "Старшим байтом вперед".
Спасибо.
Укажите полученные значения в двоичном или 16ричном формате.
Не могли бы подробнее объяснить, где нужно указать. Непонятно. Ни в OPC ни в СКАДЕ подобных функций не нашел.
to SCADAMaster: Чередование байт не при чем. Пробовал разные варианты. Проблема В Овне, похоже. Техподдержка Овна ничем помочь не может. Не нравится, говорят, можете вернуть
З.Ы. Если вопрос не решится - придется выбросить ТРМ к чертям и ставлю SMH-2G. Перед заказчиком неудобно.
Какие именно регистры у вас некорректно опрашиваются?
Оставьте в конфигуарции ОРС сервера только эти регистры, включите в свойствах ОРС сервера запись журнала и всех событий. Включите режим исполнения. Лог пишется в папку:
c:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Посмотрите какие данные приходят от приборов.
Или приложите сюда пример ответа от прибора, и какие данные должны быть на самом деле.
Segnetics также можно подключить к нашему ОРС серверу. У нас даже есть автоматический конвертер map карт в конфигурацию сервера. Конфигуратор лежит на странице загрузки ОРС:
http://insat.ru/prices/info.php?pid=6944
Спасибо.
Я посмотрел, разобрался.
Эти разработчики [вырезано внутренним цензором] сделали отрицательные числа для данного типа данных (пара значений) не int в дополнительном коде, а int со знаком
Грубо - старший разряд - знак, 0 - положительное число, 1 - отрицательное. Младшие 15 разрядов - модуль значения в десятых долях градуса.
Можно обработать скриптом, но мне лениво его писать. Может, уважаемый SCADAMaster поможет.
Ничего не понятно.
В чем отличие от обычного int?
Спасибо.
В представлении числа.
Обычный int - в дополнительном коде, а тут целое со знаком.
Т.е. -1 (в десятых) в доп. коде будет 1111111111110110 а у ОВЕНа в этом типе переменной 1000000000001010
Тогда должен помочь примерно такой скрипт:
function OnRead()
val,qual=server.ReadCurrentTag(); --читаем значение
if qual==OPC_QUALITY_GOOD then --если признак качества хороший
sub=bit.BitFromData(val,15); --анализируем 15 бит
if sub==true then --если он истина
val=bit.BitToData(val,false,15)*(-1); --сбрасываем бит и умножаем результат на -1
end;
server.WriteCurrentTag(val/10,OPC_QUALITY_GOOD); --делим результат на 10 и записываем в тег
end;
end
Пример скрипта в конфигурации в приложении
Спасибо.