Просмотр полной версии : ПЛК73+чтение данных по modbus rtu.
Всех приветствую. Помогите разобраться новичку или поделиться кодом. Хочу на плк73 опрашивать переменные по протоколу rtu с разных приборов с последующим выводом на жки. Как выводить информацию на экран разобрался, с помощью библиотеки showreal. А вот как опрашивать регистры, не получается. Заранее спасибо.
На ПЛК63/73 только через библиотеку, если ПЛК является мастером. Примеры должны быть на сайте
На ПЛК63/73 только через библиотеку, если ПЛК является мастером. Примеры должны быть на сайте
62211
Не подскажешь, что нужно подставлять ко входу Buffer? Выходит ошибка по нему.
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
..Я не совсем понимаю предназначение этого входа...
Для лучшего понимания ответьте на вопрос : а с какой целью используете MB_RD_INP_REGS ?
ps
"парамер-значение vs параметр-переменная" (C) Букварь кодера на любом языке/среде/компе/плк/часах/стиральной машине
Может так легче ?
Для лучшего понимания ответьте на вопрос : а с какой целью используете MB_RD_INP_REGS ?
ps
"парамер-значение vs параметр-переменная" (C) Букварь кодера на любом языке/среде/компе/плк/часах/стиральной машине
Может так легче ?
С целью считать четвёртую функцию с устройства.
С целью считать ... с устройства.
Вот. Хорошо. И где предполагаете увидеть данные вызывая функ.блок ?
(Предположу что имели в виду считать что-то с помощью 4-й функции, а не считать 4-фунцию - не ?)
Ильяс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.
Примеры даю свои.
Вот. Хорошо. И где предполагаете увидеть данные вызывая функ.блок ?
(Предположу что имели в виду считать что-то с помощью 4-й функции, а не считать 4-фунцию - не ?)
Предположения верны, извините за мою неграмотность. Увидеть данные хотел на ЖКИ ПЛК73.
.. Увидеть данные хотел на ЖКИ ПЛК73.
А как, предполагаете, данные с того устройства появятся на ЖКИ здесь, на ПЛК ?
(что то подсказывает что скоро от ТС будет 2й вопрос, про ЖК, или здесь все норм - разобрались? )
Ильяс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
Здесь два буфера, потому что опрашивается два регистра?
Буфер один - байтовый. Регистр состоит из двух байт. С помощью указателя (Ptb) "разбираем" буфер, "склеивая" по два байта в один регистр, в приведённом Вами куске кода, в один INT.
Буфер один - байтовый. Регистр состоит из двух байт. С помощью указателя (Ptb) "разбираем" буфер, "склеивая" по два байта в один регистр, в приведённом Вами куске кода, в один INT.
А как склеить во float например? У меня конечные данные не совпадают с фактическими показаниями устрйоства.
А как, предполагаете, данные с того устройства появятся на ЖКИ здесь, на ПЛК ?
(что то подсказывает что скоро от ТС будет 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];
А как склеить во float например?... устрйоства.
А что за девайс? Из местных?
//Здесь упоминаются 8А и 8АС
Из вышесказанного вроде вытекает что вопрос "ху из buffer" - закрыт
В примере всё есть, и чтение буфера в INT, и (чуть ниже, в этом же коде) в REAL.
А что за девайс? Из местных?
//Здесь упоминаются 8А и 8АС
Из вышесказанного вроде вытекает что вопрос "ху из buffer" - закрыт
62286
Другого производителя ИМ2300.
Здесь выкладывал в последнем сообщении пример чтения МВ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 и его используете, изменяя под себя. Потом след кусок и т. д. Потом просто соберёте программу из рабочих кусков.
kondor3000, Вы так человека еще больше запутаете.
Зачем "10" промежуточных операций? Сначала клеим байты в WORD'ы, потом WORD'ы в REAL'ы... А сразу 4 байта в REAL в правильной последовательности одной функцией?
Вообще, ТС нужно для начала разобраться с типами значений, а то он, на мой взгляд, слишком далеко решил "шагнуть" с ходу... "не зная броду"...
kondor3000
26.08.2022, 14:15
Spawn, вы плохо посмотрели, первая половина последнего сообщения относится к склейке REAL прямо из буфера.
Он сам себя путает, не зная основ.
Проще уже некуда, взял пример на ST, адаптировал под себя, поменяв адрес модуля и адреса регистров,
нет он взял FBD, где надо ещё дописывать большую часть, только потому, что пример для ПЛК63
Spawn, вы плохо посмотрели, первая половина последнего сообщения относится к склейке REAL прямо из буфера.
Он сам себя путает, не зная основ.
Проще уже некуда, взял пример на ST, адаптировал под себя, поменяв адрес модуля и адреса регистров,
нет он взял FBD, где надо ещё дописывать большую часть, только потому, что пример для ПЛК63
Я почему то подумал, что на FBD будет проще адаптировать под себя. Попробую на ST.
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 - переставить байты и регистры.
Какие адреса вы читаете? Выложите пример своего проекта ( в расширенном режиме).
Можно вообще ничего не делать а прям на девайсе настроить порядок байт.
Автор хоть РЭ на свой девайс читал на пол-страницы выше картинки из поста #19 ?
kondor3000
29.08.2022, 21:24
Можно вообще ничего не делать а прям на девайсе настроить порядок байт.
Автор хоть РЭ на свой девайс читал на пол-страницы выше картинки из поста #19 ?
Действительно, порядок байт можно настроить в приборе 62341
Но я бы для тренировки переставил в программе), как написал выше. И главное, по какому адресу читаете ?
Физический и логический отличаются на 1, от этого тоже зависит правильность чтения.
Во первых таким способом из двух байт, вы соберёте только 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
На вашем скрине вызов блока серым цветом, т. e. он не вызван в программе.
Для чего вам скрин примера вывода блока давал? и Писал, что блоки можно выводить как например Таймеры. Надо объявить экземпляр ФБ в верхней части, например
TON1 : TON ;
и вызвать в самой программе. Это делается с помощью F2 на ST.
У вас ShowReal - это функция и её проще вызвать прямо в программе, тоже по F2, выбрать библиотеку и нужную функцию. А потов подставить на входы нужное.
Смотри скрин, вызов функции вставил в начале программы 62399
6240362404
Большое спасибо. Получилось.
kondor3000
31.08.2022, 14:40
Уже хорошо)))
Но я бы перекомпоновал программу, переименовал бы вашу программу в Opros, а PLC_PRG сделал бы на CFC и добавлял бы ещё потом что надо.
Смотри скрин, вызов программы Opros это нулевой шаг 62405
Переменные, которые нужны в обеих программах, перенести в Глобальные, так они будут доступны из любого блока. В примере это r1.
Уже хорошо)))
Но я бы перекомпоновал программу, переименовал бы вашу программу в 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
Выше написал, переменные которые используются в обеих программах перенести в глобальные и удалить из самих программ ( в верхней части, в разделе объявлений).
Ваша
Qn:=REAL ; должна быть помещена в глобальные и удалена из всех программ в объявлениях. В программе REG, её надо присвоить, а в PLC_RRG вывести на вход блока.
62437
Моя не внимательность, ключевым было перенести, а я просто добавил в глобальные переменные и ждал чуда. Большое спасибо. Мне ещё учиться и учиться(
kondor3000
02.09.2022, 15:31
Мне ещё учиться и учиться(
Вы не поверите, но я учусь до сих пор, всего знать невозможно, но стремиться надо.
Зато вы сделали первый проект, да ещё с библиотечным обменом, это уже круто)))
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot