PDA

Просмотр полной версии : ПЛК 323 + МВ110-32ДН



alexusankov
14.05.2015, 13:33
Доброго дня, товарищи.
Связаны два данных устройства посредством RS485/Modbus. Параметры согласованы на устройствах и настроены.
ПЛК должен с МВ110 забирать 32 бита, показывающих соответственно состояние его 32-х входов. (регистры на модуле ввода - 0x63 и 0x64)
Добавляю кaнaл, но при добавлении, в окне соотнесение входов-выходов к каналу modbus привязывается переменная только на 16 бит.
Вопрос - как явно указать, что я хочу читать с модуля два байта, и работать с этими байтами как с DWORD?
Если это невозможно - как можно средствами языка ST объединить два word в dword, дабы полноценно работать с числом, как с одним логическим значением, ответственным за один прибор мв110?
1814618147

Трофимов Артем
14.05.2015, 13:53
во вложении пример склеивания двух вордов в REAL. также можете поменять REAL На DWORD и указать последовательность байт.

alexusankov
14.05.2015, 14:32
Благодарю за поддержку, однако с указателями в ST дел пока не имел, слишком неочевидно для меня использование указателей в ST.
Первый момент :
После беглого поиска по форуму, встречал пример сapzap, и переделанный под мои нужды он выглядит так :

VAR
mv110_1_H : WORD;
mv110_1_L : WORD;
MV_110 : DWORD;
mv_pt : POINTER TO DWORD;
END_VAR

mv_pt:=ADR(MV_110);
mv_pt^:=SHL(WORD_TO_DWORD(mv110_1_H),16) OR WORD_TO_DWORD(mv110_1_L);
Источник - http://www.owen.ru/forum/showthread.php?t=13058&p=87066&viewfull=1#post87066
Код мне понятен, за исключением применения POINTER - хоть кол о голову чеши, не понимаю, зачем указывать область памяти на переменную, когда в этом примере можно использовать оператор присваивания? В чем преимущества?
Вот следующий код, мне как Си программисту - понятен :

MV_110 := SHL(WORD_TO_DWORD(mv110_1_H),16) OR WORD_TO_DWORD(mv110_1_L);
Результат работы в ПЛК - такой же.
К чему тогда в этом коротком примере использование указателей?
Основная литература которую использую, это книга Павлова, то тема указателей - там не развернута (возможно потому что их нет в МЭК).
-------------
Второй вопрос - целесообразно ли в ST объявлять промежуточные переменные типа WORD, служащие для формирования DWORD, или можно делать вот так :

MV_110 := SHL(WORD_TO_DWORD(%IW0),16) OR WORD_TO_DWORD(%IW1);
Убирая тем самым избыточный код?

Sergey666
15.05.2015, 00:24
Работа через указатели - не что иное как один из ПРИЕМОВ обращения и работы с переменными . Каждую (любую) задачу можно решить как минимум тремя способами (выстрел в голову не в счет:p) , если задача решена - способ (прием) действенный .
А формирование из байт различных форматов - всего лишь перетасовка и "укладка" байт.
Например в системах программирования для прочих ПЛК есть команды перестановки байт в слове и команда прямого переноса "MOV","DMOV".

capzap
15.05.2015, 06:49
Благодарю за поддержку, однако с указателями в ST дел пока не имел, слишком неочевидно для меня использование указателей в ST.
Первый момент :
После беглого поиска по форуму, встречал пример сapzap, и переделанный под мои нужды он выглядит так :

VAR
mv110_1_H : WORD;
mv110_1_L : WORD;
MV_110 : DWORD;
mv_pt : POINTER TO DWORD;
END_VAR

mv_pt:=ADR(MV_110);
mv_pt^:=SHL(WORD_TO_DWORD(mv110_1_H),16) OR WORD_TO_DWORD(mv110_1_L);
Источник - http://www.owen.ru/forum/showthread.php?t=13058&p=87066&viewfull=1#post87066
Код мне понятен, за исключением применения POINTER - хоть кол о голову чеши, не понимаю, зачем указывать область памяти на переменную, когда в этом примере можно использовать оператор присваивания? В чем преимущества?
Вот следующий код, мне как Си программисту - понятен :

MV_110 := SHL(WORD_TO_DWORD(mv110_1_H),16) OR WORD_TO_DWORD(mv110_1_L);
Результат работы в ПЛК - такой же.
К чему тогда в этом коротком примере использование указателей?
Основная литература которую использую, это книга Павлова, то тема указателей - там не развернута (возможно потому что их нет в МЭК).
-------------
Второй вопрос - целесообразно ли в ST объявлять промежуточные переменные типа WORD, служащие для формирования DWORD, или можно делать вот так :

MV_110 := SHL(WORD_TO_DWORD(%IW0),16) OR WORD_TO_DWORD(%IW1);
Убирая тем самым избыточный код?

ну вопервых в моем примере речь шла о переменной реал, поэтому просто сложить два ворда не получится,для этого и использовал указатель
вовторых,есть еще вариант Вашего случая, shl можно заменить на умножение,возможно код будет еще меньше

alexusankov
15.05.2015, 08:36
речь шла о переменной реал, поэтому просто сложить два ворда не получится
Благодарю за отклик. А если в двух словах, то почему не получится, и почему получится с указателем?
Вы не могли бы посоветовать хорошую литературу, по особенностям языка ST?
Читал Павлова - но там лишь основы, и языки рассмотрены вкратце, а хочется побольше таких тонкостей.

вовторых,есть еще вариант Вашего случая, shl можно заменить на умножение,возможно код будет еще меньше
Имеется ввиду вариант :

MV_110_1 := (WORD_TO_DWORD(%IW0) * 65536 ) OR WORD_TO_DWORD(%IW1);
Логично, но со сдвигом немного очевиднее, в плане дальнейшего понимания кода (для меня)