PDA

Просмотр полной версии : ПЛК73+чтение данных по modbus rtu.



Ильяс94
22.08.2022, 07:13
Всех приветствую. Помогите разобраться новичку или поделиться кодом. Хочу на плк73 опрашивать переменные по протоколу rtu с разных приборов с последующим выводом на жки. Как выводить информацию на экран разобрался, с помощью библиотеки showreal. А вот как опрашивать регистры, не получается. Заранее спасибо.

melky
22.08.2022, 08:41
На ПЛК63/73 только через библиотеку, если ПЛК является мастером. Примеры должны быть на сайте

Ильяс94
23.08.2022, 07:24
На ПЛК63/73 только через библиотеку, если ПЛК является мастером. Примеры должны быть на сайте

62211

Не подскажешь, что нужно подставлять ко входу Buffer? Выходит ошибка по нему.

Ильяс94
23.08.2022, 07:41
62211

Не подскажешь, что нужно подставлять ко входу Buffer? Выходит ошибка по нему.

62212

В описаний так и написано. Я не совсем понимаю предназначение этого входа, инфу пытался найти.

kondor3000
23.08.2022, 08:38
62212

В описаний так и написано. Я не совсем понимаю предназначение этого входа, инфу пытался найти.

Есть же готовые примеры по ПЛК63/73
10 Обмен через библиотеки Modbus и OwenNet https://owen.ru/product/codesys_v2/example_program

У вас в программе массив BOOL,
Buffer: ARRAY[0..255] OF BOOL;
а в примере массив BYTE
Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
вам ведь ответили уже.
Вот скрин MB_RTU 62216

Валенок
23.08.2022, 08:46
..Я не совсем понимаю предназначение этого входа...
Для лучшего понимания ответьте на вопрос : а с какой целью используете MB_RD_INP_REGS ?


ps
"парамер-значение vs параметр-переменная" (C) Букварь кодера на любом языке/среде/компе/плк/часах/стиральной машине
Может так легче ?

Ильяс94
23.08.2022, 14:07
Для лучшего понимания ответьте на вопрос : а с какой целью используете MB_RD_INP_REGS ?


ps
"парамер-значение vs параметр-переменная" (C) Букварь кодера на любом языке/среде/компе/плк/часах/стиральной машине
Может так легче ?

С целью считать четвёртую функцию с устройства.

Валенок
23.08.2022, 19:30
С целью считать ... с устройства.
Вот. Хорошо. И где предполагаете увидеть данные вызывая функ.блок ?

(Предположу что имели в виду считать что-то с помощью 4-й функции, а не считать 4-фунцию - не ?)

Spawn
23.08.2022, 23:48
Ильяс94, примеры опроса есть здесь (https://owen.ru/forum/showthread.php?t=35649&page=3), здесь (https://owen.ru/forum/showthread.php?t=36198) и здесь (https://owen.ru/forum/showthread.php?t=33400&highlight=Spawn).

Здесь (https://owen.ru/forum/showthread.php?t=29168&page=2&p=284108#post284108) есть пример как "разбирать" Buffer.

Примеры даю свои.

Ильяс94
24.08.2022, 06:52
Вот. Хорошо. И где предполагаете увидеть данные вызывая функ.блок ?

(Предположу что имели в виду считать что-то с помощью 4-й функции, а не считать 4-фунцию - не ?)

Предположения верны, извините за мою неграмотность. Увидеть данные хотел на ЖКИ ПЛК73.

Валенок
24.08.2022, 07:58
.. Увидеть данные хотел на ЖКИ ПЛК73.
А как, предполагаете, данные с того устройства появятся на ЖКИ здесь, на ПЛК ?


(что то подсказывает что скоро от ТС будет 2й вопрос, про ЖК, или здесь все норм - разобрались? )

Ильяс94
25.08.2022, 13:11
Ильяс94, примеры опроса есть здесь (https://owen.ru/forum/showthread.php?t=35649&page=3), здесь (https://owen.ru/forum/showthread.php?t=36198) и здесь (https://owen.ru/forum/showthread.php?t=33400&highlight=Spawn).

Здесь (https://owen.ru/forum/showthread.php?t=29168&page=2&p=284108#post284108) есть пример как "разбирать" Buffer.

Примеры даю свои.

62271

Здесь два буфера, потому что опрашивается два регистра?

Spawn
25.08.2022, 14:02
Буфер один - байтовый. Регистр состоит из двух байт. С помощью указателя (Ptb) "разбираем" буфер, "склеивая" по два байта в один регистр, в приведённом Вами куске кода, в один INT.

Ильяс94
25.08.2022, 15:05
Буфер один - байтовый. Регистр состоит из двух байт. С помощью указателя (Ptb) "разбираем" буфер, "склеивая" по два байта в один регистр, в приведённом Вами куске кода, в один INT.

А как склеить во float например? У меня конечные данные не совпадают с фактическими показаниями устрйоства.

Ильяс94
25.08.2022, 15:12
А как, предполагаете, данные с того устройства появятся на ЖКИ здесь, на ПЛК ?


(что то подсказывает что скоро от ТС будет 2й вопрос, про ЖК, или здесь все норм - разобрались? )

ЖКИ вроде разобрался. С помощью библиотеки Showreal или Showdint выводятся данные

kondor3000
25.08.2022, 15:52
А как склеить во float например? У меня конечные данные не совпадают с фактическими показаниями устрйоства.

Здесь выкладывал в последнем сообщении пример чтения МВ110-8А, с Функц. блоком склейки двух WORD в REAL. По аналогии склеиваются и байты https://owen.ru/forum/showthread.php?t=35094#10
Можно склеить прямо в программе из буфера. Это есть в примерах, ссылки давал в начале. Пример первых двух REAL. 62277
Пример для МВ110-8А, данные перемешаны, поэтому пропуски.



d: ARRAY [0..23] OF REAL; (*считанное значение*)
ptr_D:POINTER TO BYTE;
END_VAR
__________________________________________________
(* Вставить, в след. шаге CASE где склеиваете INT (WORD) *)
ptr_D:=ADR(d)+8; ptr_D^:=buffer[11]; ptr_D:=ptr_D+1; ptr_D^:=buffer[10]; ptr_D:=ptr_D+1; ptr_D^:=buffer[9]; ptr_D:=ptr_D+1; ptr_D^:=buffer[8];
ptr_D:=ptr_D+9; ptr_D^:=buffer[23]; ptr_D:=ptr_D+1; ptr_D^:=buffer[22]; ptr_D:=ptr_D+1; ptr_D^:=buffer[21]; ptr_D:=ptr_D+1; ptr_D^:=buffer[20];

Для вашего МВ110-8АС, данные REAL подряд (читать с первого адреса REAL) будет так,
первые 2 REAL, для правильного отображения данные из буфера присваиваем в обратном порядке:


d: ARRAY [0..7] OF REAL; (*считанное значение*)
ptr_D:POINTER TO BYTE;
END_VAR
__________________________________________________
(* Вставить, в след. шаге CASE где склеиваете INT (WORD) *)
ptr_D:=ADR(d); ptr_D^:=buffer[3]; ptr_D:=ptr_D+1; ptr_D^:=buffer[2]; ptr_D:=ptr_D+1; ptr_D^:=buffer[1]; ptr_D:=ptr_D+1; ptr_D^:=buffer[0];
ptr_D:=ptr_D+1; ptr_D^:=buffer[9]; ptr_D:=ptr_D+1; ptr_D^:=buffer[8]; ptr_D:=ptr_D+1; ptr_D^:=buffer[7]; ptr_D:=ptr_D+1; ptr_D^:=buffer[6];

Валенок
25.08.2022, 18:33
А как склеить во float например?... устрйоства.
А что за девайс? Из местных?

//Здесь упоминаются 8А и 8АС
Из вышесказанного вроде вытекает что вопрос "ху из buffer" - закрыт

Spawn
25.08.2022, 23:24
В примере всё есть, и чтение буфера в INT, и (чуть ниже, в этом же коде) в REAL.

Ильяс94
26.08.2022, 06:18
А что за девайс? Из местных?

//Здесь упоминаются 8А и 8АС
Из вышесказанного вроде вытекает что вопрос "ху из buffer" - закрыт

62286

Другого производителя ИМ2300.

Ильяс94
26.08.2022, 07:26
Здесь выкладывал в последнем сообщении пример чтения МВ110-8А, с Функц. блоком склейки двух WORD в REAL. По аналогии склеиваются и байты https://owen.ru/forum/showthread.php?t=35094#10
Можно склеить прямо в программе из буфера. Это есть в примерах, ссылки давал в начале. Пример первых двух REAL. 62277
Пример для МВ110-8А, данные перемешаны, поэтому пропуски.



d: ARRAY [0..23] OF REAL; (*считанное значение*)
ptr_D:POINTER TO BYTE;
END_VAR
__________________________________________________
(* Вставить, в след. шаге CASE где склеиваете INT (WORD) *)
ptr_D:=ADR(d)+8; ptr_D^:=buffer[11]; ptr_D:=ptr_D+1; ptr_D^:=buffer[10]; ptr_D:=ptr_D+1; ptr_D^:=buffer[9]; ptr_D:=ptr_D+1; ptr_D^:=buffer[8];
ptr_D:=ptr_D+9; ptr_D^:=buffer[23]; ptr_D:=ptr_D+1; ptr_D^:=buffer[22]; ptr_D:=ptr_D+1; ptr_D^:=buffer[21]; ptr_D:=ptr_D+1; ptr_D^:=buffer[20];

Для вашего МВ110-8АС, данные REAL подряд (читать с первого адреса REAL) будет так,
первые 2 REAL, для правильного отображения данные из буфера присваиваем в обратном порядке:


d: ARRAY [0..7] OF REAL; (*считанное значение*)
ptr_D:POINTER TO BYTE;
END_VAR
__________________________________________________
(* Вставить, в след. шаге CASE где склеиваете INT (WORD) *)
ptr_D:=ADR(d); ptr_D^:=buffer[3]; ptr_D:=ptr_D+1; ptr_D^:=buffer[2]; ptr_D:=ptr_D+1; ptr_D^:=buffer[1]; ptr_D:=ptr_D+1; ptr_D^:=buffer[0];
ptr_D:=ptr_D+1; ptr_D^:=buffer[9]; ptr_D:=ptr_D+1; ptr_D^:=buffer[8]; ptr_D:=ptr_D+1; ptr_D^:=buffer[7]; ptr_D:=ptr_D+1; ptr_D^:=buffer[6];


62287

Тяжеловато мне в ST ориентироваться( Пытаюсь Ваш пример соотнести с примером FBD. Не могу правильно склеить два регистра во FLOAT, данные на выходе не правильно отображаются(

kondor3000
26.08.2022, 08:24
62287

Тяжеловато мне в ST ориентироваться( Пытаюсь Ваш пример соотнести с примером FBD. Не могу правильно склеить два регистра во FLOAT, данные на выходе не правильно отображаются(
Во первых таким способом из двух байт, вы соберёте только WORD, REAL- состоит из 4 байт или из 2 WORD.
На FBD это займёт 8 строк для 1 REAL, см. скрин 62292
а на ST одну строку, при чём с правильным расположением байт. Нафиг этот FBD.

ptr_D:=ADR(d); ptr_D^:=buffer[3]; ptr_D:=ptr_D+1; ptr_D^:=buffer[2]; ptr_D:=ptr_D+1; ptr_D^:=buffer[1]; ptr_D:=ptr_D+1; ptr_D^:=buffer[0];



У вас подход неверный, копируете блок полностью к себе в программу, а вызываете его уже в CFC квадратиком. Привыкайте комбинировать языки. Можно через экспорт, импорт, можно просто копипастом, чем ST и хорош. И используете блок, как например таймер, только ФБ пользовательский, а не библиотечный. Вызывать, вставлять название ФБ можно через F2. На скрине REAL получен из 2 WORD.
62289Надеюсь вы данные правильно на вход подаёте из адресов REAL и в правильной последовательности.

И ещё, не надо всё сразу копировать в одну программу. Берёте пример опроса блока на ST и его используете, изменяя под себя. Потом след кусок и т. д. Потом просто соберёте программу из рабочих кусков.

Spawn
26.08.2022, 11:00
kondor3000, Вы так человека еще больше запутаете.

Зачем "10" промежуточных операций? Сначала клеим байты в WORD'ы, потом WORD'ы в REAL'ы... А сразу 4 байта в REAL в правильной последовательности одной функцией?

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

kondor3000
26.08.2022, 14:15
Spawn, вы плохо посмотрели, первая половина последнего сообщения относится к склейке REAL прямо из буфера.
Он сам себя путает, не зная основ.
Проще уже некуда, взял пример на ST, адаптировал под себя, поменяв адрес модуля и адреса регистров,
нет он взял FBD, где надо ещё дописывать большую часть, только потому, что пример для ПЛК63

Ильяс94
29.08.2022, 14:23
Spawn, вы плохо посмотрели, первая половина последнего сообщения относится к склейке REAL прямо из буфера.
Он сам себя путает, не зная основ.
Проще уже некуда, взял пример на ST, адаптировал под себя, поменяв адрес модуля и адреса регистров,
нет он взял FBD, где надо ещё дописывать большую часть, только потому, что пример для ПЛК63

Я почему то подумал, что на FBD будет проще адаптировать под себя. Попробую на ST.

Ильяс94
29.08.2022, 14:52
Spawn, вы плохо посмотрели, первая половина последнего сообщения относится к склейке REAL прямо из буфера.
Он сам себя путает, не зная основ.
Проще уже некуда, взял пример на ST, адаптировал под себя, поменяв адрес модуля и адреса регистров,
нет он взял FBD, где надо ещё дописывать большую часть, только потому, что пример для ПЛК63

Адаптировал ST по свои регистры. Не правильно отображаются данные, Надо правильно разобрать буфер, не могу понять пока, что как это сделать правильно. В карте регистров ведомого устройства, написано что данные типа float.

kondor3000
29.08.2022, 15:18
Адаптировал ST по свои регистры. Не правильно отображаются данные, Надо правильно разобрать буфер, не могу понять пока, что как это сделать правильно. В карте регистров ведомого устройства, написано что данные типа float.

Буфер это массив байт, счёт идёт с нуля, [0], [1], [2], [3], ( условно назовём их 1,2,3,4),
в переменной REAL 4 байта или 2 регистра, соответственно если отображение неправильное, значит есть 3 варианта, переставить их как:
2143- переставить байты,
3412 - переставить регистры,
4321 - переставить байты и регистры.

Какие адреса вы читаете? Выложите пример своего проекта ( в расширенном режиме).

Валенок
29.08.2022, 19:49
Можно вообще ничего не делать а прям на девайсе настроить порядок байт.
Автор хоть РЭ на свой девайс читал на пол-страницы выше картинки из поста #19 ?

kondor3000
29.08.2022, 21:24
Можно вообще ничего не делать а прям на девайсе настроить порядок байт.
Автор хоть РЭ на свой девайс читал на пол-страницы выше картинки из поста #19 ?

Действительно, порядок байт можно настроить в приборе 62341
Но я бы для тренировки переставил в программе), как написал выше. И главное, по какому адресу читаете ?
Физический и логический отличаются на 1, от этого тоже зависит правильность чтения.

Ильяс94
31.08.2022, 11:55
Во первых таким способом из двух байт, вы соберёте только WORD, REAL- состоит из 4 байт или из 2 WORD.
На FBD это займёт 8 строк для 1 REAL, см. скрин 62292
а на ST одну строку, при чём с правильным расположением байт. Нафиг этот FBD.

ptr_D:=ADR(d); ptr_D^:=buffer[3]; ptr_D:=ptr_D+1; ptr_D^:=buffer[2]; ptr_D:=ptr_D+1; ptr_D^:=buffer[1]; ptr_D:=ptr_D+1; ptr_D^:=buffer[0];



У вас подход неверный, копируете блок полностью к себе в программу, а вызываете его уже в CFC квадратиком. Привыкайте комбинировать языки. Можно через экспорт, импорт, можно просто копипастом, чем ST и хорош. И используете блок, как например таймер, только ФБ пользовательский, а не библиотечный. Вызывать, вставлять название ФБ можно через F2. На скрине REAL получен из 2 WORD.
62289Надеюсь вы данные правильно на вход подаёте из адресов REAL и в правильной последовательности.

И ещё, не надо всё сразу копировать в одну программу. Берёте пример опроса блока на ST и его используете, изменяя под себя. Потом след кусок и т. д. Потом просто соберёте программу из рабочих кусков.

62397


Я получил нужные мне переменные. Как совместить ST и FBD (или CFC) что бы можно было подключить библиотеку showreal для вывода на ЖКИ ПЛК73? Я пробую добавить действие ставлю блок showreal ко входу блока пишу название переменной, загружаю в контроллер. В итоге экран контроллера пустой. Так же пробовал добавлять объект в виде ФБ и программы, делаю там аналогично, так же пустой экран.62397

kondor3000
31.08.2022, 12:49
62397


Я получил нужные мне переменные. Как совместить ST и FBD (или CFC) что бы можно было подключить библиотеку showreal для вывода на ЖКИ ПЛК73? Я пробую добавить действие ставлю блок showreal ко входу блока пишу название переменной, загружаю в контроллер. В итоге экран контроллера пустой. Так же пробовал добавлять объект в виде ФБ и программы, делаю там аналогично, так же пустой экран.62397
На вашем скрине вызов блока серым цветом, т. e. он не вызван в программе.
Для чего вам скрин примера вывода блока давал? и Писал, что блоки можно выводить как например Таймеры. Надо объявить экземпляр ФБ в верхней части, например
TON1 : TON ;
и вызвать в самой программе. Это делается с помощью F2 на ST.

У вас ShowReal - это функция и её проще вызвать прямо в программе, тоже по F2, выбрать библиотеку и нужную функцию. А потом подставить на входы нужное.
Смотри скрин, вызов функции вставил в начале программы 62399

Ильяс94
31.08.2022, 14:12
На вашем скрине вызов блока серым цветом, т. e. он не вызван в программе.
Для чего вам скрин примера вывода блока давал? и Писал, что блоки можно выводить как например Таймеры. Надо объявить экземпляр ФБ в верхней части, например
TON1 : TON ;
и вызвать в самой программе. Это делается с помощью F2 на ST.

У вас ShowReal - это функция и её проще вызвать прямо в программе, тоже по F2, выбрать библиотеку и нужную функцию. А потов подставить на входы нужное.
Смотри скрин, вызов функции вставил в начале программы 62399

6240362404

Большое спасибо. Получилось.

kondor3000
31.08.2022, 14:40
Уже хорошо)))
Но я бы перекомпоновал программу, переименовал бы вашу программу в Opros, а PLC_PRG сделал бы на CFC и добавлял бы ещё потом что надо.
Смотри скрин, вызов программы Opros это нулевой шаг 62405
Переменные, которые нужны в обеих программах, перенести в Глобальные, так они будут доступны из любого блока. В примере это r1.

Ильяс94
01.09.2022, 15:24
Уже хорошо)))
Но я бы перекомпоновал программу, переименовал бы вашу программу в Opros, а PLC_PRG сделал бы на CFC и добавлял бы ещё потом что надо.
Смотри скрин, вызов программы Opros это нулевой шаг 62405
Переменные, которые нужны в обеих программах, перенести в Глобальные, так они будут доступны из любого блока. В примере это r1.

У меня переменная не берет информацию из программы ST, отображается 0. Что я забыл ещё сделать?6243562436

kondor3000
01.09.2022, 15:43
У меня переменная не берет информацию из программы ST, отображается 0. Что я забыл ещё сделать?6243562436

Выше написал, переменные которые используются в обеих программах перенести в глобальные и удалить из самих программ ( в верхней части, в разделе объявлений).
Ваша
Qn:=REAL ; должна быть помещена в глобальные и удалена из всех программ в объявлениях. В программе REG, её надо присвоить, а в PLC_RRG вывести на вход блока.
62437

Ильяс94
02.09.2022, 06:58
Выше написал, переменные которые используются в обеих программах перенести в глобальные и удалить из самих программ ( в верхней части, в разделе объявлений).
Ваша
Qn:=REAL ; должна быть помещена в глобальные и удалена из всех программ в объявлениях. В программе REG, её надо присвоить, а в PLC_RRG вывести на вход блока.
62437

Моя не внимательность, ключевым было перенести, а я просто добавил в глобальные переменные и ждал чуда. Большое спасибо. Мне ещё учиться и учиться(

kondor3000
02.09.2022, 15:31
Мне ещё учиться и учиться(

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