1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

PROFIBUS

ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
Ответить

Автор темы
desipov
здесь недавно
здесь недавно
Сообщения: 6
Зарегистрирован: 22 июн 2018, 07:27
Имя: Дмитрий

PROFIBUS

Сообщение desipov »

Здравствуйте. Есть несколько устройств подключенных по PROFIBUS к S7-315. С них необходимо считывать пару слов и записывать столько же. В ручную с помощью PIW и PQW это делается без проблем. Решил написать FC-ку для обработки этих устройств. Возможно ли в FC-ке использовать PIW и PQW с переменными, что бы задавать адреса при вызове FC.
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

PROFIBUS

Сообщение aranea »

посмотрите на sfc14/15
Изображение
Аватара пользователя

VADR
администратор
администратор
Сообщения: 4711
Зарегистрирован: 25 июл 2008, 07:12
Имя: Диев Александр Васильевич
Страна: Россия
город/регион: г. Сегежа, Карелия
Благодарил (а): 192 раза
Поблагодарили: 336 раз

PROFIBUS

Сообщение VADR »

aranea писал(а): 03 июл 2018, 08:46 посмотрите на sfc14/15
Зачем? Если через piw/pqw напрямую читается без проблем, то и в программе тоже проблем не будет. Если надо FC вызывать несколько раз для разных входов/выходов - прицепляются нужные в точке вызова и всё.
Повторное использование кода не отменяет повторного использования мозга при его повторном использовании.

winb
освоился
освоился
Сообщения: 248
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Страна: Россия
город/регион: Нижегородская обл., Выкса
Благодарил (а): 14 раз
Поблагодарили: 59 раз

PROFIBUS

Сообщение winb »

VADR писал(а): 03 июл 2018, 09:00Зачем?
На тот случай, если нужна консистентность данных, т.е. если от оборудования нужна "россыпь" битов (дискретных входов, например), то можно и прямое чтение из периферийной области использовать, а вот если требуется считать значение (байт, слово и т.п.), то лучше использовать именно sfc14/15 - при прямом считывании значение периферийной области может измениться прямо во время операции считывания (она относительно медленная), что может иметь последствия.
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

PROFIBUS

Сообщение aranea »

VADR, зависит от программиста
можно много раз piw/pqw читать и мувами и косвенной адресацей
я предпочитаю передавать периферийный адрес в виде цифры в FB, а там функцией консистентного чтения/записи получать/записывать данные (при условии полной консистентности данных и нужной их длины)

обозначьте, пожалуйста, пример, как передать (периферийный) адрес как параметр в FC
Изображение

winb
освоился
освоился
Сообщения: 248
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Страна: Россия
город/регион: Нижегородская обл., Выкса
Благодарил (а): 14 раз
Поблагодарили: 59 раз

PROFIBUS

Сообщение winb »

aranea писал(а): 03 июл 2018, 09:56 обозначьте, пожалуйста, пример, как передать (периферийный) адрес как параметр в FC
Если навскидку, то можно так:

Код: Выделить всё

 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 - выход из блока
 
Аватара пользователя

VADR
администратор
администратор
Сообщения: 4711
Зарегистрирован: 25 июл 2008, 07:12
Имя: Диев Александр Васильевич
Страна: Россия
город/регион: г. Сегежа, Карелия
Благодарил (а): 192 раза
Поблагодарили: 336 раз

PROFIBUS

Сообщение VADR »

winb писал(а): 03 июл 2018, 09:53 если требуется считать значение (байт, слово и т.п.), то лучше использовать именно sfc14/15 - при прямом считывании значение периферийной области может измениться прямо во время операции считывания (она относительно медленная), что может иметь последствия
Кстати, да. Об этом я не подумал.
aranea писал(а): 03 июл 2018, 09:56 обозначьте, пожалуйста, пример, как передать (периферийный) адрес как параметр в FC
Не именно адрес как параметр, а несколько по-другому: делается FC со входами/выходами, и в месте вызова к этим входам/выходам привязываются нужные адреса. Из плюсов такого подхода по сравнению с косвенной адресацией - можно по reference data отследить, где какие данные используются.
Повторное использование кода не отменяет повторного использования мозга при его повторном использовании.
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

PROFIBUS

Сообщение aranea »

winb, для неконсистетных данных (такой GSD-файл был) я делал через ANY-указатель и BLKMOV
очень уж хотелось "инкапсуляции" - на входе 1 цифра адреса, на выходе структура готовых данных (сканер штрих-кодов или ЧРП)
Изображение

winb
освоился
освоился
Сообщения: 248
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Страна: Россия
город/регион: Нижегородская обл., Выкса
Благодарил (а): 14 раз
Поблагодарили: 59 раз

PROFIBUS

Сообщение winb »

aranea писал(а): 03 июл 2018, 11:52 winb, для неконсистетных данных (такой GSD-файл был) я делал через ANY-указатель и BLKMOV
очень уж хотелось "инкапсуляции" - на входе 1 цифра адреса, на выходе структура готовых данных (сканер штрих-кодов или ЧРП)
Согласен, можно и так, даже красивее будет. Но использовать BLKMOV мне совесть позволяет (хотя, если честно, лень заставляет) только если размер области перемещаемых данных больше размера элементарных типов данных.

Отправлено спустя 3 минуты 42 секунды:
VADR писал(а): 03 июл 2018, 11:45 Из плюсов такого подхода по сравнению с косвенной адресацией - можно по reference data отследить, где какие данные используются.
К сожалению, не каждый разработчик про службу эксплуатации думает :(
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

PROFIBUS

Сообщение aranea »

VADR писал(а): 03 июл 2018, 11:45 Из плюсов такого подхода по сравнению с косвенной адресацией - можно по reference data отследить, где какие данные используются.
имхо, нужно стараться делать так, чтобы адрес IO устройства на шине Profibus использовался только в одном месте программы 1 раз - считать данные, а дальше работать с ними, а не с адресом
и при правильно структурированной программе с комментариями найти это место не проблема

а если работаете с десятком ЧРП и нужно считывать 10 слов и записывать 4 - не проще ли указать при вызове FB начальный адрес PI/O (в идеале 1 одинаковая цифра для PIW и PQW), чем каждый раз при каждом вызове высчитывать смещение в указывать 10 входных адресов и 4 выходных?

человек (ТС) устал делать L PIW T DB и ищет альтернативу - это прекрасно
вариантов много, насколько хватит его чувства прекрасного
Изображение

Автор темы
desipov
здесь недавно
здесь недавно
Сообщения: 6
Зарегистрирован: 22 июн 2018, 07:27
Имя: Дмитрий

PROFIBUS

Сообщение desipov »

Мне подсказали вот такие варианты и в принципе они работают. Так что все заработало. Всем спасибо кто откликнулся.
Пример 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
Ответить

Вернуться в «Simatic Step7»