Category Archives: Программы ПЛК

S7-200 Примеры управление широтно-импульсной модуляцией

Краткое описание:

CPU-214 S7-200 содержит функцию выдачи прямоугольных сигналов на выходы A0.0 и A0.1. При этом длительность периода и ширина импульса устанавливаются независимо друг от друга. Ширина импульса соответствует времени, в течение которого выходной сигнал за период имеет состояние „1“.

Данный пример описывает широтно-импульсную модуляцию (ШИМ), где на выход A0.0 выдается сигнал, ширина импульса которого увеличивается от периода к периоду на 0,5 с. Длительность периода составляет 5 с, а стартовая ширина импульса 0,5 с. Если будет достигнуто максимальное значение ширины импульса 4,5 с, то ширина импульса снова начинает уменьшаться на 0,5 с, пока значение не станет равно нулю. Этот процесс повторяется периодически.

Для проведения такой широтно-импульсной модуляции необходимо связать выход A0.0 со входом E0.0, также как массу напряжения питания с массой входов, для того чтобы имелась возможность управлять ШИМ из программы.

Описание программы вкл. листинг:

Байт специальных меркеров SMB67 служит для инициализации широтно-импульсной модуляции на выходе A0.0. Это инициализация содержит деблокировку ШИМ и установки, позволяющие изменять длительность периода и ширину импульса, а также выбрать временной базис (здесь в мс). В подпрограмме 0 будут установлены соответствующие контрольные байты. Команда ENI производит глобальную деблокировку всех прерываний. По команде PLS 0 операционная система запоминает установленные значения и инициализирует так называемый “PTO/ШИМ-генератор”, который будет производить ШИМ на выходе A0.0.

Длительность периода 5 с задается передачей значения 5000 в слово специальных меркеров SMW68. Начальная ширина импульса устанавливается на 0,5 с, путем записи значения 500 в слово специальных меркеров SMW70.

Данная инициализация производится в первом цикле, путем логического связывания вызова подпрограммы с битом специальных меркеров SM0.1 (First Scan Flag). Инициализация и установка ШИМ будет прооизводится повторно, после завершения процесса ШИМ, т.е. когда текущая ширина импульса станет равной 0.

Вспомогательный маркер M0.0 служит для установки, будет ли ширина импульса увеличиваться или уменьшаться. Во время инициализации он устанавливается, для того чтобы могло производиться инкрементирование. Выход A0.0 связан со входом E0.0, так что выходной сигнал появляется и на входе E0.0. После того как будет выдан первый импульс, событие ‘0’ (положительный фронт на E0.0) будет назначено подпрограмме прерывания 1 (INT1) с помощью команды ‘ATCH’. INT1 повышает текущее значение импульса на 0,5 с а затем команда ‘DTCH’ разрывает связь этого прерывания с INT1, причем прерывание снова будет блокировано. Если ширина импульса при следующем увеличении станет равна длительности периода, то вспомогательный маркер M0.0 будет сброшен. При этом событие ‘0’ назначается подпрограмме прерывания 2, которая уменьшит ширину импульса после каждого импульса на 0,5 с. Когда ширина импульса станет равна 0, снова будет вызвана подпрограмма инициализации (подпрограмма SBR 0).

Размер программы составляет 66 слов.

Основная программа

// TITEL = УПРАВЛЕНИЕ ШИРОТНО-ИМПУЛЬСНОЙ МОДУЛЯЈИЕЙ

CALL 0 // вызов подпрограммы 0 для пуска ШИМ

LDW>= SMW70, VW0// Если ширина импульса >= (длина периода — ширина импульса),

R M0.0, 1// вспомогат. маркер сбрасывается

LDW= SMW70, 0// Если ширина импульса равна нулю,

CALL 0 // Вызов подпрограммы 0 для нового пуска ШИМ

LD E0.0 // ВходE0.0 установлен

U M0.0 // и вспомогательный маркер для увеличения установлен,

ATCH 1, 0 // то INT 1 назначена событию 0 (положительный фронт на E0.0)

LD E0.0 // Вход E0.0 установлен,

UN M0.0 // а вспомогательный маркер для увеличения не установлен,

ATCH 2, 0 // то INT 2 назначена событию 0 (положительный фронт на E0.0)

MEND // Конец основной программы

ПОДПРОГРАММА 0

// SM67.0 := 1 => сохранение новой длительности периода (деблокировка)

// SM67.1 := 1 => сохранение новой ширины импульса (деблокировка)

// SM67.3 := 1 => временной базис 1мс (если 0 => временной базис 1мкс)

// SM67.6 := 1 => выбор режима ШИМ (если 0 => режим PTO)

// SM67.7 := 1 =>общая деблокировка High-Speed-Output-функций

SBR 0 // Инициализация ШИМ

LD SM0.0 // Всегда в единице

S M0.0, 1 // Установка вспом. маркера “увеличение  ширины импульса”

MOVB 16#CB, SMB67//Установка контрольных байтов PTO/ШИМ — для выхода A0.0

MOVW 500, SMW70// Задание начальной ширина импульса (здесь 500 мс)

MOVW 5000, SMW68// длина периода (здесь 5 с)

ENI // Деблокировка всех прерываний

PLS 0 // Команда на программирование PTO/ШИМ-генератора

MOVW SMW68, VW0// Копировать длину периода в слово/ данных VW0

-I 500, VW0// Сохранить значение ‘длина периода — ширина импульса’ в слове данных VW0

RET // Конец подпрограммы 0 и возврат в основную программу

Подпрограммы прерываний

INT 1 // Увеличение ширины импульса

LD SM0.0 // Всегда в единице

+I 500, SMW70// Увеличение ширины импульса на 500мс

PLS 0 // Команда на программирование PTO/ШИМ-генератора

DTCH 0 // Разделить прерывание и назначенное ему событие 0

RETI // Конец ISR 1 и возврат в основную программу

Подпрограмма обработки прерываний 2

INT 2 // Уменьшение ширины импульса

LD SM0.0 // Всегда в единице

-I 500, SMW70// Уменьшение ширины импульса на 500мс

PLS 0 // Команда на программирование PTO/ШИМ-генератора

DTCH 0 // Разделить прерывание и назначенное ему событие 0

RETI // Конец ISR 2 и возврат в основную программу

 

Управление Быстрым счетчиком S-200

В данном примере применения поясняется функция быстрого счетчика в SIMATIC S7-200. Быстрый счетчик может использоваться в различных конфигурациях, для того чтобы обрабатывать входные сигналы от датчиков, как напр. датчик перемещения.

Импульсные выходы будут использоваться в данном, для того чтобы создать быстрые сигналы. При этом появляется возможность генерировать последовательность импульсов (PTO), а также модулировать ширину импульсов (ШИМ), для того чтобы напр., управлять серводвигателем. Так как в данном применении используется последовательность импульсов, то можно использовать только CPU 214 DC/DC/DC.

Данное применение призвано показать, как должна быть структурирована программа, для того чтобы использовать быстрый счетчик и функцию последовательности импульсов в простейших конфигурациях.

 

Структура программы

 

В этом примере описывается функция быстрого счетчика S7-200 DC/DC/DC. Он считает быстрее чем ПЛК может обработать цикл. Используемый счетчик это 2 килогерцовый программный счетчик, который встроен в S7-212. S7-214 имеет дополнительно два аппаратных счетчика по 7 КГц. Все счетчики вместе требуют 10 байт в памяти данных, для управления, хранения значений, счета и чтения текущего состояния.

Размер программы составляет 96 слов.

Основная программа

Основная программа сбрасывает выход A0.0, так ка он необходим для  функции импульсов. Кроме того инициализируется быстрый счетчик HSC0 и вызываются подпрограммы 0 и 1. При этом HSC0 запускается со следующими свойствами: возможна актуализация значения, прямой счет. Программа завершается, если выполняется число циклов указанное в SBR 0 (SMD72).

 

 

LD SM0.1 // Первый цикл

R A0.0,1 // Сброс выхода // A0.0 для импульсов

MOVB 16#F8,SMB37 // Загрузка контрольных битов для быстрого счетчика HSC0 (деблокировка HSC0, обновление текущих значений, обновление сбросов, обновление направления счета и числа циклов). Команда HSC использует эти контрольные биты, для конфигурирования быстрого счетчика.

MOVD 0,SMD38 // Начальное значение быстрого счетчика HSC0

MOVD 1000,SMD42 // Первое значение останова от HSC0

HDEF 0,0 // Определение быстрого счетчика 0 в режиме 0

CALL 0 // Вызов подпрограммы 0

CALL 1 // Вызов подпрограммы 1

MEND // Конец основной программы

 

 

Подпрограммы

// Подпрограмма 0 служит для инициализации и деблокировки выдачи импульсов. В байте специальных меркеров SMB67 определяется вывод: последовательность импульсов, временой базис, обновление значений и деблокировка. Слово SMW68 содержит время цикла как мультипликатор временного базиса. В двойном слове специальных меркеров задается число генерируемых циклов.

 

SBR 0 // Подпрграмма 0

LD SM0.0 // Всегда в единице

MOVB 16#8D,SMB67 // Выдача импульсов:1мс,

// PTO, деблокировка, обновление

MOVW 1,SMW68// Длина цикла в мс

MOVD 30000, SMD72 // Число гененируемых циклов

PLS 0 // Разрешение выдачи импульсов на выходA0.0

RET // Конец подпрограммы 0

 

Подпрограмма 1 запускает быстрый счетчик HSC0 и назначает  подпрограмму 0 событию прерывания 12 (HSC0 текущее значение = сброс). Это событие возникает, если число сосчитанных импульсов (текущее значение) достигает текущего значения останова (сброс). Происходит деблокировка прерывания.

 

SBR 1 // Подпрограмма 1

LD SM0.0 // Всегда в единице

ATCH 0,12 // Назначение INT 0 событию прерывания 12 (HSC0 текущее значение = сброс)

ENI // Деблокировка прерывания

HSC 0 // Пуск быстрого счетчика 0

RET // Конец подпрограммы 1

 

Подпрограммы прерываний

//Подпрограмма прерывания 0 будет вызвана, если достигнуто первое значение сброса (1000) быстрого счетчика 0. Выход A0.1 устанавливается и задается новое значение сброса (1500) для быстрого счетчика.

// Подпрограмма прерывания 1 назначается событию прерывания 12 вместо подпрограммы 0.

 

INT 0 // Подпрограмма прерывания 0

LD SM0.0 // Всегда в единице

S A0.1,1 //Установка выхода A0.1

MOVD 16#A0,SMB37 //Установка контрольных битов: только загрузка нового сброса

MOVD 1500,SMD42// Следующее значение сброса HSC0

ATCH 1,12 // Назначение INT 1событию прерывания 12 вместо INT 0

HSC 0 // Загрузка нового сброса в HSC0

RETI // Конец подпрограммы прерывания 0

 

// Подпрограмма прерывания 1 вызывается, если достигнуто второе значение сброса (1500) быстрого счетчика 0. Выход A0.2 устанавливается, направление счета изменяется на обратное и определяется новое значение сброса (1000).

// Подпрограмма прерывания 2 назначается событию прерывания 12 INT 1

Подпрограмма прерывания 1

LD SM0.0 // Всегда в единице

S A0.2,1 //Установка выхода A0.2

MOVB 16#B0,SMB37//Установка контрольных битов для загрузки нового сброса и обратного счета

MOVD 1000,SMD42// Следующее значение сброса

ATCH 2,12 // Назначение INT 2 событию прерывания 12 вместо INT 1

HSC 0 // Загрузка нового сброса и нового направления в HSC0

RETI // Конец подпрограммы прерывания 1

 

Подпрограмма прерывания 2 вызывается, если достигнуто третье значение сброса (1000) быстрого счетчика 0. Выходы A0.1 и A0.2 сбрасываются, направление счета изменяется на прямое и текущее значение счетчика сбрасывается в ноль.

Значение сброса остается неизменным. При этом подпрограмма прерывания 0 назначается событию прерывания 12, выполнение программы начинается заново. Программа завершается, если заданное в SBR 0 (SMD72) число циклов отработано.

 

INT 2 // Подпрограмма прерывания 2

LD SM0.0 // Всегда в единице

R A0.1,2 // Сброс выходов A0.1 и A0.2

MOVB 16#D8,SMB37//Установка контрольных битов, для загрузки нового текущего значения прямого счета

MOVD 0,SMD38// Сброс текущего значения счетчика HSC0

ATCH 0,12 // Назначение INT 0 событию прерывания 12

HSC 0 // Новый пуск быстрого счетчика 0

RETI // Конец подпрограммы прерывания 2

 

Указания по преобразованию

Для того чтобы преобразовать TOOLITE2 AWL в S7-Micro/DOS AWL:

  • Установите ‘K’ перед каждым числом, не являющимся 16-ричной константой (напр. 4 → K4)
  • Замените ‘16#’ → ‘KH’ для всех 16-ричных констант (напр. 16#FF → KHFF)
  • Поставьте запятые для смены полей. Используйте клавиши перемещения или клавишу TAB для перехода от поля к полю.
  • Для преобразования программы S7-Micro/DOS AWL в KOP-форму нужно начинать каждый сегмент словом ‘NETWORK’ и номером. Каждый сегмент в этом примере имеет свой номер на диаграмме KOP. Используйте NWENFG в меню редактора для ввода нового сегмента. Команды MEND, RET, RETI, LBL, SBR и INT требуют отдельных сегментов.
  • Комментарии к строкам начинающиеся с «//» в S7-Micro/DOS не возможны, зато возможны комментарии к сегментам.

Работа с аналоговыми потенциометрами S7-200

Этот пример поясняет применение аналоговых потенциометров SIMATIC CPU 214. Положение аналоговых потенциометров преобразуется в цифровое значение между 0 и 255 и заносится в два байта специальных, причем SMB28 содержит значения потенциометра 1, а SMB29 значение потенциометра 2.

Метод 1:

В качестве первого варианта рассмотрим применение аналогового потенциометра 0 для точной установки таймера. Грубая или предварительная установка (здесь 200мс) производится в программе. Потенциометр может быть при этом использован для дальнейшей установки нужного значения до ,примерно, 1,48 секунды. После каждого цикла таймера будут выполнятся операции подпрограммы 1: Значение потенциометра 0, содержащееся в SMB28, будет загружено в AC1, разделено пополам и прибавлено к 200мс-предустановке. В основной программе число циклов таймера в AC2 будет увеличено на 1 и индицировано на выходном байте AB0.

Метод 2:

Второй метод позволяет сложить и усреднить в AC3 значения потенциометра 1 в 100 следующих друг за другом циклах программы. В первом цикле запоминаются нижнее граничное в VW14 и верхнее граничное в VW16 значения. Если усредненное значение ниже нижней границы или выше верхней границы, то это значение заносится в VW12 и копируется в VW14, VW16 и VW18. Новые верхняя и нижняя границы задаются прибавлением или вычитанием 3мс к усредненному значению. Среднее значение потенциометра, сохраненное в VW18, будет передано в основную программу в таймер T34. Здесь считаются циклы таймера и индицируются затем на выходном байте AB1. Этот метод создает путем фильтрации значений потенциометра относительно постоянную установку таймера от 0 до 2,55 секунд.

Метод 3:

Метод 3 это прямая загрузка значения потенциометра в качестве предустановки для таймера T35. Здесь число циклов таймера будет индицироваться на выходном байте AB0. Установка таймера может быть изменена в любом цикле.

Размер программы составляет 112 байт.

Подпрограммы

// Подпрограмма SBR 1:

// Уменьшение значения потенциометра 0 включая сложение с предустановленным значением.

SBR 1

LD T33 // После выполнения цикла таймера

MOVW 0, AC1 // аккумулятор AC1 сбрасывается

MOVB SMB28, AC1 // и значение потенциометра 0 копируется в AC1

MOVW 2, VW60

DIV VW60, AC1 // Принятое значение потенциометра делится пополам

+I 20, AC1 // и прибавляется смещение 200 мс

MOVW AC1, VW0 // Значение AC1 копируется в VW0

RET // Возврат в основную программу

// Подпрограмма SBR 2:

// Определение среднего значения потенциометра 1 по 100 циклам программы

SBR 2

LD SM0.0 // В каждом цикле

INCW VW10 // счетчик циклов увеличивается на 1

MOVB SMB29, AC0 // Значение потенциометра 1 заносится в AC0

+I AC0, AC3 // Прибавляется к общему значению в AC3

LDW= VW10,100 // После 100 циклов

MOVW 100, VW50

DIV VW50, AC3 // Значение для образования среднего значения делится на 100

MOVW AC3, VW12 // Среднее значение заносится в VW12

MOVW 0, VW10 // Сброс счетчика циклов

MOVD 0, AC3 // Сброс памяти общего значения

= M0.0

LD M0.0

LDW<= VW12, VW14 // и новое среднее значение вне поля допуска

OW>= VW12, VW16

ALD

FILL VW12, VW14, 3 // Новое среднее значение копируется в VW14, VW16 и VW18

-I 3, VW14 // Установка новой нижней границы (Среднее значение — 3мс)

+I 3, VW16 // Установка новой верхней границы (Среднее значение + 3мс)

RET // Возврат в основную программу

Для того чтобы преобразовать TOOLITE2 AWL в S7-Micro/DOS AWL:

• Установите ‘K’ перед каждым числом, не являющимся 16-ричной константой (напр. 4 → K4)

• Замените ‘16#’ → ‘KH’ для всех 16-ричных констант (напр. 16#FF → KHFF)

• Поставьте запятые для смены полей. Используйте клавиши перемещения или клавишу TAB для перехода от поля к полю.

• Для преобразования программы S7-Micro/DOS AWL в KOP-форму нужно начинать каждый сегмент словом ‘NETWORK’ и номером. Каждый сегмент в этом примере имеет свой номер на диаграмме KOP. Используйте NWENFG в меню редактора для ввода нового сегмента. Команды MEND, RET, RETI, LBL, SBR и INT требуют отдельных сегментов.

Управление прерываниями по времени

С помощью прерываний по времени создается тактовое мигание, причем частота мигания уполовинивается нажатием выключателя E0.1. Подача сигнала на вход 0.0 восстанавливает первоначальную частоту.

Этот пример призван пояснить общую работу с прерываниями по времени и изменением временного растра.

 

В байт специальных меркеров SMB34 заносится растр времени, с которым вызывается прерывание по времени с номером 10 (первое прерывание по временем). В байт специальных меркеров SMB 35 растр времени, с которым вызывается прерывание по времени с номером 11 (второе прерывание по времени — поддерживается только CPU 214). Растр времени в обоих случаях будет определен с инкрементом 1мс. Минимальное допустимое значение растра времени составляет 5 мс, максимальное — 255 мс.

Программа состоит из следующих подпрограмм:

  • Main Инициализация и задание времени
  • INT 0 Установка выхода A0.0
  • INT 1 Сброс выхода A0.0

Размер программы составляет 51 слово.

Основная программа

// TITEL = TIME-INT

// В этой первой части основной программы задается начальный растр времени

// и связываются два прерывания управляемых по времени.

 

// По положительному фронту входа E0.1 растр времени прерывания по времени

// удваивается. Для выполнения этого нового задания необходимо

// разорвать связи между прерываниями и подпрограммами прерывания,

// так как в противном случае новые значения не будут восприняты. Разрыв

// связи производится командой DTCH.

// После задания нового растра времени, связи должны быть заново созданы

// командой ATCH.

 

// По положительному фронту входа E0.0 будет восстановлена старая тактовая

// частота.

 

 

Подпрограммы прерываний

// ************************************************************

// При вызове подпрограммы прерывания 0 устанавливается выход A0.0.

 

// ************************************************************

// При вызове подпрограммы прерывания 1 выход A0.0 сбрасывается.

// Так как растр времени для вызова подпрограммы прерывания 1 в два раза длиннее, чем

// растр времени для вызова подпрограммы прерывания 0, возникает такт мигания.

 

Указания по преобразованию

Для того чтобы преобразовать TOOLITE2 AWL в S7-Micro/DOS AWL :

  • Установите ‘K’ перед каждым числом, не являющимся 16-ричной константой (напр. 4 станет K4)
  • Замените ‘16#’ на ‘KH’ для всех 16-ричных констант (напр. 16#FF → KHFF)
  • Поставьте запятые для смены полей. Используйте клавиши перемещения или клавишу TAB для перехода от поля к полю.
  • Для преобразования программы S7-Micro/DOS AWL в KOP-форму нужно начинать каждый сегмент словом ‘NETWORK’ и номером. Каждый сегмент в этом примере имеет свой номер на диаграмме KOP. Используйте NWENFG в меню редактора для ввода нового сегмента. Команды MEND, RET, RETI, LBL, SBR и INT требуют отдельных сегментов.

 

Управление подпрограммами прерываний ввода/вывода

 

Эта программа для SIMATIC S7-212 и S7-214 считает от 0 до 255 в зависимости от входа E0.0: Если он установлен, то программа считает обратно, а если нет, то программа считает прямо. При переключении этого входа выполняется подпрограмма прерывания ввода/вывода, которая устанавливает или сбрасывает меркерный бит обратного счета M0.0.

Эта программа является примером подпрограммы прерывания ввода/вывода. Счетчик считает от 0 до 255. Если вход E0.0 не установлен, то идет прямой счет. Если вход E0.0 установлен, то идет обратный счет.

Структура программы:

Main Инициализация и подпрограмма счета

INT 0 прямой счет — вход E0.0 не установлен

INT 1 обратный счет — вход E0.0 установлен

Размер программы составляет 32 слова.

Основная программа

// TITLE=EVENT-INT

// Основная программа состоит из подпрограмм инициализации и счета.

// При 0 или 255 процесс счета завершается.

// Меркерный бит M0.0 (меркер обратного счета) отвечает за направление счета.

// Включение входа E0.0подпрограмма прерывания ввода/вывода INT 0 выключается.

// Вэтой подпрограмме устанавливается меркер обратного счета M0.0.

// При этом основная программа ведет обратный счет.

// Подпрограмма прерывания по событию INT 1 выполняется, если вход E0.0

// выключается. При этом меркер обратного счета M0.0 сбрасывается и

// программа вновь ведет прямой счет.

LD SM0.1 // Бит инициализации — только в 1 в первом рабочем цикле

MOVB 0,AC0 // Установка аккумулятора счетчика в 0

ENI // Разрешение для подпрограмм прерываний

ATCH 0,0 // Подпрограма по событию для положительного фронта входа E0.0

ATCH 1,1 // Подпрограма по событию для отрицательного фронта входа E0.0

 

LDN M0.0 // Если меркер обратного счета не установлен

UB>= 16#FE,AC0 // … и текущее значение счетчика меньше или равно 254

U SM0.5 // … и импульс 0.5 секунды

EU // … и положительный фронт импульса,

INCW AC0 // то содержимое аккумулятора сетчика увеличивается на 1

 

LD M0.0 // Если меркер обратного счета установлен

UB<= 16#1,AC0 // … и текущее значение счетчика больше или равно 1

U SM0.5 // … и импульс 0.5 секунды

EU // … и положительный фронт импульса,

DECW AC0 // то содержимое аккумулятора сетчика уменьшается на 1

 

LD SM0.0 // Всегда в единице

MOVB AC0,AB0 // Индикация текущего значения счетчика на выходах

MEND // Конец основной программы

 

Подпрограммы прерываний

// Подпрограмма прерывания по событию 0 устанавливает меркерный бит M0.0 в 0.

// В этом случае программа ведет обратный счет.

INT 0 // Подпрограмма по событию ведет обратный счет

LD SM0.0

S M0.0,1 // Установка меркера обратного счета

RETI // Конец подпрограммы прерываний

// Подпрограмма прерывания по событию 1 устанавливает меркерный бит M0.0 в 1.

// В этом случае программа ведет прямой счет.

 

INT 1 // Подпрограмма по событию ведет прямой счет

R M0.0,1 // Сброс меркера обратного счета

RETI // Конец подпрограммы прерываний

Указания по преобразованию

Для того чтобы преобразовать TOOLITE2 AWL в S7-Micro/DOS AWL

  • Установите ‘K’ перед каждым числом, не являющимся 16-ричной константой (напр. 4 → K4)
  • Замените ‘16#’ → ‘KH’ для всех 16-ричных констант (напр. 16#FF → KHFF)
  • Поставьте запятые для смены полей. Используйте клавиши перемещения или клавишу TAB для перехода от поля к полю.
  • Для преобразования программы S7-Micro/DOS AWL в KOP-форму нужно начинать каждый сегмент словом ‘NETWORK’ и номером. Каждый сегмент в этом примере имеет свой номер на диаграмме KOP. Используйте NWENFG в меню редактора для ввода нового сегмента. Команды MEND, RET, RETI, LBL, SBR и INT требуют отдельных сегментов.

Использование OPC-сервера для подключения контроллеров к ПК

Технология подключения контроллеров системы CoDeSys к компьютеру следующая.

1. При загрузке проекта в среду CoDeSys осуществляется проверка, не подключен ли контроллер, и, если подключен, вызывается команда Logout .

2. Во вкладке ресурсов (Resources) Организатора объектов CoDeSys выбирается утилита Target Settings (рис. 1).

 Выбор утилиты Target Settings во вкладке ресурсов CoDeSys

Выбор утилиты Target Settings во вкладке ресурсов CoDeSys

3. В открывшейся экранной форме Target Settings (рис. 2), во вкладке General устанавливается опция Download Symbol File и подтверждается выбор нажатием клавиши ОК.

4. В главном меню CoDeSys (рис. 3) выбирается пункт Project и, в появляющемся контекстном меню, команда Options.

Выбор команды Project=> Options

Выбор команды Project => Options

5. В открывшейся экранной форме Options (рис. 4) в списке Category выбирается опция Symbol Configuration, а в поле параметров устанавливается флаг в поле Dump symbol entries, после чего нажимается кнопка Configure symbol file.

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

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

6. В открывшемся списке параметров переменных проекта (рис. 5) выбираются нужные объекты проекта, из которых требуется экспортировать переменные, и устанавливаются для них флаги в полях опций. Для обеспечения экспорта переменных в пространство имен OPC_сервера необходимо установить флаг в поле опции Export variables of object . В случае, если требуется изменять значения переменных, необходимо установить флаг в поле опции Write access.

Выбор параметров переменных проекта

Выбор параметров переменных проекта

7. Проект сохраняется.

8. Выбирается команда меню Project Rebuild all…, и перекомпилируется проект.

9. Вызывается команда Login, и загружается проект на контроллер.

10. Запускается OPC Configurator последовательным выбором команд:

Пуск => Программы => 3S Software => Communication => CoDeSys OPC Configurator

11. В открывшейся экранной форме OPC Config (рис. 6) в иерархической структуре (в левом поле) выделяется пункт Server и, в поле параметров справа, устанавливается время обновления данных Update Rate,ms (ввод цифр).

Экранная форма OPC Configurator

Экранная форма OPC Configurator

12. Правой кнопкой манипулятора «мышь» вызывается контекстное меню, и выбирается опция Append PLC (рис. 6). В открывшейся экранной форме (рис. 7) в иерархической структуре (в левом поле) для появившегося PLC1 выбирается пункт (папка) Connection и, в поле параметров справа, нажимается кнопку Edit, после чего устанавливаются параметры подключения ПЛК Communication Parameters.

13. Пользователь подтверждает свой выбор нажатием клавиши ОК, после чего OPC_сервер сконфигурирован и готов к работе под управлением SCADA_системы.

Подключение ПЛК

Подключение ПЛК

 

Конфигурация ОВЕН ПЛК 63 для связи с модулем МДВВ

В отличие от своих старших братьев – линейки ОВЕН ПЛК 1ХХ, ПЛК 63 не имеет такого замечательного инструмента подключения дополнительных модулей как Univercal modbus device. Это вызывает некоторые проблемы с расширением числа входов-выходов этого устройства. Есть конечно модуль МР1 и в большинстве приложений набора ПЛК63+МР1 достаточно, но отнюдь не везде и не всегда.

Решением задачи является написание специализированного программного модуля позволяющего через работу с  портами опрашивать и управлять модулем дискретного ввода-вывода МДВВ программно. Основные этапы создания этой программы Вы можете наблюдать ниже.

Итак, этап 1. Создадим подпрограмму для модуля МДВВ и назовем ее например PLC_Modbus.

Входами программы будут параметры связи (№ slave- устройства и скорость обмена) и параметры входов устройства

Выходными переменными будут счетчики и собственно входы устройства

Для реализации алгоритма нам понадобятся специализированные функции Modbus для работы с портом.

На этом завершим описание области переменных.

Программа открытия Com-порта представлена ниже.

Производим запись значений ШИМ программно.

Читаем состояние входов:

Опрашиваем счетчики по входам.

Ну и обязательная проверка на ошибки

Ну и наконец ниже показано как этот монстр выглядит при использовании в программе на языке LD.

 

Работа с гипертерминалом

В данной статье приводится список сообщений ПЛК1хх (на примере ПЛК150), выдаваемых контроллером при загрузке в окно Гипертерминала. Справа приведены комментарии к сообщениям контроллера.


DATAFLASH initialized successful                                                      Сообщение о успешной инициализации Flash

Welcome to the OWEN program loader                                               Приветствие загрузчика

MAIN_OSCILLATOR_CLOCK=15998976                                             Частота кварца в Гц

PCK=199987200                                                                              Частота ядра в Гц

MCK=66662400                                                                                Частота шины в Гц

Kernel found…                                                                                 Сообщение о нахождении ядра

Loading kernel…                                                                              и о начале его загрузки

Reseting…

Checksum OK!                                                                                Проверка контрольной суммы ядра

local_status         =4Load PLC core…

Main oscilator clock=15998976                                                           Частота кварца в Гц

Processor clock=199987200                                                              Частота ядра в Гц

Master clock=66662400                                                                     Частота шины в Гц

Waiting for check power…                                                                 Проверка основного питания.

Power status OK                                                                              Если основное питание отсутствует — загрузка далее не идет

at 20080004, s=16

Initialization of Timer0 completed                                                        Инициализация таймера

Module Id=1 found                                                                            Загрузка программных модулей

Module Id=2 found

Module Id=3 found

Module Id=100 found

Module Id=101 found

Module Id=102 found

Module Id=103 found

Module Id=104 found

Module Id=106 found

Module Id=107 found

Module Id=120 found

Module Id=200 found

Module Id=2000 found

Module Id=2050 found

Module Id=2051 found

Module Id=2052 found

Module Id=2053 found

Module Id=2054 found

Module Id=2055 found

Module Id=2056 found

Module Id=2057 found

Module Id=2058 found

Module Id=2059 found

Module Id=2060 found

Module Id=2061 found

Module Id=2062 found

Module Id=2063 found

Module Id=2064 found

Module Id=2065 found

Module Id=201 found

Module Id=202 found

Module Id=210 found

Module Id=2100 found

Module Id=250 found

Module Id=302 found

Module Id=303 found

Module Id=450 found

Module Id=451 found

Module Id=452 found

Module Id=500 found

Module Id=502 found

Module Id=504 found

Module Id=550 found

Module Id=600 found

Module Id=601 found

Module Id=602 found

Module Id=650 found

Module Id=700 found

Module Id=701 found

Module Id=702 found

Module Id=703 found

Module Id=704 found

Module Id=221 found

Module Id=300 found

Module Id=561 found

Module Id=400 found

Module Id=402 found

Module Id=401 found

Initialization of Timer5 completed                                                        Инициализация таймера

Initialization of Timer4 completed                                                        Инициализация таймера

Begin search and initialize I2C devices                                                Проверка устройств на шине I2C

Check for adress 77 …DEVICE FOUND!                                            Обнаружение устройства с адресом 77

MCP9800 #0 OK!                                                                             Датчик температуры №1 (для ПЛК150 это датчик холодного спая ТП)

Check for adress 72 …DEVICE FOUND!                                            Обнаружение устройства с адресом 72

MCP9800 #1 OK!                                                                             Датчик температуры №1 (для ПЛК150 это датчик холодного спая ТП)

Check for adress 4 …DEVICE FOUND!                                             Обнаружение устройства с адресом 4

PIC lower initialized!                                                                          Периферийный процессор нижней платы

Check for adress 3 …DEVICE FOUND!                                             Обнаружение устройства с адресом 3

PIC upper initialized!                                                                         Периферийный процессор верхней платы

dif=298

at 2008003c, s=4

at 20080044, s=4

Read Flash: .at 2008004c, s=4                                                          Начало чтения образа Flash в ОЗУ

at 20080054, s=4

at 2008005c, s=4

at 20080064, s=4

………………at 2008006c, s=4

……………………………………………………………………….                   Ход процесса чтения Flash

DATAFLASH READ OK                                                                    Flash успешно считана в ОЗУ

Flash read takes 3897 ms                                                                 Сообщение о времени чтения Flash

Start mounting FFS                                                                          Старт монтирования файловой системы Flash

Flash check takes 1977 ms                                                               Сообщение о времени проверки образа Flash

It is 0 bad blocks                                                                             Количество блоков Flash, отмеченных как сбойные

Mounting of FFS completed!                                                              Окончание монтирования Flash

Mounting takes 97 ms                                                                       Сообщение о времени монтирования файловой системы

Total size of filesystem is 3145728 bytes                                           Отчет о полном объеме файловой системы

It is 6135 blocks                                                                              и о кол-ве блоков в ней

It is 9 used blocks                                                                            и о кол-ве использованных блоков

It is 0 bad blocks                                                                             и о кол-ве сбойных блоков

Maximum wear level is 5 times                                                          Максимальное кол-во записей в один блок, обнаруженное в файлов. сист.

Reset status information…………………..                                            Сообщение о причине последней перезагрузки

PLC was reset by power!                                                                  … в нашем случаи по выключению питания

Last run module Id   =100                                                                  Последний вызванный по таймеру модуль

Last post module Id  =104                                                                 Последний вызванный сообщением модуль

Total control code   =2                                                                      Код TotatControl

Max cache utilisation =4                                                                    Максимальное число задействованных ячеек КЭШа на запись

local_status         =4

run_level            =2

Run levels stack: ff 16 ff ff ff ff  0  0  0  0  0  0  0  0  0  0

…………………………………………

ADC and DAC driver initialized!                                                          Сообщение о инициализации АЦП (только для ПЛК150-154)

PLC model MODEL PLC 150                                                             Сообщение о модели ПЛК

Binary  VERSION 2.05.7                                                                   о версии прошивки

Need Target version 2.05                                                                  о необходимой версии таргета

Compiled: 17:05:53 May 30 2008                                                       о времени создания прошивки

MAC 66:77:01:07:F4:49                                                                    МАС-адрес контроллера

IP 10.2.10.26                                                                                   IP-адрес контроллера

GATE 10.2.1.1                                                                                 адрес шлюза

MASK 255.0.0.0                                                                               маска подсети IP

PIC upper version is 05                                                                    версия ПО периферийного контроллера верхней платы

Licence limited to 360 bytes                                                              сообщение о лицензионном ограничении (в нашем случаи лиценз. L)

Voltage DAC                                                                                   тип модулей аналогового выхода (в нашем случаи тип У)

PIC lower version is 09                                                                     версия ПО периферийного контроллера нижней платы

Loading PLC core completed!                                                            Сообщение о успешной загрузке ядра

Start CoDeSys initialization secuence                                                 Старт загрузки программы CoDeSys

Special cable detected…                                                                   Сообщение о обнаружении кабеля программирования

Switch top RS to CoDeSys mode…                                                    Переключение порта Debug RS232 на протокол Gateway. Больше

сообщений не будет!

Описание нескольких типичных сбоев (проблем)

1. Отсутствие связи с устройствами по шине I2C

Выдаваемые сообщения (пример):

….

Check for adress 77 …DEVICE FOUND!

MCP9800 #0 OK!

Check for adress 72 …DEVICE FOUND!

MCP9800 #1 OK!

Check for adress 4 …FAILED!

Check for adress 3 …DEVICE FOUND!

PIC upper initialized!

……..

PLC model MODEL PLC 150

Binary  VERSION 2.05.7

Need Target version 2.05

Compiled: 17:05:53 May 30 2008

MAC 66:77:01:07:F4:49

IP 10.2.10.26

GATE 10.2.1.1

MASK 255.0.0.0

PIC upper version is 05

Licence limited to 360 bytes

Voltage DAC

PIC lower version is 00

 

 

Расшифровка сообщений:

Не найдено устройство с адресом 4 (это нижний периферийный процессор). Из-за этого не определена версия его ПО. При отсутствии связи с нижним периферийным процессором невозможно установить связь с контроллером (выдается сообщение о несоответствии выбранному Target-файлу).

Причина Метод устранения
Разовый сбой при загрузке Выключите питание ПЛК более чем на 10 мин, повторно включите и проверьте поиск устройств I2C
Отсутствие контакта в межплатном разъеме Обратитесь в сервисный центр
Выход из строя периферийного контроллера или датчика температуры Обратитесь в сервисный центр

Внимание: ПЛК150 и ПЛК154 содержат два датчика температуры, ПЛК100 и ПЛК110 – один. Для ПЛК100 и ПЛК110 является нормальным сообщение «Check for adress 7х …FAILED!» для одного из датчиков при условии обнаружения второго.

2. Отсутствие определения кабеля программирования

Не выдается сообщений :

Special cable detected…

Switch top RS to CoDeSys mode…

 

Расшифровка:

Порт Debug RS232 не переведен для работы по протоколу Gateway. В связи с этим невозможна установка связи со средой CoDeSys через этот порт.

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

Причина Метод устранения
Разовый сбой при загрузке Выключите питание ПЛК более чем на 10 мин, повторно включите и проверьте поиск устройств I2C
Применен нештатный кабель для программирования или кабель не исправен Проверьте кабель, замените кабель
На верхней плате ПЛК100, ПЛК150(154) ошибочно установлена перемычка («джампер») рядом с аккумулятором Удалите перемычку с верхней платы
Поломка верхней платы Обратитесь в сервисный центр

3. Длительное время загрузки ПЛК, долгое монтирование файловой системы

Выдаваемые сообщения (пример):

….

DATAFLASH READ OK
Flash read takes 3318 ms
Start mounting FFS
Flash check takes 4369 ms
Mounting of FFS completed!
Mounting takes 4605 ms
Total size of filesystem is 3145728 bytes
It is 5454 blocks
It is 687 used blocks
It is 3 bad blocks
Maximum wear level is 358 times

….

Расшифровка:

В данном примере видно, что файловая система контроллера достаточно интенсивно используется, производилась многократная запись и удаление файлов. Максимальное число использования блока в файловой системе довольно велико. Это означает, что весь объем Flash, отведенный под файловую систему многократно полностью перезаписывался. При этом вероятно файловая система сильно фрагментирована.  Это не является дефектом контроллера (т.к. максимальный ресурс записей в каждый блок составляет не менее 50 тыс), но приводит к увеличенному времени монтирования файловой системы.

Также в системе присутствует несколько сбойных блоков. Вероятно сбои произошли при перезагрузке контроллера (по Reset или по пропаданию питания при разряженном аккумуляторе) во время записи файла на Flash.

Метод устранения: Отформатировать Flesh используя программу перепрошивки. В одном из окон программы установить галочку «Форматировать Flash». При этом рекомендуется считать с ПЛК все файлы на ПК и после форматирования записать их обратно.

Важно понимать, что при хранении большого количества файлов на Flash-диске ПЛК время монтирования файловой системы все равно будет увеличено, вне зависимости от того, как давно было произведено форматирование.

 

Передача архивных файлов по по протоколу Modbus.

Организация передачи архивных файлов по последовательному интерфейсу по протоколу Modbus (при помощи 20-ой функции ModBus)

 

1. Введение

Данная функция предназначена для чтения файлов архива во флеш памяти PLC и передачи их по шине ModBus в ответ на запросы по 20-ой функции со стороны ModBus мастера (например ПК с установленным на нем  Lectus OPC).

2. Подключение и настройка

Функция реализована как подмодуль модуля ModBus slave в конфигурации PLC и называется File,  это выглядит так:

где

— File name – имя файла из которого происходит чтение.

— Amount Byte – количество байт в одной записи (в запросе записей может быть много)

3. Форматы запросов и ответов

Информация справочная или необходимая для случая создания собственного ПО обмена, запускаемого на ПК. При использовании ПО на КП, поддерживающего работу с функцией 20 особенности обмена скрыты от пользователя.

Формат запроса:

Function Code 0x14 Byte Код функции
Byte count 0x07 Byte Кол во байт, следующих ниже
Referens Type 0x06 Byte Подфункция (в нашем случае константа =6)
Hi File number Byte Старший Байт номера требуемого файла
Lo File number Byte Соответственно младший
Hi Rec addr Byte Старший Байт адреса записи в файле
Lo Rec addr Byte Соответственно младший
Hi Rec num Byte Старший Байт количества запрашиваемых записей
Lo Rec num Byte Соответственно младший

Соответственно ответ в случае успеха ответ должен быть таким:

Function Code 0x14 Byte Код функции
Byte count 0x07 Byte Кол во байт, следующих ниже
Byte count 0x07 Byte Кол во байт, следующих ниже (необходимо по стандарту)
Referens Type 0x06 Byte Подфункция (в нашем случае константа =6)
Data Byte*Rec_num*Amount_byte Собственно данные длиной Rec num из (запрса), умноженные на длину одной записи из конфигурации.

File number – может принимать значение от 0x0000 до 0xffff

Rec number – может принимать значение от 0x0000до 0xffff

Rec addr – может принимать значение 0x0000-0xfffe

Важно! При запросе с адресом Recaddr=0xffff происходит удаление файла.

При ошибке возвращается стандартный код ошибки ModBus, то есть 0x02.

4. Работа с несколькими файлами.

Для работы с несколькими файлами архивных данных необходимо подключить в модуле Modbus Slave несколько модулей File. Так как в запросе нет возможности передать имя файла то соответствие имени файла (их может быть много) и запроса осуществляется следующим образом. Номер файла в запросе соответствует позиции файла в дереве

PLC Configurations, начиная с нуля, то есть запрос с нулевым номером файла будет читать данные из первого стоящего файла в PLC Configurations модуля, первый из второго и так далее. Если запрошен файл которого нет на диске или в конфигурации он не указан, выдается код ошибки с номером 0x04.

Примечание: Для того чтобы Lectus OPC работал с этой функцией необходимо дополнительно поместить в его рабочую директорию библиотеку ModBus.dll.

 

Пример работы с SMS-сообщениями в ОВЕН ПЛК

Введение

Пример предназначен для демонстрации взаимодействия ОВЕН ПЛК и коммуникационного оборудования, подключенного через последовательный интерфейс RS232. При написании программы вызываются функции стандартной библиотеки SysLibCom.lib.  Функционально программа позволяет посылать и принимать SMS сообщения, используя стандартную визуализацию среды CoDeSys. Пример проекта, позволяющего принимать и посылать SMS–сообщения находится в файле
“sms_send_example.pro”.

Типовая аппаратная конфигурация

Программа протестирована на ПЛК100. Для перехода на ПЛК 150 (154) следует использовать верхний (DBGU) порт с “Модемным кабелем ПЛК1XX“ без перемычки (см. РЭ ПЛК150 (154)). В качестве модема применялся терминал Siemens MC35i. Типовые настройки модема:

1)      Выбрана скорость обмена 9600 AT+CBST=7

2)      Уведомление о приходе новых SMS AT+CNMI=1,1

3)   Сохранение параметров настройки во флэш-памяти. AT&W0

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

При работе с программой источником событий могут являться: либо человеко-машинный интерфейс, либо входящее SMS-сообщение с модема. При получении SMS на мнемосхеме появится телефонный номер, откуда пришло сообщение и текст. Для отсылки SMS наберите номер и нажмите в мнемосхеме viz1 кнопку “Отправить”.

Описание ФБ для работы с модемом

Для работы SMS в цикл программы ПЛК должен быть включен вызов ФБ “Gsm_modem_sms”

В качестве входов блока используются

com_num:PORTS:=COM1; Номер порта к которому подключен модем ( по умолчанию – COM1 – для ПЛК150 замените на COM3)

phone_num:STRING;         Телефонный номер получателя (например, 79160000000)– если не требуется посылать SMS оставьте пустым.

send_SMS_text:STRING;          Строка для отправки по указанному номеру – если не требуется посылать SMS оставьте пустым.

rcvSMS:BOOL;                      Флаг необходимости проверки SMS  — если установлен то производится проверка на вновь полученное SMS

use_unicode: BOOL ; Использование кодовой таблицы — юникод — ограничение на сообщение — 21 символ. Для отправки русских СМС – ограничение будет именно в 21 символ.

В качестве выходов блока используется

rcvedSMS:STRING;               Полученное SMS – если не пустое, то пришло новое.

rcvedPhonNum:STRING;     Телефон с которого отправлено SMS

rcvedTm:STRING(25);         Время отправки SMS сообщения

sended_OK:BOOL;               Признак успешной отправки SMS