На форуме обязательно:
  1. Заполнить свой профиль НА РУССКОМ ЯЗЫКЕ КИРИЛЛИЦЕЙ. См. Правила, п.2.d.
  2. Не писать свой вопрос в первую попавшуюся тему, а вместо этого создать свою. См. Правила, п.3.a.

Рекламу мы не размещаем ни на каких условиях.

PROFIBUS

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

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

PROFIBUS

Сообщение desipov » 03 июл 2018, 08:45

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

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 791
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 7 раз
Поблагодарили: 70 раз
Контактная информация:

PROFIBUS

Сообщение aranea » 03 июл 2018, 08:46

посмотрите на sfc14/15
Изображение

Аватара пользователя

VADR
администратор
администратор
Сообщения: 2851
Зарегистрирован: 25 июл 2008, 06:12
Имя: Диев Александр Васильевич
Благодарил (а): 60 раз
Поблагодарили: 44 раза

PROFIBUS

Сообщение VADR » 03 июл 2018, 09:00

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


winb
осмотрелся
осмотрелся
Сообщения: 160
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Благодарил (а): 6 раз
Поблагодарили: 26 раз

PROFIBUS

Сообщение winb » 03 июл 2018, 09:53

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

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 791
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 7 раз
Поблагодарили: 70 раз
Контактная информация:

PROFIBUS

Сообщение aranea » 03 июл 2018, 09:56

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

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


winb
осмотрелся
осмотрелся
Сообщения: 160
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Благодарил (а): 6 раз
Поблагодарили: 26 раз

PROFIBUS

Сообщение winb » 03 июл 2018, 11:40

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
администратор
администратор
Сообщения: 2851
Зарегистрирован: 25 июл 2008, 06:12
Имя: Диев Александр Васильевич
Благодарил (а): 60 раз
Поблагодарили: 44 раза

PROFIBUS

Сообщение VADR » 03 июл 2018, 11:45

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

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 791
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 7 раз
Поблагодарили: 70 раз
Контактная информация:

PROFIBUS

Сообщение aranea » 03 июл 2018, 11:52

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


winb
осмотрелся
осмотрелся
Сообщения: 160
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Благодарил (а): 6 раз
Поблагодарили: 26 раз

PROFIBUS

Сообщение winb » 03 июл 2018, 12:01

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

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

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 791
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 7 раз
Поблагодарили: 70 раз
Контактная информация:

PROFIBUS

Сообщение aranea » 03 июл 2018, 13:01

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
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 22 июн 2018, 07:27
Имя: Дмитрий

PROFIBUS

Сообщение desipov » 05 июл 2018, 15:00

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