PDA

Просмотр полной версии : Вопрос по примеру работы со счетчиком Меркурий



JIexa21
02.03.2012, 10:37
Всем привет!

Разобрался вроде со всем, но вот есть непонятный момент.

IF rt.Q THEN
IF Error3=0 THEN
Q_f3:=WORD_TO_REAL(DD3.Out)/100;
IF DD3.znak6 THEN
Q_f3:=Q_f3*-1;
END_IF
END_IF

DD3(
start:= FALSE);
Stat:=109;
END_IF
Что конкретно не понятно:

Q_f3:=WORD_TO_REAL(DD3.Out)/100;
IF DD3.znak6 THEN
Q_f3:=Q_f3*-1;
END_IF
Выходу FB уже присвоили значение, а потом проверяем знак и меняем его в переменной, которую уже вывели? И так по всему примеру с подобными данными...

capzap
02.03.2012, 11:06
ничего страшного,это особенность всех ПЛК, входам и выходам значения присваиваются не мгновенно, а двумя словами: в конце цикла( выхода) и в начале цикла (входа)

JIexa21
07.03.2012, 10:39
ничего страшного,это особенность всех ПЛК, входам и выходам значения присваиваются не мгновенно, а двумя словами: в конце цикла( выхода) и в начале цикла (входа)

Блин, точно. Извиняюсь. :)

Наконец то у меня сегодня появился счетчик. Естественно что сначала ничего не работало, но уже разобрался и данные "поперли". :)
Почему не заработало сразу: ошибка в библиотеке mercury.lib и в частности в FB GetParam.
Было:


2:
WAIT_M (IN := TRUE);
DD2(
start:=TRUE ,
DeviceAdr:= DA,
Level:= Level,
Code:= ADR(code) ,
DeviceNumber:= DN,
Timeout:= TM,
PollingTime:= TP,
Стало:


2:
WAIT_M (IN := TRUE);
DD2(
start:=TRUE ,
DeviceAdr:= DA,
Level:= Level,
Code:= code ,
DeviceNumber:= DN,
Timeout:= TM,
PollingTime:= TP,

Т.е. в Open_session (DD2) передавался не адрес массива с паролем, а адрес с переменной адреса массива. Ну вы поняли. :)

capzap
07.03.2012, 11:02
Code: POINTER TO ARRAY [0..5] OF BYTE; здесь указатель на массив и комбинация ADR(code) верная в том случае, если code сам по себе не указатель на массив, а именно массив ARRAY [0..5] OF BYTE. Окно объявлений покажите, где объявлен code

JIexa21
07.03.2012, 11:27
Это понятно. Посмотрите пример PLC110-M + Mercury.pro - там передается именно адрес. Я по нему делал.

Code: ARRAY [0..5] OF BYTE := 6(1);
А после Code перед FB GetParam стоит ADR.
Т.е. по идее пример не рабочий.

capzap
07.03.2012, 11:40
все правильно там, в разделе объявлений массив, в ФБ GetParam он передается через блок ADR, внутри ФБ GetParam вход объявлен как указатель, так что ошибок в примере нет, что касаеется этой ситуации

JIexa21
07.03.2012, 12:59
Я все это практически без изменений вставил в свой проект. Добавил только чтение даты и времени в GetParam - сделал еще одну функцию. Ну и добавил тайм-аут при тесте связи - выход, если нет ответа в течении 500мс.
Сейчас попробовал завести ваш пример - не завелся. Только заменил в конфигурации контроллер и в плц_прг адрес счетчика.

JIexa21
11.03.2012, 12:03
Нашел еще один косяк. :)
В FB модуле Read_Energy_Mass:


IF NumMass =6 THEN
p:=ADR(out4);
p^:=otvet[15];
p:=ADR(out4)+1;
p^:=otvet[16];

IF out4=65535 THEN
out4:=0;
END_IF

ELSE
out4:=0;
END_IF

А должно быть:


IF NumMass <> 6 THEN

Если запрашиваем пофазные значения, то длина 12 байт, а не наоборот...
Или я что-то где-то не понимаю?
И еще вопрос: ответы энергий идут размером в DWORD, а у вас всего WORD, т.е. с учетом того что там в ват/час, то переход через ноль будет уже при 65 с копейками киловатт. Не маловато ли?

Александр Приходько
21.09.2012, 09:52
Обновлена библиотека работы со счетчиками электроэнергии Меркурий.
Новая версия 3.2.

Скачать можно тут:
http://www.owen.ru/forum/showthread.php?t=11279

MikJagger
15.07.2013, 08:49
Я все это практически без изменений вставил в свой проект. Добавил только чтение даты и времени в GetParam - сделал еще одну функцию. Ну и добавил тайм-аут при тесте связи - выход, если нет ответа в течении 500мс.
Сейчас попробовал завести ваш пример - не завелся. Только заменил в конфигурации контроллер и в плц_прг адрес счетчика.
Добрый день, а не подскажите как вы сделали чтение даты и времени!?
Если можно не скините свой проект по работе с меркурием, ну или часть проекта!?
Заранее спасибо.