Вход

Просмотр полной версии : Групповое чтение ПЛК100 из Elemer EL-4019



Knive87
07.10.2015, 19:32
Есть в преобразователе 3 параметра, которые возможно прочитать только групповым запросом. В ПЛК это реализовать не получается, только начинаю их программировать. Может кто сталкивался или есть какие-нибудь идеи?

lara197a
07.10.2015, 21:17
(0x04) — чтение значений из нескольких регистров ввода (Read Input Registers).
см.:
http://we.easyelectronics.ru/khomin/modbus-rtu-dlya-chaynikov.html

petera
08.10.2015, 02:45
Есть в преобразователе 3 параметра, которые возможно прочитать только групповым запросом. В ПЛК это реализовать не получается, только начинаю их программировать. Может кто сталкивался или есть какие-нибудь идеи?
Пример с использованием String output module смотреть здесь http://www.owen.ru/forum/showthread.php?t=17207&p=141316&viewfull=1#post141316

Knive87
01.11.2015, 19:39
Спасибо большое, помогло, разобрался. Теперь только остался вопрос как разбить REAL на 2 WORD

petera
01.11.2015, 23:43
Теперь только остался вопрос как разбить REAL на 2 WORDhttp://www.owen.ru/forum/attachment.php?attachmentid=11962&d=1392751544
Мазохизмом попахивает:rolleyes:

melky
02.11.2015, 09:10
Преобразовать в dword и разделить на 2 word, только действительно зачем ?

Knive87
02.11.2015, 14:16
Есть модуль сбора данных МСД-200, которое работает как Slave, а значения в него пишет ПЛК. Если писать как обычно (by Pool time), то получается лестница из значений с привязкой ко времени. Читать архив значений неудобно и неприятно. Поэтому необходима групповая запись переменных из ПЛК. Числа с плавающей точкой (Float). Массивом тип REAL, ,больше одного не передается. Получается только WORD в String array (строковый массив). Разбиваем REAL на 2 WORD и записываем в нужные регистры и получаем нужные значения с линейной привязкой ко времени.

Появилась еще одна проблема. Необходимо настроить периодичность архивации. by pool time дает максимальную периодичность 10 сек и тройную запись переменной. Есть в настройках Universal network device выполнение по комманде (by command 0xFF-Start 0xFE-Stop), что меня бы вполне устроило, знай я как этим воспользоваться. Как послать эту команду, никак не доходит. Я новичек и возможно мазохист, но стремлюсь к совершенству. Не оставляйте, прошу, незнайкой)))

petera
02.11.2015, 16:00
Есть модуль сбора данных МСД-200, которое работает как Slave, а значения в него пишет ПЛК. Если писать как обычно (by Pool time), то получается лестница из значений с привязкой ко времени. Читать архив значений неудобно и неприятно. Поэтому необходима групповая запись переменных из ПЛК. Числа с плавающей точкой (Float). Массивом тип REAL, ,больше одного не передается. Получается только WORD в String array (строковый массив). Разбиваем REAL на 2 WORD и записываем в нужные регистры и получаем нужные значения с линейной привязкой ко времени
Не верю!
(с) Станиславский Константин Сергеевич

Специально сделал пример и попробовал, как работает групповая запись REAL с помощью модуля String
У меня все работает, по крайней мере на панель СП270 запись идет правильно
20627 20628 20629

Knive87
02.11.2015, 17:38
Не верю!
(с) Станиславский Константин Сергеевич

Специально сделал пример и попробовал, как работает групповая запись REAL с помощью модуля String
У меня все работает, по крайней мере на панель СП270 запись идет правильно
20627 20628 20629

Делал все так же, для одной переменной получается, а больше нет. Устройство МСД-200. Будем еще пробовать.

Knive87
04.11.2015, 00:05
REAL напрямую в МСД-200 более одной переменной не передается. Обошел иначе, может кому пригодится. Разбиваем (повторюсь) REAL на 2 WORD и передаем в регистры устройства, соответственно REAL=0..1 регистры, WORD1=0 регистр, WORD2=1 регистр. Теперь по разбивке.

Объявление переменных:
x: REAL
PrpREAL: POINTER TO ARRAY [0..1] OF WORD;
W: ARRAY [0..1] OF WORD;

Программа:
PrpREAL:=ADR(x);
W[0]:=PrpREAL^[0];
W[1]:=PrpREAL^[1];

Получаем 2 переменные из WORD массива, которые и передаем через String-массив.


Вот способ по сращиванию, нашел где-то, рабочий

Объявление переменных:
p1: POINTER TO BYTE;
p2: POINTER TO BYTE;
IN_Data: POINTER TO ARRAY[0..1] OF WORD; (*Указатель на массив регистров для Float*)
Out_data: Real;

Программа:
(*Регистры с типом данных Word необходимо пересобрать в обратной последовательности для получения Float*)
p1:=ADR(Out_data);
p2:=ADR(IN_Data^[1]);

p1^:=p2^;
p1:=p1+1;
p2:=p2+1;
p1^:=p2^;
p1:=p1+1;
p2:=ADR(IN_Data^[0]);
p1^:=p2^;
p1:=p1+1;
p2:=p2+1;
p1^:=p2^;

Валенок
04.11.2015, 10:45
Все-таки жёсткий мазохизм

Knive87
04.11.2015, 11:22
Все-таки жёсткий мазохизм

В достижении цели все средства хороши.