PDA

Просмотр полной версии : ReadStoredDotS - ошибка в библиотеке?



Alex7583
23.09.2011, 12:17
Здравствуйте!
Имеем ТРМ138, подключенный к ПК с помощью библиотеки owen_io. Обнаружил некорректную работу функции ReadStoredDotS. При чтении значения уставки C.SP функция возвращает неправильное значение.
Пример. На ЦПУ-2 для канала 1 горит значение "30.0". При прогоне такого кода:

res = ReadStoredDotS(0, ADRTYPE_8BIT, "C.SP", value, -1);
printf("%f\n", value);

на экране ПК получим "439.600006".
Аналогично при чтении значения "45.0" на ЦПУ-2, на экране ПК получим "454.600006".

Если же предварительно записать целое значение уставки, а потом прочитать его с помощью такого кода:

float value=30.0;
res = WriteStoredDotS(0, ADRTYPE_8BIT, "C.SP", value, -1);
res = ReadStoredDotS(0, ADRTYPE_8BIT, "C.SP", value, -1);
printf("%f\n", value);

, то на ЦПУ-2 загорается "30" (без точки и нуля), а на экране ПК получим "30.000000".

На сколько я понял, функция ReadStoredDotS возвращает некорректное значение, если считываемый параметр отображается на ЦПУ-2 как не целое число.

Среда разработки c++ builder, поэтому файл owen_io.lib конвертировал с помощью coff2omf.exe.

Поэтому вопрос: это действительно ошибка в библиотеке, проблема из-за конвертации lib файла, или я что-то недопонял?

Малышев Олег
23.09.2011, 13:28
А библиотеку давно скачивали?

Alex7583
23.09.2011, 16:50
Скачивал на прошлой неделе.

Малышев Олег
26.09.2011, 11:31
Насколько я помню, была такая проблема в свое время, и ее решали. Может быть опять поломали? Пошлите запрос на support@owen.ru с описанием проблемы

Alex7583
26.09.2011, 12:23
Спасибо, буду туда обращаться.

Alex7583
28.09.2011, 12:28
В службе поддержки сказали что это действитеьно ошибка в библиотеке. Посоветовали получить данные с помощью функции owenio. На мой вопрос когда будет исправлена ошибка в библиотеке, так ответа и не дали. Поэтому пришлось разбираться с owenio. Вот код написанный на borland c++ builder, может кому-то пригодится.



float value=0;//C.SP value
int res=0;

res = OpenPort(0, spd_9600, prty_NONE, databits_8, stopbit_1, RS485CONV_AUTO);
if (res != ERR_OK) printf(" error opening port\n");

//---------- Read C.SP
char data[3];
DWORD dataSize = 0;
short znak; // znak according to 5.1.2
unsigned __int8 d8;
unsigned __int16 d16;
unsigned __int8 step; // stepen' according to 5.1.2
res = OwenIO(0, ADRTYPE_8BIT, 1, "C.SP", (char*)data, &dataSize);
if (res != ERR_OK) printf(" error reading C.SP\n");

//opredelenie C.SP soglasno p. 5.1.2 opisaniya protokola
d8=data[0];
if (( d8 & 0x80)>0) (znak = -1); else (znak = 1);
d8<<=1;
d8>>=5;
step=d8;
d8=data[0];
d16=d8;
d16<<=12;
d16>>=4;

d8=data[1];

d16=d16 | d8;

value=znak*pow(10,-step)*d16;