PDA

Просмотр полной версии : ТРМ-148 и OWEN_IO.dll



Чуданов Е.Н.
15.01.2010, 14:26
Необходимо при помощи универсальной функции OwenIO опросить текущие значения каналов ТРМ148, ну и с помощью этой же функции передать необходимые уставки. Кто знает как правильно задать параметры, и их размеры. Из описания библиотеки неясно как это сделать. В файле tags.txt также нет достаточной информации. Может кто подскажет пример на Delphi. E_Mail: chudanov08@rambler.ru. Заранее благодарю.

Hemann
15.01.2010, 14:38
Записывать этой функцией не пробовал, а читать получилось. Скажите куда прислать, отмылю примерчик на Delphi5

Hemann
15.01.2010, 16:53
вот примерчик. тестировался с трм101 вер.03.0023

Чуданов Е.Н.
18.01.2010, 08:28
Спасибо за помощь, но кажется в ТРМ-148 функцию OwenIO использовать нельзя. У меня такое впечатление (не работает). Хотя она описана, как универсальная функция ввода - вывода.

Hemann
18.01.2010, 10:17
Похоже на то. В файле tags.txt, по крайней мере про ТРМ-148 вообще ничего не сказано, но если экстраполировать ТРМ-138, то действительно, эта функция в ТРМ-148 не поддерживается. А что по этому поводу скажут ОВЕНовские спецы?

Чуданов Е.Н.
18.01.2010, 11:45
Я где то в форуме нашел, что описание функций для ТРМ-148 на стадии становления и надо пользоваться функциями, как для TPM-151. Там же приводился пример на Basic. Попробывал, адаптировал, но тоже не работает.

Hemann
19.01.2010, 00:02
а вы можете подсунуть вместо трм148 какой-нибудь плк, сконфигурированный так, как будто он трм148? если да, то сможете посмотреть что пишет в прибор ваша программа, тогда и все ясно будет

Дмитрий Егоренков
19.01.2010, 11:14
нет никакой необходимости опрашивать ТРМ148 универсальной функцией (она, кстати, действительно универсальная, и ей можно прочитать и записать любой параметр протокола ОВЕН). нужно использовать функции, соответствующие типу параметра.

определить тип параметра непросто, но возможно. установите конфигуратор и экспортируйте список параметров (меню "сервис"). далее используем эвристическое правило:

- целочисленные параметры (как правило Int8) читаем ReadSInt, пишем WriteByte;
- число с плавающей точкой читаем ReadStoredDotS(), пишем WriteStoredDotS();
- знаковое число с односторонней десятичной точкой читаем ReadStoredDotS(), пишем или WriteStoredDotS() или, если не получается, WriteStoredDotEx(), передавая в предпоследнем параметре позицию точки (от 0 до 2);
- стандартный 4-х байтовый float (IEEE) читаем ReadIEEE32().

есть еще один способ -- написать в поддержку овен письмо со списком параметров.

Чуданов Е.Н.
19.01.2010, 14:58
то, что пишет дмитрий егоренков, это правильно, именно таким путем и следует идти. но специалистам овен надо подробнее расписать возможности применения своей библиотеки и конфигурацию функций. получается так, что универсальные функции есть, но их применение сильно затруднено, ввиду недокументированности.

Hemann
21.01.2010, 13:18
получается так, что универсальные функции есть, но их применение сильно затруднено, ввиду недокументированности.
Согласен, хелп к библиотеке весьма слабоват. Например, в вышеупомянутой функции OwenIO, такие параметры как params и param_sz упомянуты только вскользь, а что они собой представляют и как ими пользоваться хотелось бы увидеть более подробно. В примерах тоже не совсем ясно, как эти параметры задействованы.

Дмитрий Егоренков
21.01.2010, 13:23
эти параметры -- буфер с содержимым поля данных протокола овен, и размер этих даннных. на выходе из функции в них помещаются данные из принятого пакета и их размер.

использовать эту функцию есть смысл только для строковых параметров.

Hemann
21.01.2010, 16:52
Понятно, да и опытным путем выяснили это. Речь-то о том, чтобы это было в хелпе поподробнее расписано и пример желательно иметь более развернутый

ToniPizecato
06.03.2010, 14:30
Здравствуйте, у меня проблема с чтением и записью параметра SP.LU
Owen_io.WriteStoredDotS(16 + (channel - 1), ADRTYPE_8BIT, "SP.LU", 35, -1);
ошибка: недопустимо большой линейный индекс

Подскажите с решением.

Дмитрий Егоренков
24.03.2010, 11:54
можно подробней? на чем пишете, как функция объявлена, как давно брали библиотеку с сайта?

ToniPizecato
01.04.2010, 17:07
пишу на C#. функция объявлена так
[DllImport("owen_io.dll", EntryPoint = "WriteStoredDotS", CharSet = CharSet.Ansi)]
public static extern int _WriteStoredDotS(
[MarshalAs(UnmanagedType.U4)] uint adr,
[MarshalAs(UnmanagedType.U4)] uint adr_type,
[MarshalAs(UnmanagedType.LPStr)] string command,
[MarshalAs(UnmanagedType.R4)] float value,
[MarshalAs(UnmanagedType.I4)] int index);

брал библиотеку свежую.

вопрос решился поиском идентичной проблемы в интернете.

error = Owen_io.WriteStoredDotS(16 + (channel - 1), ADRTYPE_8BIT, "SP.LU", (float)t, 0);

выяснилось, что индекс должен быть равен нулю.
в документации непонятно описано назначение индекса.

– для конфигурационных параметров индексация идет через значение index;

и все. а как он меняется, в зависимости от чего и тд не понятно.


Скажите, если я работаю с двумя трм девайсами, мне надо иметь две копии библиотеки owen_io.dll ? или же я могу создать два класса и они не будут вмешиваться в память друг друга?

Дмитрий Егоренков
01.04.2010, 17:42
для оперативных параметров номер канала прибавляется к адресу, для конфигурационных -- передается как индекс. соответственно выглядит это так: error = Owen_io.WriteStoredDotS(16, ADRTYPE_8BIT, "SP.LU", (float)t, (channel - 1));

библиотека будет загружена один раз. два прибора можно опрашивать поочередно.

ToniPizecato
02.04.2010, 15:56
но странно, я записывал таким образом уставку (как для оперативных). и проверял вручную. все записывало правильно.
попробую ваш вариант. спасибо.

AlexanderZX
27.04.2010, 17:05
эти параметры -- буфер с содержимым поля данных протокола овен, и размер этих даннных. на выходе из функции в них помещаются данные из принятого пакета и их размер.

использовать эту функцию есть смысл только для строковых параметров.
Нельзя ли привести пример чтения параметра с помощью команд "dev" и "ver"

Дмитрий Егоренков
28.04.2010, 11:38
char value[OWENIO_DATA_BUFFER_SIZE + 1];
DWORD param_sz = 0;

int err = OwenIO(16, ADRTYPE_8BIT, 1, "ver", value, &param_sz);

if (ERR_OK == err)
{
value[param_sz] = '\0';
strrev(value);
}

AlexanderZX
28.04.2010, 13:58
char value[OWENIO_DATA_BUFFER_SIZE + 1];
DWORD param_sz = 0;

int err = OwenIO(16, ADRTYPE_8BIT, 1, "ver", value, &param_sz);

if (ERR_OK == err)
{
value[param_sz] = '\0';
strrev(value);
}

Почему value передается не по ссылке ??? это получается чтение размера параметра (param_sz) само значение (value)не читается

Дмитрий Егоренков
28.04.2010, 14:04
потому что это указатель.

AlexanderZX
28.04.2010, 15:27
потому что это указатель.
мой код на С#

//Универсальная функция чтения записи
[DllImportAttribute("owen_io.dll", EntryPoint = "OwenIO", CallingConvention = CallingConvention.StdCall)]
unsafe public static extern int OwenIO(int adr, int adr_type, int is_read, string command, char * dev, ref int params_sz);


unsafe public static int read_owen_io(int adr, int adr_type, string command)//, ref string value)
{
try
{
int sz =0;
string value = "";
char[] param = new char[8];
fixed (char* p = &param[0])
{
//string param = "";
int res = OwenIO(adr, adr_type, 1, command, p, ref sz);
for (int i = 0; i < param.Length; i++)
value += param[i];
// System.Windows.Forms.MessageBox.Show(sz + "\n" + value);
return res;
}
}
catch { return -1000; }
}
при чтении "dev" возвращает значения "11576","49856","204","\0" как это расшифровать ?

Дмитрий Егоренков
28.04.2010, 16:52
для начала надо понять разницу между строками в C и в C#, а потом почитать что-нибудь про взаимодействие с неуправляемым кодом. и тогда все само расшифруется.



[DllImportAttribute("owen_io.dll", EntryPoint = "OwenIO", CallingConvention = CallingConvention.StdCall)]
public static extern int OwenIO(int adr, int adr_type, int is_read, string command, IntPtr dev, ref int params_sz);

public static int read_owen_io(int adr, int adr_type, string command)
{
int sz = 0;
IntPtr param = Marshal.AllocCoTaskMem(15);

int res = OwenIO(adr, adr_type, 1, command, param, ref sz);

if (res == 0)
{
string value = Marshal.PtrToStringAnsi(param, sz);
}
Marshal.FreeCoTaskMem(param);

return res;
}

AlexanderZX
28.04.2010, 17:15
для начала надо понять разницу между строками в C и в C#, а потом почитать что-нибудь про взаимодействие с неуправляемым кодом. и тогда все само расшифруется.



[DllImportAttribute("owen_io.dll", EntryPoint = "OwenIO", CallingConvention = CallingConvention.StdCall)]
public static extern int OwenIO(int adr, int adr_type, int is_read, string command, IntPtr dev, ref int params_sz);

public static int read_owen_io(int adr, int adr_type, string command)
{
int sz = 0;
IntPtr param = Marshal.AllocCoTaskMem(15);

int res = OwenIO(adr, adr_type, 1, command, param, ref sz);

if (res == 0)
{
string value = Marshal.PtrToStringAnsi(param, sz);
}
Marshal.FreeCoTaskMem(param);

return res;
}


Спасибо !!!Работает!!!

ToniPizecato
19.07.2010, 18:40
для оперативных параметров номер канала прибавляется к адресу, для конфигурационных -- передается как индекс. соответственно выглядит это так: error = Owen_io.WriteStoredDotS(16, ADRTYPE_8BIT, "SP.LU", (float)t, (channel - 1));

библиотека будет загружена один раз. два прибора можно опрашивать поочередно.

не получается. возвращает ошибку 47.
каким образом модно записать уставку? не могли бы вы привести рабочий код? то, что вы написали не работает.


Разобрался.
индекс должен быть кратен 3 (состояние работы).
error = Owen_io.WriteStoredDotS(16, ADRTYPE_8BIT, "SP.LU", (float)t, 3 * (channel - 1));