библиотеки еще нет, но первый шаг на встречу пользователям сделан:
Нестандартные протоколы
На базе данных примеров можете составлять свои системы опроса электросчетчиков
библиотеки еще нет, но первый шаг на встречу пользователям сделан:
Нестандартные протоколы
На базе данных примеров можете составлять свои системы опроса электросчетчиков
здравствуйте. проштудировал форум и мануалы, но так и не нашел информации по подключению теплосчетчика спт к Plc. если несложно - ткните носом пожалуйста. лучше в пример. спасибо.
пишите на plc@owen.ru - вышлем.
Здравствуйте!
Не могу победить следующую проблемму:
Пытаюсь наладить опрос расходомеров Гиперфлоу-3Пм с ПЛК Овен-100. Тестирую пока на программе-эмуляторе Гиперфлоу.
Запросы на чтение мгновенных измеренных параметров (перепад, давление, температура, расход) проходят нормально.
Ответы читаю в массив 40 байт (преамбула, стартовый байт, адрес, команда, длина, статус, данные, контрольная сумма по XOR).
Проблеммы начинаются когда пытаюсь разобрать ответ гипера на мгновенные измеренные параметры: dP - байты с 18 по 21,
P - байты с 24 по 27, T - байты с 30 по 33, Q - байты с 36 по 39. Трабл возникает когда преобразую эти параметры
в REAL значения через указатель pt1 : POINT TO REAL следующим образом:
pt1 := ADR (Arr_Giper [Rx_Addr].Rx_buffer [18]);
Arr_Giper [Rx_Addr].dP := pt1^;
pt1 := ADR (Arr_Giper [Rx_Addr].Rx_buffer [24]);
(* Arr_Giper [Rx_Addr].P := pt1^; *)
pt1 := ADR (Arr_Giper [Rx_Addr].Rx_buffer [30]);;
Arr_Giper [Rx_Addr].T := pt1^;
pt1 := ADR (Arr_Giper [Rx_Addr].Rx_buffer [36]);
(* Arr_Giper [Rx_Addr].Q := pt1^; *)
,где Arr_Giper - массив структур гиперов, Rx_buffer : ARRAY [1..40] OF BYTE - ответ от гиперов.
Причем dP и T преобразуются без проблем, указатели на P и Q в строках 3,7 берутся нормально а когда убираю коментарий
с 4 и 8-ой строки контроллер при запуске перегружается.
В файле debug.txt появляются следующие записи:
17 E PLC was reset by watchdog!
3 M Last run module Id =100
3 M Last post module Id =100
3 M Total control code =18
3 M Max cache utilisation =6
3 M local_status =3
3 M run_level =2
3 M ff 45 ff ff ff 0 0 0 0 0 0 0 0 0 0 0
Т.е. как я понимаю, ПЛК перегружается по сторожевому таймеру.
Когда тестировал на CDS SP RTE все работало без проблем.
Help me please!
Не соблюдается выравнивание данных в памяти.
начальные адреса REAL должны быть кратны 4, при объявлении байтового массива его начальный адрес может быть случайным, далее если угадали положение dP, то потом вклиниваются байты 22 и 23 которые нарушают выравнивание. Надо объявить переменную REAL, и через ADR копировать
байты из массива, а не пытаться считать их через указатель.
Примерно так
varReal: REAL;
pReal: pointer to array[0..3] of byte;
pReal:=ADR(varReal);
Последний раз редактировалось Логвиненко Андрей; 14.02.2011 в 13:29.
Между параметрами dP, P, T, Q есть 2 пустых байта.
dP и T нормально преобразуются.
Чтобы проверить что с указателями не ошибся, создал 4 отдельных указателя pt1 : POINTER TO REAL;
pt2 : POINTER TO REAL;
pt3 : POINTER TO REAL;
pt4 : POINTER TO REAL;
и разделяю параметры следующим образом:
pt1 := ADR (Arr_Giper [Rx_Addr].Rx_buffer [18]);
Arr_Giper [Rx_Addr].dP := pt1^;
pt2 := ADR (Arr_Giper [Rx_Addr].Rx_buffer [24]);
(*Arr_Giper [Rx_Addr].P := pt2^;*)
pt3 := ADR (Arr_Giper [Rx_Addr].Rx_buffer [30]);;
Arr_Giper [Rx_Addr].T := pt3^;
pt4 := ADR (Arr_Giper [Rx_Addr].Rx_buffer [36]);
(*Arr_Giper [Rx_Addr].Q := pt4^;*)
при этом адреса получаются вроде как правильные:
pt1 = <202b9204>, pt2 = <202b920a>, pt3 = <202b9210>,
pt4 = <202b9216>
Почему 1-ый и 3-ий параметры преобразуются, а 2-ой и 4-ый не хотят?
Повторюсь, на SP RTE все работало.
Адреса как-раз неправильные, так как идут через 6. Адреса 1 и 3 параметров получаются кратными 4, поэтому и преобразуются.
Выравнивать адеса требует ARM, в SP RTE наверное это не требуется.
Попробуете так:
varReal: REAL;
SysMemCpy(ADR(varReal),pt1,4);
Последний раз редактировалось Логвиненко Андрей; 14.02.2011 в 14:00.
Спасибо! Попробую.
Ура! Заработало!
Логвиненко Андрей, большое Вам спасибо!