|
Связь с внешним миром Modbus, RS232, RS485, Lon и другое. |
|
Опции темы | Поиск в этой теме |
13.12.2008, 17:26 | #1 |
Новичок
Регистрация: Oct 2008
Сообщения: 10
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
сетевые in-out переменные
очень хотелось бы чтобы появились in-out модбас переменные, не очень удобно задавать значение в один адрес, а считывать из другого. если задавать уставку, в некоторых панелях приходиться выводить два числа - одно заданное, другое фактическое, вместо того чтобы просто привязаться к одной переменной
|
15.12.2008, 10:45 | #2 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Наши контроллеры работают под управлением циклически работающей программы. Это значит, что данные перерассчитываются каждый такой цикл. Количество циклов может достигать сотни в секунду. Следовательно и "внутренние" данные на такой переменной будут обновляться так же часто.
Вполне допускаю, что на такой вот "совмещённой" переменной записанные извне данные постоянно будут теряться. И, в конце концов, это противоречит самой структуре стандарта modbus. Обратите внимание на название пространств переменных: INPUT status, INPUT register. COIL status, HOLDING registers. Input - входные; coil - катушка реле; holding - удерживание, закрепление. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
15.12.2008, 13:09 | #3 |
Senior Member
Регистрация: Jan 2006
Сообщения: 172
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
1. HOLDING registers легко позволяют делать такое. В моих разработках так сделаны настройки которые можно изменить и по Модбасу и с панели контроллера.
2. У меня есть некоторые сомнения в возможности и целесообразности переписывать modbus-регистры сотню раз в секунду. Вы же не собираетесь записывать данные в каждом цикле, даже если значение переменной не изменилось? |
15.12.2008, 13:32 | #4 |
Новичок
Регистрация: Oct 2008
Сообщения: 10
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
так оно и есть, циклическая программа вначале исполнения принимает данные, после выполнения сохраняет значения в тех же переменных, быстро скакать они не будут, потому что программу то пишу я сам, и сам определяю для чего мне эти переменые, например, есть уставка, которая может корректироваться алгоритмом - например ограничение, но когда у меня регистр только на запись, я об этой корректировке могу узнать только из другой переменной, а когда переменная одна и та же - есть окно для ввода-вывода значений, я ввожу уставку, и тут же после этого вижу ее реальное значение в контроллере. сейчас для этого нужно заводить второе окошечко, либо как то придумывать как обновить оконце с уставкой.
да и спецификация модбаса не говорит что это обязательно должны быть разные области, можно сделать одну область для input registers и для holding, а команды используй на запись одни, на чтение другие. у вас же сейчас можно менять адрес переменных, если снять ограничение на адрес, то и будет счастье сотню раз в секунду менять значение, конечно,нет никагого смысла, такие переменные нужны для настроек, а они меняются довольно редко. Последний раз редактировалось Николай Ушаков, 15.12.2008 в 13:39 |
15.12.2008, 13:49 | #5 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
1) Я не говорю, что это невозможно, я лишь указываю, что это неправильно с точки зрения modbus.
2) Упомянутые вами "modbus-регистры" это не что иное, как ОЗУ контроллера. Работает программа, хранит в ОЗУ свои данные. Модбас, как протокол, ориентирован на то, что запись и чтение происходят не из буфера, а напрямую в/из ОЗУ. Это разгружает процессор контроллера от лишней работы, но вносит сумятицу в умы "обычных" программистов , привыкших работать на "больших" компьютерах, где любой протокол обеспечен отдельным защищённым буфером. А то и стек отдельно на каждую нитку связи создаётся. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
15.12.2008, 13:53 | #6 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Когда вы читаете из "модбас-переменной" - вы читаете напрямую с выхода того блока, куда эта переменная подцеплена.
Когда вы пишете в переменную, вы пишете прямо на вход блока. Вы не можете контролировать её обновление. Вы не можете иметь и вход и выход одновременно в одной ячейке ОЗУ. К тому же, если вы читаете данные из контроллера, то не всё ли равно, откуда их читать? __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
15.12.2008, 14:57 | #7 |
Новичок
Регистрация: Oct 2008
Сообщения: 10
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
почему я не могу иметь вход и выход в одной ячейке? если в начале выполнения блока я получаю доступ к ячейке, в процессе делаю с ней все что хочу, и после, оставляю.
сечас цепочка такая: панель-переменнная1-программа-переменная2-панель, но в окнах ввода вывода панелей нельзя читать из одних адресов, а писать в другие а хотелось бы такую цепочку: панель-переменная-панель а кстати, с какой версии ядра поддерживается "новая карта памяти"? |
15.12.2008, 15:57 | #8 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
С 242-й версии.
Блок в циклической программе совсем не равен подпрограмме в обычном "линейном" языке программирования. Блоки не могут "получать доступ к ячейке", т.к. это не функции, вызывающиеся со структурой в стеке и возвращающие обработанную структуру обратно. У входов блоков фиксированная структура, состоящая из выходов предыдущих блоков. У них нет отдельного ОЗУ и нет некоего "менеджера", перекладывающего данные из одного места в ОЗУ в другое. У нас была мысль сделать переменные по аналогии с EEPROM(): с доступом на чтение/запись из программы и из сети, но пробная реализация показала крайнее неудобство пользования таких переменных в FBD-программе. Мы ведём дальнейшие исследования, но пока всех устраивающего варианте нет. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
15.12.2008, 17:09 | #9 |
Senior Member
Регистрация: Jan 2006
Сообщения: 172
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
Я предпочитаю опираться на стандарт, в нем я не видел указаний что регистры=ОЗУ. Раз стандарт не нарушается, значит все в порядке. Понятно что вариант с прямым наложением регистров на ОЗУ когда-то был первым и единственным. Такая реализация требует гораздо меньших накладных расходов, но сразу вызывает кучу ограничений. Это хорошо видно на примере SMH
|
16.12.2008, 11:06 | #10 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Да видно. Например, работа программы замедляется всего на 10% при опросе одновременно по двум портам.
Были бы выделенные обработчики, то во-первых под них ушла бы немалая часть ОЗУ (конкретнее 8кб, что составляет ровно половину от доступного ОЗУ для FBD-программы), что ограничило бы размер программы, во-вторых от быстродействия бы "отъелось" не 10%, а около 60%. Следовательно для наших контроллеров мега бы не подошла, пришлось бы ставить арм-9 или что побыстрее. В конце концов получился бы более дорогой контроллер только лишь для того, чтобы нельзя было сказать "Такая реализация требует гораздо меньших накладных расходов, но сразу вызывает кучу ограничений. Это хорошо видно на примере SMH" Мы проверяли варианты с абсолютно "честными" стеками для сети. Цифры именно такие. Предпочитаю не спорить против математики, особенно когда она корешится с бухгалтерией. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
17.04.2009, 01:32 | #11 |
Senior Member
Регистрация: Feb 2007
Сообщения: 174
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
Галочка "Старая карта" в окошке Модбас переменных, что из себя представляет ? Можно ли снять ее (там вроде объем занятой памяти уменьшается радикально) для 236 ядра ?
|
17.04.2009, 11:14 | #12 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Для 236 ядра вы получите сообщение типа "ядро не поддерживает распределение адресов" и программа не загрузится.
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
17.04.2009, 15:48 | #13 |
Senior Member
Регистрация: Feb 2007
Сообщения: 174
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
Жаль...
А что реально такая экономия пространства ? пардон, но ведь количество данных в сети от этого не меняется, верно ? Последний раз редактировалось vladun, 17.04.2009 в 15:55 Причина: добавлено: |
17.04.2009, 17:54 | #14 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
кол-во данных в сети не изменяется.
память освобождает. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
17.04.2009, 18:58 | #15 |
Senior Member
Регистрация: Feb 2007
Сообщения: 174
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
Спасибо!
Тут уже давали ответ, но я не могу его найти поиском по поводу загрузки канала МОДбаса: SMH (слейв): R переменные из него обновляются (идут в канал) по запросу Мастера ? А R/W переменные так же, только по обращению всемогущего Master или постоянно вне зависимости от запросов Мастера ? |
18.04.2009, 00:19 | #16 |
Senior Member
Регистрация: Jan 2006
Сообщения: 172
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
Это же Модбас, в нем все происходит исключительно по запросам мастера
|
18.04.2009, 01:32 | #17 |
Senior Member
Регистрация: Feb 2007
Сообщения: 174
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: сетевые in-out переменные
Понятно.
Сенькс. |
03.04.2013, 11:57 | #18 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Цитата:
Указанные вами функции у нас поддерживаются как в режиме "master", так и в режиме "slave". Всего остального никакие определения или описания протокола Modbus не касаются. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. Последний раз редактировалось Arsie, 03.04.2013 в 12:33 |
|
03.04.2013, 14:08 | #19 |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: сетевые in-out переменные
На запрос записи регистра слейв должен ответить в течении таймаута. Нормальный ответ должен быть эхом после того, как регистр будет записан и исходя из требований Модбаса и исходя из возможностей контроллера. Функции 1,5,15 относятся к одной области памяти - Coils. Функции 3,6,16 к области памяти Holding Registers. Cледовательно функции чтения и записи могут адресоваться к одной и той же переменной в пределах своей области. Значение этой переменной может быть изменено уже к следующему ее чтению после записи. Т.е. формально через минимальный таймаут 3,5 периода после предыдущего запроса.
Получается с точки зрения стандарта переменные записываются из модбас, читаются в ФБД,..., Читаются из модбас. Пропущено записываются из ФБД. Вопрос к реализации Logix а не модбас Не зная внутреннее устройство Logix реализация выглядит достаточно просто, как передать данные с выхода блока на его же вход. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
03.04.2013, 14:37 | #20 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Цитата:
В FBD, из-за циклического характера выполнения программы, простейшая запись в ячейку памяти (т.е. "переменную") может спровоцировать автоколебания алгоритма. Эти колебания должны гаситься алгоритмически. Либо для каждой функции, связанной с двунаправленностью переменной (запись в память, работа в меню) нам нужно будет реализовывать отдельный FBD, как обычно подходящий не всем и не всегда. По моей оценке, лучше иметь десяток возмущающихся человек от невозможности переустановки холдинг-регистров, чем сотни и тысячи убитых контроллеров, умерших либо из-за недостатка алгоритма, либо из-за недостатка знаний пишущего алгоритм. Всё же FBD нацелен не на программистов, а на конструкторов и/или проектировщиков. Их проблемы цикличности мало волнуют и я не думаю, что есть даже один человек на миллион, которых держит это в памяти. Причём я настаиваю, что трудности работы с уставками порождены неуниверсальностью структуры софта панели, который не позволяет указывать произвольную переменную в качестве обратной связи для уставки. Либо недостатком знаний человека, который не знает о такой возможности в софте панели. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. Последний раз редактировалось Arsie, 03.04.2013 в 14:50 |
|
03.04.2013, 16:07 | #21 |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: сетевые in-out переменные
Кому как. По мне так лучше иметь тысячу плюс десять довольных пользователей. Могу привести пример, где реализован двунаправленный доступ как к ОЗУ так и к EEPROM в более дорогих контроллерах (примерно в 6 раз дороже). Но ведь стремиться надо к лучшим. (Но за меньшие деньги).
__________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
03.04.2013, 16:31 | #22 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Цитата:
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
03.04.2013, 17:07 | #23 |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: сетевые in-out переменные
Вот оно ключевое слово СУБД.
Систему баз данных можно рас- сматривать как компьютеризированную систему хранения записей. Такая система вклю- чает сами по себе данные (хранимые в базе данных), аппаратное обеспечение, программное обеспечение (в частности, систему управления базами данных, или СУБД), а также пользователей (что наиболее важно). Пользователи, в свою очередь, подразделяются на прикладных программистов, конечных пользователей и администраторов базы данных, или АБД. Последние отвечают за администрирование базы данных и всей системы баз данных в соответствии с требованиями, устанавливаемыми администратором данных. К.Дж.Дейт. В нашем случае администрирование и модификацию базы данных производит и сам контроллер. Обеспечивая при этом доступ другим пользователям. А отсюда реляционная модель и взаимодействие между таблицами. Это все работало на Пентиуме 200 ММХ с 16 MB оперативной памяти. Почему вы считаете, что упоминать об этом пустое? __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
03.04.2013, 17:14 | #24 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Потому что то, что работало на Пентиуме 200ММХ с 16МВ ОЗУ никак не будет работать на ATMega 14МГц с 64Кб ОЗУ.
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
05.04.2013, 10:53 | #25 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: сетевые in-out переменные
Если вы действительно заинтересованы добавить "внутреннюю запись", то это достаточно легко сделать: создаёте сценарии применения, список сценариев обработки. Далее создаёте работающий макет на FBD, эмулирующий вашу функцию (обычный регистр вполне может сымитировать "переменную"). Если ваш макет покажет высокую устойчивость в каждом из сценариев - я обещаю вам реализацию этой функции в течении месяца.
Я уже проводил такую работу. И я знаю, что вреда будет больше, чем пользы. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. Последний раз редактировалось Arsie, 09.04.2013 в 14:00 |