Вложений: 5
COM#24. Как настроить обмен между ПЛК, программируемыми в CODESYS V3.5?
Вопрос: как настроить обмен данными между несколькими ПЛК, программируемыми в CODESYS V3.5?
Очевидно, что это можно сделать с помощью протокола Modbus TCP, но этот вариант является довольно трудоемким (настройка мастера и слэйвов, размещение данных в регистрах и т.д.)
Нет ли более простых способов?
Ответ: такие способы есть.
1. Если один ПЛК должен передавать одни и те же данные на несколько других ПЛК, то можно использовать сетевые переменные (Network Variables).
См. документацию (п. 3) и видеопример.
2. Если один ПЛК должен считывать/записывать разные данные с одного или нескольких ПЛК, то можно использовать Менеджер источников данных (Data Source Manager).
См. видеопример, доп. информацию для ПЛК2хх и информацию в онлайн-справке CODESYS:
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
Вопрос: Как в коде контролировать наличие связи через Data Source Manager?
Ответ: это можно сделать с помощью глобальных переменных диагностики:
- g_Datasources.<имя_источника_данных>Error (тип - Datasources.DataSourceError)
- g_Datasources.<имя_источника_данных>State (тип - Datasources.DataSourceMonitoringState)
Имя источника данных можно увидеть в дереве проекта (по умолчанию для первого источника данных это имя - Datasource).
Вложение 57244
Перечисления для этих переменных объявлены в библиотеке Datasources, которая автоматически добавляется в проект вместе с менеджером источников данных:
Вложение 57245
Вопрос: Как в коде контролировать наличие связи при использовании сетевых переменных?
Ответ: это можно сделать с помощью глобальных переменных диагностики, которые автоматически генерируются в списке сетевых переменных.
Для диагностики на стороне отправителя:
необходимо в свойствах списка сетевых переменных на вкладке Свойства сети установить галочку Подтверждение для ожидания подтверждений от получателя.
Вложение 57246
В случае обрыва связи в структуре NetVarTxDiag_UDP поле sLastError примет значение NetVarUDPError_NOACKNOWLEDGEMENT, а поле nErrorCount будет постоянно увеличиваться.
Вложение 57247
Для диагностики на стороне получателя:
В случае обрыва связи в структуре NetVarRxDiag_UDP значение полей nReceiveCount и tLastReceive "застынут" и перестанут изменяться.
Вложение 57248
Вложений: 1
PRG#28. Как инициализировать структуру в коде программы?
Вопрос: как иницилизировать структуру в коде программы?
Предположим, что объявлена такая структура:
Код:
TYPE TEST_DATA :
STRUCT
iVar: INT;
rVar: REAL;
END_STRUCT
END_TYPE
Понятно, что в коде программы можно инициализировать ее таким образом:
Код:
PROGRAM PLC_PRG
VAR
stData: TEST_DATA;
xInit: BOOL;
END_VAR
IF xInit THEN
stData.iVar := 11;
stData.rVar := 22.33;
...
xInit := FALSE;
END_IF
Но нет ли более простого способа?
Ответ: можно инициализировать структуру с помощью специального оператора STRUCT (не описанного в данный момент в справке CODESYS).
Код:
PROGRAM PLC_PRG
VAR
stData: TEST_DATA;
xInit: BOOL;
END_VAR
IF xInit THEN
stData := STRUCT(iVar := 11, rVar := 22.33);
xInit := FALSE;
END_IF
Этот способ также позволяет инициализировать структуры, объявленные в области VAR_INPUT CONSTANT в редакторе языка CFC:
Вложение 57586
OTHER#11. Как исполнить на ПЛК "имперский марш"?
Вопрос: как исполнить на зуммере ПЛК "имперский марш"?
Комментарий: данный функционал поддерживается в прошивках с CODESYS V3.5 SP16 Patch 3 и выше - в них в узле Buzzer добавлена возможность управления частотой зуммера.
Ответ: см. пример и видео.
Вложений: 1
PRG#29. Локальные перечисления
Вопрос: в наших проектах мы регулярно используем перечисления для повышения читабельности кода.
Некоторые перечисления используются только в конкретном функциональном блоке, и при переносе этого блока в другие проекты приходится не забывать о копировании таких перечислений, что составляет определенное неудобство.
Очевидным вариантом является выделение этого функционального блока и его перечислений в библиотеку, но это тоже является неудобным, так как в разных проектах часто приходится редактировать исходники этого ФБ, адаптируя его под конкретное применение.
Если ли какие-либо варианты для упрощения нашей ситуации?
Можно ли как-то "встроить" перечисление в ФБ?
Ответ: в CODESYS V3.5 (начиная с версии SP7) поддерживаются так называемые "локальные" перечисления. Эти перечисления создаются не при добавлении объекта типа DUT, а прямо в области объявления переменных.
Пример:
Код:
VAR
eState: (OPEN := 0, READ := 10, WRITE := 20, CLOSE := 30) INT;
END_VAR
Объявление локальных перечислений поддерживается в POU (функциях, ФБ и программах) и списках локальных переменных.
Объявление локальных перечислений не поддерживается в методах.
Источник информации:
1. https://alltwincat.com/2021/11/16/local-enumerations/
2. Баг-трекер CODESYS:
Вложение 58125
Примечание: локальные перечисления также поддерживаются в CoDeSys V2.3
Вложений: 1
PRG#30. Как выполнить действие при активации тревоги?
Вопрос: в проекте настроена Конфигурация тревог. Требуется при активации (или деактивации, подтверждении и т.д.) тревог выполнять какие-то действия - например, отправлять cмс, e-mail, сообщение через telegram-бота и т.п. Как это сделать?
Ответ: см. пример.
В примере демонстрируется, как при изменении состояния тревоги отправить e-mail. По аналогии можно реализовать выполнение других операций.
Вложение 58783
Вложений: 1
COM#25. Как записать данные из ПЛК в таблицу Google Spreadsheet?
Вопрос: как записать данные из ПЛК в таблицу Google Spreadsheet?
Ответ: см. пример.
Вложение 58906
Вложений: 3
DEBUG#10. В проекте для СПК возникает 40 ошибок типа Screen.VisuElems...
Вопрос: при создании проекта для СПК в среде CODESYS V3.5 SP16 Patch 3 и выше возникают такие ошибки:
Вложение 58974
Как их исправить?
Ответ: нажмите ПКМ на узел Screen, выберите команду Обновить устройство и обновите компонент до последней доступной версии.
Вложение 58975
Ошибки связаны с изменениями во внутренних библиотеках CODESYS, которые произошли в свежих версиях.
Рекомендуем создавать проект для СПК на основе шаблона - в этом случае ошибок не будет:
Вложение 58976
Вложений: 2
COM#26. В версии SP16 Patch 3 не удается опросить Modbus TCP Slave Device - ошибка 10
Вопрос: ПЛК настроен как Modbus TCP Slave Device через дерево проекта.
При его опросе возвращается ошибка 10 (0x0A): GATEWAY PATH UNAVAILABLE.
Вложение 58977
Ошибка проявилась в версии CODESYS V3.5 SP16 Patch 3, в прошлых версиях CODESYS с тем же проектом все работало нормально.
В чем может быть проблема?
Ответ: начиная с версии CODESYS V3.5 SP16 контроллер, настроенный как Modbus TCP Slave Device, отвечает только на запросы с Unit ID = 0 и Unit ID = 255.
Вложение 58978
Остальные адреса обрабатываются только в режиме SerialGateway.
В версии V3.5 SP17 будет восстановлено старое поведение - ПЛК будет отвечать на запросы с любым Unit ID.
Вложений: 2
PRG#31. Как инициализировать массивы и структуры?
Вопрос: как задать начальные значения для переменных типа массив (ARRAY) и структура (STRUCT)?
Ответ: см. видеопример или текстовое описание ниже.
Начальные значения элементов массива задаются в квадратных скобках:
Код:
aiData: ARRAY [1..6] OF INT := [1, 2, 3, 4, 5, 6];
Если некоторым последовательно размещенным элементам надо задать одно и то же значение - то можно сделать так:
Код:
// aiData[3] и aiData[4] получат значение 0
aiData: ARRAY [1..6] OF INT := [1, 2, 2(0), 5, 6];
Для многомерных массивов синтаксис аналогичен:
Код:
aiData: ARRAY [1..2, 1..3] OF INT := [1, 2, 3, 11, 22, 33];
Вложение 59180
Начальные значения элементов структуры можно задать прямо при ее создании.
Все экземпляры данной структуры по умолчанию будут инициализированы этими значениями.
Код:
TYPE TEST_DATA :
STRUCT
iVar: INT := 11;
rVar: REAL := 22.33;
END_STRUCT
END_TYPE
Если требуется при объявлении конкретного экземпляра структуры задать индивидуальные значения элементов - то это можно сделать в круглых скобках c указанием их имен:
Код:
stData: TEST_DATA := (iVar := 123, rVar := 11.22);
Пример инициализации массива структур:
Код:
astData: ARRAY [1..3] OF TEST_DATA := [ (iVar := 111, rVar := 11.22), (iVar := 222, rVar := 22.33), (iVar := 333, rVar := 33.44) ];
Кроме того, задать начальные значения можно в редакторе автообъявления:
Вложение 59181
PRG#32. Как сбросить счетчики ПЛК2хх из кода программы?
Вопрос: используем ПЛК210. Требуется сбрасывать счетчики дискретных входов и энкодеров из кода программы.
В узле Leftside на вкладке Конфигурация есть параметр Сброс счетчиков входов и энкодеров, но он применяется только при загрузке программы.
Как можно сбросить счетчики прямо в процессе работы ПЛК при выполнии нужного условия?
Ответ: явного механизма сброса счетчиков и энкодеров нет.
Вместо этого следует копировать их значения в промежуточные переменные, которыми уже можно будет манипулировать в коде программы.
См. пример.