ЖУРНАЛ «СТА» №3/2007

Пара замечаний: 1. Поля типов AIM72x_inputs и AIM72x_outputs, соответст- вующие однотипным каналам (например vout0...3), могут быть описаны массивами. 2. Коэффициенты преобразования значений АЦПмогут быть объявлены в виде констант в секции VAR CONSTANT. К сожалению, это решение, являющееся хорошим тоном в языках программирования общего применения, не очень подходит для данного случая. Это связано с тем, что компи- лятор CoDeSys размещает одни и те же константы в памяти каждого экземпляра POU. Более того, если требуется задать инициализирующее значение некоторой переменной в секции VAR, оно тоже займет место в памяти каждого эк- земпляра POU. А у нас размер области памяти, отводимой под переменные, составляет всего 24 кбайт. Пусть, кроме того, требуется выводить в сеть Modbus зна- чения напряжения на каналах модулей AIM726 и AIM729. Суммарное количество каналов составляет 2 × 6 + 4 × 9 = 48, а значит, в конфигурации сети контроллера для передачи 48 значений типа REAL должно быть создано не менее 96 входных регистров со смежными идентификаторами (адре- сами). Пусть первый из 96 созданных регистров имеет адрес %QB7 в области выходных данных среды исполнения. Программа, преобразующая показания 6 модулей анало- гового ввода типа AIM726, 9 модулей аналогового ввода ти- па AIM728 и выводящая результаты в Modbus, может выгля- деть следующим образом: PROGRAM PLC_PRG VAR CONSTANT AIM726_ARRAY_SIZE :INT := 5; AIM728_ARRAY_SIZE :INT := 8; NETWORK_BUF_BOUND :INT := 47; END_VAR VAR_INPUT (* Адрес первого канала первого модуля AIM726 из шести – %IB37 *) aim726_inputs AT%IB37 : ARRAY [0..AIM726_ARRAY_SIZE] OF AIM726_inputs; (* Адрес первого канала первого модуля AIM728 из девяти – %IB91 *) aim728_inputs AT%IB91 : ARRAY [0..AIM728_ARRAY_SIZE] OF AIM728_inputs; END_VAR VAR_OUTPUT (* Адрес канала первого регистра из 96ти – %QB7 *) networkBuffer AT%QB7 : ARRAY [0.. NETWORK_BUF_BOUND] OF REAL; END_VAR VAR aim726_conv : ARRAY [0..AIM726_ARRAY_SIZE] OF AIM726_STIN; aim728_conv : ARRAY [0..AIM728_ARRAY_SIZE] OF AIM728_STIN; i : INT; netBufferIndex : INT; END_VAR (* Исполняемый код начинается здесь *) netBufferIndex := 0; FOR i := 0 TO AIM726_ARRAY_SIZE DO aim726_conv[i](inputs:= aim726_inputs[i], valid=> , outputs=> ); networkBuffer[netBufferIndex] := aim726_conv[i].outputs.vout0; netBufferIndex := netBufferIndex + 1; networkBuffer[netBufferIndex] := aim726_conv[i].outputs.vout1; netBufferIndex := netBufferIndex + 1; END_FOR; FOR i := 0 TO AIM728_ARRAY_SIZE DO aim728_conv[i](inputs:= aim728_inputs[i], valid=> , outputs=> ); networkBuffer[netBufferIndex] := aim726_conv[i].outputs.vout0; netBufferIndex := netBufferIndex + 1; networkBuffer[netBufferIndex] := aim726_conv[i].outputs.vout1; netBufferIndex := netBufferIndex + 1; networkBuffer[netBufferIndex] := aim726_conv[i].outputs.vout2; netBufferIndex := netBufferIndex + 1; networkBuffer[netBufferIndex] := aim726_conv[i].outputs.vout3; netBufferIndex := netBufferIndex + 1; END_FOR; END_PROGRAM; Как видно из приведённого исходного текста, в програм- ме объявлены два массива входных непосредственно пред- ставляемых переменных типа AIM726_inputs и AIM728_inputs. Массив aim726_inputs, состоящий из шести элементов типа AIM726_inputs, размещается, начиная с ад- реса первого канала первого модуля AIM726 из шести имеющихся в конфигурации контроллера. Массив aim728_inputs, состоящий из девяти элементов типа AIM728_inputs, размещается, начиная с адреса первого ка- нала первого модуля AIM728 из девяти имеющихся в кон- фигурации контроллера. Кроме того, для вывода в Modbus в программе объявлен массив из 48 переменных типа REAL, которые ссылаются на область выходных данных прикладной программы, начиная с адреса %QB7, то есть с того места, где располагается выходной канал первого из 96 смежных регистров. Далее в программе объявлены шесть и девять массивов функциональных блоков типа AIM726_STIN и AIM728_STIN соответственно. Вызовы блоков преобразо- вания выполняются в двух циклах. Теперь в случае добавле- ния какихлибо модулей перед первыми шестью AIM726 достаточно будет скорректировать значения адресов, на ко- торые ссылаются переменныемассивы aim726_inputs и aim728_inputs, заглянув в секцию PLC Configuration. Если же какиенибудь модули вставляются между первыми ше- стью AIM726 и группой из девяти AIM728, нужно будет скорректировать значение адреса, на который ссылается пе- ременнаямассив aim728_inputs. Кроме того, имеется воз- можность считывать значения всех 48 аналоговых каналов за один запрос чтения группы регистров, передаваемый мас- тером Modbus контроллеру. При использовании подобных приёмов следует учиты- вать, что они работают только тогда, когда однотипные объекты окружения (модули вводавывода или коммуника- ционные объекты) располагаются в конфигурации кон- троллера друг за другом. Кроме того, среда исполнения CoDeSys должна поддерживать чтение/запись по произ- вольному адресу без обязательного выравнивания на есте- ственную границу для процессора, на базе которого сделан контроллер. И еще одно замечание. В приведённом примере совер- шенно не обязательно объявлять и использовать в програм- ме два массива экземпляров функциональных блоков AIM726_STIN и AIM728_STIN, вполне достаточно обой- тись одним экземпляром каждого блока. Это связано с тем, что в данной программе используются только вычисляемые функции блоков. Применение отдельных экземпляров функциональных блоков требуется тогда, когда необходимо хранить состояние каждого объекта, представляемого каж- дым экземпляром блока, между вызовами программы. ● Автор — сотрудник фирмы Fastwel 119313, Москва, а/я 242 Тел.: +7 (495) 234-0639 Факс: +7 (495) 232-1654 E-mail: info@fastwel.ru Web: www.fastwel.ru 74 СТА 3/2007 АППА РАТ НЫ Е С Р Е Д С Т В А / П Р ОМЫШЛ Е ННЫ Е КОН Т Р ОЛЛ Е Р Ы www.cta.ru

RkJQdWJsaXNoZXIy MTQ4NjUy