Category Archives: ПЛК-системы

Работа ОВЕН ПЛК с модемом одновременно и в режиме передачи данных и с СМС сообщениями

В данном примере будет показано, как опрашивать удаленный объект при помощи канала CSD и одновременно при необходимости отправлять СМС сообщения.

В данном примере ПЛК будет инициировать связь с удаленным объектом (ПК-оператора),  куда будет передавать текущее значение «var1»- контролируемый параметр, и откуда будет считывать значение переменной «var1_Alarm»- аварийный уровень. При этом если текущее значение переменной превысит аварийный уровень (далее авария) отправить СМС сообщение и обнулить ее.

Настройка связи с удаленным объектом настраивается в конфигурации ПЛК.

Алгоритм работы следующий: В фоновом режиме  происходит периодический обмен между ПЛК и ПК. В случае аварии выставляется флаг о необходимости отправить СМС «Start», блоку «FB_SMS_SR» подается команда на отправку, номер абонента и текст сообщения. Далее если в текущий момент модем не занят (переменная «LineStatus» равна нулю), то захватываем порт, при необходимости производим настройку модема, после чего происходит непосредственно отправка сообщения. После отправки флаг снимается (при помощи выхода «SmsSend» блока «FB_SMS_SR»)и происходит освобождение порта.

Программа в CoDeSys 2.3

Список переменных:

PROGRAM PLC_PRG

VAR

                Com                      :OpenPort;

                cfg                         :FB_SMS_CFG;

                sms                        :FB_SMS_SR;

DevNum             :WORD;

                Start                      : BOOL  :=FALSE;

                cfg_ok                  :BOOL;

                 var1                                      AT%QW12.1.1.0               :WORD;

                 var1_Alarm                       AT%IW12.1.0.0 :WORD :=8000;

                LineStatus          AT%QB12.0.0    : BYTE;

                SmsNum             :STRING               := ‘79012345678’;

END_VAR

 

Конфигурация ПЛК задачи

Мой блог находят по следующим фразам

Запрос баланса из программы ОВЕН ПЛК

В данном примере будет показано, как осуществлять запрос баланса.

Программа запроса баланса из ОВЕН ПЛК

Список переменных:

PROGRAM PLC_PRG

VAR

                Com                      :OpenPort;

                cfg                         :FB_SMS_CFG;

                sms                        :FB_SMS_SR;

                DevNum             :WORD;

                cfg_ok                  :BOOL;

                 var1                      :WORD;

                 var1_Alarm       :WORD :=5000;

                CheckListNum: STRING                :=»;

                ComSend            :BOOL;

                smsText              :STRING               := »;

                BalaseOk             :BOOL;

END_VAR

Данный пример отличается от предыдущего (http://plc24.ru/zadanie-ustavki-pri-pomoshhi-sms-iz-programmy-oven-plk/)только настраиваемыми параметрами. В качестве номера используется короткий номер запроса баланса, у каждого оператора он свой, здесь используется номер МТС. У некоторых операторов несколько номеров: для запроса на русском языке и запроса на латинице – рекомендуется использовать номер запроса на латинице. Так как запрос баланса по своей сути является USSD запросом, то внутри блока имеет несколько другую обработку, поэтому в данном случае блок игнорирует значения на входах «CheckNum» и «CheckNumList» (считает что «CheckNum» имеет значение False). Поле текста отправляемого сообщения нужно оставлять пустым.

Мой блог находят по следующим фразам

Задание уставки при помощи СМС из программы ОВЕН ПЛК

В данном примере будет показано, как одновременно отправлять и получать СМС сообщения.

Программа ПЛК. Задание уставки с помощью СМС

 Список переменных:

PROGRAM PLC_PRG

VAR

                Com                      :OpenPort;

                cfg                         :FB_SMS_CFG;

                sms                       :FB_SMS_SR;

                DevNum             :WORD;

                cfg_ok                  :BOOL;

                 var1                      :WORD;

                 var1_Alarm       :WORD :=5000;

                CheckListNum: STRING:=’79012345678;79876543210′;

                ComSend            :BOOL;

                smsText              :STRING               := ‘Set alarm 8000’;

                smsNum             :STRING               := ‘79012345678’;

END_VAR

Как и в предыдущих примерах (http://plc24.ru/priem-sms-soobshhenij-v-programme-oven-plk/) необходимо добавить в конфигурацию ПЛК модуль Universal Network Module, произвести его настройку. Также необходимо в программе открыть порт и произвести настройку модема. (Можно взять за основу http://plc24.ru/otkrytie-porta-i-nastrojka-modema-dlya-oven-plk/)

Необходимо понимать, что модем одновременно может выполнять только одно действие: или читать входящие сообщения или отправлять, при этом на выполнение любого действия необходимо время. Поэтому работа с модемом осуществляется в асинхронном режиме. В среднем необходимо не более 20 сек. на отправку одного СМС сообщения. Как следствие необходимо использовать флаг, который бы показывал готовность блока к отправке нового сообщения. В данном примере в качестве такого флага можно использовать переменную «ComSend», которая так же является командой на отправку, Новое сообщение можно отправлять, только когда она равна False, если же она равна True, то при попытке отправить еще одно сообщение оно будет потеряно.

Мой блог находят по следующим фразам

Прием СМС сообщений в программе ОВЕН ПЛК

В данном примере будет показано, как организовать удаленное управление при помощи СМС сообщений.

Программа ПЛК

Список переменных:

PROGRAM PLC_PRG

VAR

                Com                      :OpenPort;

                cfg                         :FB_SMS_CFG;

                sms                        :FB_SMS_SR;

                DevNum             :WORD;

                cfg_ok: BOOL;

                 var1                      :WORD;

                 var1_Alarm       :WORD :=5000;

                CheckListNum: STRING                :=’79012345678;7987654321′;

END_VAR

Как и в предыдущих примерах необходимо добавить в конфигурацию ПЛК модуль Universal Network Module, произвести его настройку. Также необходимо в программе открыть порт и произвести настройку модема. (Можно взять за основу пример http://plc24.ru/otkrytie-porta-i-nastrojka-modema-dlya-oven-plk/)

Зависимость поведения ФБ от значений на входах «CheckNum» и «CheckNumList» представлена в следующей таблице:

Вход «CheckNum» Вход «CheckNumList» Результат
1 Flase любое Принимает все входящие СМС
2 True Пустая строка (‘’) Не принимает входящие СМС
3 True Номер или список номеров (‘79012345678;7987654321’) Принимает СМС только с указанных номеров

Блоки 9-16 нужны для расшифровки текста сообщения: блоки 9,10,13 выделяют командное слово, блоки 11,12 выделяют значение переменной из текста.

Как только сообщение будет принято на выход «NewInRing» будет подан единичный импульс (одновременно с этим будут обновлены значения на выходах «NewInSmsText», «NewInSmsTime» и «NewInSmsNum»), что совместно с блоками 14,15 позволяет осуществить однократную запись нового значения в переменную «var1_Alarm». Это может быть полезно, если значение этой переменной задается несколькими способами, например, еще и с панели оператора.

Выход «NewInSmsNum» позволяет организовать разделение абонентов по уровням доступа.

Мой блог находят по следующим фразам

Отправка СМС сообщений нескольким получателям из программы ОВЕН ПЛК.

Пример аналогичен предыдущему (http://plc24.ru/otpravka-sms-soobshhenij-iz-programmy-oven-plk/) с той разницей, что сообщение с одним и тем же текстом надо отправить нескольким получателям сразу. Для этого можно использовать ФБ «FB_SMS_SL», входящий в состав  библиотеки SmsOwenLib.

Программа ПЛК

 

Список переменных

PROGRAM PLC_PRG

VAR

Com                      :OpenPort;

cfg                         :FB_SMS_CFG;

sms                        :FB_SMS_SR;

 

cfg_ok                  :BOOL;

DevNum             :WORD :=0;

 

var1                      :WORD;

var1_Alarm       :WORD :=5000;

 

sl                            :FB_SMS_SL; (*дополнительный блок для отправки группе получателей*)

listNum                :ARRAY [0..2] OF STRING(10):=3(‘79012345678’); (*массив номеров получателей, обязательно с начинаться должен с нуля*)

END_VAR

 

Мой блог находят по следующим фразам

Отправка СМС сообщений из программы ОВЕН ПЛК

Добавим к предыдущему примеру (http://plc24.ru/otkrytie-porta-i-nastrojka-modema-dlya-oven-plk/) переменную (var1), которая будет постоянно расти и по достижению ею определенного уровня (var1_Alarm) необходимо отправить сообщение. Текстом сообщения будет служить значение этой переменной, номер получателя заранее жестко задан.

Программа ПЛК

Алгоритм работы программы.

Список переменных

PROGRAM PLC_PRG

VAR

Com                      : OpenPort;

cfg                         :FB_SMS_CFG;

sms                       :FB_SMS_SR;

 

cfg_ok                  :BOOL;

DevNum             :WORD :=0;

 

var1                      :WORD; (*переменная, которая будет расти*)

var1_Alarm       :WORD :=5000; (*ее аварийный уровень*)

END_VAR

 

После открытия порта и конфигурирования модема начинает работать блок отправки и получения СМС. Так как режим CSD передачи данных в данном примере не используется на вход «CsdClose» подается сигнал False (все входящие вызовы будут сброшены). Входящие СМС сообщения так же не используются, поэтому на входа «CheckNumList» и «CheckNum» можно ничего не подавать.

На вход «SendSmsNum» подается десятизначный номер получателя в формате строки (String). На вход «SendSmsText» подается преобразованной к типу String значение переменной  «var1». По приходу на вход «SendSms» значения True, значения на двух предыдущих входах будут зафиксированы внутри ФБ. Как только сообщение будет отправлено на выход «SmsSend» будет подан единичный импульс (значение True будет установлено на один цикл).

Мой блог находят по следующим фразам

Открытие порта и настройка модема для ОВЕН ПЛК

Вначале необходимо добавить в конфигурацию ПЛК модуль Universal Network Module, указать к какому интерфейсу будет подключен модем.  Затем произвести настройку порта (указать скорость, число стоп-битов и т.д.), рис.1. Режим можно указывать любой, как ASCII так и RTU.

Рис.1. Настройка модуля Universal Network Module.

Программа:

Рис.2. Алгоритм работы программы.

Список переменных проекта:

PROGRAM PLC_PRG

VAR

Com                      : OpenPort;

cfg                         :FB_SMS_CFG;

cfg_ok                  :BOOL;

DevNum             :WORD :=0;

END_VAR

В данном примере порт будет открыт всегда, при необходимости освободить его достаточно подать на вход «Enable» ФБ «com» значение False.

ФБ «cfg» по окончанию конфигурации модема установит на выходе «Done» значение True в не зависимости от того, были ли ошибки или нет, поэтому необходимо проверять значение на выходе «ErrCode». В данном примере в случае возникновения ошибки блок будет перезапущен и конфигурация модема будет произведена повторно.

Так же данной блок устанавливает кроме доступных пользователю для задания и другие параметры, необходимые для корректной работы модема и библиотеки (форматы ответа модема на команды, режимы отправки и получения СМС сообщений и т.д.).

Если модем уже настроен и его параметры не будут меняться, то можно не использовать данный ФБ в программе или вызывать его только один раз при подключении нового модема.

 

Мой блог находят по следующим фразам

Состав библиотеки SmsOwenLib.

Данная библиотека предназначена для работы на контроллерах ОВЕН с внешним модемом: для отправки и получения СМС сообщений, фиксации входящего вызова и первоначальной конфигурации самого модема.

Блок «OpenPort» захвата/освобождения интерфейса

Рисунок 1 – Структурная схема

Таблица 1

Имя программного компонента OpenPort
Тип программного компонента

Функциональный блок  

Функция 

Программа

Особенности работы Для работы требуется установка в проекте библиотеки UNM
Применение на контроллерах ПЛК100, ПЛК150, ПЛК154, ПЛК110, ПЛК160.

 

Входная переменная:

Тип данных

Пояснения

Enable

BOOL

разрешение на работу
DeviceNumber

WORD

номер модуля UNM – нумерация идет с 0 по порядку сверху вниз как расположены модули UNM в конфигурации, первый сверху модуль UNM имеет номер 0, следующий номер UNM – 1, и так далее
Выходная переменная:

Тип данных

Пояснения

Out

BOOL

состояние открытия порта, после окончания включен постоянно

 

Описание

До начала передачи/приема в интерфейс данных из программы CoDeSys нужно «захватить» интерфейс и приостановить работу с этим интерфейсом модулей протоколов, подключенных в PLC Configuration. Для использования нужно создать в конфигурации контроллера один (или несколько)  модулей Universal Network Module. Внутри каждого модуля нужно настроить параметры порта передачи данных (для последовательных портов это скорость, четность, биты данных, биты стопа, время задержки).

Блок «FB_SMS_CFG» конфигурирования модема

Рисунок 2 – Структурная схема

Таблица 2

Имя программного компонента FB_SMS_CFG
Тип программного компонента

Функциональный блок  

Функция 

Программа

Особенности работы Для работы требуется установка в проекте библиотеки UNM
Применение на контроллерах ПЛК100, ПЛК150, ПЛК154, ПЛК110, ПЛК160.

 

Входная переменная:

Тип данных

Пояснения

Enable

BOOL

разрешение на работу
Handle

WORD

номер модуля UNM, порт открывается с помощью ФБ «OpenPort»
PortCfg

BOOL

разрешение на настройку порта модема, по умолчанию False (выкл.)
SaveCfg

BOOL

сохранение параметров в модеме после конфигурирования, по умолчанию False (не сохранять)
ModemART

BOOL

включение/отключение автоподъема трубки, по умолчанию False (выкл.),
PortBaudrate

STRING(6)

параметр настройки порта — скорость, по умолчанию ‘0’
PortParity

BYTE

параметр настройки порта — четность, 0- нет 1-нечет 2-чет, по умолчанию 0-нет
PortStopBits

BYTE

параметр настройки порта – число стоп-бит, 1-1бит, 3-2бита, по умолчанию1-1бит
PortByteSize

BYTE

параметр настройки порта — Биты данных, по умолчанию 8-8 бит
PortFlowCtrl

BYTE

параметр настройки порта — управление потоком, 0 – отключено, 1-XON/XOFF, 2-аппаратный, по умолчанию 0-отключено
Выходная переменная:

Тип данных

Пояснения

Done

BOOL

флаг окончания настройки, после окончания включен постоянно
ErrCode

BYTE

код ошибки

Описание работы

Необходим для конфигурирования модема. Должен вызываться до блока FB_SMS_SR. Если модем уже был настроен ранее (вручную или с помощью данного ФБ с SaveCfg:=TRUE) и в ходе работы настройки модема меняться не будут, то разрешается не использовать данный ФБ в программе.

Блок «FB_SMS_SR» отправки/ получения СМС

Рисунок 3 – Структурная схема

Таблица 3

Имя программного компонента FB_SMS_SR
Тип программного компонента

Функциональный блок  

Функция 

Программа

Особенности работы Для работы требуется установка в проекте библиотеки UNM
Применение на контроллерах ПЛК100, ПЛК150, ПЛК154, ПЛК110, ПЛК160.

 

Входная переменная:

Тип данных

Пояснения

Enable

BOOL

разрешение на работу
Handle

WORD

номер модуля UNM, порт открывается с помощью ФБ «OpenPort»
CsdClose

BOOL

запрет входящих вызовов: определяет поведение при входящем звонке, если True(вкл.), то всегда вешает трубку, если False(выкл.), то выставляет флаг NewInRing, по умолчанию True (вкл.)
SendSms

BOOL

команда на отправку SMS сообщения, срабатывает по фронту
SendSmsText

STRING

текст отправляемого сообщения (на русском макс 70 символов, на латинице макс 140 символов)
SendSmsNum

STRING

номер абонента, кому отправить СМС, пишется целиком с кодом страны без скобок и «+», например «79012345678»
CheckNum

BOOL

включить/отключить проверку номера отправителя СМС (для входящих сообщений), по умолчанию False (выкл)
CheckNumList

STRING

список разрешенных номеров, фомат: «ххххххххххх;ххххххххххх;» номер пишется целиком без скобок и «+», через точку с запятой, если функция выключена то не используется, по умолчанию ‘’
Выходная переменная:

Тип данных

Пояснения

Busy

BOOL

флаг указывающий, что блок выполняет в данный момент какие либо операции
ErrCode

BYTE

код ошибки
SmsSend

BOOL

флаг успешной отправки СМС сообщения, включается на 1н цикл
NewInSms

BOOL

флаг наличия нового входящего СМС сообщения, включается на 1н цикл
NewInRing

BOOL

флаг наличия входящего вызова
NewInSmsText

STRING

текст последнего принятого СМС сообщения
NewInSmsTime

STRING

время отправки последнего входящего СМС сообщения
NewInSmsNum

STRING

номер отправителя последнего входящего СМС сообщения, 10 цифр

 

Описание работы

Необходим для отправки/получения СМС сообщений и индикации входящих вызовов

Блок «FB_SMS_SL» вспомогательный для отправки сообщения группе абонентов

Рисунок 4 – Структурная схема

Таблица 4

Имя программного компонента FB_SMS_SL
Тип программного компонента

Функциональный блок  

Функция 

Программа

Особенности работы Для работы не требуется установка в проекте дополнительных библиотек
Применение на контроллерах ПЛК63, ПЛК73, ПЛК410

 

Входная переменная:

Тип данных

Пояснения

SendGroup

BOOL

команда на отправку группе
NumCount

BYTE

количество адресатов
SmsTextIn

STRING

текст отправляемого сообщения
SmsSend

BOOL

контроль за отправкой сообщений
Выходная переменная:

Тип данных

Пояснения

SendSms

BOOL

команда на отправку сообщения
NumCur

BYTE

текущий номер адресата
SmsTextOut

STRING

текст отправляемого сообщения
Done

BOOL

флаг завершения работы, включается на 1н цикл

 

Описание работы

По фронту сигнала на входе «SendGroup» БФ запоминает текст отправляемого сообщения, который подается на вход «SmsTextIn», и выдает его на выход «SmsTextOut» (после этого значение на входе «SmsTextIn» может меняться – на работу блока это никак не повлияет). Вход «SmsSend» и выход «SendSms» необходимо соединить с одноименными входами и выходами ФБ «FB_SMS_SR» — с их помощью будет осуществляться управление отправкой сообщений. Выход «NumCur» определяет порядковый номер текущего адресата, нумерация начинается с нуля. Когда сообщение будет разослано, на выход «Done» будет подан единичный импульс.

 

Мой блог находят по следующим фразам

Структуры в Step7

Структура объединяет различные типы данных (элементарные и составные типы данных, включая массивы и структуры), образуя одно целое. Вы можете группировать данные так, чтобы приспособить их к управлению вашим процессом. Поэтому Вы можете также передавать параметры как единицу данных, а не как отдельные элементы. Следующий рисунок показывает структуру, состоящую из целого числа, байта, символа, числа с плавающей точкой и булевой величины.

 

Структура может иметь до 8 вложенных уровней (например, структура,состоящая из структур, содержащих массивы).

Создание структуры

Вы определяете структуры, описывая данные внутри DB или в разделе описания переменных логического блока.

Следующий рисунок иллюстрирует описание структуры (Stack_1), которая состоит из следующих элементов: целое число (для хранения количества), байт (для хранения исходных данных), символ (для хранения управляющего кода), число с плавающей точкой (для хранения температуры), и булев бит памяти (для завершения сигнала).

 

Присваивание структуре начальных значений

Если Вы хотите присвоить начальное значение каждому элементу структуры, то указывайте значение, допустимое для типа данных и имени элемента. Например, Вы можете присвоить следующие начальные значения (структуре, объявленной на рисунке выше):

Amount [количество] = 100

Original_data [исходные_данные] = B#(0)

Control_code [управляющий_код] = ‘C’

Temperature [температура] = 120

End [конец] = False

Хранение и доступ к данным в структурах

У Вас есть доступ к отдельным элементам структуры. Вы можете использовать символьные адреса (например, Stack_1.Temperature). Однако Вы можете указывать абсолютный адрес, по которому расположен элемент (пример: если Stack_1 расположен в DB20, начиная с байта 0, то абсолютный адрес для amount – это DB20.DBW0 и адрес для temperature – это DB20.DBD6).

Использование структур в качестве параметров

Вы можете передавать структуры в качестве параметров. Если параметр описывается как STRUCT в разделе описания переменных, то Вы должны передавать структуру с теми же самыми компонентами. Однако параметру может присваиваться также элемент структуры, когда Вы вызываете блок, если элемент структуры соответствует типу данных параметра.

Если Вы используете структуры в качестве параметров, то обе структуры (для формальных параметров и для фактических параметров) должны иметь одинаковые компоненты, другими словами, одинаковые типы данных должны располагаться в одинаковой последовательности.

Мой блог находят по следующим фразам

Массивы в Step 7

Массив объединяет группу данных одного типа (элементарного или составного), образуя одно целое. Вы можете создавать массив, состоящий из массивов. Определяя массив, Вы должны сделать следующее:

  • Присвоить массиву имя.
  • Описать массив с помощью ключевого слова ARRAY.
  • Определить размер массива, используя индекс. Вы определяете номер первого и последнего элемента по отдельным измерениям массива (максимум 6 измерений). Индекс вводят в квадратных скобках, разделяя измерения посредством запятой, а номера первого и последнего элемента измерения – двумя точками. Например, следующий индекс определяет, трехмерный массив: [1..5,–2..3,30..32]
  • Вы указываете тип данных, которые должны содержаться в массиве.

Пример 1

Следующий рисунок показывает массив с тремя целыми числами. Вы обращаетесь к данным, хранимым в массиве, используя индекс. Индекс – это номер в квадратных скобках. Например, вторым целым числом является Op_temp[2]».

Индекс может быть любым целым числом (от -32768 до 32767), включая отрицательные значения. Массив на следующем рисунке можно было бы определить также как ARRAY [-1 .. 1]. Тогда первым целым числом было бы Op_temp[-1], вторым целым числом – Op_temp[0] и третьим целым числом – Op_temp[1].

 

Пример 2

Массив может также описывать многомерную группу типов данных. Следующий рисунок показывает двумерный массив целых чисел.

 

Вы обращаетесь к данным в многомерном массиве, используя индекс. В этом примере первым целым числом является Op_temp[1,1]», третьим – Op_temp[1,3]», четвертым – Op_temp[2,1]» и шестым – Op_temp [2,3]».

Вы можете определять в массиве до 6 измерений (6 индексов). Например, Вы могли бы определить переменную Op_temp как шестимерный массив следующим образом:

ARRAY [1..3,1..2,1..3,1..4,1..3,1..4]

Индексом первого элемента в этом массиве является [1,1,1,1,1,1]. Индексом последнего элемента является [3,2,3,4,3,4].

Создание массивов

Вы определяете массивы, объявляя данные в DB или в разделе описания переменных. Когда Вы объявляете массив, Вы указываете ключевое слово (ARRAY), а затем размер в квадратных скобках следующим образом:

[значение нижней границы.. значение верхней границы]

В многомерном массиве Вы указываете также дополнительные верхние и нижние границы и разделяете отдельные измерения посредством запятой.

Следующий рисунок показывает описание для создания массива размерности 2 x 3.

 

Ввод начальных значений для массива

Создавая массивы, Вы можете каждому элементу массива присваивать начальное значение. STEP 7 предоставляет два метода ввода начальных значений:

  1. Ввод индивидуальных значений: для каждого элемента массива Вы указываете значение, допустимое для типа данных этого массива. Значения указываются в порядке следования элементов: [1,1]. Помните, что отдельные элементы должны отделяться друг от друга запятой.
  2. Задание коэффициента повторения: при наличии последовательных элементов, имеющих одинаковое начальное значение, Вы можете указать число таких элементов (коэффициент повторения) и начальное значение для этих элементов. Формат ввода коэффициента повторения имеет вид: x (y), где x – коэффициент повторения, а y – повторяемое значение.

Если Вы используете массив, описанный на рисунке, показанном выше, то Вы можете задать начальное значение для всех шести элементов следующим образом: 17, 23, -45, 556, 3342, 0. Вы могли бы также установить начальное значение всех шести элементов равным 10, указав 6(10). Вы могли бы задать определенные значения для первых двух элементов, а затем установить остальные 4 элемента в 0, указав следующее: 17, 23, 4(0).

Доступ к данным в массиве

Вы обращаетесь к данным в массиве через индекс определенного элемента в массиве. Индекс используется в сочетании с символьным именем.

Пример: Если массив, описанный на рисунке выше, начинается в первом байте DB20 (motor), Вы обращаетесь ко второму элементу этого массива по следующему адресу:

Motor.Heat_2x3[1,2].

Использование массивов в качестве параметров

Вы можете передавать массивы как параметры. Если параметр описан в разделе описания переменных как ARRAY, то Вы должны передать весь массив (а не отдельные элементы). Однако параметру может присваиваться элемент массива, когда Вы вызываете блок, если элемент массива соответствует типу данных параметра.

Если Вы используете массивы как параметры, то не требуется, чтобы эти массивы имели такое же имя (для них даже не нужно имени). Однако оба массива (и формальный параметр, и фактический параметр) должны иметь одинаковую структуру. Например, массив размерности 2 x 3, состоящий из целых чисел, может передаваться как параметр только тогда, когда формальный параметр блока определен как массив размерности 2 x 3, состоящий из целых чисел, и фактический параметр, предоставляемый операцией вызова, тоже является массивом размерности 2 x 3, состоящим из целых чисел.

Мой блог находят по следующим фразам