Tag Archives: CoDeSys

Программирование ОВЕН ПЛК (связь ОВЕН ПЛК110 и СПК107)

 

Часть 1.

 

Часть 2.

Спасибо Кириллу Гайнутдинову за пример. Материал Взят с сайта производителя (www.owen.ru)

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

Программирование ОВЕН ПЛК (подключение модулей ввода-вывода к ПЛК)

 

Спасибо Кириллу Гайнутдинову за пример. Материал взят с сайта производителя www.owen.ru

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

Программирование ОВЕН ПЛК (подключение к ПЛК по последовательным интерфейсам)

 

Спасибо Кириллу Гайнутдинову за пример. Материал взят с сайта производителя (www.owen.ru)

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

Программирование ОВЕН ПЛК (Связь с ПЛК по Ethernet).

 

Спасибо Кириллу Гайнутдинову за пример. Материал взят с сайта www.owen.ru

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

Программирование ОВЕН ПЛК. Дискретная логика

 

Спасибо Кириллу Гайнутдинову за этот пример. Материал взят с сайта производителя (www.owen.ru)

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

Программирование ПЛК110 (первый проект)

Спасибо Кириллу Гайнутдинову за этот пример. Материал взят с сайта производителя (www.owen.ru)

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

Пример работы по Modbus в режиме Slave для CoDeSys 3.5

Пример на языке ST реализует работу по интерфейсу RS-485: настройку модуля ModBus-Slave для трансляции в сеть массива переменных MB_Buffer.

Объявление переменных:

PROGRAM PLC_PRG

VAR

MB_func: MB_SLAVE;

MB_Buffer: ARRAY[0..3] OF WORD; (* буфер данных для обмена по ModBus *)

MB_NewData: BOOL; (* данные обновились *)

MB_Error: MB_ERROR_TYPE; (* ошибка обработки запроса *)

port_opened: BYTE := 0;

Settings: ComSerice.SysCom.COM_Settings; (*настройки последовательного порта *)

SettingsEx: ComSerice.SysCom.COM_SettingsEx;

COM_SERVICE1: COM_SERVICE;

END_VAR

Тело программы:

IF port_opened=0 THEN

Settings.sPort:=ComSerice.SysCom.SYS_COMPORT2; (*номер COM-порта*)

Settings.ulBaudrate:=9600; (*скорость*)

Settings.byParity:=0;

Settings.ulTimeout:=0;

Settings.byStopBits:=1;

Settings.ulBufferSize:=0;

SettingsEx.byByteSize:=8;

SettingsEx.bBinary:=TRUE;

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings,sets_ex:=SettingsEx , Task:=OPEN_TSK );

(*Если COM-порт открыт, то переходим к приему и передачи данных *)

IF COM_SERVICE1.ready THEN

port_opened:=2;

END_IF

MB_Buffer[0] := 16#1234;

MB_Buffer[1] := 16#5678;

MB_Buffer[2] := 16#ABCD;

MB_Buffer[3] := 16#5555;

END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

MB_func(

ComHandle:=COM_SERVICE1.handle, (*номер COM-порта*)

DevAddr := 16,

pBuffer := ADR(MB_Buffer),

BufSize := SIZEOF(MB_Buffer),

NewData => MB_NewData,

Error => MB_Error

);

IF MB_Error <> MB_OK THEN

MB_NewData := FALSE;

END_IF

IF MB_NewData = TRUE THEN

MB_Error := MB_OK;

END_IF

END_IF

Пример записи переменных по Modbus для CoDeSys 3

Пример на языке ST реализует работу по интерфейсу RS-485: запись параметров типа Int (функция Modbus 06 — MB_WR_SNG_REG) и записи параметра типа Float (функция Modbus 16 — MB_WR_REGS). Для работы примера в PLC Configuration должны быть подключены библиотеки SisLibCom, Modbus, ComService.

PROGRAM PLC_PRG

VAR

send1_modbus:MB_WR_SNG_REG; (*функция 06 — запись параметра*)

send2_modbus: MB_WR_REGS; (*функция 16 — запись параметров*)

COM_SERVICE1: COM_SERVICE; (*ФБ открытия порта*)

Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)

cmpl: BOOL; (* признак завершения операции *)

port_opened: BYTE := 0; (*состояние порта*)

Init: BOOL; (* признак инициализации пользовательской программы *)

Settings:COMSETTINGS; (* настройки последовательного порта *)

com_num: PORTS:=1; (*0 — RS-485, 1 — RS-232*)

enabl: BOOL; (*состояние работы блока*)

err: INT; (*номер ошибки*)

TimeOut: TIME:=T#50ms; (*таймаут*)

Exception: BYTE;

DataSize: WORD;

master1: BYTE;

t: DWORD; (*переменная для организации счетчика*)

A: WORD := 0; (*счетчик*)

f1:DINT:=65; (*Записываемый параметр типа DINT*)

f2:REAL:=12.7; (*Записываемый параметр типа REAL*)

ptr_f2:POINTER TO BYTE;

END_VAR

(*Организуем счетчик, что бы передавать эти данные по сети*)

t:=t+1;

IF (t MOD 1000)=0 THEN

A := A + 1;

IF A > 9999 THEN

A := 0;

END_IF

(*Устанавливаем настройки COM-порта*)

IF port_opened=0 THEN

Settings.Port:=com_num; (*номер COM-порта*) Описание интерфейса библиотеки ФБ для работы с протоколом Modbus

Settings.dwBaudRate:=115200; (*скорость*)

Settings.byParity:=0;

Settings.dwTimeout:=0;

Settings.byStopBits:=0;

Settings.dwBufferSize:=0;

Settings.dwScan:=0;

END_IF

(*Открываем COM-порт*)

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );

(*Если COM-порт открыт, то переходим к приему и передачи данных *)

IF COM_SERVICE1.ready THEN

port_opened:=2;

END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

CASE master1 OF

0: (* функция 06 — запись параметра типа Int в прибор с адресом 1 в регистр 0*)

send1_modbus(

Enable:=enabl , (* разрешение работы блока *)

Mode:=MB_ASCII , (*режим передачи*)

DevAddr:=1 , (*адрес*)

RegAddr:=0 , (*регистр*)

Value:=A, (*значение переменной, которое надо передать*)

ComHandle:= Settings.Port, (*номер сом-порта*)

TimeOut:=TimeOut , (*таймаут T#50ms*)

Complete=>cmpl , (* скопировать признак завершения операции *)

Exception=>err ); (* скопировать регистр ошибок *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

master1:=1; (*переходим к выполнению следующего блока*)

END_IF

1: (* функция 16 — запись параметров типа Int (регистр 4) и Real (регистр 6) в прибор с адресом 2 *)

(*запись в буффер параметра типа INT*)

Buffer[1] := DINT_TO_BYTE(f1);

Buffer[0] := DINT_TO_BYTE( SHR(f1,8));

Buffer[3] := DINT_TO_BYTE( SHR(f1,16));

Buffer[2] := DINT_TO_BYTE( SHR(f1,24));

(*запись в буффер параметра типа Float*)

ptr_f2:=ADR(f2);

buffer[5] := ptr_f2^;

ptr_f2:=ptr_f2+1;

21 Описание интерфейса библиотеки ФБ для работы с протоколом Modbus 22

buffer[4] := ptr_f2^;

ptr_f2:=ptr_f2+1;

buffer[7] := ptr_f2^;

ptr_f2:=ptr_f2+1;

buffer[6] := ptr_f2^;

send2_modbus(

Enable:= enabl, (* разрешение работы блока *)

Mode:=MB_ASCII , (*режим передачи*)

DevAddr:=2 , (*адрес*)

FirstAddr:= 4, (*номер регистра*)

Quantity:= 4, (*количество записываемых регистров*)

ComHandle:=Settings.Port ,(*номер сом-порта*)

TimeOut:=TimeOut , (*таймаут T#50ms*)

Buffer:=Buffer , (* буфер данных *)

Complete=>cmpl , (* скопировать признак завершения операции *)

Exception=>err , (* скопировать регистр ошибок *)

RegCnt=> DataSize); (*кол-во считанных байтов *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

master1:=0;(*переходим к выполнению следующего блока*)

END_IF

END_CASE

IF enabl = FALSE THEN

enabl := TRUE;

END_IF

IF err <> 0 THEN

enabl := FALSE;

END_IF

END_IF

Работа с архивом в CoDeSys 3.5

Рассмотрим возможности создания и управления архивом в СоDeSys 3.5. В качестве примера будем по таймеру опрашивать набор переменных, изменяющихся на фиксированный шаг в каждом цикле ПЛК.

 

PROGRAM PLC_PRG

VAR

Arc1_1:GetData; //блок формирования строки и заголовка

Arc1_2:WriteData; // блок записи в архив

strT:STRING:=’bla bla bla’; //некоторая текстовая переменная

in1:BYTE; //некоторые внутренние переменные

in2: WORD;

in3:DWORD;

b:BOOL; //вспомогательная переменная

tp1:ton; // таймер для задания периода архивации

END_VAR

Сама программа:

b:=TRUE; //задаем ее каждый цикл TRUE для работы таймера

in1:=in1+1; // некоторые операции с данными

in2:=in2+2;

in3:=in3+123;

IF tp1.Q THEN

b:=FALSE; // обеспечит перезапуск таймера(его циклическую работу)

END_IF

Arc1_1.SetHead(); //разрешаем составить заголовок (обязательно ставить перед объявление переменных для архивирования)

Arc1_1( Name:=’in1′, Tip:=1, Znachenie:=ADR(in1)); // записываем значение переменной «in1»

Arc1_1( Name:=’in2′, Tip:=2, Znachenie:=ADR(in2));

Arc1_1( Name:=left(‘in3 name bolee 15 sim’,15), Tip:=3, Znachenie:=ADR(in3)); // имя переменной обязательно должно быть меньше 16 символов, если больше, то может вызвать ошибку

Arc1_1( Name:=’text’, Tip:=4, Znachenie:=ADR(strT));

//запишем все эти данные в архив, разрешение на работу свяжем с таймером, данныt берем из ФБ «Arc1_1», имя архива будет «ar1», и хранится будет в папке «/var/log/»(путь надо завершать косой чертой), режим оставляем по умолчанию равны «0»

Arc1_2(Enable:=tp1.Q, ArcPnt:=adr(Arc1_1), NameArc:=’ar1′, Path:=’/var/log/’);

TP1(IN := b, PT:= T#1M); //запустим таймер

На ПЛК получим файл(ы) следующего вида

Как видно к имени архива добавилась дата.

Со следующим содержанием:

//заголовок

#000 size=001 name=in1 #001 size=002 name=in2 #002 size=004 name=in3 name bolee #003 size=015 name=text

//данные

2010.12.03 16.05.22 #000=66 #001=00CC #002=00003102 #003=bla bla bla

2010.12.03 16.05.27 #000=CC #001=0198 #002=00006204 #003=bla bla bla

2010.12.03 16.05.32 #000=32 #001=0264 #002=00009306 #003=bla bla bla

2010.12.03 16.05.37 #000=98 #001=0330 #002=0000C408 #003=bla bla bla

2010.12.03 16.05.42 #000=FE #001=03FC #002=0000F50A #003=bla bla bla

2010.12.03 16.05.47 #000=64 #001=04C8 #002=0001260C #003=bla bla bla

2010.12.03 16.05.52 #000=CA #001=0594 #002=0001570E #003=bla bla bla

2010.12.03 16.05.57 #000=30 #001=0660 #002=00018810 #003=bla bla bla

2010.12.03 16.06.02 #000=96 #001=072C #002=0001B912 #003=bla bla bla

2010.12.03 16.06.07 #000=FC #001=07F8 #002=0001EA14 #003=bla bla bla

2010.12.03 16.06.13 #000=62 #001=08C4 #002=00021B16 #003=bla bla bla

2010.12.03 16.06.18 #000=C8 #001=0990 #002=00024C18 #003=bla bla bla

2010.12.03 16.06.23 #000=2E #001=0A5C #002=00027D1A #003=bla bla bla

и т.д.

Описание и назначение библиотеки

Библиотека ArchivatorOwenLib предназначена для ведения архива данных и записи его в энергонезависимую память контроллера (внутреннюю или внешнюю). Для этого используется два ФБ: первый блок «GetData» формирует строку для записи, на него заводятся те переменные, которые мы хотим архивировать; второй блок «WriteData» осуществляет запись сформированной строки в архив, в перспективе осуществляет несколько режимов ведения архива (пока доступен только один: каждый день создается новый файл).

Описание ФБ

Блок «GetData»

Входы:

• Name — имя переменной, максимальная длина15 символов, используется при формирование заголовка архива, если включен режим формирования заголовка;

• Tip – тип записываемой переменной: 0-REAL, 1-Byte, 2-Word, 3-DWord, 4-String (максимальная длина такая же, как у имени – 15 сиволов )

• Znachenie -значение переменной

Выходы:

• ErrCode -код ошибки (255-переполнение строки данных, 254-переполнение заголовка, 253-переполнение и строки данных и заголовка, 0-ошибок нет); если ошибка случилось, то блок продолжает работать, только новые данные не будут добавлены в конечную строку данных или заголовка.

• StrOut – сформированная строка данных определенного формата (номер переменной в виде #xxx и значение в шеснадцатиричной форме записи, например #005=00A1, «#»Номер переменной ПРОБЕЛ «=»Значение переменной в зависимости от типа)

• StrOutHead –сформированная строка заголовка определенного формата ( «#»Номер переменной ПРОБЕЛ «size=»Размер в байтах ПРОБЕЛ«name=» имя переменнойПРОБЕЛ)

Блок «WriteData»

Входы:

• Enable – разрешение на работу

• ArcPnt – ссылка на ФБ формирования заголовка и строки данных «GetData»

• NameArc – имя архива(максимум 15 символов)

• Path – путь к папке, в которой будет храниться архив (в конце должна стоять косая черта, например: /var/log/)

Для записи данных на флеш-карту или SD-карту памяти у контролеров ПЛК304/308 путь выглядит следующим образом:

SD: « /mnt/mmc/»

USB: «/mnt/usb1(2)/»

• Mode – режим работы (0-каждый день создается новый файл архива, дата добавляется в имя архива)

Выходы:

• ErrCode –код ошибки (0-ошибок нет, 1-не удалось создать файл, 2-не удалось открыть или файл занят, 3- не удалось записать), если ошибка случилось, то происходит выход из ФБ

 

Использование CoDeSys Service Tool для диалога с ПЛК

CoDeSys Service Tool (CST) предназначен для упрощения выполнения сервисных действий с контроллером, таких как: создание или обновление загрузочного проекта, перезагрузка и запуск исполняемого кода проекта, загрузка и чтение файлов, сброс и т.д. Таким образом, с помощью CST можно проводить типовые операции этапа сопровождения прикладных проектов без применения среды программирования CoDeSys.

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

При запуске CST на экране монитора отображается следующее окно:

 

В верхней части данного окна расположен раздел ‘Options’, содержащий кнопки для настройки соединения. В центре окна помещен раздел ‘Online’, содержащий кнопки управления контроллером и загрузкой программ и файлов. Внизу вы видите раздел ‘Log’, в котором содержится протокол работы. Справа помещен информационный раздел, в котором показан используемый контроллер и параметры соединения.

Раздел ‘Options’ содержит кнопки для выбора контроллера и настройки канала связи с ним

Пример использования CST

Допустим, нам необходимо обновить код прикладной программы (например My_prg) в одном или нескольких ПЛК, причем сделать это должен неспециалист. Контроллер соединен с компьютером и работает.

Предположим, что мы уже имеем в определенной рабочей директории необходимые файлы нового загрузочного проекта (My_prg.prg, My_prg.chk, My_prg.sdb), программу CST.exe и файл настроек My_plc.ini. Теперь мы можем запустить CST в диалоговом режиме, считать настройки, выбрать загрузочный проект, закачать его, перезагрузить и запустить прикладную программу.

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

bat файл создается в любом текстовом редакторе. Для получения сообщений на русском языке используйте кодировку DOS 866.

Ниже приведен возможный пример bat файла. В начале он выполняет проверку двух базовых условий (наличие самой сервисной программы и файла проекта) и, в случае отсутствия, дает соответствующее сообщение. Затем запускает CST с соответствующими аргументами и анализирует код возврата. Для кодов 1 и 103 предусмотрены текстовые сообщения. Вы можете использовать данный пример, адаптировав его под собственные нужды и развив диагностические сообщения в зависимости от задачи.

Пример bat файла:

@echo off

echo.

echo Обновление программы в ПЛК

echo ——————————

echo.

rem Проверяем наличие сервисной программы CST

if not exist «CST.exe» goto errorCST

rem Проверяем наличие загрузочного проекта

if not exist «My_prg.prg» goto errorPRG

echo Идет соединение с контроллером и загрузка программы. . .

CST.exe -pf %CD%/My_plc.ini -b My_prg.prg -rl -sta

echo.

if %ERRORLEVEL% LEQ 0 goto ok_result

if %ERRORLEVEL% LEQ 1 goto error1

if %ERRORLEVEL% LEQ 103 goto error103

echo Произошла ошибка N%ERRORLEVEL%

goto the_end

:errorCST

echo Не найден файл CST.exe

goto the_end