Вход

Просмотр полной версии : Снова C#, owen_io.dll и ТРМ138



YuriKarelin
18.06.2015, 02:17
Мне нужно читать и записывать уставки в ТРМ138. Скачал образец программы на C#, внес изменения на предмет импортирования функции ReadStoredDotS и чтения параметра C.SP.

Импортировал так:

[DllImportAttribute("owen_io.dll", EntryPoint = "ReadStoredDotS", CallingConvention = CallingConvention.StdCall)]
public static extern int ReadStoredDotS(int adr, int adr_type, System.IntPtr command, ref float value, int index);

Использую так (адрес 11-ти битный, с 8-мибитным ситуация та же):

IntPtr name = Marshal.StringToCoTaskMemAnsi("C.SP");

float value = 0;
deviceAddress = 0;

ConnectionError res = (ConnectionError)NativeMethods.ReadStoredDotS(devi ceAddress, 1, name, ref value, -1);

if (res == ConnectionError.Ok)
{
textBoxMemo.Text = value.ToString();
}
else
{
MessageBox.Show("Ошибка чтения: " + res.ToString());
}

Marshal.FreeCoTaskMem(name);

При установленной в ТРМ138 уставке, равной 90 градусам, моя функция читает волшебное значение 499.6. Конфигуратор ТРМ138 читает и показывает 90.
Мало того, при просмотре обмена на порту, что от моей программы и обратно, что от конфигуратора и обратно идут абсолютно одинаковые пакеты.

Это запрос:
23 47 47 48 47 49 47 49 47 48 55 4E 4E 0D #GGHGIGIGHUNN.

Это ответ:
23 47 47 47 49 49 47 49 47 48 4A 4F 4B 54 4C 4E 49 0D #GGGIIGIGHJOKTLNI.

Откуда же берется такая разница после преобразования?
Заранее спасибо за помощь.

YuriKarelin
18.06.2015, 02:34
Еще немного поковырялся, попеременно пробуя работу конфигуратором и моей программой. Выяснилось, что если конфигуратором записать уставку равную 0, то моя программа считает 0. Если уставка равна 10 градусов, моя программа считает 419,6. При 20 - 429,6 и так далее. То есть, откуда-то берутся дополнительные 409,6. Я, конечно, могу их отнять в моей программе, но что, если через некоторое время это волшебное число изменится на какое-нибудь другое :).

ЗЫ Оказывается, эти волшебные 409,6 в двоичном виде выглядят как 110011001.10011001100110011001100. Очень красивое и обладающее системой число :).

murdemon
18.06.2015, 14:59
Там в протоколе овен какой то хитрый формат float - 3 байта ..

YuriKarelin
18.06.2015, 15:28
Да, вроде, по описанию C.SP не float, а знаковое с фиксированной точкой. И пользуюсь именно той функцией, которую они в tag.txt при библиотеки прописали. Пробовал прочитать этот параметр функцией ReadIEEE32 - функция возвращает ошибку формата, как и должно.

capzap
18.06.2015, 17:14
Да, вроде, по описанию C.SP не float, а знаковое с фиксированной точкой. И пользуюсь именно той функцией, которую они в tag.txt при библиотеки прописали. Пробовал прочитать этот параметр функцией ReadIEEE32 - функция возвращает ошибку формата, как и должно.

почему не модбас, там стандартный флоат?
если протокол овен, то когда Вы употребляете фразу знаковое с фиксированной точкой что имеет ввиду, переводить его во флоат не нужно это двухбайтное число целочисленное от -999 до 9999

YuriKarelin
18.06.2015, 21:05
Я не нашел, как изменить протокол обмена в моем ТРМ. Меню уровня PL-4 заканчивается параметром n.Flt. К тому же, я посчитал, что самый быстрый способ разработки - использование библиотек изготовителя. А сейчас уже просто стало интересно, почему вижу то, что вижу.
Разобрал ответы от ТРМ, оказалось, что уставки передаются в двух байтах в формате знакового целого с запятой, как и описано в документации. И те самые 409,6 (4096) это и есть экспонента (10^-1) в 12 бите двухбайтового числа. То есть, получив целое, я могу отмаскировать 12-14 биты, получив экспоненту, а биты 0-11 будут мантиссой.
Осталось понять, почему стандартная функция для чтения ReadStoredDotS не делает этого сама, а выдает мне сырой результат. Буду пользоваться ReadUInt и вручную проделывать описанные выше операции, если не разберусь, как делать правильно.

murdemon
18.06.2015, 23:00
Пошлите вопрос... OWEN поддержке.... пусть они бар репорт заведут и в следующем релизе поправят :)

YuriKarelin
19.06.2015, 00:36
Всем спасибо за помощь и поддержку. Победил тем методом, что описал, через одно нехарактерное место.
Что странно, функция WriteStoredDotS, в отличие от ReadStoredDotS, работает нормально.

Дмитрий Егоренков
19.06.2015, 13:27
Свежую версию библиотеки не пробовали с сайта скачать?

http://www.owen.ru/catalog/biblioteka_win_dll/opisanie

YuriKarelin
24.06.2015, 00:12
Свежую версию библиотеки не пробовали с сайта скачать?

http://www.owen.ru/catalog/biblioteka_win_dll/opisanie

Ее, родимую, и качал :).

Дмитрий Егоренков
25.06.2015, 11:28
Проверьте, пожалуйста, что это _единственная_ версия библиотеки в системе. Проверить просто -- запустите программу, и попробуйте удалить owen_io.dll.
Если получится, дело нечисто. Версия owen_io.dll должна быть 1, 2, 0, 20.

YuriKarelin
25.06.2015, 23:57
Вот ведь чудеса. Действительно, версия библиотеки была 1.2.0.17. Хотя качал здесь же. Правда, ТРМ уже отдал заказчику - некак прямо сейчас проверить, помогло ли обновление. Как появится возможность, обязательно попробую. Спасибо.