- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
PROFIBUS
-
- здесь недавно
- Сообщения: 6
- Зарегистрирован: 22 июн 2018, 07:27
- Имя: Дмитрий
PROFIBUS
Здравствуйте. Есть несколько устройств подключенных по PROFIBUS к S7-315. С них необходимо считывать пару слов и записывать столько же. В ручную с помощью PIW и PQW это делается без проблем. Решил написать FC-ку для обработки этих устройств. Возможно ли в FC-ке использовать PIW и PQW с переменными, что бы задавать адреса при вызове FC.
-
- администратор
- Сообщения: 4727
- Зарегистрирован: 25 июл 2008, 07:12
- Имя: Диев Александр Васильевич
- Страна: Россия
- город/регион: г. Сегежа, Карелия
- Благодарил (а): 225 раз
- Поблагодарили: 392 раза
PROFIBUS
Зачем? Если через piw/pqw напрямую читается без проблем, то и в программе тоже проблем не будет. Если надо FC вызывать несколько раз для разных входов/выходов - прицепляются нужные в точке вызова и всё.
Повторное использование кода не отменяет повторного использования мозга при его повторном использовании.
-
- освоился
- Сообщения: 248
- Зарегистрирован: 31 янв 2017, 08:44
- Имя: Маркушин Андрей Геннадьевич
- Страна: Россия
- город/регион: Нижегородская обл., Выкса
- Благодарил (а): 19 раз
- Поблагодарили: 64 раза
PROFIBUS
На тот случай, если нужна консистентность данных, т.е. если от оборудования нужна "россыпь" битов (дискретных входов, например), то можно и прямое чтение из периферийной области использовать, а вот если требуется считать значение (байт, слово и т.п.), то лучше использовать именно sfc14/15 - при прямом считывании значение периферийной области может измениться прямо во время операции считывания (она относительно медленная), что может иметь последствия.
-
- знаток Eplan
- Сообщения: 1136
- Зарегистрирован: 21 сен 2012, 22:45
- Имя: aranea
- Благодарил (а): 30 раз
- Поблагодарили: 165 раз
PROFIBUS
VADR, зависит от программиста
можно много раз piw/pqw читать и мувами и косвенной адресацей
я предпочитаю передавать периферийный адрес в виде цифры в FB, а там функцией консистентного чтения/записи получать/записывать данные (при условии полной консистентности данных и нужной их длины)
обозначьте, пожалуйста, пример, как передать (периферийный) адрес как параметр в FC
можно много раз piw/pqw читать и мувами и косвенной адресацей
я предпочитаю передавать периферийный адрес в виде цифры в FB, а там функцией консистентного чтения/записи получать/записывать данные (при условии полной консистентности данных и нужной их длины)
обозначьте, пожалуйста, пример, как передать (периферийный) адрес как параметр в FC
-
- освоился
- Сообщения: 248
- Зарегистрирован: 31 янв 2017, 08:44
- Имя: Маркушин Андрей Геннадьевич
- Страна: Россия
- город/регион: Нижегородская обл., Выкса
- Благодарил (а): 19 раз
- Поблагодарили: 64 раза
PROFIBUS
Если навскидку, то можно так:
Код: Выделить всё
L #p_in_ptr
T #temp_ptr
L PIW [#temp_ptr]
T #out_piw_val
, где
p_in_ptr - входной параметр типа DWORD, в который снаружи функции загружен внутризонный указатель на нужное слово (например, p#280.0 - указатель на 280 адрес)
temp_ptr - временная переменная, чтобы компилятор не ругался
out_piw_val - выход из блока
-
- администратор
- Сообщения: 4727
- Зарегистрирован: 25 июл 2008, 07:12
- Имя: Диев Александр Васильевич
- Страна: Россия
- город/регион: г. Сегежа, Карелия
- Благодарил (а): 225 раз
- Поблагодарили: 392 раза
PROFIBUS
Кстати, да. Об этом я не подумал.
Не именно адрес как параметр, а несколько по-другому: делается FC со входами/выходами, и в месте вызова к этим входам/выходам привязываются нужные адреса. Из плюсов такого подхода по сравнению с косвенной адресацией - можно по reference data отследить, где какие данные используются.
Повторное использование кода не отменяет повторного использования мозга при его повторном использовании.
-
- знаток Eplan
- Сообщения: 1136
- Зарегистрирован: 21 сен 2012, 22:45
- Имя: aranea
- Благодарил (а): 30 раз
- Поблагодарили: 165 раз
PROFIBUS
winb, для неконсистетных данных (такой GSD-файл был) я делал через ANY-указатель и BLKMOV
очень уж хотелось "инкапсуляции" - на входе 1 цифра адреса, на выходе структура готовых данных (сканер штрих-кодов или ЧРП)
очень уж хотелось "инкапсуляции" - на входе 1 цифра адреса, на выходе структура готовых данных (сканер штрих-кодов или ЧРП)
-
- освоился
- Сообщения: 248
- Зарегистрирован: 31 янв 2017, 08:44
- Имя: Маркушин Андрей Геннадьевич
- Страна: Россия
- город/регион: Нижегородская обл., Выкса
- Благодарил (а): 19 раз
- Поблагодарили: 64 раза
PROFIBUS
Согласен, можно и так, даже красивее будет. Но использовать BLKMOV мне совесть позволяет (хотя, если честно, лень заставляет) только если размер области перемещаемых данных больше размера элементарных типов данных.
Отправлено спустя 3 минуты 42 секунды:
К сожалению, не каждый разработчик про службу эксплуатации думает :(
-
- знаток Eplan
- Сообщения: 1136
- Зарегистрирован: 21 сен 2012, 22:45
- Имя: aranea
- Благодарил (а): 30 раз
- Поблагодарили: 165 раз
PROFIBUS
имхо, нужно стараться делать так, чтобы адрес IO устройства на шине Profibus использовался только в одном месте программы 1 раз - считать данные, а дальше работать с ними, а не с адресом
и при правильно структурированной программе с комментариями найти это место не проблема
а если работаете с десятком ЧРП и нужно считывать 10 слов и записывать 4 - не проще ли указать при вызове FB начальный адрес PI/O (в идеале 1 одинаковая цифра для PIW и PQW), чем каждый раз при каждом вызове высчитывать смещение в указывать 10 входных адресов и 4 выходных?
человек (ТС) устал делать L PIW T DB и ищет альтернативу - это прекрасно
вариантов много, насколько хватит его чувства прекрасного
-
- здесь недавно
- Сообщения: 6
- Зарегистрирован: 22 июн 2018, 07:27
- Имя: Дмитрий
PROFIBUS
Мне подсказали вот такие варианты и в принципе они работают. Так что все заработало. Всем спасибо кто откликнулся.
Пример 1:
в интерфейсе блока определяете
#in_I_Address - входной параметр типа INT (начальный адрес периферии)
#L_Address_DW - локальный параметр типа DWORD
Код
L #in_I_Address //чтобы из int получить адрес двойного слова
SLD 3 //нужно выполнить инструкцию SLD (смещение влево) на три разряда
T #L_Address_DW //и сохранить результат в переменной длиной в 2 слова
L PID [#L_Address_DW] //обращение к адресу: <область памяти>[<переменная с адресом>]
T DID 12 //сохранение результата в DID = Datablock Instance Double word
Пример 2
Тоже самое с использованием адресного регистра
Код
L #in_I_Address
LAR1 //загрузка адреса из ACCU1 в адресный регистр
L PID [AR1,P#0.0] //обращение к адресу: <область памяти>[AR1, <смещение>] Peripheral Input Double word
T DID 12
Пример 1:
в интерфейсе блока определяете
#in_I_Address - входной параметр типа INT (начальный адрес периферии)
#L_Address_DW - локальный параметр типа DWORD
Код
L #in_I_Address //чтобы из int получить адрес двойного слова
SLD 3 //нужно выполнить инструкцию SLD (смещение влево) на три разряда
T #L_Address_DW //и сохранить результат в переменной длиной в 2 слова
L PID [#L_Address_DW] //обращение к адресу: <область памяти>[<переменная с адресом>]
T DID 12 //сохранение результата в DID = Datablock Instance Double word
Пример 2
Тоже самое с использованием адресного регистра
Код
L #in_I_Address
LAR1 //загрузка адреса из ACCU1 в адресный регистр
L PID [AR1,P#0.0] //обращение к адресу: <область памяти>[AR1, <смещение>] Peripheral Input Double word
T DID 12