ЖУРНАЛ СТА 4/2014
явления трудноуловимых ошибок во вре- мя работы системы. Представим, к при- меру, что значение булевой переменной bOnOff приложения, исполняемого в контроллере, определяется результатом записи в некоторое битовое поле типа Coil со стороны клиента MODBUS. Пусть приложение, обнаружив «перед- ний фронт» значения bOnOff , формирует импульсную команду включения или выключения коммутационного аппара- та, подключённого к каналу дискретно- го вывода контроллера, после чего само- стоятельно сбрасывает в FALSE значение bOnOff . Это нормально работает до мо- мента, когда клиент MODBUS, передав в bOnOff значение TRUE, пропускает от- вет контроллера на данный запрос запи- си из-за помехи в линии связи. Контрол- лер же, обнаружив передний фронт bOnOff , выдаёт команду управления и са- мостоятельно сбрасывает значение bOnOff . Если клиент MODBUS, не полу- чив ответа на последний запрос записи, повторно передаёт TRUE в bOnOff , это приводит к повторной выдаче команды на коммутационный аппарат. Либо при- ложение, взаимодействующее с контрол- лером по MODBUS, включает «красный транспарант», предупреждая оператора о неудачном выполнении последней ко- манды. В системе исполнения контроллеров FASTWEL I/O Holding -регистры для ал- горитма являются строго входными ( %I* ), что означает единственность ис- точника значений отображённых на них переменных, а среда разработки CoDeSys 2.3 размещает переменные ти- па %I* и RETAIN -переменные в разных непересекающихся сегментах памяти, что делает невозможным объявлять %I* -переменные в качестве RETAIN . Чтение Holding -регистров клиентами MODBUS используется только для то- го, чтобы узнать, какие значения были ранее записаны в некоторую область Holding -регистров по сети. Такая модель повышает предсказуемость поведения системы, как с точки зрения выполни- мости временных ограничений, так и с точки зрения предотвращения логиче- ских ошибок, которые могут возник- нуть при наличии возможности менять значения любых переменных из разных источников данных. Теперь о том, как решить обозначен- ную проблему сетевой параметризации контроллеров FASTWEL I/O. Идея со- стоит в том, что перед запуском прило- жения нужно вручную, используя ариф- метику указателей, скопировать значе- ния требуемых RETAIN -переменных в соответствующие входные переменные, отображённые на Holding -регистры MODBUS. Системное событие OnInit является единственным местом, где это удастся сделать, поскольку после него пользовательский код имеет дело с ад- ресами %I* -переменных, размещённых в персональных сегментах каждой цик- лической задачи, о чём было подробно рассказано в первой части статьи, опуб- ликованной в «СТА» 3/2014. Пусть уставки декларированы в виде энергонезависимой переменной, как показано на рис. 8. Тогда в конфигура- ции MODBUS-сервера следует создать необходимое число входных перемен- ных для приёма значений уставок по се- ти, используя те же типы данных и в том же порядке, как они перечислены в структурном типе AppSetPoints, как по- казано на рис. 9. Затем нужно декларировать перемен- ную, отображённую на начальный ад- рес группы переменных в конфигура- ции MODBUS-сервера, как показано на рис. 10. Далее следует создать функцию копи- рования данных по произвольному ад- ресу, код которой показан на рис. 11 . Теперь необходимо установить обра- ботчик системного события OnInit , ко- торое происходит всякий раз при запус- ке контроллера при включении пита- 84 СТА 4/2014 АППА РАТ НЫЕ С Р Е ДС Т В А / П РОМЫШЛ Е ННЫЕ КОН Т РОЛЛ Е РЫ www.cta.ru Рис. 9. Конфигурация MODBUS-сервера для приёма значений уставок, представленных типом AppSetPoints Рис. 11. Функция копирования size байт из области памяти pSource в pDestination Рис. 10. Структурная переменная для получения значений уставок по MODBUS
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy