--- a/i18n/Beremiz_ru_RU.po Thu Feb 16 14:34:40 2017 +0500
+++ b/i18n/Beremiz_ru_RU.po Thu Feb 16 14:35:12 2017 +0500
@@ -7,39 +7,17 @@
"Project-Id-Version: Beremiz\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-21 17:11+0300\n"
-"PO-Revision-Date: 2016-04-21 17:22+0300\n"
+"POT-Creation-Date: 2017-01-12 14:39+0300\n" +"PO-Revision-Date: 2017-01-12 14:41+0300\n" +"Last-Translator: Andrey Skvortsov <andrej.skvortzov@gmail.com>\n" "Language-Team: Andrey Skvortsov <andrej.skvortzov@gmail.com>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.7.1\n"
-#: ../PLCOpenEditor.py:396
-"An error has occurred.\n"
-"Click OK to save an error report.\n"
-"Please be kind enough to send this file to:\n"
-"edouard.tisserant@gmail.com\n"
-"Нажмите OK, чтобы сохранить репорт об ошибке.\n"
-"Будьте так добры, пошлите этот файл:\n"
-"edouard.tisserant@gmail.com\n"
+"X-Generator: Poedit 1.8.11\n" +#: ../PLCOpenEditor.py:408 ../Beremiz.py:1191 @@ -49,399 +27,427 @@
"Please be kind enough to send this file to:\n"
"beremiz-devel@lists.sourceforge.net\n"
-"You should now restart Beremiz.\n"
+"You should now restart program.\n" -"Произошла невосстанавливаемая ошибка (bug). Отчет об ошибке сохранен:\n"
+"Произошла невосстанавливаемая ошибка (bug). Отчет об ошибке сохранен в:\n" "Будьте добры, отправьте этот файл по адресу\n"
"beremiz-devel@lists.sourceforge.net\n"
-"Для дальнейшей работы перезапустите Beremiz.\n"
+"Для дальнейшей работы перезапустите программу.\n" #: ../controls/VariablePanel.py:72
#: ../controls/VariablePanel.py:71
#: ../controls/VariablePanel.py:71
#: ../controls/VariablePanel.py:72
#: ../controls/VariablePanel.py:71
#: ../controls/VariablePanel.py:73
-#: ../PLCOpenEditor.py:406
-#: ../dialogs/PouTransitionDialog.py:94 ../dialogs/ProjectDialog.py:66
+#: ../dialogs/PouTransitionDialog.py:99 ../dialogs/ProjectDialog.py:66 #: ../dialogs/PouActionDialog.py:91 ../dialogs/PouDialog.py:113
-#: ../ProjectController.py:1027
+#: ../ProjectController.py:1089 msgid " generation failed !\n"
msgstr "неудачная генерация кода!\n"
-#: ../plcopen/plcopen.py:883
+#: ../plcopen/plcopen.py:881 msgid "\"%s\" Data Type doesn't exist !!!"
msgstr "Тип данных \"%s\" не существует!!!"
-#: ../plcopen/plcopen.py:901
+#: ../plcopen/plcopen.py:899 msgid "\"%s\" POU already exists !!!"
msgstr "POU \"%s\" уже существует!!!"
-#: ../plcopen/plcopen.py:922
+#: ../plcopen/plcopen.py:920 msgid "\"%s\" POU doesn't exist !!!"
msgstr "POU \"%s\" не найден!!!"
-#: ../editors/Viewer.py:242
+#: ../editors/Viewer.py:246 msgid "\"%s\" can't use itself!"
msgstr "\"%s\" не может использовать сам себя!!!"
-#: ../IDEFrame.py:1615 ../IDEFrame.py:1634
+#: ../IDEFrame.py:1652 ../IDEFrame.py:1671 msgid "\"%s\" config already exists!"
msgstr "Конфигурация \"%s\" уже существует!!!"
-#: ../plcopen/plcopen.py:471
+#: ../plcopen/plcopen.py:467 msgid "\"%s\" configuration already exists !!!"
msgstr "Конфигурация \"%s\" уже существует!!!"
msgid "\"%s\" data type already exists!"
msgstr "Тип данных \"%s\" уже существует!!!"
-#: ../dialogs/PouTransitionDialog.py:105 ../dialogs/BlockPreviewDialog.py:219
-#: ../dialogs/PouActionDialog.py:102 ../editors/Viewer.py:258
-#: ../editors/Viewer.py:326 ../editors/Viewer.py:350 ../editors/Viewer.py:370
-#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
-#: ../controls/VariablePanel.py:386
+#: ../dialogs/PouTransitionDialog.py:110 ../dialogs/BlockPreviewDialog.py:219 +#: ../dialogs/PouActionDialog.py:102 ../editors/Viewer.py:262 +#: ../editors/Viewer.py:330 ../editors/Viewer.py:354 ../editors/Viewer.py:374 +#: ../editors/TextViewer.py:272 ../editors/TextViewer.py:301 +#: ../controls/VariablePanel.py:396 msgid "\"%s\" element for this pou already exists!"
msgstr "Элемент с именем \"%s\" уже существует в этом POU!!!"
msgid "\"%s\" folder is not a valid Beremiz project\n"
msgstr "Директория \"%s\" не является проектом Beremiz\n"
-#: ../PLCGenerator.py:1091
-msgid "\"%s\" function cancelled in \"%s\" POU: No input connected"
-msgstr "Функция \"%s\" не используется в POU \"%s\": входы не подключены"
-#: ../dialogs/SFCStepNameDialog.py:51 ../dialogs/PouTransitionDialog.py:101
-#: ../dialogs/BlockPreviewDialog.py:207 ../dialogs/PouNameDialog.py:49
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouTransitionDialog.py:106 +#: ../dialogs/BlockPreviewDialog.py:207 ../dialogs/PouNameDialog.py:50 #: ../dialogs/PouActionDialog.py:98 ../dialogs/PouDialog.py:120
-#: ../editors/DataTypeEditor.py:554 ../editors/DataTypeEditor.py:583
-#: ../editors/CodeFileEditor.py:750 ../controls/VariablePanel.py:733
+#: ../editors/DataTypeEditor.py:555 ../editors/DataTypeEditor.py:584 +#: ../editors/CodeFileEditor.py:770 ../controls/VariablePanel.py:751 msgid "\"%s\" is a keyword. It can't be used!"
msgstr "\"%s\" является ключевым словом и не может быть использован!"
-#: ../editors/Viewer.py:246
-msgid "\"%s\" is already used by \"%s\"!"
-msgstr "\"%s\" уже используется \"%s\"!"
-#: ../plcopen/plcopen.py:2405
+#: ../plcopen/plcopen.py:2412 msgid "\"%s\" is an invalid value!"
msgstr "\"%s\" недопустимое значение!"
-#: ../PLCOpenEditor.py:332 ../PLCOpenEditor.py:369
+#: ../PLCOpenEditor.py:339 ../PLCOpenEditor.py:381 msgid "\"%s\" is not a valid folder!"
msgstr "\"%s\" не является директорией!"
-#: ../dialogs/SFCStepNameDialog.py:49 ../dialogs/PouTransitionDialog.py:99
-#: ../dialogs/BlockPreviewDialog.py:203 ../dialogs/PouNameDialog.py:47
+#: ../dialogs/SFCStepNameDialog.py:50 ../dialogs/PouTransitionDialog.py:104 +#: ../dialogs/BlockPreviewDialog.py:203 ../dialogs/PouNameDialog.py:48 #: ../dialogs/PouActionDialog.py:96 ../dialogs/PouDialog.py:118
-#: ../editors/DataTypeEditor.py:578 ../editors/CodeFileEditor.py:748
-#: ../controls/VariablePanel.py:731 ../IDEFrame.py:1558
+#: ../editors/DataTypeEditor.py:579 ../editors/CodeFileEditor.py:768 +#: ../controls/VariablePanel.py:749 ../IDEFrame.py:1591 msgid "\"%s\" is not a valid identifier!"
msgstr "\"%s\" неверный идентификатор!"
msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
msgstr "\"%s\" используется более чем одним POU. Продолжить?"
#: ../dialogs/BlockPreviewDialog.py:211 ../dialogs/PouDialog.py:122
-#: ../editors/Viewer.py:256 ../editors/Viewer.py:311 ../editors/Viewer.py:341
-#: ../editors/Viewer.py:363 ../editors/TextViewer.py:268
-#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:348
-#: ../editors/TextViewer.py:371 ../controls/VariablePanel.py:328
+#: ../editors/Viewer.py:260 ../editors/Viewer.py:315 ../editors/Viewer.py:345 +#: ../editors/Viewer.py:367 ../editors/TextViewer.py:270 +#: ../editors/TextViewer.py:299 ../editors/TextViewer.py:350 +#: ../editors/TextViewer.py:373 ../controls/VariablePanel.py:338 msgid "\"%s\" pou already exists!"
msgstr "POU \"%s\" уже существует!"
-#: ../plcopen/plcopen.py:495
-msgid "\"%s\" resource already exists in \"%s\" configuration !!!"
-msgstr "Ресурс \"%s\" уже существует в конфигурации \"%s\"!!!"
-#: ../plcopen/plcopen.py:512
-msgid "\"%s\" resource doesn't exist in \"%s\" configuration !!!"
-msgstr "Ресурс \"%s\" отсутствует в конфигурации \"%s\"!!!"
-#: ../dialogs/SFCStepNameDialog.py:57
+#: ../dialogs/SFCStepNameDialog.py:58 msgid "\"%s\" step already exists!"
msgstr "Шаг \"%s\" уже существует!"
-#: ../editors/DataTypeEditor.py:549
+#: ../editors/DataTypeEditor.py:550 msgid "\"%s\" value already defined!"
msgstr "\"%s\" значение уже задано!"
-#: ../dialogs/ArrayTypeDialog.py:97 ../editors/DataTypeEditor.py:744
+#: ../dialogs/ArrayTypeDialog.py:97 ../editors/DataTypeEditor.py:745 msgid "\"%s\" value isn't a valid array dimension!"
msgstr "\"%s\" не является корректной размерностью для массива! "
-#: ../dialogs/ArrayTypeDialog.py:103 ../editors/DataTypeEditor.py:751
+#: ../dialogs/ArrayTypeDialog.py:103 ../editors/DataTypeEditor.py:752 "\"%s\" value isn't a valid array dimension!\n"
"Right value must be greater than left value."
msgstr "\"%s\" не является корректной размерностью массива! Правое значение должно быть больше левого."
-#: ../editors/CodeFileEditor.py:663
+#: ../PLCGenerator.py:1101 +msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected" +msgstr "Функция \"{a1}\" не используется в POU \"{a2}\": входы не подключены" +#: ../editors/Viewer.py:250 +msgid "\"{a1}\" is already used by \"{a2}\"!" +msgstr "\"{a1}\" уже используется \"{a2}\"!" +#: ../plcopen/plcopen.py:491 +msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!" +msgstr "Ресурс \"{a1}\" уже существует в конфигурации \"{a2}\"!!!" +#: ../plcopen/plcopen.py:509 +msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!" +msgstr "Ресурс \"{a1}\" отсутствует в конфигурации \"{a2}\"!!!" msgid "%(codefile_name)s"
msgstr "%(codefile_name)"
-#: ../PLCControler.py:970
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:578 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:569 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:56 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:570 -msgid "%s \"%s\" can't be pasted as a %s."
-msgstr "%s \"%s\" не может быть вставлен как %s."
-#: ../PLCControler.py:1530
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:55 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:53 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:54 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572 +#: ../PLCControler.py:1531 -#: ../PLCControler.py:1513
+#: ../PLCControler.py:1514 -#: ../canfestival/SlaveEditor.py:46 ../canfestival/NetworkEditor.py:67
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:90 -#: ../ConfigTreeNode.py:32
-"%s XML file doesn't follow XSD schema at line %d:\n"
-"%s XML файл не следует XSD-схеме в строке %d:\n"
-#: ../plcopen/plcopen.py:1638 ../plcopen/plcopen.py:1645
-#: ../plcopen/plcopen.py:1657 ../plcopen/plcopen.py:1665
-#: ../plcopen/plcopen.py:1675
+#: ../plcopen/plcopen.py:1645 ../plcopen/plcopen.py:1652 +#: ../plcopen/plcopen.py:1664 ../plcopen/plcopen.py:1672 +#: ../plcopen/plcopen.py:1682 msgid "%s body don't have instances!"
msgstr "Тело %s не содержит экземпляров!"
-#: ../plcopen/plcopen.py:1693 ../plcopen/plcopen.py:1700
-#: ../plcopen/plcopen.py:1707
+#: ../plcopen/plcopen.py:1700 ../plcopen/plcopen.py:1707 +#: ../plcopen/plcopen.py:1714 msgid "%s body don't have text!"
msgstr "Тело %s не содержит никакой текст!"
msgstr "&Добавить элемент"
+#: ../dialogs/AboutDialog.py:65 ../dialogs/AboutDialog.py:113 +#: ../dialogs/AboutDialog.py:150
+#: ../dialogs/AboutDialog.py:64 -#: ../PLCOpenEditor.py:119
+#: ../PLCOpenEditor.py:125
msgstr "&Недавние проекты"
-#: ../controls/SearchResultPanel.py:252
-msgid "'%s' - %d match in project"
-msgstr "'%s'- %d совпадений в проекте"
-#: ../controls/SearchResultPanel.py:254
-msgid "'%s' - %d matches in project"
-msgstr "'%s' - %d совпадений в проекте"
-#: ../connectors/PYRO/__init__.py:86
-msgid "'%s' is located at %s\n"
-msgstr "'%s' находится %s\n"
-#: ../controls/SearchResultPanel.py:304
+#: ../controls/SearchResultPanel.py:239 +msgid "'{a1}' - {a2} match in project" +msgstr "'{a1}'- {a2} совпадений в проекте" +#: ../controls/SearchResultPanel.py:241 +msgid "'{a1}' - {a2} matches in project" +msgstr "'{a1}' - {a2} совпадений в проекте" +#: ../connectors/PYRO/__init__.py:90 +msgid "'{a1}' is located at {a2}\n" +msgstr "'{a1}' находится {a2}\n" +#: ../controls/SearchResultPanel.py:291 -#: ../PLCOpenEditor.py:384 ../PLCOpenEditor.py:386 ../PLCOpenEditor.py:387
+#: ../PLCOpenEditor.py:396 ../PLCOpenEditor.py:398 ../PLCOpenEditor.py:399
-#: ../dialogs/PouTransitionDialog.py:96 ../dialogs/PouActionDialog.py:93
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/PouActionDialog.py:93 #: ../dialogs/PouDialog.py:115
-#: ../PLCOpenEditor.py:382
+#: ../PLCOpenEditor.py:394
-#: ../controls/LogViewer.py:278
+#: Extra TC6 documentation strings +msgid "0 - current time, 1 - load time from PDT" +msgstr "0 - текущее время, 1 - отклонение от PDT" +msgid "0 - manual , 1 - automatic" +msgstr "0 - ручной, 1 - автоматический" +msgid "0 - track X0, 1 - ramp to/track X1" +msgstr "0 - вход X0, 1 - нарастание до значения X1" +msgid "1 = integrate, 0 = hold" +msgstr "1 = интегрировать, 0 = остановка" #: ../controls/LogViewer.py:279
+#: ../controls/LogViewer.py:280 -#: ../controls/LogViewer.py:280
+#: ../controls/LogViewer.py:281 -#: ../controls/LogViewer.py:281
+#: ../controls/LogViewer.py:282 -#: ../dialogs/PouDialog.py:124 ../IDEFrame.py:1581 ../IDEFrame.py:1623
+#: ../dialogs/PouDialog.py:124 ../IDEFrame.py:1614 ../IDEFrame.py:1660 msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
msgstr "В POU присутствует элемент с именем \"%s\". Это может вызвать конфликт. Хотите продолжить?"
-#: ../dialogs/SFCStepNameDialog.py:53 ../dialogs/PouTransitionDialog.py:103
-#: ../dialogs/PouNameDialog.py:51 ../dialogs/PouActionDialog.py:100
-#: ../controls/VariablePanel.py:735 ../IDEFrame.py:1593 ../IDEFrame.py:1604
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:108 +#: ../dialogs/PouNameDialog.py:52 ../dialogs/PouActionDialog.py:100 +#: ../controls/VariablePanel.py:753 ../IDEFrame.py:1628 ../IDEFrame.py:1641 msgid "A POU named \"%s\" already exists!"
msgstr "POU с именем \"%s\" уже существует!"
-#: ../ConfigTreeNode.py:400
-msgid "A child named \"%s\" already exist -> \"%s\"\n"
-msgstr "Дочерний элемент с именем \"%s\" уже существует -> \"%s\"\n"
-#: ../dialogs/BrowseLocationsDialog.py:211
+#: ../ConfigTreeNode.py:424 +msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n" +msgstr "Дочерний элемент с именем \"{a1}\" уже существует -> \"{a2}\"\n" +#: ../dialogs/BrowseLocationsDialog.py:216 msgid "A location must be selected!"
msgstr "Необходимо выбрать размещение!"
-#: ../dialogs/SFCStepNameDialog.py:55 ../controls/VariablePanel.py:737
-#: ../IDEFrame.py:1595 ../IDEFrame.py:1606
+#: ../dialogs/SFCStepNameDialog.py:56 ../controls/VariablePanel.py:755 +#: ../IDEFrame.py:1630 ../IDEFrame.py:1643 msgid "A variable with \"%s\" as name already exists in this pou!"
msgstr "Переменная с именем \"%s\" уже существует в этом POU!"
-#: ../editors/CodeFileEditor.py:754
+#: ../editors/CodeFileEditor.py:774 msgid "A variable with \"%s\" as name already exists!"
msgstr "Переменная с именем \"%s\" уже существует!"
-#: ../PLCOpenEditor.py:152 ../Beremiz.py:374
+#: ../dialogs/AboutDialog.py:40 ../PLCOpenEditor.py:158 ../Beremiz.py:381
-#: ../PLCOpenEditor.py:346
-msgid "About PLCOpenEditor"
-msgstr "О PLCOpenEditor"
#: ../plcopen/iec_std.csv:22
msgstr "Абсолютный номер"
-#: ../dialogs/SFCStepDialog.py:71 ../dialogs/ActionBlockDialog.py:42
+#: ../dialogs/SFCStepDialog.py:72 ../dialogs/ActionBlockDialog.py:42 -#: ../editors/Viewer.py:551 ../editors/Viewer.py:2069
+#: ../editors/Viewer.py:555 ../editors/Viewer.py:2345 @@ -453,7 +459,7 @@
-#: ../plcopen/plcopen.py:1356
+#: ../plcopen/plcopen.py:1359 msgid "Action with name %s doesn't exist!"
msgstr "Действие с именем %s не существует!"
@@ -466,72 +472,72 @@
-#: ../editors/Viewer.py:1087
+#: ../editors/Viewer.py:1100 -#: ../canfestival/SlaveEditor.py:57 ../canfestival/NetworkEditor.py:78
-#: ../editors/Viewer.py:584 ../Beremiz.py:1024
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:101 +#: ../editors/Viewer.py:588 ../Beremiz.py:1060 -#: ../IDEFrame.py:1856 ../IDEFrame.py:1891
+#: ../IDEFrame.py:1890 ../IDEFrame.py:1925 msgstr "Добавить действие"
msgid "Add C code accessing located variables synchronously"
msgstr "Добавить C-код с синхронным доступом к локальным переменным"
msgid "Add Configuration"
msgstr "Добавить конфигурацию"
msgstr "Добавить тип данных"
-#: ../editors/Viewer.py:509
+#: ../editors/Viewer.py:513 msgid "Add Divergence Branch"
msgstr "Добавить ветвление"
-#: ../dialogs/DiscoveryDialog.py:115
+#: ../dialogs/DiscoveryDialog.py:116 msgstr "Добавить IP адрес"
msgid "Add Python code executed asynchronously"
msgstr "Добавить асинхронно вызываемый код на Python"
-#: ../IDEFrame.py:1867 ../IDEFrame.py:1917
+#: ../IDEFrame.py:1901 ../IDEFrame.py:1951 -#: ../IDEFrame.py:1845 ../IDEFrame.py:1888
+#: ../IDEFrame.py:1879 ../IDEFrame.py:1922 msgstr "Добавить переход"
-#: ../editors/Viewer.py:496
+#: ../editors/Viewer.py:500 -#: ../editors/SFCViewer.py:359
+#: ../editors/SFCViewer.py:433 msgid "Add a new initial step"
msgstr "Добавить новый исходный шаг"
-#: ../editors/Viewer.py:2672 ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2706 ../editors/SFCViewer.py:770 msgstr "Добавить новый безусловный переход"
-#: ../editors/SFCViewer.py:381
+#: ../editors/SFCViewer.py:455 msgstr "Добавить новый шаг"
msgid "Add a simple WxGlade based GUI."
msgstr "Добавить простой GUI на WxGlade "
@@ -539,7 +545,7 @@
msgstr "Добавить действие"
-#: ../editors/DataTypeEditor.py:351
+#: ../editors/DataTypeEditor.py:352 msgstr "Добавить элемент"
@@ -547,7 +553,7 @@
msgstr "Добавить экземпляр"
-#: ../canfestival/NetworkEditor.py:80
+#: ../canfestival/NetworkEditor.py:103 @@ -555,7 +561,7 @@
-#: ../editors/CodeFileEditor.py:640 ../controls/VariablePanel.py:440
+#: ../editors/CodeFileEditor.py:658 ../controls/VariablePanel.py:450 msgstr "Добавить переменную"
@@ -563,22 +569,22 @@
-#: ../plcopen/definitions.py:22
+#: ../plcopen/definitions.py:47 msgid "Additional function blocks"
msgstr "Дополнительные функциональные блоки"
-#: ../editors/Viewer.py:567
+#: ../editors/Viewer.py:571 msgid "Adjust Block Size"
msgstr "Скорректировать размер элемента"
-#: ../editors/Viewer.py:1612
+#: ../editors/Viewer.py:1637 -#: ../dialogs/BrowseLocationsDialog.py:34
-#: ../dialogs/BrowseLocationsDialog.py:42
-#: ../dialogs/BrowseLocationsDialog.py:135
-#: ../dialogs/BrowseLocationsDialog.py:138 ../controls/LogViewer.py:297
+#: ../dialogs/BrowseLocationsDialog.py:39 +#: ../dialogs/BrowseLocationsDialog.py:47 +#: ../dialogs/BrowseLocationsDialog.py:140 +#: ../dialogs/BrowseLocationsDialog.py:143 ../controls/LogViewer.py:298 #: ../controls/VariablePanel.py:70
@@ -587,11 +593,11 @@
msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
msgstr "Все файлы (*.*)|*.*|CSV files (*.csv)|*.csv"
-#: ../ProjectController.py:1523
+#: ../ProjectController.py:1623 msgid "Already connected. Please disconnect\n"
msgstr "Уже подключен. Пожалуйста, отключитесь сначала.\n"
-#: ../editors/DataTypeEditor.py:593
+#: ../editors/DataTypeEditor.py:594 msgid "An element named \"%s\" already exists in this structure!"
msgstr "Поле с именем \"%s\" уже существует в данной структуре!"
@@ -616,8 +622,8 @@
-#: ../editors/DataTypeEditor.py:54 ../editors/DataTypeEditor.py:634
-#: ../controls/VariablePanel.py:811
+#: ../editors/DataTypeEditor.py:54 ../editors/DataTypeEditor.py:635 +#: ../controls/VariablePanel.py:829 @@ -637,7 +643,10 @@
msgid "Author Name (optional):"
msgstr "Имя автора (опционально):"
-#: ../dialogs/FindInPouDialog.py:78
+msgid "BUSY = 1 during ramping period" +msgstr "BOSY = 1 во время " +#: ../dialogs/FindInPouDialog.py:79 @@ -649,26 +658,26 @@
msgid "Bad domain name at "
msgstr "Неправильное доменное имя в"
-#: ../canfestival/config_utils.py:342 ../canfestival/config_utils.py:624
+#: ../canfestival/config_utils.py:342 ../canfestival/config_utils.py:630 msgid "Bad location size : %s"
msgstr "Неправильный размер: %s"
-#: ../dialogs/ArrayTypeDialog.py:55 ../editors/DataTypeEditor.py:174
-#: ../editors/DataTypeEditor.py:204 ../editors/DataTypeEditor.py:296
+#: ../dialogs/ArrayTypeDialog.py:55 ../editors/DataTypeEditor.py:175 +#: ../editors/DataTypeEditor.py:205 ../editors/DataTypeEditor.py:297 -#: ../editors/DataTypeEditor.py:624 ../controls/VariablePanel.py:769
+#: ../editors/DataTypeEditor.py:625 ../controls/VariablePanel.py:787 msgstr "Базовые параметры"
msgstr "Настройки Beremiz "
@@ -701,7 +710,7 @@
msgid "Bitwise inverting"
-#: ../editors/Viewer.py:521 ../editors/Viewer.py:2073
+#: ../editors/Viewer.py:525 ../editors/Viewer.py:2358 @@ -709,69 +718,77 @@
-#: ../editors/TextViewer.py:261
+#: ../editors/TextViewer.py:262 -#: ../editors/Viewer.py:487
+#: ../editors/Viewer.py:491 +#: ../ProjectController.py:1301 #: ../dialogs/BrowseValuesLibraryDialog.py:37
msgid "Browse %s values library"
-#: ../dialogs/BrowseLocationsDialog.py:60
+msgstr "Browse %s values library" +#: ../dialogs/BrowseLocationsDialog.py:65 msgstr "Просмотр директорий"
-#: ../ProjectController.py:1668
+#: ../ProjectController.py:1769 -#: ../ProjectController.py:1166
+#: ../ProjectController.py:1235 msgid "Build directory already clean\n"
msgstr "Директория сборки уже пуста\n"
-#: ../ProjectController.py:1669
+#: ../ProjectController.py:1770 msgid "Build project into build folder"
msgstr "Сборка проекта в директории сборки"
-#: ../ProjectController.py:956
+#: ../ProjectController.py:1018 msgid "C Build crashed !\n"
msgstr "Крэш во время сборки C-кода!\n"
-#: ../ProjectController.py:953
+#: ../ProjectController.py:1015 msgid "C Build failed.\n"
msgstr "Ошибка сборки C-кода.\n"
-#: ../c_ext/CFileEditor.py:40
+#: ../c_ext/CFileEditor.py:63 -#: ../ProjectController.py:1031
+#: ../ProjectController.py:1093 msgid "C code generated successfully.\n"
msgstr "C-код успешно сгенерирован.\n"
-#: ../targets/toolchain_makefile.py:108
+#: ../targets/toolchain_makefile.py:122 msgid "C compilation failed.\n"
msgstr "Ошибка компиляции.\n"
-#: ../targets/toolchain_gcc.py:132
+#: ../targets/toolchain_gcc.py:156 msgid "C compilation of %s failed.\n"
msgstr "Ошибка компиляции %s.\n"
-#: ../canfestival/NetworkEditor.py:29
+#: ../dialogs/AboutDialog.py:63 +#: ../canfestival/NetworkEditor.py:52 -#: ../canfestival/SlaveEditor.py:21
+#: ../canfestival/SlaveEditor.py:44 @@ -784,37 +801,37 @@
msgstr "Поддержка CANOpen"
-#: ../plcopen/plcopen.py:1580 ../plcopen/plcopen.py:1594
-#: ../plcopen/plcopen.py:1615 ../plcopen/plcopen.py:1631
+#: ../plcopen/plcopen.py:1584 ../plcopen/plcopen.py:1598 +#: ../plcopen/plcopen.py:1622 ../plcopen/plcopen.py:1638 msgid "Can only generate execution order on FBD networks!"
msgstr "Можно сгенерировать порядок исполнения только для FBD!"
-#: ../controls/VariablePanel.py:259
+#: ../controls/VariablePanel.py:267 msgid "Can only give a location to local or global variables"
msgstr "Можно задать размещение только локальным или глобальным переменны"
-#: ../PLCOpenEditor.py:327
+#: ../PLCOpenEditor.py:334 msgid "Can't generate program to file %s!"
msgstr "Нельзя сгенерировать программу в файл %s!"
-#: ../controls/VariablePanel.py:257
+#: ../controls/VariablePanel.py:265 msgid "Can't give a location to a function block instance"
msgstr "Нельзя задать размещение для экземпляра функционального блока"
-#: ../PLCOpenEditor.py:367
+#: ../PLCOpenEditor.py:379 msgid "Can't save project to file %s!"
msgstr "Нельзя сохранить проект в файл %s!"
-#: ../controls/VariablePanel.py:303
+#: ../controls/VariablePanel.py:313 msgid "Can't set an initial value to a function block instance"
msgstr "Нельзя задать исходное значение экземпляру функционального блока"
@@ -828,54 +845,54 @@
msgid "CanFestivalSlaveNode"
-#: ../ConfigTreeNode.py:504
-msgid "Cannot create child %s of type %s "
-msgstr "Нельзя создать дочерний элемент %s типа %s"
-#: ../ConfigTreeNode.py:429
+#: ../ConfigTreeNode.py:529 +msgid "Cannot create child {a1} of type {a2} " +msgstr "Нельзя создать дочерний элемент {a1} типа {a2}" +#: ../ConfigTreeNode.py:454 msgid "Cannot find lower free IEC channel than %d\n"
msgstr "Не удалось найти свободный МЭК-канал с номером меньше чем %d\n"
-#: ../connectors/PYRO/__init__.py:127
+#: ../connectors/PYRO/__init__.py:131 msgid "Cannot get PLC status - connection failed.\n"
msgstr "Невозможно получить состояние ПЛК - ошибка подключения.\n"
-#: ../ProjectController.py:817
+#: ../ProjectController.py:881 msgid "Cannot open/parse VARIABLES.csv!\n"
msgstr "Не удалось открыть/прочитать VARIABLES.csv\n"
-#: ../canfestival/config_utils.py:372
-msgid "Cannot set bit offset for non bool '%s' variable (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "Невозможно установить битовое смещение для небулевой переменной '%s' (ID:%d,Idx:%x,sIdx:%x))"
-#: ../dialogs/SearchInProjectDialog.py:67 ../dialogs/FindInPouDialog.py:87
+#: ../canfestival/config_utils.py:374 +msgid "Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))" +msgstr "Невозможно установить битовое смещение для небулевой переменной '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))" +#: ../dialogs/SearchInProjectDialog.py:59 ../dialogs/FindInPouDialog.py:88 msgstr "Регистрозависимый"
-#: ../editors/Viewer.py:482
+#: ../editors/Viewer.py:486 -#: ../Beremiz_service.py:245
+#: ../Beremiz_service.py:266 msgid "Change IP of interface to bind"
msgstr "Сменить IP-адрес интерфейса для привязки сокета"
-#: ../Beremiz_service.py:244
+#: ../Beremiz_service.py:265
msgid "Change POU Type To"
msgstr "Сменить тип POU на"
-#: ../Beremiz_service.py:246
+#: ../Beremiz_service.py:267 msgid "Change Port Number"
msgstr "Сменить номер порта"
-#: ../Beremiz_service.py:247
+#: ../Beremiz_service.py:268 msgid "Change working directory"
msgstr "Сменить рабочую директорию"
@@ -883,37 +900,37 @@
msgstr "Строковые операции"
-#: ../svgui/svgui.py:101
+#: ../svgui/svgui.py:125 msgid "Choose a SVG file"
-msgstr "Выберете SVG-файл"
-#: ../ProjectController.py:420
+msgstr "Выберите SVG-файл" +#: ../ProjectController.py:451 msgid "Choose a directory to save project"
-msgstr "Выберете директорию, чтобы сохранить проект"
-#: ../canfestival/canfestival.py:136 ../PLCOpenEditor.py:285
-#: ../PLCOpenEditor.py:317 ../PLCOpenEditor.py:361
+msgstr "Выберите директорию, чтобы сохранить проект" +#: ../canfestival/canfestival.py:160 ../PLCOpenEditor.py:292 +#: ../PLCOpenEditor.py:324 ../PLCOpenEditor.py:373
-#: ../Beremiz.py:899 ../Beremiz.py:934
+#: ../Beremiz.py:931 ../Beremiz.py:966 -msgstr "Выберете проект"
+msgstr "Выберите проект" #: ../dialogs/BrowseValuesLibraryDialog.py:42
msgid "Choose a value for %s:"
-msgstr "Выберете значение для %s:"
-#: ../Beremiz_service.py:293
+msgstr "Выберите значение для %s:" +#: ../Beremiz_service.py:323 msgid "Choose a working directory "
-msgstr "Выберете рабочую директорию"
-#: ../ProjectController.py:334
+msgstr "Выберите рабочую директорию" +#: ../ProjectController.py:358 msgid "Chosen folder doesn't contain a program. It's not a valid project!"
msgstr "Выбранная директория не содержит программы. Это некорректный проект!"
-#: ../ProjectController.py:301
+#: ../ProjectController.py:325 msgid "Chosen folder isn't empty. You can't use it for a new project!"
msgstr "Выбранная директория не пуста и не может использоваться для нового проекта!"
@@ -921,7 +938,7 @@
-#: ../controls/VariablePanel.py:431
+#: ../controls/VariablePanel.py:441 @@ -929,55 +946,55 @@
-#: ../ProjectController.py:1672
+#: ../ProjectController.py:1773 -#: ../controls/LogViewer.py:317
+#: ../controls/LogViewer.py:318 msgid "Clean log messages"
-#: ../ProjectController.py:1674
+#: ../ProjectController.py:1775 msgid "Clean project build folder"
msgstr "Очистить директорию сборки проекта"
-#: ../ProjectController.py:1163
+#: ../ProjectController.py:1232 msgid "Cleaning the build directory\n"
msgstr "Очистка директории сборки\n"
-#: ../editors/Viewer.py:577
+#: ../editors/Viewer.py:582 msgid "Clear Execution Order"
msgstr "Очистить порядок исполнения"
-#: ../dialogs/FindInPouDialog.py:110
+#: ../dialogs/SearchInProjectDialog.py:105 ../dialogs/FindInPouDialog.py:111 -#: ../PLCOpenEditor.py:192 ../Beremiz.py:667
+#: ../PLCOpenEditor.py:199 ../Beremiz.py:693 msgid "Close Application"
msgstr "Закрыть приложение"
-#: ../PLCOpenEditor.py:102 ../Beremiz.py:326 ../Beremiz.py:611
+#: ../PLCOpenEditor.py:108 ../Beremiz.py:333 ../Beremiz.py:637 -#: ../PLCOpenEditor.py:100 ../Beremiz.py:324
+#: ../PLCOpenEditor.py:106 ../Beremiz.py:331 -#: ../editors/Viewer.py:537 ../editors/Viewer.py:2084
+#: ../editors/Viewer.py:541 ../editors/Viewer.py:2366 -#: ../editors/Viewer.py:557 ../editors/LDViewer.py:506
+#: ../editors/Viewer.py:561 ../editors/LDViewer.py:506 @@ -1000,7 +1017,7 @@
-#: ../ProjectController.py:609
+#: ../ProjectController.py:672 msgid "Compiling IEC Program into C code...\n"
msgstr "Компиляция МЭК-программы в C-код...\n"
@@ -1008,15 +1025,15 @@
-#: ../editors/ConfTreeNodeEditor.py:206
+#: ../editors/ConfTreeNodeEditor.py:229 -#: ../editors/ProjectNodeEditor.py:13
+#: ../editors/ProjectNodeEditor.py:36 msgstr "Конфигурационные переменные"
-#: ../dialogs/SearchInProjectDialog.py:47
+#: ../dialogs/SearchInProjectDialog.py:39 @@ -1024,27 +1041,27 @@
-#: ../editors/Viewer.py:303 ../editors/Viewer.py:333 ../editors/Viewer.py:355
-#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:340
-#: ../editors/TextViewer.py:363 ../controls/VariablePanel.py:318
+#: ../editors/Viewer.py:307 ../editors/Viewer.py:337 ../editors/Viewer.py:359 +#: ../editors/TextViewer.py:291 ../editors/TextViewer.py:342 +#: ../editors/TextViewer.py:365 ../controls/VariablePanel.py:328 msgid "Confirm or change variable name"
msgstr "Подтвердить или поменять имя переменной"
-#: ../ProjectController.py:1687
+#: ../ProjectController.py:1788 -#: ../ProjectController.py:1688
+#: ../ProjectController.py:1789 msgid "Connect to the target PLC"
msgstr "Подключиться к целевому ПЛК"
-#: ../ProjectController.py:1212
+#: ../ProjectController.py:1292 msgid "Connected to URI: %s"
msgstr "Подключен к URI: %s"
-#: ../dialogs/SFCTransitionDialog.py:75 ../editors/Viewer.py:523
-#: ../editors/Viewer.py:2075
+#: ../dialogs/SFCTransitionDialog.py:76 ../editors/Viewer.py:527 +#: ../editors/Viewer.py:2359 @@ -1052,29 +1069,33 @@
msgid "Connection Properties"
msgstr "Свойства подключение"
-#: ../ProjectController.py:1547
+#: ../ProjectController.py:1647 msgid "Connection canceled!\n"
msgstr "Подключение отменено!\n"
-#: ../ProjectController.py:1572
+#: ../ProjectController.py:1672 msgid "Connection failed to %s!\n"
msgstr "Неудачное подключение к %s!\n"
-#: ../connectors/PYRO/__init__.py:98
+#: ../connectors/PYRO/__init__.py:115 ../connectors/WAMP/__init__.py:111 +msgid "Connection lost!\n" +msgstr "Подключение прервано!\n" +#: ../connectors/PYRO/__init__.py:102 msgid "Connection to '%s' failed.\n"
msgstr "Неудачное подключение к %s!\n"
-#: ../dialogs/ConnectionDialog.py:64 ../editors/Viewer.py:1569
+#: ../dialogs/ConnectionDialog.py:64 ../editors/Viewer.py:1594 -#: ../dialogs/SFCStepDialog.py:64
+#: ../dialogs/SFCStepDialog.py:65
@@ -1082,7 +1103,7 @@
-#: ../editors/Viewer.py:533 ../editors/Viewer.py:2080
+#: ../editors/Viewer.py:537 ../editors/Viewer.py:2362 @@ -1090,7 +1111,7 @@
msgid "Content Description (optional):"
msgstr "Описание содержимого (опционально):"
-#: ../dialogs/ConnectionDialog.py:65 ../editors/Viewer.py:1570
+#: ../dialogs/ConnectionDialog.py:65 ../editors/Viewer.py:1595 @@ -1110,12 +1131,12 @@
msgid "Conversion to time-of-day"
msgstr "Преобразование во время суток"
-#: ../editors/Viewer.py:593 ../controls/LogViewer.py:692 ../IDEFrame.py:346
+#: ../editors/Viewer.py:597 ../controls/LogViewer.py:693 ../IDEFrame.py:370
@@ -1127,55 +1148,62 @@
msgid "Copy file from right folder to left"
msgstr "Скопировать файл с правой директории в левую"
#: ../plcopen/iec_std.csv:28
-#: ../ConfigTreeNode.py:626
+#: ../ConfigTreeNode.py:656 -"Could not add child \"%s\", type %s :\n"
+"Could not add child \"{a1}\", type {a2} :\n" -"Невозможно добавить дочерний элемент \"%s\", тип %s:\n"
-#: ../py_ext/PythonFileCTNMixin.py:53
+"Невозможно добавить дочерний элемент \"{a1}\", тип {a2}:\n" +#: ../py_ext/PythonFileCTNMixin.py:77 msgid "Couldn't import old %s file."
msgstr "Невозможно импортировать старый файл %s."
-#: ../ConfigTreeNode.py:598
+#: ../ConfigTreeNode.py:626 -"Couldn't load confnode base parameters %s :\n"
-msgstr "Невозможно загрузить базовые параметры confnode %s: %s"
-#: ../ConfigTreeNode.py:614 ../CodeFileTreeNode.py:99
+"Couldn't load confnode base parameters {a1} :\n" +"Невозможно загрузить базовые параметры confnode {a1}:\n" +#: ../ConfigTreeNode.py:643 ../CodeFileTreeNode.py:124 -"Couldn't load confnode parameters %s :\n"
-msgstr "Невозможно загрузить параметры confnode %s: %s"
+"Couldn't load confnode parameters {a1} :\n" +"Невозможно загрузить параметры confnode {a1}:\n" #: ../PLCControler.py:946
msgid "Couldn't paste non-POU object."
msgstr "Невозможно вставить не-POU."
-#: ../ProjectController.py:1486
+#: ../ProjectController.py:1589 msgid "Couldn't start PLC !\n"
msgstr "Невозможно запустить ПЛК!\n"
-#: ../ProjectController.py:1494
+#: ../ProjectController.py:1597 msgid "Couldn't stop PLC !\n"
msgstr "Невозможно остановить ПЛК!\n"
-#: ../ProjectController.py:1458
+#: ../ProjectController.py:1561 msgid "Couldn't stop debugger.\n"
msgstr "Невозможно остановить отладчик.\n"
@@ -1187,71 +1215,79 @@
msgid "Create a new action"
msgstr "Создать новое действие"
msgid "Create a new action block"
msgstr "Создать новый блок действие"
-#: ../IDEFrame.py:84 ../IDEFrame.py:114 ../IDEFrame.py:147
+#: ../IDEFrame.py:108 ../IDEFrame.py:138 ../IDEFrame.py:171 msgid "Create a new block"
msgstr "Создать новый блок"
msgid "Create a new branch"
msgstr "Создать новое ветвление"
msgid "Create a new coil"
msgstr "Создать новую катушку"
-#: ../IDEFrame.py:78 ../IDEFrame.py:93 ../IDEFrame.py:123
+#: ../IDEFrame.py:102 ../IDEFrame.py:117 ../IDEFrame.py:147 msgid "Create a new comment"
msgstr "Создать новый комментарий"
-#: ../IDEFrame.py:87 ../IDEFrame.py:117 ../IDEFrame.py:150
+#: ../IDEFrame.py:111 ../IDEFrame.py:141 ../IDEFrame.py:174 msgid "Create a new connection"
msgstr "Создать новое подключение"
-#: ../IDEFrame.py:105 ../IDEFrame.py:156
+#: ../IDEFrame.py:129 ../IDEFrame.py:180 msgid "Create a new contact"
msgstr "Создать новый контакт"
msgid "Create a new divergence"
msgstr "Создать новое ветвление"
-#: ../dialogs/SFCDivergenceDialog.py:51
+#: ../dialogs/SFCDivergenceDialog.py:53 msgid "Create a new divergence or convergence"
msgstr "Создать новое ветвление или объединение"
msgid "Create a new initial step"
msgstr "Создать исходный шаг"
msgid "Create a new jump"
-msgstr "Создать новый переход"
-#: ../IDEFrame.py:96 ../IDEFrame.py:153
+msgstr "Создать новый безусловный переход" +#: ../IDEFrame.py:120 ../IDEFrame.py:177 msgid "Create a new power rail"
msgstr "Создать новую линию питания"
msgid "Create a new rung"
msgstr "Создать новую цепь"
msgid "Create a new step"
msgstr "Создать новый шаг"
-#: ../dialogs/PouTransitionDialog.py:42 ../IDEFrame.py:132
+#: ../dialogs/PouTransitionDialog.py:47 ../IDEFrame.py:156 msgid "Create a new transition"
msgstr "Создать новый переход"
-#: ../IDEFrame.py:81 ../IDEFrame.py:111 ../IDEFrame.py:144
+#: ../IDEFrame.py:105 ../IDEFrame.py:135 ../IDEFrame.py:168 msgid "Create a new variable"
msgstr "Создать новую переменную"
-#: ../editors/Viewer.py:592 ../IDEFrame.py:344 ../IDEFrame.py:400
+#: ../dialogs/AboutDialog.py:105 +#: ../Beremiz_service.py:432 +msgid "Current working directory :" +msgstr "Текущая рабочая директория :" +#: ../editors/Viewer.py:596 ../IDEFrame.py:368 ../IDEFrame.py:424 @@ -1267,15 +1303,15 @@
-#: ../canfestival/SlaveEditor.py:53 ../canfestival/NetworkEditor.py:74
+#: ../canfestival/SlaveEditor.py:76 ../canfestival/NetworkEditor.py:97 -#: ../canfestival/SlaveEditor.py:54 ../canfestival/NetworkEditor.py:75
+#: ../canfestival/SlaveEditor.py:77 ../canfestival/NetworkEditor.py:98 -#: ../dialogs/SearchInProjectDialog.py:43
+#: ../dialogs/SearchInProjectDialog.py:35 @@ -1300,11 +1336,14 @@
+msgid "Datetime, current or relative to PDT" +msgstr "Текущие дата и время, абсолютные или относительные от PDT" #: ../dialogs/DurationEditorDialog.py:43
-#: ../ProjectController.py:1594
+#: ../ProjectController.py:1694 msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
msgstr "Отлаживаемая программа не соответствует программе в ПЛК - остановите/загрузите/запустите, чтобы разрешить отладку\n"
@@ -1312,42 +1351,42 @@
msgstr "Отладка экземпляра"
-#: ../editors/Viewer.py:1104 ../editors/Viewer.py:3596
+#: ../editors/Viewer.py:1117 ../editors/Viewer.py:3653 -#: ../ProjectController.py:1247
+#: ../ProjectController.py:1350 msgid "Debug: Unknown variable '%s'\n"
msgstr "Отладка: неизвестная переменная '%s'\n"
-#: ../ProjectController.py:1245
+#: ../ProjectController.py:1348 msgid "Debug: Unsupported type to debug '%s'\n"
msgstr "Отладка: неподдерживамый отладкой тип '%s'\n"
-#: ../ProjectController.py:1427
+#: ../ProjectController.py:1530 msgid "Debugger disabled\n"
msgstr "Отладчик запрещен\n"
-#: ../ProjectController.py:1591
+#: ../ProjectController.py:1691 msgstr "Отладчик готов\n"
-#: ../ProjectController.py:1460
+#: ../ProjectController.py:1563 msgid "Debugger stopped.\n"
msgstr "Отладчик остановлен.\n"
-#: ../editors/Viewer.py:568 ../Beremiz.py:1028 ../IDEFrame.py:1925
+#: ../editors/Viewer.py:572 ../Beremiz.py:1064 ../IDEFrame.py:1959 -#: ../editors/Viewer.py:510
+#: ../editors/Viewer.py:514 msgid "Delete Divergence Branch"
@@ -1355,7 +1394,7 @@
-#: ../editors/Viewer.py:497
+#: ../editors/Viewer.py:501 msgid "Delete Wire Segment"
msgstr "Удалить сегмент цепи"
@@ -1367,35 +1406,29 @@
msgid "Deletion (within)"
msgstr "Удаление подстроки"
-#: ../editors/DataTypeEditor.py:152
+#: ../editors/DataTypeEditor.py:153 msgstr "Механизм создания типа:"
-#: ../plcopen/definitions.py:41
-"The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
-"Функциональный блок формирует выход XOUT пропорционально частоте изменения входа XIN."
-#: ../editors/CodeFileEditor.py:664
-#: ../controls/VariablePanel.py:422
+msgid "Derivative time constant" +msgstr "Постоянная времени дифференцирования" +#: ../controls/VariablePanel.py:432 -#: ../dialogs/ArrayTypeDialog.py:61 ../editors/DataTypeEditor.py:320
+msgid "Differentiated output" +msgstr "Дифференцированный выход" +#: ../dialogs/ArrayTypeDialog.py:61 ../editors/DataTypeEditor.py:321 -#: ../dialogs/FindInPouDialog.py:67
+#: ../dialogs/FindInPouDialog.py:68
-#: ../dialogs/BrowseLocationsDialog.py:85
+#: ../dialogs/BrowseLocationsDialog.py:90 @@ -1406,15 +1439,19 @@
msgid "Disable_Extensions"
msgstr "Запретить расширения"
-#: ../ProjectController.py:1696
+#: ../ProjectController.py:1797 -#: ../ProjectController.py:1698
+#: ../ProjectController.py:1799 msgid "Disconnect from PLC"
msgstr "Отключиться от ПЛК"
-#: ../editors/Viewer.py:552 ../editors/Viewer.py:2061
+#: ../ProjectController.py:1302 +#: ../editors/Viewer.py:556 ../editors/Viewer.py:2354 @@ -1431,27 +1468,19 @@
-#: ../PLCOpenEditor.py:321
+#: ../PLCOpenEditor.py:328 -#: ../plcopen/definitions.py:34
-"The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
-"Декрементный счетчик\n"
-"Декрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг нулевого значения с исходного заданного значения."
#: ../dialogs/ActionBlockDialog.py:38
-#: ../canfestival/canfestival.py:139
+#: ../canfestival/canfestival.py:163 msgid "EDS files (*.eds)|*.eds|All files|*.*"
msgstr "Файлы EDS (*.eds)|*.eds|All files|*.*"
-#: ../editors/Viewer.py:566
+#: ../editors/Viewer.py:570 msgstr "Редактировать блок"
@@ -1467,11 +1496,11 @@
msgstr "Редактировать длительность"
-#: ../dialogs/SFCStepDialog.py:49
+#: ../dialogs/SFCStepDialog.py:50 msgstr "Редактировать шаг"
-#: ../wxglade_hmi/wxglade_hmi.py:12
+#: ../wxglade_hmi/wxglade_hmi.py:36 msgid "Edit a WxWidgets GUI with WXGlade"
msgstr "Редактировать WxWidgets GUI с помощью WXGlade"
@@ -1483,7 +1512,7 @@
msgid "Edit array type properties"
msgstr "Редактировать свойства массива"
-#: ../editors/Viewer.py:2541 ../editors/Viewer.py:2952
+#: ../editors/Viewer.py:2575 ../editors/Viewer.py:3004 msgstr "Редактировать комментарий"
@@ -1495,50 +1524,57 @@
msgstr "Редактировать элемент"
-#: ../editors/Viewer.py:2916
+#: ../editors/Viewer.py:2963 msgstr "Редактирование безусловного перехода"
-#: ../ProjectController.py:1710
+#: ../ProjectController.py:1811 msgid "Edit raw IEC code added to code generated by PLCGenerator"
msgstr "Редактировать МЭК-код добавленный к коду сгенерированному PLCGenerator"
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:799 msgstr "Редактировать имя шага"
-#: ../dialogs/SFCTransitionDialog.py:50
+#: ../dialogs/SFCTransitionDialog.py:51 msgstr "Редактировать переход"
msgstr "Редактор панели инструментов"
-#: ../ProjectController.py:1126
+#: ../ProjectController.py:1195 msgstr "Редактор выделения"
-#: ../editors/DataTypeEditor.py:347
+msgid "Elapsed time of ramp" +msgstr "Прошедшее время нарастания" +#: ../editors/DataTypeEditor.py:348
+#: ../ProjectController.py:1300 msgstr "Разрешить отмену и повтор операций"
-#: ../Beremiz_service.py:299
+#: ../Beremiz_service.py:331 -#: ../Beremiz_service.py:286
+#: ../Beremiz_service.py:316 msgid "Enter a port number "
msgstr "Введите номер порта"
-#: ../Beremiz_service.py:277
+#: ../Beremiz_service.py:307 msgid "Enter the IP of the interface to bind"
msgstr "Введите IP-адрес используемого интерфейса"
@@ -1551,66 +1587,67 @@
#: ../dialogs/ForceVariableDialog.py:179
-#: ../dialogs/SearchInProjectDialog.py:157 ../dialogs/SFCStepNameDialog.py:59
+#: ../dialogs/SearchInProjectDialog.py:168 ../dialogs/SFCStepNameDialog.py:60 #: ../dialogs/DurationEditorDialog.py:121
-#: ../dialogs/DurationEditorDialog.py:163 ../dialogs/PouTransitionDialog.py:107
+#: ../dialogs/DurationEditorDialog.py:163 ../dialogs/PouTransitionDialog.py:112 #: ../dialogs/BlockPreviewDialog.py:236 ../dialogs/ProjectDialog.py:71
#: ../dialogs/ArrayTypeDialog.py:97 ../dialogs/ArrayTypeDialog.py:103
-#: ../dialogs/PouNameDialog.py:53 ../dialogs/BrowseLocationsDialog.py:211
+#: ../dialogs/PouNameDialog.py:54 ../dialogs/BrowseLocationsDialog.py:216 #: ../dialogs/BrowseValuesLibraryDialog.py:83 ../dialogs/PouActionDialog.py:104
-#: ../dialogs/PouDialog.py:134 ../PLCOpenEditor.py:328 ../PLCOpenEditor.py:333
-#: ../PLCOpenEditor.py:407 ../PLCOpenEditor.py:417 ../editors/Viewer.py:419
+#: ../dialogs/PouDialog.py:134 ../PLCOpenEditor.py:335 ../PLCOpenEditor.py:340 +#: ../PLCOpenEditor.py:420 ../PLCOpenEditor.py:430 ../editors/Viewer.py:423 #: ../editors/LDViewer.py:666 ../editors/LDViewer.py:882
-#: ../editors/LDViewer.py:886 ../editors/DataTypeEditor.py:549
-#: ../editors/DataTypeEditor.py:554 ../editors/DataTypeEditor.py:578
-#: ../editors/DataTypeEditor.py:583 ../editors/DataTypeEditor.py:593
-#: ../editors/DataTypeEditor.py:744 ../editors/DataTypeEditor.py:751
-#: ../editors/TextViewer.py:387 ../editors/CodeFileEditor.py:763
-#: ../ProjectController.py:269 ../controls/FolderTree.py:217
+#: ../editors/LDViewer.py:886 ../editors/DataTypeEditor.py:550 +#: ../editors/DataTypeEditor.py:555 ../editors/DataTypeEditor.py:579 +#: ../editors/DataTypeEditor.py:584 ../editors/DataTypeEditor.py:594 +#: ../editors/DataTypeEditor.py:745 ../editors/DataTypeEditor.py:752 +#: ../editors/TextViewer.py:389 ../editors/CodeFileEditor.py:783 +#: ../ProjectController.py:293 ../ProjectController.py:421 +#: ../ProjectController.py:428 ../controls/FolderTree.py:217 #: ../controls/DebugVariablePanel/DebugVariablePanel.py:166
#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:137
-#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:225
-#: ../controls/VariablePanel.py:392 ../controls/VariablePanel.py:754
-#: ../Beremiz.py:1167 ../IDEFrame.py:975 ../IDEFrame.py:1581
-#: ../IDEFrame.py:1618 ../IDEFrame.py:1623 ../IDEFrame.py:1637
-#: ../IDEFrame.py:1642 ../Beremiz_service.py:190
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:231 +#: ../controls/VariablePanel.py:402 ../controls/VariablePanel.py:772 +#: ../Beremiz.py:1203 ../IDEFrame.py:1003 ../IDEFrame.py:1614 +#: ../IDEFrame.py:1655 ../IDEFrame.py:1660 ../IDEFrame.py:1674 +#: ../IDEFrame.py:1679 ../Beremiz_service.py:211 -#: ../ProjectController.py:663
+#: ../ProjectController.py:727 msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
msgstr "Ошибка: Как минимум одна конфигурация и один ресурс должны быть задекларированы в ПЛК!\n"
-#: ../ProjectController.py:655
+#: ../ProjectController.py:719 msgid "Error : IEC to C compiler returned %d\n"
msgstr "Ошибка: компилятор МЭК в C вернул код ошибки %d\n"
-#: ../ProjectController.py:589
+#: ../ProjectController.py:621 "Error in ST/IL/SFC code generator :\n"
msgstr "Ошибка в ST/IL/SFC кодогенераторе: %s\n"
-#: ../ConfigTreeNode.py:192
+#: ../ConfigTreeNode.py:216 msgid "Error while saving \"%s\"\n"
msgstr "Ошибка во время сохранения \"%s\"\n"
-#: ../canfestival/canfestival.py:144
+#: ../canfestival/canfestival.py:168 msgid "Error: Export slave failed\n"
msgstr "Ошибка: неудачный экспорт ведомого\n"
-#: ../canfestival/canfestival.py:345
+#: ../canfestival/canfestival.py:369 msgid "Error: No Master generated\n"
msgstr "Ошибка: мастер не сгенерирован\n"
-#: ../canfestival/canfestival.py:340
+#: ../canfestival/canfestival.py:364 msgid "Error: No PLC built\n"
msgstr "Ошибка: ПЛК не собран\n"
-#: ../ProjectController.py:1566
+#: ../ProjectController.py:1666 msgid "Exception while connecting %s!\n"
msgstr "Исключение во время подключения %s!\n"
@@ -1623,7 +1660,7 @@
msgstr "Порядок исполнения:"
msgid "Experimental web based HMI"
msgstr "Экспериментальный WEB-HMI"
@@ -1635,7 +1672,7 @@
msgstr "Взятие экспоненты"
-#: ../canfestival/canfestival.py:150
+#: ../canfestival/canfestival.py:174 msgid "Export CanOpen slave to EDS file"
msgstr "Экспортировать CanOpen ведомое устройство в EDS файл"
@@ -1643,7 +1680,7 @@
msgid "Export graph values to clipboard"
msgstr "Экспортировать график значений в буфер обмена"
-#: ../canfestival/canfestival.py:149
+#: ../canfestival/canfestival.py:173 msgstr "Экспортировать ведомое устройство"
@@ -1655,35 +1692,38 @@
-#: ../ProjectController.py:676
+#: ../ProjectController.py:740 msgid "Extracting Located Variables...\n"
msgstr "Экспорт локальных переменных...\n"
-#: ../dialogs/PouTransitionDialog.py:35 ../dialogs/PouActionDialog.py:31
+msgid "FB for derivative term" +msgstr "ФБ дифференцирования" +msgid "FB for integral term" +msgstr "ФД интегрирования" +#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31 #: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
-#: ../ProjectController.py:1629
+#: ../ProjectController.py:1729 msgid "Failed : Must build before transfer.\n"
msgstr "Ошибка: необходима сборка перед передачей.\n"
-#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:458
+#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:462 -#: ../plcopen/definitions.py:32
-"Falling edge detector\n"
-"The output produces a single pulse when a falling edge is detected."
-"Детектор падающего фронта\n"
-"На выходе формируется одиночный импульс, если обнаружен падающий фронт."
-#: ../ProjectController.py:946
+#: ../ProjectController.py:1008 msgid "Fatal : cannot get builder.\n"
msgstr "Ошибка: невозможно получить сборщик.\n"
#: ../dialogs/DurationEditorDialog.py:160
msgid "Field %s hasn't a valid value!"
@@ -1699,16 +1739,16 @@
msgid "File '%s' already exists!"
msgstr "Файл '%s' уже существует!"
-#: ../dialogs/FindInPouDialog.py:35 ../dialogs/FindInPouDialog.py:105
+#: ../dialogs/SearchInProjectDialog.py:100 ../dialogs/FindInPouDialog.py:36 +#: ../dialogs/FindInPouDialog.py:106 ../IDEFrame.py:375
msgstr "Поиск следующего"
msgstr "Поиск предыдущего"
@@ -1720,11 +1760,11 @@
-#: ../connectors/PYRO/__init__.py:159
+#: ../connectors/PYRO/__init__.py:163 msgid "Force runtime reload\n"
msgstr "Принудительный перезапуск системы исполнения\n"
-#: ../editors/Viewer.py:1528
+#: ../editors/Viewer.py:1553 msgstr "Фиксировать значение"
@@ -1732,44 +1772,40 @@
msgid "Forcing Variable Value"
msgstr "Форсировать значение переменной"
-#: ../dialogs/SFCTransitionDialog.py:178 ../dialogs/PouTransitionDialog.py:97
+#: ../dialogs/SFCTransitionDialog.py:179 ../dialogs/PouTransitionDialog.py:102 #: ../dialogs/ProjectDialog.py:70 ../dialogs/PouActionDialog.py:94
#: ../dialogs/PouDialog.py:116
msgid "Form isn't complete. %s must be filled!"
msgstr "Форма заполнена неполностью. %s должен быть заполнен!"
-#: ../dialogs/SFCStepDialog.py:141 ../dialogs/FBDBlockDialog.py:232
+#: ../dialogs/SFCStepDialog.py:144 ../dialogs/FBDBlockDialog.py:232 #: ../dialogs/ConnectionDialog.py:160
msgid "Form isn't complete. Name must be filled!"
msgstr "Форма заполнена неполностью. Имя должно быть заполнено!"
-#: ../dialogs/SearchInProjectDialog.py:145
-msgid "Form isn't complete. Pattern to search must be filled!"
-msgstr "Форма заполнена неполностью. Шаблон поиска должен быть заполнен!"
#: ../dialogs/FBDBlockDialog.py:228
msgid "Form isn't complete. Valid block type must be selected!"
msgstr "Форма заполнена неполностью. Должен быть выбран корректный тип блока!"
-#: ../dialogs/FindInPouDialog.py:73
+#: ../dialogs/FindInPouDialog.py:74 -#: ../dialogs/SearchInProjectDialog.py:44 ../IDEFrame.py:1712
+#: ../dialogs/SearchInProjectDialog.py:36 ../IDEFrame.py:1746
msgstr "Функциональный &блок"
-#: ../dialogs/SearchInProjectDialog.py:45 ../IDEFrame.py:1711
+#: ../dialogs/SearchInProjectDialog.py:37 ../IDEFrame.py:1745 msgstr "Функциональный блок"
-#: ../controls/VariablePanel.py:807
+#: ../controls/VariablePanel.py:825 msgid "Function Block Types"
msgstr "Типы функциональных блоков"
@@ -1777,11 +1813,11 @@
msgstr "Функциональные блоки"
-#: ../editors/Viewer.py:244
+#: ../editors/Viewer.py:248 msgid "Function Blocks can't be used in Functions!"
msgstr "Функциональные блоки не могут использоваться в функциях!"
-#: ../PLCControler.py:2336
+#: ../PLCControler.py:2337 msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
msgstr "Функциональный блок \"%s\" не может быть вставлен в функцию!!!"
@@ -1790,16 +1826,16 @@
-#: ../PLCOpenEditor.py:109
+#: ../PLCOpenEditor.py:115 msgstr "Сгенерировать программу"
-#: ../ProjectController.py:580
+#: ../ProjectController.py:612 msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
msgstr "Генерация МЭК-61131 ST/IL/SFC кода ПЛК...\n"
#: ../controls/VariablePanel.py:73
@@ -1825,6 +1861,10 @@
+#: ../runtime/NevowServer.py:181 +msgid "HTTP interface port :" +msgstr "Порт HTTP-интерфейса :" #: ../controls/ProjectPropertiesPanel.py:120
@@ -1841,67 +1881,54 @@
-#: ../plcopen/definitions.py:44
-"The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
-"Функциональный блок формирует дискретный выход с гистерезисом в зависимости от разницы двух вещественных входов XIN1 и XIN2."
-#: ../dialogs/PouTransitionDialog.py:35 ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouActionDialog.py:31 ../dialogs/PouDialog.py:36
-#: ../dialogs/DiscoveryDialog.py:93
+#: ../dialogs/DiscoveryDialog.py:94
-#: ../Beremiz_service.py:278 ../Beremiz_service.py:279
+#: ../Beremiz_service.py:308 ../Beremiz_service.py:309 msgstr "Неверный IP-адрес"
-#: ../svgui/svgui.py:18 ../svgui/svgui.py:19
+#: ../svgui/svgui.py:42 ../svgui/svgui.py:43 -#: ../dialogs/FBDVariableDialog.py:38 ../editors/Viewer.py:1555
+#: ../dialogs/FBDVariableDialog.py:38 ../editors/Viewer.py:1580 #: ../controls/VariablePanel.py:71
-#: ../editors/Viewer.py:1087
+#: ../editors/Viewer.py:1100 -#: ../controls/VariablePanel.py:268
-msgid "Incompatible data types between \"%s\" and \"%s\""
-msgstr "\"%s\" и \"%s\" имеют несовместимые типы данных"
-#: ../controls/VariablePanel.py:277
-msgid "Incompatible size of data between \"%s\" and \"%s\""
-msgstr "\"%s\" и \"%s\" имеют несовместимый размер данных"
-#: ../controls/VariablePanel.py:273
+#: ../controls/VariablePanel.py:276 +msgid "Incompatible data types between \"{a1}\" and \"{a2}\"" +msgstr "\"{a1}\" и \"{a2}\" имеют несовместимые типы данных" +#: ../controls/VariablePanel.py:282 msgid "Incompatible size of data between \"%s\" and \"BOOL\""
msgstr "Несовместимый размер данных \"%s\" с типом \"BOOL\""
+#: ../controls/VariablePanel.py:286 +msgid "Incompatible size of data between \"{a1}\" and \"{a2}\"" +msgstr "\"{a1}\" и \"{a2}\" имеют несовместимый размер данных" #: ../dialogs/ActionBlockDialog.py:38
-#: ../editors/CodeFileEditor.py:663
-msgstr "Исходное значение"
-#: ../editors/Viewer.py:548 ../editors/Viewer.py:2058
+#: ../editors/Viewer.py:552 @@ -1910,25 +1937,36 @@
msgstr "Исходное значение"
-#: ../editors/DataTypeEditor.py:184 ../editors/DataTypeEditor.py:215
-#: ../editors/DataTypeEditor.py:271 ../editors/DataTypeEditor.py:309
+#: ../editors/DataTypeEditor.py:185 ../editors/DataTypeEditor.py:216 +#: ../editors/DataTypeEditor.py:272 ../editors/DataTypeEditor.py:310 msgstr "Исходное значение:"
+msgstr "Исходное значение"
-#: ../dialogs/SFCTransitionDialog.py:74 ../dialogs/ActionBlockDialog.py:42
+#: ../dialogs/SFCTransitionDialog.py:75 ../dialogs/ActionBlockDialog.py:42 -#: ../dialogs/SFCStepDialog.py:69 ../dialogs/FBDVariableDialog.py:37
-#: ../dialogs/BrowseLocationsDialog.py:35 ../editors/Viewer.py:1553
-#: ../controls/VariablePanel.py:71
+#: ../dialogs/SFCStepDialog.py:70 ../dialogs/FBDVariableDialog.py:37 +#: ../dialogs/BrowseLocationsDialog.py:40 ../editors/Viewer.py:289 +#: ../editors/Viewer.py:1578 ../editors/TextViewer.py:307 +#: ../controls/LocationCellEditor.py:98 ../controls/VariablePanel.py:71 +#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351 +msgid "Input to be differentiated" +msgstr "Вход для дифференцирования" +msgstr "Входная переменная" #: ../dialogs/FBDBlockDialog.py:93
@@ -1937,7 +1975,7 @@
msgstr "Вставка подстроки"
-#: ../plcopen/plcopen.py:1684
+#: ../plcopen/plcopen.py:1691 msgid "Instance with id %d doesn't exist!"
msgstr "Экземпляр с id %d не существует!"
@@ -1946,13 +1984,8 @@
-#: ../plcopen/definitions.py:40
-"The integral function block integrates the value of input XIN over time."
-"Функциональный блок интегрирует входное значение XIN во времени."
+msgid "Integrated output" +msgstr "Интегрированный выход" #: ../controls/VariablePanel.py:70
@@ -1966,36 +1999,41 @@
-#: ../PLCControler.py:2324
+#: ../PLCControler.py:2325 msgid "Invalid plcopen element(s)!!!"
msgstr "Некорректный PlcOpen элемент(ы)!!!"
-#: ../canfestival/config_utils.py:377 ../canfestival/config_utils.py:638
-msgid "Invalid type \"%s\"-> %d != %d for location\"%s\""
-msgstr "Неправильный тип \"%s\"->\"%d != %d для \"%s\""
-#: ../dialogs/ForceVariableDialog.py:177
-msgid "Invalid value \"%s\" for \"%s\" variable!"
-msgstr "Неверное значение \"%s\" для переменной \"%s\"!"
+#: ../canfestival/config_utils.py:381 +msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location\"{a4}\"" +msgstr "Неправильный тип \"{a1}\"-> {a2} != {a3} для \"{a4}\"" +#: ../canfestival/config_utils.py:645 +msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\"" +msgstr "Неправильный тип \"{a1}\"-> {a2} != {a3} для \"{a4}\"" #: ../controls/DebugVariablePanel/DebugVariablePanel.py:132
#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:92
-#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:160
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:166 msgid "Invalid value \"%s\" for debug variable"
msgstr "Неверное значение \"%s\" для отлаживаемой переменной"
-#: ../controls/VariablePanel.py:247 ../controls/VariablePanel.py:250
+#: ../controls/VariablePanel.py:255 ../controls/VariablePanel.py:258 msgid "Invalid value \"%s\" for variable grid element"
-#: ../editors/Viewer.py:229 ../editors/Viewer.py:232
+msgstr "Неверное значение \"%s\" для значения размещения переменной" +#: ../editors/Viewer.py:233 ../editors/Viewer.py:236 msgid "Invalid value \"%s\" for viewer block"
+msgstr "Неверное значение \"%s\" для вставки в редактор" +#: ../dialogs/ForceVariableDialog.py:177 +msgid "Invalid value \"{a1}\" for \"{a2}\" variable!" +msgstr "Неверное значение \"{a1}\" для переменной \"{a2}\"!" #: ../dialogs/DurationEditorDialog.py:121
@@ -2005,24 +2043,24 @@
"Необходимо ввести числовое значение."
-#: ../editors/Viewer.py:553 ../editors/Viewer.py:2062
+#: ../editors/Viewer.py:557 ../editors/Viewer.py:2343
-#: ../dialogs/PouTransitionDialog.py:35 ../dialogs/PouActionDialog.py:31
+msgstr "Безусловный переход" +#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31 #: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
#: ../editors/LDViewer.py:215 ../editors/LDViewer.py:231
msgid "Ladder element with id %d is on more than one rung."
msgstr "Элемент лестничной диаграммы с id %d более чем на одной ступени."
-#: ../dialogs/PouTransitionDialog.py:86 ../dialogs/PouActionDialog.py:83
+#: ../dialogs/PouTransitionDialog.py:91 ../dialogs/PouActionDialog.py:83 #: ../dialogs/PouDialog.py:104
@@ -2031,28 +2069,28 @@
msgid "Language (optional):"
msgstr "Язык (опционально):"
-#: ../dialogs/PouTransitionDialog.py:60 ../dialogs/PouActionDialog.py:56
+#: ../dialogs/PouTransitionDialog.py:65 ../dialogs/PouActionDialog.py:56 #: ../dialogs/PouDialog.py:73
-#: ../ProjectController.py:1635
+#: ../ProjectController.py:1735 msgid "Latest build already matches current target. Transfering anyway...\n"
msgstr "Загружаемая программа совпадает с текущий программой в целевом ПЛК. Загрузка продолжена...\n"
-#: ../Beremiz_service.py:250
+#: ../Beremiz_service.py:271 msgid "Launch WX GUI inspector"
msgstr "Запустить WX GUI Inspector"
-#: ../Beremiz_service.py:249
+#: ../Beremiz_service.py:270 msgid "Launch a live Python shell"
msgstr "Запустить консоль Python"
-#: ../editors/Viewer.py:481
+#: ../editors/Viewer.py:485 -#: ../dialogs/LDPowerRailDialog.py:61
+#: ../dialogs/LDPowerRailDialog.py:62 msgstr "Левая шина питания"
@@ -2071,9 +2109,13 @@
+#: ../dialogs/AboutDialog.py:143 #: ../plcopen/iec_std.csv:73
@@ -2082,22 +2124,22 @@
-#: ../targets/toolchain_gcc.py:142
+#: ../targets/toolchain_gcc.py:166 -#: ../dialogs/DiscoveryDialog.py:110 ../controls/VariablePanel.py:72
+#: ../dialogs/DiscoveryDialog.py:111 ../controls/VariablePanel.py:72 -#: ../canfestival/canfestival.py:322
+#: ../canfestival/canfestival.py:346 msgstr "Локальные записи"
-#: ../ProjectController.py:1541
+#: ../ProjectController.py:1641 msgid "Local service discovery failed!\n"
msgstr "Локальный сервис не найден!\n"
@@ -2105,7 +2147,7 @@
-#: ../dialogs/BrowseLocationsDialog.py:67
+#: ../dialogs/BrowseLocationsDialog.py:72 msgid "Locations available:"
msgstr "Доступные размещения:"
@@ -2113,41 +2155,46 @@
msgid "Logarithm to base 10"
msgstr "Десятичный логарифм"
-#: ../connectors/PYRO/__init__.py:90
+#: ../connectors/PYRO/__init__.py:94 msgid "MDNS resolution failure for '%s'\n"
msgstr "MDNS разрешение неудачно для '%s'\n"
-#: ../canfestival/SlaveEditor.py:41 ../canfestival/NetworkEditor.py:62
+msgid "Manual output adjustment - Typically from transfer station" +#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:85 msgstr "Отображение переменной"
msgid "Map located variables over CANopen"
msgstr "Отображение переменных по CANopen"
-#: ../canfestival/NetworkEditor.py:83
+#: ../canfestival/NetworkEditor.py:106 -#: ../ConfigTreeNode.py:514
-msgid "Max count (%d) reached for this confnode of type %s "
-msgstr "Достигнуто максимальное количество (%d) для типа узла конфигурации %s"
+#: ../ConfigTreeNode.py:539 +msgid "Max count ({a1}) reached for this confnode of type {a2} " +msgstr "Достигнуто максимальное количество ({a1}) для типа узла конфигурации {a2} " #: ../plcopen/iec_std.csv:71
-#: ../editors/DataTypeEditor.py:238
+#: ../editors/DataTypeEditor.py:239 -#: ../dialogs/BrowseLocationsDialog.py:37
+#: ../dialogs/BrowseLocationsDialog.py:42 ../editors/Viewer.py:289 +#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:98 +#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351
@@ -2155,7 +2202,7 @@
-#: ../editors/Viewer.py:486
+#: ../editors/Viewer.py:490 @@ -2167,7 +2214,7 @@
-#: ../editors/DataTypeEditor.py:225
+#: ../editors/DataTypeEditor.py:226 @@ -2183,10 +2230,10 @@
-#: ../PLCGenerator.py:778 ../PLCGenerator.py:1217
-msgid "More than one connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr "Более одного коннектора соответствуют продолжению цепи \"%s\" в POU \"%s\""
+#: ../PLCGenerator.py:786 ../PLCGenerator.py:1230 +msgid "More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU" +msgstr "Более одного коннектора соответствуют продолжению цепи \"{a1}\" в POU \"{a2}\"" #: ../dialogs/ActionBlockDialog.py:140
@@ -2200,11 +2247,11 @@
msgstr "Переместить ниже"
-#: ../editors/DataTypeEditor.py:354
+#: ../editors/DataTypeEditor.py:355 msgid "Move element down"
msgstr "Переместить элемент ниже"
-#: ../editors/DataTypeEditor.py:353
+#: ../editors/DataTypeEditor.py:354 msgstr "Переместить элементы выше"
@@ -2224,7 +2271,7 @@
msgstr "Переместить задачу выше"
-#: ../IDEFrame.py:75 ../IDEFrame.py:90 ../IDEFrame.py:120 ../IDEFrame.py:161
+#: ../IDEFrame.py:99 ../IDEFrame.py:114 ../IDEFrame.py:144 ../IDEFrame.py:185 msgstr "Переместить отображение"
@@ -2232,11 +2279,11 @@
msgstr "Переместить выше"
-#: ../editors/CodeFileEditor.py:643 ../controls/VariablePanel.py:443
+#: ../editors/CodeFileEditor.py:661 ../controls/VariablePanel.py:453 msgid "Move variable down"
msgstr "Переместить переменную ниже"
-#: ../editors/CodeFileEditor.py:642 ../controls/VariablePanel.py:442
+#: ../editors/CodeFileEditor.py:660 ../controls/VariablePanel.py:452 msgstr "Переместить переменную выше"
@@ -2252,21 +2299,24 @@
-#: ../dialogs/DiscoveryDialog.py:91
+#: ../dialogs/DiscoveryDialog.py:92 #: ../editors/ResourceEditor.py:68 ../editors/ResourceEditor.py:83
-#: ../editors/DataTypeEditor.py:50 ../editors/CodeFileEditor.py:663
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53 +#: ../controls/VariablePanel.py:54 -#: ../Beremiz_service.py:300
+#: ../Beremiz_service.py:332 msgid "Name must not be null!"
msgstr "Имя не может быть null!"
-#: ../dialogs/SFCStepDialog.py:55 ../dialogs/FBDBlockDialog.py:83
+#: ../dialogs/SFCStepDialog.py:56 ../dialogs/FBDBlockDialog.py:83 #: ../dialogs/ConnectionDialog.py:75
@@ -2275,12 +2325,20 @@
msgid "Natural logarithm"
msgstr "Натуральный логарифм"
-#: ../dialogs/LDElementDialog.py:75 ../editors/Viewer.py:456
+#: ../dialogs/LDElementDialog.py:75 ../editors/Viewer.py:460 -#: ../PLCOpenEditor.py:96 ../PLCOpenEditor.py:138 ../Beremiz.py:314
+#: ../Beremiz_service.py:578 +msgid "Nevow Web service failed. " +msgstr "Ошибка Web сервиса Nevow. " +#: ../Beremiz_service.py:554 +msgid "Nevow/Athena import failed :" +msgstr "Ошибка импорта Nevow/Athena :" +#: ../PLCOpenEditor.py:102 ../PLCOpenEditor.py:144 ../Beremiz.py:321 @@ -2288,25 +2346,25 @@
-#: ../editors/Viewer.py:455
+#: ../editors/Viewer.py:459 msgstr "Нет модификатора"
-#: ../ProjectController.py:1662
+#: ../ProjectController.py:1763 msgid "No PLC to transfer (did build succeed ?)\n"
msgstr "Нет ПЛК для передачи (была сборка успешна?)\n"
-#: ../PLCGenerator.py:1608
+#: ../PLCGenerator.py:1631 msgid "No body defined in \"%s\" POU"
msgstr "Нет тела для POU \"%s\""
-#: ../PLCGenerator.py:797 ../PLCGenerator.py:1227
-msgid "No connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr "Не найден коннектор, соответствующий продолжению цепи \"%s\" в POU \"%s\""
-#: ../PLCOpenEditor.py:340
+#: ../PLCGenerator.py:806 ../PLCGenerator.py:1241 +msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU" +msgstr "Не найден коннектор, соответствующий продолжению цепи \"{a1}\" в POU \"{a2}\"" +#: ../PLCOpenEditor.py:347 "No documentation available.\n"
@@ -2314,40 +2372,40 @@
"Документация отсутствует.\n"
-#: ../PLCGenerator.py:819
+#: ../PLCGenerator.py:829 msgid "No informations found for \"%s\" block"
msgstr "Не найдена информация по блоку \"%s\""
-#: ../PLCGenerator.py:1183
-msgid "No output %s variable found in block %s in POU %s. Connection must be broken"
-msgstr "Выходная переменная %s не найдена в блоке %s в POU %s."
+#: ../PLCGenerator.py:1194 +msgid "No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken" +msgstr "Выходная переменная {a1} не найдена в блоке {a2} в POU {a3}." #: ../controls/SearchResultPanel.py:169
msgid "No search results available."
msgstr "Ничего не найдено."
-#: ../svgui/svgui.py:107
+#: ../svgui/svgui.py:131 msgid "No such SVG file: %s\n"
msgstr "Нет такого SVG файла: %s\n"
-#: ../canfestival/config_utils.py:633
-msgid "No such index/subindex (%x,%x) (variable %s)"
-msgstr "Нет индекса/подиндекса (%x,%x) (переменная %s)"
+#: ../canfestival/config_utils.py:639 +msgid "No such index/subindex ({a1},{a2}) (variable {a3})" +msgstr "Нет индекса/подиндекса ({a1},{a2}) (переменная {a3})" #: ../canfestival/config_utils.py:362
-msgid "No such index/subindex (%x,%x) in ID : %d (variable %s)"
-msgstr "Нет индекса/подиндекса (%x,%x) в ID: %d (переменная %s)"
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})" +msgstr "Нет индекса/подиндекса ({a1},{a2}) в ID: {a3} (переменная {a4})" #: ../dialogs/BrowseValuesLibraryDialog.py:83
msgid "No valid value selected!"
msgstr "Не выбрано допустимое значение!"
-#: ../PLCGenerator.py:1606
+#: ../PLCGenerator.py:1629 msgid "No variable defined in \"%s\" POU"
msgstr "Переменная не определена в POU \"%s\""
@@ -2356,9 +2414,9 @@
#: ../canfestival/config_utils.py:355
-msgid "Non existing node ID : %d (variable %s)"
-msgstr "Несуществующий ID узла: %d (переменная %s)"
+msgid "Non existing node ID : {a1} (variable {a2})" +msgstr "Несуществующий ID узла: {a1} (переменная {a2})" #: ../controls/VariablePanel.py:64
@@ -2368,16 +2426,16 @@
-#: ../canfestival/config_utils.py:384
-msgid "Not PDO mappable variable : '%s' (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "Не переменная для отображения в PDO: '%s' (ID:%d,Idx:%x,sIdx:%x))"
+#: ../canfestival/config_utils.py:389 +msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))" +msgstr "Не переменная для отображения в PDO: '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))" #: ../plcopen/iec_std.csv:80
-#: ../dialogs/SFCDivergenceDialog.py:78
+#: ../dialogs/SFCDivergenceDialog.py:89 msgid "Number of sequences:"
@@ -2385,44 +2443,28 @@
msgstr "Математические функции"
-#: ../plcopen/definitions.py:38
-"The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
-"Таймер выключения может быть использован, чтобы внести задержку установки выхода в FALSE на фиксированный период времени после того, как вход стал FALSE."
-#: ../plcopen/definitions.py:37
-"The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
-"Таймер выключения может быть использован, чтобы внести задержку установки выхода в TRUE на фиксированный период времени после того, как вход стал TRUE."
-#: ../editors/CodeFileEditor.py:664
-#: ../dialogs/SearchInProjectDialog.py:93
+#: ../dialogs/SearchInProjectDialog.py:86 -#: ../PLCOpenEditor.py:98 ../PLCOpenEditor.py:139 ../Beremiz.py:316
+#: ../PLCOpenEditor.py:104 ../PLCOpenEditor.py:145 ../Beremiz.py:323 -#: ../svgui/svgui.py:116
+#: ../svgui/svgui.py:140 msgstr "Открыть Inkscape"
-#: ../ProjectController.py:1714
+msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime." +msgstr "Свободное программное обеспечение для промышленной автоматизации, состоящие из среды разработки программ по стандарту МЭК 61131 с постоянно расширяющимся набором плагинов и гибкой системой исполнения для ПЛК." +#: ../ProjectController.py:1815 msgid "Open a file explorer to manage project files"
msgstr "Открыть файловый менеджер для просмотра файлов проекта"
-#: ../wxglade_hmi/wxglade_hmi.py:114
+#: ../wxglade_hmi/wxglade_hmi.py:138 @@ -2430,7 +2472,7 @@
-#: ../dialogs/FindInPouDialog.py:82 ../editors/CodeFileEditor.py:664
+#: ../dialogs/FindInPouDialog.py:83 @@ -2438,62 +2480,80 @@
msgid "Organization (optional):"
msgstr "Организация (опционально):"
-#: ../canfestival/SlaveEditor.py:51 ../canfestival/NetworkEditor.py:72
+#: ../canfestival/SlaveEditor.py:74 ../canfestival/NetworkEditor.py:95 -#: ../dialogs/SFCStepDialog.py:70 ../dialogs/FBDVariableDialog.py:39
-#: ../dialogs/BrowseLocationsDialog.py:36 ../editors/Viewer.py:1554
-#: ../controls/VariablePanel.py:71
+#: ../dialogs/SFCStepDialog.py:71 ../dialogs/FBDVariableDialog.py:39 +#: ../dialogs/BrowseLocationsDialog.py:41 ../editors/Viewer.py:289 +#: ../editors/Viewer.py:1579 ../editors/TextViewer.py:307 +#: ../controls/LocationCellEditor.py:98 ../controls/VariablePanel.py:71 +#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351 -#: ../canfestival/SlaveEditor.py:40 ../canfestival/NetworkEditor.py:61
+msgid "Overriding reset" +msgstr "Сброс интегратора" +#: ../canfestival/SlaveEditor.py:63 ../canfestival/NetworkEditor.py:84 -#: ../canfestival/SlaveEditor.py:39 ../canfestival/NetworkEditor.py:60
+#: ../canfestival/SlaveEditor.py:62 ../canfestival/NetworkEditor.py:83 -#: ../plcopen/definitions.py:42
-"The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
-"ПИД (Пропорциональный Интегральный Дифференциальный) ФБ - классический регулятор, используемый в системах с обратной связью."
-#: ../targets/toolchain_gcc.py:107
+#: ../targets/toolchain_gcc.py:131
-#: ../ProjectController.py:930
+#: ../ProjectController.py:992 msgid "PLC code generation failed !\n"
msgstr "Неудачная генерация кода!\n"
-#: ../PLCOpenEditor.py:189 ../PLCOpenEditor.py:302
+#: ../Beremiz_service.py:295 +msgid "PLC is empty or already started." +msgstr "В ПЛК нет программы или он уже запущен." +#: ../Beremiz_service.py:302 +msgid "PLC is not started." +#: ../PLCOpenEditor.py:196 ../PLCOpenEditor.py:309 -"PLC syntax error at line %d:\n"
+"PLC syntax error at line {a1}:\n" -"Синтаксическая ошибка в строке %d:\n"
-#: ../PLCOpenEditor.py:285 ../PLCOpenEditor.py:361
+"Синтаксическая ошибка в строке {a1}:\n" +#: ../PLCOpenEditor.py:292 ../PLCOpenEditor.py:373 msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
msgstr "PLCOpen файлы (*.xml)|*.xml|All files|*.*"
-#: ../PLCOpenEditor.py:146 ../PLCOpenEditor.py:202
+#: ../PLCOpenEditor.py:152 ../PLCOpenEditor.py:209 +#: ../PLCOpenEditor.py:355 +"PLCOpenEditor is part of Beremiz project.\n"
-#: ../dialogs/DiscoveryDialog.py:94
+"PLCOpenEditor является частью проекта Beremiz.\n" +#: ../dialogs/DiscoveryDialog.py:95 @@ -2513,17 +2573,20 @@
-#: ../connectors/PYRO/__init__.py:41
+msgstr "Ошибка, PV - SP" +#: ../connectors/PYRO/__init__.py:45 msgid "PYRO connecting to URI : %s\n"
msgstr "PYRO подключение к URI: %s\n"
-#: ../connectors/PYRO/__init__.py:57
+#: ../connectors/PYRO/__init__.py:61 msgid "PYRO using certificates in '%s' \n"
msgstr "PYRO использует сертификаты в '%s'\n"
-#: ../PLCOpenEditor.py:112 ../Beremiz.py:329
+#: ../PLCOpenEditor.py:118 ../Beremiz.py:336 msgstr "Настройки страницы"
@@ -2531,7 +2594,7 @@
msgid "Page Size (optional):"
msgstr "Размер страницы (опционально):"
@@ -2540,62 +2603,69 @@
msgstr "Родительский экземпляр"
-#: ../editors/Viewer.py:594 ../IDEFrame.py:348 ../IDEFrame.py:402
+#: ../editors/Viewer.py:598 ../IDEFrame.py:372 ../IDEFrame.py:426
-#: ../dialogs/SearchInProjectDialog.py:64
+#: ../dialogs/SearchInProjectDialog.py:56 msgid "Pattern to search:"
-#: ../dialogs/LDPowerRailDialog.py:72
+#: ../dialogs/LDPowerRailDialog.py:73 -#: ../editors/Viewer.py:2672 ../editors/Viewer.py:2916
-#: ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2706 ../editors/Viewer.py:2963 +#: ../editors/SFCViewer.py:770 msgid "Please choose a target"
-msgstr "Выберете цель перехода"
-#: ../editors/TextViewer.py:261
+msgstr "Выберите цель перехода" +#: ../editors/TextViewer.py:262 msgid "Please enter a block name"
msgstr "Введите имя блока"
-#: ../editors/Viewer.py:2542 ../editors/Viewer.py:2953
+#: ../editors/Viewer.py:2576 ../editors/Viewer.py:3005 msgid "Please enter comment text"
msgstr "Введите текст комментария"
-#: ../editors/SFCViewer.py:359 ../editors/SFCViewer.py:381
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:433 ../editors/SFCViewer.py:455 +#: ../editors/SFCViewer.py:799 msgid "Please enter step name"
msgstr "Введите имя шага"
+#: ../Beremiz_service.py:194 +msgid "Please enter text" #: ../dialogs/ForceVariableDialog.py:163
msgid "Please enter value for a \"%s\" variable:"
msgstr "Введите значение для переменной \"%s\":"
-#: ../Beremiz_service.py:287
+#: ../Beremiz_service.py:317 msgid "Port number must be 0 <= port <= 65535!"
msgstr "Номер порта должен быть в диапазоне от 0 до 65535!"
-#: ../Beremiz_service.py:287
+#: ../Beremiz_service.py:317 msgid "Port number must be an integer!"
msgstr "Номер порта должен быть целым числом!"
-#: ../editors/Viewer.py:532 ../editors/Viewer.py:2085
+#: ../editors/Viewer.py:536 ../editors/Viewer.py:2367 -#: ../dialogs/LDPowerRailDialog.py:49
+#: ../dialogs/LDPowerRailDialog.py:50 msgid "Power Rail Properties"
msgstr "Свойства шины питания"
-#: ../PLCOpenEditor.py:114 ../Beremiz.py:331
+#: ../PLCOpenEditor.py:120 ../Beremiz.py:338 @@ -2603,12 +2673,12 @@
-#: ../PLCOpenEditor.py:116 ../PLCOpenEditor.py:142 ../Beremiz.py:333
+#: ../PLCOpenEditor.py:122 ../PLCOpenEditor.py:148 ../Beremiz.py:340
msgstr "Предварительный просмотр"
@@ -2616,15 +2686,18 @@
-#: ../dialogs/SFCTransitionDialog.py:88
+#: ../dialogs/SFCTransitionDialog.py:89 -#: ../runtime/PLCObject.py:369
+#: ../runtime/PLCObject.py:370 msgid "Problem starting PLC : error %d"
msgstr "Проблема запуска ПЛК: ошибка %d"
+msgid "Process variable" +msgstr "Текущее значение регулируемой переменной" #: ../dialogs/ProjectDialog.py:55
@@ -2645,12 +2718,12 @@
msgid "Product Version (required):"
msgstr "Версия продукта (обязательно):"
-#: ../dialogs/SearchInProjectDialog.py:46 ../IDEFrame.py:1710
+#: ../dialogs/SearchInProjectDialog.py:38 ../IDEFrame.py:1744 -#: ../PLCOpenEditor.py:330
+#: ../PLCOpenEditor.py:337 msgid "Program was successfully generated!"
msgstr "Программа успешно сгенерирована!"
@@ -2658,11 +2731,11 @@
-#: ../editors/Viewer.py:238
+#: ../editors/Viewer.py:242 msgid "Programs can't be used by other POUs!"
msgstr "Программы не могут использоваться другими POU!"
-#: ../controls/ProjectPropertiesPanel.py:84 ../IDEFrame.py:556
+#: ../controls/ProjectPropertiesPanel.py:84 ../IDEFrame.py:584 @@ -2671,7 +2744,7 @@
-#: ../ProjectController.py:1713
+#: ../ProjectController.py:1814 @@ -2687,7 +2760,7 @@
msgid "Project Version (optional):"
msgstr "Версия проекта (опционально):"
-#: ../PLCControler.py:3157
+#: ../PLCControler.py:3158 "Project file syntax error:\n"
@@ -2695,14 +2768,14 @@
"Синтаксическая ошибка в файле проекта:\n"
-#: ../dialogs/ProjectDialog.py:32 ../editors/ProjectNodeEditor.py:14
+#: ../dialogs/ProjectDialog.py:32 ../editors/ProjectNodeEditor.py:37 msgid "Project properties"
msgstr "Свойства проекта"
-#: ../ConfigTreeNode.py:540
-msgid "Project tree layout do not match confnode.xml %s!=%s "
-msgstr "Дерево проекта не соответствует confnode.xml %s!=%s"
+#: ../ConfigTreeNode.py:566 +msgid "Project tree layout do not match confnode.xml {a1}!={a2} " +msgstr "Дерево проекта не соответствует confnode.xml {a1}!={a2} " #: ../dialogs/ConnectionDialog.py:94
@@ -2712,19 +2785,31 @@
-#: ../plcopen/definitions.py:36
-"The pulse timer can be used to generate output pulses of a given time duration."
-"Функциональный блок используется для генерации выходных импульсов заданной длительности."
-#: ../py_ext/PythonEditor.py:57
+msgid "Proportionality constant" +msgstr "Коэффициент пропорциональности" +#: ../Beremiz_service.py:440 +msgid "Publishing service on local network" +msgstr "Сервис доступен в локальной сети" +#: ../connectors/PYRO/__init__.py:118 +msgid "Pyro exception: %s\n" +msgstr "Исключение Pyro: %s\n" +#: ../Beremiz_service.py:427 +msgid "Pyro object's uri :" +#: ../Beremiz_service.py:426 +#: ../py_ext/PythonEditor.py:81
@@ -2732,68 +2817,47 @@
-#: ../PLCOpenEditor.py:122 ../Beremiz.py:336 ../Beremiz_service.py:252
+#: ../PLCOpenEditor.py:128 ../Beremiz.py:343 ../Beremiz_service.py:273 -#: ../plcopen/definitions.py:29
-"The RS bistable is a latch where the Reset dominates."
-"RS триггер - переключатель с доминантой выключения."
-#: ../plcopen/definitions.py:43
-"The RAMP function block is modelled on example given in the standard."
-"Ограничитель скорости изменения сигнала\n"
-"Функциональный блок написан согласно примеру, приведенному в стандарте."
+msgstr "Длительность нарастания" #: ../controls/DebugVariablePanel/DebugVariablePanel.py:225
-#: ../ProjectController.py:1709
+#: ../ProjectController.py:1810 -#: ../plcopen/definitions.py:39
-"The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
-"Часы реального времени используется для получения меток времени, установки даты и времени дня в отчетах, сообщениях об авариях и пр."
msgid "Really delete node '%s'?"
msgstr "Действительно удалить элемент '%s'?"
-#: ../IDEFrame.py:338 ../IDEFrame.py:398
+#: ../IDEFrame.py:362 ../IDEFrame.py:422 -#: ../dialogs/SFCTransitionDialog.py:73
+#: ../dialogs/SFCTransitionDialog.py:74 -#: ../dialogs/DiscoveryDialog.py:105 ../IDEFrame.py:408
+#: ../dialogs/DiscoveryDialog.py:106 ../IDEFrame.py:432 -#: ../dialogs/SearchInProjectDialog.py:73
+#: ../dialogs/SearchInProjectDialog.py:66 msgid "Regular expression"
msgstr "Регулярное выражение"
-#: ../dialogs/FindInPouDialog.py:97
+#: ../dialogs/FindInPouDialog.py:98 msgid "Regular expressions"
msgstr "Регулярные выражения"
-#: ../editors/Viewer.py:1531
+#: ../editors/Viewer.py:1556 msgstr "Освободить значение"
@@ -2801,16 +2865,16 @@
msgid "Remainder (modulo)"
msgstr "Остаток от деления (modulo)"
msgstr "Удалить %s элемент"
msgstr "Удалить тип данных"
@@ -2818,7 +2882,7 @@
msgstr "Удалить действие"
-#: ../editors/DataTypeEditor.py:352
+#: ../editors/DataTypeEditor.py:353 @@ -2830,7 +2894,7 @@
msgstr "Удалить экземпляр"
-#: ../canfestival/NetworkEditor.py:81
+#: ../canfestival/NetworkEditor.py:104 msgstr "Удалить ведомое устройство"
@@ -2838,11 +2902,11 @@
-#: ../editors/CodeFileEditor.py:641 ../controls/VariablePanel.py:441
+#: ../editors/CodeFileEditor.py:659 ../controls/VariablePanel.py:451 msgstr "Удалить переменную"
@@ -2850,7 +2914,7 @@
-#: ../editors/Viewer.py:498
+#: ../editors/Viewer.py:502 msgid "Replace Wire by connections"
msgstr "Заменить цепь подключениями"
@@ -2862,11 +2926,11 @@
-#: ../editors/Viewer.py:578
+#: ../editors/Viewer.py:583 msgid "Reset Execution Order"
msgstr "Сбросить порядок исполнения"
msgid "Reset Perspective"
msgstr "Сбросить представление"
@@ -2874,38 +2938,33 @@
msgid "Reset search result"
msgstr "Сбросить результаты поиска"
-#: ../PLCControler.py:97 ../Beremiz.py:1039
+msgstr "Постоянная времени интегрирования" +#: ../PLCControler.py:97 ../Beremiz.py:1075 #: ../controls/VariablePanel.py:62
-#: ../controls/VariablePanel.py:414
+#: ../controls/VariablePanel.py:424 msgstr "Возвращаемый тип:"
-#: ../editors/Viewer.py:483
+#: ../editors/Viewer.py:487 -#: ../dialogs/LDPowerRailDialog.py:62
+#: ../dialogs/LDPowerRailDialog.py:63 msgstr "Правая шина питания"
-#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:457
+#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:461 msgstr "Нарастающий фронт"
-#: ../plcopen/definitions.py:31
-"Rising edge detector\n"
-"The output produces a single pulse when a rising edge is detected."
-"Детектор нарастающего фронта\n"
-"На выходе формируется одиночный импульс, если обнаружен нарастающий фронт."
#: ../plcopen/iec_std.csv:65
msgstr "Циклический сдвиг влево"
@@ -2918,77 +2977,86 @@
msgstr "Округление вверх/вниз"
-#: ../ProjectController.py:1677
+#: ../ProjectController.py:1778 -#: ../ProjectController.py:975
+#: ../ProjectController.py:1037 msgid "Runtime IO extensions C code generation failed !\n"
msgstr "Ошибка генерации C-кода для расширений ввода-вывода!\n"
-#: ../ProjectController.py:984
+#: ../ProjectController.py:1046 msgid "Runtime library extensions C code generation failed !\n"
msgstr "Ошибка генерации C-кода для библиотеки расширений системы исполнения!\n"
-#: ../canfestival/SlaveEditor.py:38 ../canfestival/NetworkEditor.py:59
+#: ../canfestival/SlaveEditor.py:61 ../canfestival/NetworkEditor.py:82 -#: ../canfestival/SlaveEditor.py:37 ../canfestival/NetworkEditor.py:58
+#: ../canfestival/SlaveEditor.py:60 ../canfestival/NetworkEditor.py:81 #: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
-#: ../plcopen/definitions.py:28
-"The SR bistable is a latch where the Set dominates."
-"SR триггер - переключатель с доминантой включения."
-#: ../dialogs/PouTransitionDialog.py:35 ../dialogs/PouActionDialog.py:31
+#: ../PLCGenerator.py:1392 +msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\"" +msgstr "Безусловный переход в POU \"{a1}\" ссылается на несуществующий SFC шаг \"{a2}\"" +#: ../PLCGenerator.py:773 +msgid "SFC transition in POU \"%s\" must be connected." +msgstr "SFC переход в POU \"%s\" должен быть подключен." +#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31 #: ../dialogs/PouDialog.py:36
-#: ../PLCOpenEditor.py:317
+#: ../PLCOpenEditor.py:324 msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST файлы (*.st)|*.st|Все файлы|*.*"
-#: ../svgui/svgui.py:101
+#: ../svgui/svgui.py:125 msgid "SVG files (*.svg)|*.svg|All files|*.*"
msgstr "SVG файлы (*.svg)|*.svg|Все файлы|*.*"
-#: ../PLCOpenEditor.py:105 ../PLCOpenEditor.py:140 ../Beremiz.py:320
+msgstr "Период сэмплирования" +#: ../PLCOpenEditor.py:111 ../PLCOpenEditor.py:146 ../Beremiz.py:327 -#: ../PLCOpenEditor.py:107 ../PLCOpenEditor.py:141 ../Beremiz.py:352
+#: ../PLCOpenEditor.py:113 ../PLCOpenEditor.py:147 ../Beremiz.py:359 msgstr "Сохранить как..."
-#: ../dialogs/SearchInProjectDialog.py:76
+#: ../ProjectController.py:420 +msgid "Save path is the same as path of a project! \n" +msgstr "Выбранный путь совпадает с путём проекта!\n" +#: ../dialogs/SearchInProjectDialog.py:69 msgstr "Область действия"
-#: ../dialogs/SearchInProjectDialog.py:105 ../IDEFrame.py:595
-#: ../dialogs/SearchInProjectDialog.py:52 ../IDEFrame.py:358 ../IDEFrame.py:404
+#: ../dialogs/SearchInProjectDialog.py:44 ../IDEFrame.py:382 ../IDEFrame.py:428 msgid "Search in Project"
@@ -2996,27 +3064,31 @@
-#: ../editors/Viewer.py:284 ../editors/TextViewer.py:304
-#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:280
-#: ../controls/VariablePanel.py:340
+#: ../editors/Viewer.py:288 ../editors/TextViewer.py:306 +#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:290 +#: ../controls/VariablePanel.py:350 msgid "Select a variable class:"
-#: ../ProjectController.py:1126
+msgstr "Выберите класс переменной:" +#: ../ProjectController.py:1195 msgid "Select an editor:"
-msgstr "Выберете редактор:"
+msgstr "Выберите редактор:" #: ../controls/PouInstanceVariablesPanel.py:276
msgid "Select an instance"
-msgstr "Выберете экземпляр"
+msgstr "Выберите экземпляр" -msgstr "Выберете объект"
+msgstr "Выберите объект" +#: ../ProjectController.py:427 +msgid "Selected directory already contains another project. Overwrite? \n" +msgstr "Выбранная директория уже содержит другой проект. Перезаписать?\n" #: ../plcopen/iec_std.csv:70
@@ -3030,19 +3102,11 @@
msgid "Selection Divergence"
msgstr "Альтернативное ветвление"
-#: ../plcopen/definitions.py:30
-"The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
-"Семафор предоставляет собой программный механизм синхронизации для обеспечения исключительного доступа к определенным ресурсам."
-#: ../dialogs/DiscoveryDialog.py:81
+#: ../dialogs/DiscoveryDialog.py:82 msgid "Service Discovery"
-#: ../dialogs/DiscoveryDialog.py:84
+#: ../dialogs/DiscoveryDialog.py:85 msgid "Services available:"
msgstr "Сервисы доступны:"
@@ -3050,6 +3114,9 @@
#: ../plcopen/iec_std.csv:62
@@ -3058,19 +3125,19 @@
-#: ../ProjectController.py:1703
+#: ../ProjectController.py:1804 msgid "Show IEC code generated by PLCGenerator"
msgstr "Показать год, сгенерированный PLCGenerator"
-#: ../canfestival/canfestival.py:363
+#: ../canfestival/canfestival.py:387 msgstr "Показать ведущего"
-#: ../canfestival/canfestival.py:364
+#: ../canfestival/canfestival.py:388 msgid "Show Master generated by config_utils"
msgstr "Показать ведущий узел сгенерированный config_utils"
-#: ../ProjectController.py:1701
+#: ../ProjectController.py:1802 @@ -3088,54 +3155,67 @@
#: ../editors/ResourceEditor.py:68
-msgstr "Источник прерывания"
-#: ../targets/toolchain_makefile.py:112
+#: ../targets/toolchain_makefile.py:126 msgid "Source didn't change, no build.\n"
msgstr "Исходные файлы не изменились, сборка не нужна.\n"
+#: ../PLCGenerator.py:397 +msgid "Source signal has to be defined for single task '{a1}' in resource '{a2}.{a3}'." +msgstr "Для задачи '{a1}' в ресурсе '{a2}.{a3}' отсутсвует задание источника." #: ../plcopen/iec_std.csv:23
msgid "Square root (base 2)"
msgstr "Квадратный корень"
-#: ../plcopen/definitions.py:21
+#: ../plcopen/definitions.py:46 msgid "Standard function blocks"
msgstr "Стандартные функциональные блоки"
-#: ../ProjectController.py:1679 ../Beremiz_service.py:240
+#: ../ProjectController.py:1780 ../Beremiz_service.py:261 -#: ../ProjectController.py:922
+#: ../ProjectController.py:984 msgid "Start build in %s\n"
msgstr "Сборка запущена в %s\n"
-#: ../ProjectController.py:1483
+#: ../ProjectController.py:1298 +#: ../ProjectController.py:1586 -msgstr "ПЛК запускается\\n\n"
+msgstr "ПЛК запускается\n" -#: ../editors/Viewer.py:549 ../editors/Viewer.py:2059
+#: ../editors/Viewer.py:553 ../editors/Viewer.py:2342 -#: ../ProjectController.py:1682
+#: ../ProjectController.py:1783 -#: ../Beremiz_service.py:241
+#: ../Beremiz_service.py:262 -#: ../ProjectController.py:1684
+#: ../ProjectController.py:1785 msgstr "Остановить запущенный ПЛК"
-#: ../ProjectController.py:1455
+#: ../ProjectController.py:1299 +#: ../ProjectController.py:1558 msgid "Stopping debugger...\n"
msgstr "Остановка отладчика...\n"
@@ -3151,10 +3231,14 @@
-#: ../ProjectController.py:961
+#: ../ProjectController.py:1023 msgid "Successfully built.\n"
msgstr "Сборка прошла успешно.\n"
+msgid "Switch perspective" +msgstr "Сменить представление" @@ -3164,11 +3248,11 @@
-#: ../dialogs/SearchInProjectDialog.py:154
+#: ../dialogs/SearchInProjectDialog.py:165 ../dialogs/FindInPouDialog.py:172 msgid "Syntax error in regular expression of pattern to search!"
msgstr "Синтаксическая ошибка в регулярном выражении шаблона поиска!"
-#: ../dialogs/DiscoveryDialog.py:92
+#: ../dialogs/DiscoveryDialog.py:93 @@ -3191,6 +3275,24 @@
+msgid "The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control." +msgstr "ПИД (Пропорциональный Интегральный Дифференциальный) ФБ - классический регулятор, используемый в системах с обратной связью." +msgid "The RAMP function block is modelled on example given in the standard." +msgstr "Ограничитель скорости изменения сигнала. Функциональный блок написан согласно примеру, приведенному в стандарте." +msgid "The RS bistable is a latch where the Reset dominates." +msgstr "RS-триггер с приоритетом выключения." +msgid "The SR bistable is a latch where the Set dominates." +msgstr "SR-триггер с приоритетом включения." +msgid "The derivative function block produces an output XOUT proportional to the rate of change of the input XIN." +msgstr "Функциональный блок формирует выход XOUT пропорционально частоте изменения входа XIN." +msgid "The down-counter can be used to signal when a count has reached zero, on counting down from a preset value." +msgstr "Декрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг нулевого значения с исходного заданного значения." #: ../editors/FileManagementPanel.py:180
@@ -3202,18 +3304,51 @@
#: ../editors/LDViewer.py:882
msgid "The group of block must be coherent!"
-#: ../Beremiz.py:614 ../IDEFrame.py:983
+msgstr "Группа блоков должна быть связанной!" +msgid "The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2." +msgstr "Функциональный блок формирует дискретный выход с гистерезисом в зависимости от разницы двух вещественных входов XIN1 и XIN2." +msgid "The integral function block integrates the value of input XIN over time." +msgstr "Функциональный блок интегрирует входное значение XIN во времени." +msgid "The off-delay timer can be used to delay setting an output false, for fixed period after input goes false." +msgstr "Таймер выключения может быть использован, чтобы внести задержку установки выхода в FALSE на фиксированный период времени после того, как вход стал FALSE." +msgid "The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true." +msgstr "Таймер выключения может быть использован, чтобы внести задержку установки выхода в TRUE на фиксированный период времени после того, как вход стал TRUE." +msgid "The output produces a single pulse when a falling edge is detected." +msgstr "Детектор падающего фронта. На выходе формируется одиночный импульс, если обнаружен падающий фронт." +msgid "The output produces a single pulse when a rising edge is detected." +msgstr "Детектор нарастающего фронта. На выходе формируется одиночный импульс, если обнаружен нарастающий фронт." +msgid "The pulse timer can be used to generate output pulses of a given time duration." +msgstr "Генератор импульсов. Функциональный блок используется для генерации выходных импульсов заданной длительности." +msgid "The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on." +msgstr "Часы реального времени используется для получения меток времени, установки даты и времени дня в отчетах, сообщениях об авариях и пр." +msgid "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources." +msgstr "Семафор предоставляет собой программный механизм синхронизации для обеспечения исключительного доступа к определенным ресурсам." +msgid "The up-counter can be used to signal when a count has reached a maximum value." +msgstr "Инкрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг максимального значения." +msgid "The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other." +msgstr "Инкрементный/декрементный счетчик имеет два входа CU и CD. Он может использоваться для счета вверх по одному входу и для счета низ по другому." +#: ../Beremiz.py:640 ../IDEFrame.py:1011 msgid "There are changes, do you want to save?"
msgstr "Хотите сохранить изменения?"
-#: ../IDEFrame.py:1618 ../IDEFrame.py:1637
+#: ../IDEFrame.py:1655 ../IDEFrame.py:1674 msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
msgstr "Существует POU с именем \"%s\". Это может вызвать конфликт. Хотите продолжить?"
"There was a problem printing.\n"
"Perhaps your current printer is not set correctly?"
@@ -3225,6 +3360,11 @@
msgid "This option isn't available yet!"
msgstr "Это опция еще не доступна!"
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:565 #: ../plcopen/iec_std.csv:40
@@ -3258,54 +3398,54 @@
msgid "Time-of-day subtraction"
msgstr "Вычитание времени суток"
-#: ../editors/Viewer.py:485
+#: ../editors/Viewer.py:489 -#: ../ProjectController.py:1691
+#: ../ProjectController.py:1792 -#: ../ProjectController.py:1693
+#: ../ProjectController.py:1794 -#: ../ProjectController.py:1658
+#: ../ProjectController.py:1758 msgid "Transfer completed successfully.\n"
msgstr "Передача успешно завершена.\n"
-#: ../ProjectController.py:1660
+#: ../ProjectController.py:1760 msgid "Transfer failed\n"
msgstr "Ошибка передачи\n"
-#: ../editors/Viewer.py:550 ../editors/Viewer.py:2060 ../editors/Viewer.py:2089
+#: ../editors/Viewer.py:554 ../editors/Viewer.py:2344 ../editors/Viewer.py:2371 -#: ../PLCGenerator.py:1499
+#: ../PLCGenerator.py:1518 msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
msgstr "Тело перехода \"%s\" должно содержать выходную переменную или катушку, ссылающуюся на его имя"
-#: ../dialogs/PouTransitionDialog.py:84
+#: ../dialogs/PouTransitionDialog.py:89 -#: ../dialogs/PouTransitionDialog.py:53
+#: ../dialogs/PouTransitionDialog.py:58 -#: ../PLCGenerator.py:1588
-msgid "Transition with content \"%s\" not connected to a next step in \"%s\" POU"
-msgstr "Переход с содержимым \"%s\" не подключен к следующему шагу в POU \"%s\""
-#: ../PLCGenerator.py:1579
-msgid "Transition with content \"%s\" not connected to a previous step in \"%s\" POU"
-msgstr "Переход с содержимым \"%s\" не подключен к предыдущему шагу в POU \"%s\""
-#: ../plcopen/plcopen.py:1315
+#: ../PLCGenerator.py:1609 +msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU" +msgstr "Переход с содержимым \"{a1}\" не подключен к следующему шагу в POU \"{a2}\"" +#: ../PLCGenerator.py:1598 +msgid "Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU" +msgstr "Переход с содержимым \"{a1}\" не подключен к предыдущему шагу в POU \"{a2}\"" +#: ../plcopen/plcopen.py:1318 msgid "Transition with name %s doesn't exist!"
msgstr "Переход с именем %s отсутствует!"
@@ -3314,21 +3454,29 @@
+#: ../dialogs/AboutDialog.py:123 #: ../editors/ResourceEditor.py:68
+#: ../Beremiz_service.py:476 +msgid "Twisted unavailable." +msgstr "Модуль Twisted недоступен." #: ../dialogs/ActionBlockDialog.py:38 ../editors/ResourceEditor.py:83
-#: ../editors/DataTypeEditor.py:50 ../editors/CodeFileEditor.py:663
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53 +#: ../controls/VariablePanel.py:54 -#: ../dialogs/BrowseLocationsDialog.py:43
+#: ../dialogs/BrowseLocationsDialog.py:48 msgid "Type and derivated"
msgstr "Тип и его производные"
-#: ../canfestival/config_utils.py:336 ../canfestival/config_utils.py:618
+#: ../canfestival/config_utils.py:336 ../canfestival/config_utils.py:624 msgid "Type conflict for location \"%s\""
msgstr "Конфликт типов \"%s\""
@@ -3337,16 +3485,16 @@
msgstr "Преобразование типов"
-#: ../editors/DataTypeEditor.py:161
+#: ../editors/DataTypeEditor.py:162 msgstr "Информация о типе:"
-#: ../dialogs/BrowseLocationsDialog.py:44
+#: ../dialogs/BrowseLocationsDialog.py:49 msgstr "Только данный тип"
-#: ../dialogs/SFCDivergenceDialog.py:57 ../dialogs/SFCTransitionDialog.py:56
-#: ../dialogs/LDPowerRailDialog.py:55 ../dialogs/BrowseLocationsDialog.py:94
+#: ../dialogs/SFCDivergenceDialog.py:59 ../dialogs/SFCTransitionDialog.py:57 +#: ../dialogs/LDPowerRailDialog.py:56 ../dialogs/BrowseLocationsDialog.py:99 #: ../dialogs/FBDBlockDialog.py:65 ../dialogs/ConnectionDialog.py:58
@@ -3354,74 +3502,58 @@
msgstr "URI системы исполнения"
-#: ../canfestival/config_utils.py:456 ../canfestival/config_utils.py:470
+#: ../canfestival/config_utils.py:462 ../canfestival/config_utils.py:476 msgid "Unable to define PDO mapping for node %02x"
msgstr "Невозможно определить отображение PDO для узла %02x"
-#: ../targets/Xenomai/__init__.py:15
+#: ../targets/Xenomai/__init__.py:39 msgid "Unable to get Xenomai's %s \n"
msgstr "Невозможно получить Xenomai %s\n"
-#: ../PLCGenerator.py:951 ../PLCGenerator.py:1202
-msgid "Undefined block type \"%s\" in \"%s\" POU"
-msgstr "Неопределенный тип блока \"%s\" в POU \"%s\""
+#: ../PLCGenerator.py:961 ../PLCGenerator.py:1214 +msgid "Undefined block type \"{a1}\" in \"{a2}\" POU" +msgstr "Неопределенный тип блока \"{a1}\" в POU \"{a2}\"" #: ../PLCGenerator.py:254
msgid "Undefined pou type \"%s\""
msgstr "Неопределенный тип POU \"%s\""
-#: ../IDEFrame.py:336 ../IDEFrame.py:397
+#: ../IDEFrame.py:360 ../IDEFrame.py:421 -#: ../ProjectController.py:308
+#: ../ProjectController.py:332 -#: ../editors/Viewer.py:389
+#: ../editors/Viewer.py:393 msgid "Unknown variable \"%s\" for this POU!"
msgstr "Неизвестная переменная \"%s\" для этого POU!"
-#: ../ProjectController.py:305 ../ProjectController.py:306
+#: ../ProjectController.py:329 ../ProjectController.py:330
#: ../PLCControler.py:636
-#: ../controls/VariablePanel.py:275
+#: ../controls/VariablePanel.py:284 msgid "Unrecognized data size \"%s\""
msgstr "Неопределенный размер данных \"%s\""
-#: ../plcopen/definitions.py:33
-"The up-counter can be used to signal when a count has reached a maximum value."
-"Инкрементный счетчик\n"
-"Инкрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг максимального значения."
-#: ../plcopen/definitions.py:35
-"The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
-"Инкрементный/декрементный счетчик\n"
-"Инкрементный/декрементный счетчик имеет два входа CU и CD. Он может использоваться для счета вверх по одному входу и для счета низ по другому."
-#: ../editors/DataTypeEditor.py:631 ../controls/VariablePanel.py:780
+#: ../editors/DataTypeEditor.py:632 ../controls/VariablePanel.py:798 msgstr "Пользовательские типы данных"
-#: ../canfestival/SlaveEditor.py:42 ../canfestival/NetworkEditor.py:63
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:86 msgstr "Пользовательский тип"
@@ -3433,26 +3565,32 @@
-#: ../editors/DataTypeEditor.py:258
+#: ../editors/DataTypeEditor.py:259 -#: ../dialogs/ActionBlockDialog.py:42 ../editors/Viewer.py:522
-#: ../editors/Viewer.py:2074
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/Viewer.py:526 +#: ../editors/Viewer.py:2374 +#: ../editors/Viewer.py:308 ../editors/Viewer.py:338 ../editors/Viewer.py:360 +#: ../editors/TextViewer.py:292 ../editors/TextViewer.py:343 +#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:329 +msgstr "Перетаскивание переменной" #: ../dialogs/FBDVariableDialog.py:63
msgid "Variable Properties"
msgstr "Свойства переменных"
-#: ../editors/Viewer.py:284 ../editors/TextViewer.py:304
-#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:280
-#: ../controls/VariablePanel.py:340
+#: ../editors/Viewer.py:288 ../editors/TextViewer.py:306 +#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:290 +#: ../controls/VariablePanel.py:350
-#: ../editors/Viewer.py:391 ../editors/TextViewer.py:385
+msgstr "Класс переменной" +#: ../editors/Viewer.py:395 ../editors/TextViewer.py:387 msgid "Variable don't belong to this POU!"
msgstr "Переменная не принадлежит этому POU!"
@@ -3468,33 +3606,41 @@
-#: ../connectors/WAMP/__init__.py:88
+#: ../Beremiz_service.py:586 +msgid "WAMP client startup failed. " +msgstr "Ошибка импорта WAMP. " +#: ../connectors/WAMP/__init__.py:91 msgid "WAMP connecting to URL : %s\n"
msgstr "WAMP подключение к URI: %s\n"
-#: ../connectors/WAMP/__init__.py:128
+#: ../connectors/WAMP/__init__.py:131 msgid "WAMP connection timeout"
msgstr "Тайм-аут WAMP подключения "
-#: ../connectors/WAMP/__init__.py:147
+#: ../connectors/WAMP/__init__.py:150 msgid "WAMP connection to '%s' failed.\n"
msgstr "Не удалось установить WAMP подключение к %s.\n"
-#: ../wxglade_hmi/wxglade_hmi.py:11
+#: ../Beremiz_service.py:562 +msgid "WAMP import failed :" +msgstr "Ошибка импорта WAMP :" +#: ../wxglade_hmi/wxglade_hmi.py:35
#: ../dialogs/PouDialog.py:128 ../editors/LDViewer.py:891
-#: ../ProjectController.py:584
+#: ../ProjectController.py:616 msgid "Warnings in ST/IL/SFC code generator :\n"
msgstr "Предупреждения в ST/IL/SFC коде генераторе:\n"
-#: ../dialogs/SearchInProjectDialog.py:85
+#: ../dialogs/SearchInProjectDialog.py:78 @@ -3503,23 +3649,27 @@
-#: ../dialogs/FindInPouDialog.py:92
+#: ../dialogs/FindInPouDialog.py:93 msgstr "Продолжить поиск сначала"
+#: ../dialogs/AboutDialog.py:122
msgstr "Настройки Xenomai"
-#: ../svgui/svgui.py:115
+#: ../svgui/svgui.py:139 "You don't have write permissions.\n"
@@ -3527,7 +3677,7 @@
"У вас недостаточно прав для записи.\n"
"Открыть Inkscape все равно?"
-#: ../wxglade_hmi/wxglade_hmi.py:113
+#: ../wxglade_hmi/wxglade_hmi.py:137 "You don't have write permissions.\n"
@@ -3535,7 +3685,7 @@
"У вас недостаточно прав для записи.\n"
"Открыть wxGlade все равно?"
-#: ../ProjectController.py:268
+#: ../ProjectController.py:292 "You must have permission to work on the project\n"
"Work on a project copy ?"
@@ -3545,13 +3695,13 @@
#: ../editors/LDViewer.py:886
msgid "You must select the block or group of blocks around which a branch should be added!"
-msgstr "Выберете блок или группу блоков, вокруг которых нужно добавить ветвление!"
+msgstr "Выберите блок или группу блоков, вокруг которых нужно добавить ветвление!" #: ../editors/LDViewer.py:666
msgid "You must select the wire where a contact should be added!"
-msgstr "Выберете провод, куда должен быть добавлен контакт!"
-#: ../dialogs/SFCStepNameDialog.py:47 ../dialogs/PouNameDialog.py:45
+msgstr "Выберите провод, куда должен быть добавлен контакт!" +#: ../dialogs/SFCStepNameDialog.py:48 ../dialogs/PouNameDialog.py:46 msgid "You must type a name!"
@@ -3559,14 +3709,10 @@
msgid "You must type a value!"
msgstr "Введите значение!"
@@ -3577,25 +3723,31 @@
-#: ../PLCOpenEditor.py:326
+#: ../PLCOpenEditor.py:333 -#: ../util/ProcessLogger.py:166
-msgid "exited with status %s (pid %s)\n"
-msgstr "завершился с кодом %s (pid %s)\n"
-#: ../PLCOpenEditor.py:384 ../PLCOpenEditor.py:386
+#: ../util/ProcessLogger.py:169 +msgid "exited with status {a1} (pid {a2})\n" +msgstr "завершился с кодом {a1} (pid {a2})\n" +#: ../PLCOpenEditor.py:396 ../PLCOpenEditor.py:398 +msgid "first input parameter" +msgstr "первый входной параметр" +msgid "first output parameter" +msgstr "первый выходной параметр" #: ../dialogs/PouDialog.py:31
-#: ../PLCOpenEditor.py:387
+#: ../PLCOpenEditor.py:399 @@ -3610,7 +3762,10 @@
-#: ../PLCOpenEditor.py:387
+msgid "internal state: 0-reset, 1-counting, 2-set" +msgstr "состояние: 0 - сброс, 1 - счёт, 2 - установка" +#: ../PLCOpenEditor.py:399 @@ -3631,14 +3786,16 @@
-#: ../PLCOpenEditor.py:346
-msgid "plcopen_about.html"
-msgstr "plcopen_about.ru.html"
#: ../dialogs/PouDialog.py:31
+msgid "second input parameter" +msgstr "второй входной параметр" +msgid "second output parameter" +msgstr "второй выходной параметр" #: ../dialogs/DurationEditorDialog.py:152
@@ -3658,29 +3815,130 @@
+msgid "update info unavailable." +msgstr "информация об обновлениях недоступна." -#: ../PLCOpenEditor.py:324
+#: ../PLCOpenEditor.py:331 msgstr "предупреждение: %s\n"
+#: ../PLCControler.py:970 +msgid "{a1} \"{a2}\" can't be pasted as a {a3}." +msgstr "{a1} \"{a2}\" не может быть вставлен как {a3}." +#: ../ConfigTreeNode.py:56 +"{a1} XML file doesn't follow XSD schema at line %{a2}:\n" +"{a1} XML файл не следует XSD-схеме в строке {a2}:\n" +#~ "An error has occurred.\n" +#~ "Click OK to save an error report.\n" +#~ "Please be kind enough to send this file to:\n" +#~ "edouard.tisserant@gmail.com\n" +#~ "Произошла ошибка.\n" +#~ "Нажмите OK, чтобы сохранить репорт об ошибке.\n" +#~ "Будьте так добры, пошлите этот файл:\n" +#~ "edouard.tisserant@gmail.com\n" +#~ msgid " -> Nothing to do\n" +#~ msgstr " -> Ничего не нужно делать\n" #~ msgid "\"%s\" element can't be pasted here!!!"
#~ msgstr "Элемент \"%s\" не может быть вставлен сюда!!!"
#~ msgid "... debugger recovered\n"
#~ msgstr "... отладчик восстановлен\n"
+#~ msgid "About Beremiz" +#~ msgid "About PLCOpenEditor" +#~ msgstr "О PLCOpenEditor" #~ msgid "Clear the graph values"
#~ msgstr "Очистить значения на графике"
+#~ "The derivative function block produces an output XOUT proportional to the rate of change of the input XIN." +#~ "Функциональный блок формирует выход XOUT пропорционально частоте изменения входа XIN." +#~ "The down-counter can be used to signal when a count has reached zero, on counting down from a preset value." +#~ "Декрементный счетчик\n" +#~ "Декрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг нулевого значения с исходного заданного значения." +#~ msgid "Enable_Native_Library" +#~ msgstr "Разрешить библиотеку Native" +#~ "Falling edge detector\n" +#~ "The output produces a single pulse when a falling edge is detected." +#~ "Детектор падающего фронта\n" +#~ "На выходе формируется одиночный импульс, если обнаружен падающий фронт." +#~ msgid "Form isn't complete. Pattern to search must be filled!" +#~ msgstr "Форма заполнена неполностью. Шаблон поиска должен быть заполнен!" +#~ "The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2." +#~ "Функциональный блок формирует дискретный выход с гистерезисом в зависимости от разницы двух вещественных входов XIN1 и XIN2." #~ msgid "IEC-61131-3 code generation failed !\n"
#~ msgstr "Неудачная генерация МЭК-61131-3 кода!\n"
+#~ msgstr "Исходное значение" +#~ "The integral function block integrates the value of input XIN over time." +#~ "Функциональный блок интегрирует входное значение XIN во времени." #~ msgid "Move debug variable down"
#~ msgstr "Переместить отлаживаемую переменную ниже"
@@ -3693,18 +3951,102 @@
#~ msgid "No output variable found"
#~ msgstr "Выходная переменная не найдена"
+#~ "The off-delay timer can be used to delay setting an output false, for fixed period after input goes false." +#~ "Таймер выключения\n" +#~ "Таймер выключения может быть использован, чтобы внести задержку установки выхода в FALSE на фиксированный период времени после того, как вход стал FALSE." +#~ "The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true." +#~ "Таймер выключения может быть использован, чтобы внести задержку установки выхода в TRUE на фиксированный период времени после того, как вход стал TRUE." +#~ "The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control." +#~ "ПИД (Пропорциональный Интегральный Дифференциальный) ФБ - классический регулятор, используемый в системах с обратной связью." +#~ "The pulse timer can be used to generate output pulses of a given time duration." +#~ "Генератор импульсов\n" +#~ "Функциональный блок используется для генерации выходных импульсов заданной длительности." +#~ "The RS bistable is a latch where the Reset dominates." +#~ "RS триггер - переключатель с доминантой выключения." +#~ "The RAMP function block is modelled on example given in the standard." +#~ "Ограничитель скорости изменения сигнала\n" +#~ "Функциональный блок написан согласно примеру, приведенному в стандарте." +#~ "The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on." +#~ "Часы реального времени используется для получения меток времени, установки даты и времени дня в отчетах, сообщениях об авариях и пр." #~ msgid "Remove debug variable"
#~ msgstr "Удалить отлаживаемую переменную"
#~ msgid "Reset zoom and offset"
#~ msgstr "Сбросить приближение и смещение"
+#~ "Rising edge detector\n" +#~ "The output produces a single pulse when a rising edge is detected." +#~ "Детектор нарастающего фронта\n" +#~ "На выходе формируется одиночный импульс, если обнаружен нарастающий фронт." +#~ "The SR bistable is a latch where the Set dominates." +#~ "SR триггер - переключатель с доминантой включения." +#~ "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources." +#~ "Семафор предоставляет собой программный механизм синхронизации для обеспечения исключительного доступа к определенным ресурсам." +#~ "The up-counter can be used to signal when a count has reached a maximum value." +#~ "Инкрементный счетчик\n" +#~ "Инкрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг максимального значения." +#~ "The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other." +#~ "Инкрементный/декрементный счетчик\n" +#~ "Инкрементный/декрементный счетчик имеет два входа CU и CD. Он может использоваться для счета вверх по одному входу и для счета низ по другому." @@ -3713,3 +4055,9 @@
+#~ msgstr "about.ru.html" +#~ msgid "plcopen_about.html" +#~ msgstr "plcopen_about.ru.html" --- a/i18n/messages.pot Thu Feb 16 14:34:40 2017 +0500
+++ b/i18n/messages.pot Thu Feb 16 14:35:12 2017 +0500
@@ -8,7 +8,7 @@
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-21 17:11+0300\n"
+"POT-Creation-Date: 2017-01-12 14:39+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,20 +17,7 @@
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../PLCOpenEditor.py:396
-"An error has occurred.\n"
-"Click OK to save an error report.\n"
-"Please be kind enough to send this file to:\n"
-"edouard.tisserant@gmail.com\n"
+#: ../PLCOpenEditor.py:408 ../Beremiz.py:1191 @@ -40,7 +27,7 @@
"Please be kind enough to send this file to:\n"
"beremiz-devel@lists.sourceforge.net\n"
-"You should now restart Beremiz.\n"
+"You should now restart program.\n" @@ -69,355 +56,369 @@
-#: ../PLCOpenEditor.py:406
-#: ../dialogs/PouTransitionDialog.py:94 ../dialogs/ProjectDialog.py:66
+#: ../dialogs/PouTransitionDialog.py:99 ../dialogs/ProjectDialog.py:66 #: ../dialogs/PouActionDialog.py:91 ../dialogs/PouDialog.py:113
-#: ../ProjectController.py:1027
+#: ../ProjectController.py:1089 msgid " generation failed !\n"
-#: ../plcopen/plcopen.py:883
+#: ../plcopen/plcopen.py:881 msgid "\"%s\" Data Type doesn't exist !!!"
-#: ../plcopen/plcopen.py:901
+#: ../plcopen/plcopen.py:899 msgid "\"%s\" POU already exists !!!"
-#: ../plcopen/plcopen.py:922
+#: ../plcopen/plcopen.py:920 msgid "\"%s\" POU doesn't exist !!!"
-#: ../editors/Viewer.py:242
-msgid "\"%s\" can't use itself!"
-#: ../IDEFrame.py:1615 ../IDEFrame.py:1634
-msgid "\"%s\" config already exists!"
-#: ../plcopen/plcopen.py:471
-msgid "\"%s\" configuration already exists !!!"
-msgid "\"%s\" data type already exists!"
-#: ../dialogs/PouTransitionDialog.py:105 ../dialogs/BlockPreviewDialog.py:219
-#: ../dialogs/PouActionDialog.py:102 ../editors/Viewer.py:258
-#: ../editors/Viewer.py:326 ../editors/Viewer.py:350 ../editors/Viewer.py:370
-#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
-#: ../controls/VariablePanel.py:386
-msgid "\"%s\" element for this pou already exists!"
-msgid "\"%s\" folder is not a valid Beremiz project\n"
-#: ../PLCGenerator.py:1091
-msgid "\"%s\" function cancelled in \"%s\" POU: No input connected"
-#: ../dialogs/SFCStepNameDialog.py:51 ../dialogs/PouTransitionDialog.py:101
-#: ../dialogs/BlockPreviewDialog.py:207 ../dialogs/PouNameDialog.py:49
-#: ../dialogs/PouActionDialog.py:98 ../dialogs/PouDialog.py:120
-#: ../editors/DataTypeEditor.py:554 ../editors/DataTypeEditor.py:583
-#: ../editors/CodeFileEditor.py:750 ../controls/VariablePanel.py:733
-msgid "\"%s\" is a keyword. It can't be used!"
#: ../editors/Viewer.py:246
-msgid "\"%s\" is already used by \"%s\"!"
-#: ../plcopen/plcopen.py:2405
+msgid "\"%s\" can't use itself!" +#: ../IDEFrame.py:1652 ../IDEFrame.py:1671 +msgid "\"%s\" config already exists!" +#: ../plcopen/plcopen.py:467 +msgid "\"%s\" configuration already exists !!!" +msgid "\"%s\" data type already exists!" +#: ../dialogs/PouTransitionDialog.py:110 ../dialogs/BlockPreviewDialog.py:219 +#: ../dialogs/PouActionDialog.py:102 ../editors/Viewer.py:262 +#: ../editors/Viewer.py:330 ../editors/Viewer.py:354 ../editors/Viewer.py:374 +#: ../editors/TextViewer.py:272 ../editors/TextViewer.py:301 +#: ../controls/VariablePanel.py:396 +msgid "\"%s\" element for this pou already exists!" +msgid "\"%s\" folder is not a valid Beremiz project\n" +#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouTransitionDialog.py:106 +#: ../dialogs/BlockPreviewDialog.py:207 ../dialogs/PouNameDialog.py:50 +#: ../dialogs/PouActionDialog.py:98 ../dialogs/PouDialog.py:120 +#: ../editors/DataTypeEditor.py:555 ../editors/DataTypeEditor.py:584 +#: ../editors/CodeFileEditor.py:770 ../controls/VariablePanel.py:751 +msgid "\"%s\" is a keyword. It can't be used!" +#: ../plcopen/plcopen.py:2412 msgid "\"%s\" is an invalid value!"
-#: ../PLCOpenEditor.py:332 ../PLCOpenEditor.py:369
+#: ../PLCOpenEditor.py:339 ../PLCOpenEditor.py:381 msgid "\"%s\" is not a valid folder!"
-#: ../dialogs/SFCStepNameDialog.py:49 ../dialogs/PouTransitionDialog.py:99
-#: ../dialogs/BlockPreviewDialog.py:203 ../dialogs/PouNameDialog.py:47
+#: ../dialogs/SFCStepNameDialog.py:50 ../dialogs/PouTransitionDialog.py:104 +#: ../dialogs/BlockPreviewDialog.py:203 ../dialogs/PouNameDialog.py:48 #: ../dialogs/PouActionDialog.py:96 ../dialogs/PouDialog.py:118
-#: ../editors/DataTypeEditor.py:578 ../editors/CodeFileEditor.py:748
-#: ../controls/VariablePanel.py:731 ../IDEFrame.py:1558
+#: ../editors/DataTypeEditor.py:579 ../editors/CodeFileEditor.py:768 +#: ../controls/VariablePanel.py:749 ../IDEFrame.py:1591 msgid "\"%s\" is not a valid identifier!"
msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
#: ../dialogs/BlockPreviewDialog.py:211 ../dialogs/PouDialog.py:122
-#: ../editors/Viewer.py:256 ../editors/Viewer.py:311 ../editors/Viewer.py:341
-#: ../editors/Viewer.py:363 ../editors/TextViewer.py:268
-#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:348
-#: ../editors/TextViewer.py:371 ../controls/VariablePanel.py:328
+#: ../editors/Viewer.py:260 ../editors/Viewer.py:315 ../editors/Viewer.py:345 +#: ../editors/Viewer.py:367 ../editors/TextViewer.py:270 +#: ../editors/TextViewer.py:299 ../editors/TextViewer.py:350 +#: ../editors/TextViewer.py:373 ../controls/VariablePanel.py:338 msgid "\"%s\" pou already exists!"
-#: ../plcopen/plcopen.py:495
-msgid "\"%s\" resource already exists in \"%s\" configuration !!!"
-#: ../plcopen/plcopen.py:512
-msgid "\"%s\" resource doesn't exist in \"%s\" configuration !!!"
-#: ../dialogs/SFCStepNameDialog.py:57
+#: ../dialogs/SFCStepNameDialog.py:58 msgid "\"%s\" step already exists!"
-#: ../editors/DataTypeEditor.py:549
+#: ../editors/DataTypeEditor.py:550 msgid "\"%s\" value already defined!"
-#: ../dialogs/ArrayTypeDialog.py:97 ../editors/DataTypeEditor.py:744
+#: ../dialogs/ArrayTypeDialog.py:97 ../editors/DataTypeEditor.py:745 msgid "\"%s\" value isn't a valid array dimension!"
-#: ../dialogs/ArrayTypeDialog.py:103 ../editors/DataTypeEditor.py:751
+#: ../dialogs/ArrayTypeDialog.py:103 ../editors/DataTypeEditor.py:752 "\"%s\" value isn't a valid array dimension!\n"
"Right value must be greater than left value."
-#: ../editors/CodeFileEditor.py:663
-#: ../PLCControler.py:970
+#: ../PLCGenerator.py:1101 +msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected" +#: ../editors/Viewer.py:250 +msgid "\"{a1}\" is already used by \"{a2}\"!" +#: ../plcopen/plcopen.py:491 +msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!" +#: ../plcopen/plcopen.py:509 +msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!" +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:578 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:569 -msgid "%s \"%s\" can't be pasted as a %s."
-#: ../PLCControler.py:1530
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:56 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:570 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:55 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:53 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:54 +#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572 +#: ../PLCControler.py:1531 -#: ../PLCControler.py:1513
+#: ../PLCControler.py:1514 -#: ../canfestival/SlaveEditor.py:46 ../canfestival/NetworkEditor.py:67
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:90 -#: ../ConfigTreeNode.py:32
-"%s XML file doesn't follow XSD schema at line %d:\n"
-#: ../plcopen/plcopen.py:1638 ../plcopen/plcopen.py:1645
-#: ../plcopen/plcopen.py:1657 ../plcopen/plcopen.py:1665
-#: ../plcopen/plcopen.py:1675
+#: ../plcopen/plcopen.py:1645 ../plcopen/plcopen.py:1652 +#: ../plcopen/plcopen.py:1664 ../plcopen/plcopen.py:1672 +#: ../plcopen/plcopen.py:1682 msgid "%s body don't have instances!"
-#: ../plcopen/plcopen.py:1693 ../plcopen/plcopen.py:1700
-#: ../plcopen/plcopen.py:1707
+#: ../plcopen/plcopen.py:1700 ../plcopen/plcopen.py:1707 +#: ../plcopen/plcopen.py:1714 msgid "%s body don't have text!"
+#: ../dialogs/AboutDialog.py:65 ../dialogs/AboutDialog.py:113 +#: ../dialogs/AboutDialog.py:150
+#: ../dialogs/AboutDialog.py:64 -#: ../PLCOpenEditor.py:119
+#: ../PLCOpenEditor.py:125
-#: ../controls/SearchResultPanel.py:252
-msgid "'%s' - %d match in project"
-#: ../controls/SearchResultPanel.py:254
-msgid "'%s' - %d matches in project"
-#: ../connectors/PYRO/__init__.py:86
-msgid "'%s' is located at %s\n"
-#: ../controls/SearchResultPanel.py:304
+#: ../controls/SearchResultPanel.py:239 +msgid "'{a1}' - {a2} match in project" +#: ../controls/SearchResultPanel.py:241 +msgid "'{a1}' - {a2} matches in project" +#: ../connectors/PYRO/__init__.py:90 +msgid "'{a1}' is located at {a2}\n" +#: ../controls/SearchResultPanel.py:291 -#: ../PLCOpenEditor.py:384 ../PLCOpenEditor.py:386 ../PLCOpenEditor.py:387
+#: ../PLCOpenEditor.py:396 ../PLCOpenEditor.py:398 ../PLCOpenEditor.py:399 -#: ../dialogs/PouTransitionDialog.py:96 ../dialogs/PouActionDialog.py:93
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/PouActionDialog.py:93 #: ../dialogs/PouDialog.py:115
-#: ../PLCOpenEditor.py:382
+#: ../PLCOpenEditor.py:394 -#: ../controls/LogViewer.py:278
#: ../controls/LogViewer.py:279
#: ../controls/LogViewer.py:280
#: ../controls/LogViewer.py:281
+#: ../controls/LogViewer.py:282 -#: ../dialogs/PouDialog.py:124 ../IDEFrame.py:1581 ../IDEFrame.py:1623
+#: ../dialogs/PouDialog.py:124 ../IDEFrame.py:1614 ../IDEFrame.py:1660 msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
-#: ../dialogs/SFCStepNameDialog.py:53 ../dialogs/PouTransitionDialog.py:103
-#: ../dialogs/PouNameDialog.py:51 ../dialogs/PouActionDialog.py:100
-#: ../controls/VariablePanel.py:735 ../IDEFrame.py:1593 ../IDEFrame.py:1604
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:108 +#: ../dialogs/PouNameDialog.py:52 ../dialogs/PouActionDialog.py:100 +#: ../controls/VariablePanel.py:753 ../IDEFrame.py:1628 ../IDEFrame.py:1641 msgid "A POU named \"%s\" already exists!"
-#: ../ConfigTreeNode.py:400
-msgid "A child named \"%s\" already exist -> \"%s\"\n"
-#: ../dialogs/BrowseLocationsDialog.py:211
+#: ../ConfigTreeNode.py:424 +msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n" +#: ../dialogs/BrowseLocationsDialog.py:216 msgid "A location must be selected!"
-#: ../dialogs/SFCStepNameDialog.py:55 ../controls/VariablePanel.py:737
-#: ../IDEFrame.py:1595 ../IDEFrame.py:1606
+#: ../dialogs/SFCStepNameDialog.py:56 ../controls/VariablePanel.py:755 +#: ../IDEFrame.py:1630 ../IDEFrame.py:1643 msgid "A variable with \"%s\" as name already exists in this pou!"
-#: ../editors/CodeFileEditor.py:754
+#: ../editors/CodeFileEditor.py:774 msgid "A variable with \"%s\" as name already exists!"
-#: ../PLCOpenEditor.py:152 ../Beremiz.py:374
+#: ../dialogs/AboutDialog.py:40 ../PLCOpenEditor.py:158 ../Beremiz.py:381
-#: ../PLCOpenEditor.py:346
-msgid "About PLCOpenEditor"
#: ../plcopen/iec_std.csv:22
-#: ../dialogs/SFCStepDialog.py:71 ../dialogs/ActionBlockDialog.py:42
+#: ../dialogs/SFCStepDialog.py:72 ../dialogs/ActionBlockDialog.py:42 -#: ../editors/Viewer.py:551 ../editors/Viewer.py:2069
+#: ../editors/Viewer.py:555 ../editors/Viewer.py:2345 @@ -429,7 +430,7 @@
-#: ../plcopen/plcopen.py:1356
+#: ../plcopen/plcopen.py:1359 msgid "Action with name %s doesn't exist!"
@@ -442,72 +443,72 @@
-#: ../editors/Viewer.py:1087
+#: ../editors/Viewer.py:1100 -#: ../canfestival/SlaveEditor.py:57 ../canfestival/NetworkEditor.py:78
-#: ../editors/Viewer.py:584 ../Beremiz.py:1024
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:101 +#: ../editors/Viewer.py:588 ../Beremiz.py:1060 -#: ../IDEFrame.py:1856 ../IDEFrame.py:1891
+#: ../IDEFrame.py:1890 ../IDEFrame.py:1925
msgid "Add C code accessing located variables synchronously"
msgid "Add Configuration"
-#: ../editors/Viewer.py:509
+#: ../editors/Viewer.py:513 msgid "Add Divergence Branch"
-#: ../dialogs/DiscoveryDialog.py:115
+#: ../dialogs/DiscoveryDialog.py:116
msgid "Add Python code executed asynchronously"
-#: ../IDEFrame.py:1867 ../IDEFrame.py:1917
+#: ../IDEFrame.py:1901 ../IDEFrame.py:1951 -#: ../IDEFrame.py:1845 ../IDEFrame.py:1888
+#: ../IDEFrame.py:1879 ../IDEFrame.py:1922 -#: ../editors/Viewer.py:496
+#: ../editors/Viewer.py:500 -#: ../editors/SFCViewer.py:359
+#: ../editors/SFCViewer.py:433 msgid "Add a new initial step"
-#: ../editors/Viewer.py:2672 ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2706 ../editors/SFCViewer.py:770 -#: ../editors/SFCViewer.py:381
+#: ../editors/SFCViewer.py:455
msgid "Add a simple WxGlade based GUI."
@@ -515,7 +516,7 @@
-#: ../editors/DataTypeEditor.py:351
+#: ../editors/DataTypeEditor.py:352 @@ -523,7 +524,7 @@
-#: ../canfestival/NetworkEditor.py:80
+#: ../canfestival/NetworkEditor.py:103 @@ -531,7 +532,7 @@
-#: ../editors/CodeFileEditor.py:640 ../controls/VariablePanel.py:440
+#: ../editors/CodeFileEditor.py:658 ../controls/VariablePanel.py:450 @@ -539,22 +540,22 @@
-#: ../plcopen/definitions.py:22
+#: ../plcopen/definitions.py:47 msgid "Additional function blocks"
-#: ../editors/Viewer.py:567
+#: ../editors/Viewer.py:571 msgid "Adjust Block Size"
-#: ../editors/Viewer.py:1612
+#: ../editors/Viewer.py:1637 -#: ../dialogs/BrowseLocationsDialog.py:34
-#: ../dialogs/BrowseLocationsDialog.py:42
-#: ../dialogs/BrowseLocationsDialog.py:135
-#: ../dialogs/BrowseLocationsDialog.py:138 ../controls/LogViewer.py:297
+#: ../dialogs/BrowseLocationsDialog.py:39 +#: ../dialogs/BrowseLocationsDialog.py:47 +#: ../dialogs/BrowseLocationsDialog.py:140 +#: ../dialogs/BrowseLocationsDialog.py:143 ../controls/LogViewer.py:298 #: ../controls/VariablePanel.py:70
@@ -563,11 +564,11 @@
msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
-#: ../ProjectController.py:1523
+#: ../ProjectController.py:1623 msgid "Already connected. Please disconnect\n"
-#: ../editors/DataTypeEditor.py:593
+#: ../editors/DataTypeEditor.py:594 msgid "An element named \"%s\" already exists in this structure!"
@@ -592,8 +593,8 @@
-#: ../editors/DataTypeEditor.py:54 ../editors/DataTypeEditor.py:634
-#: ../controls/VariablePanel.py:811
+#: ../editors/DataTypeEditor.py:54 ../editors/DataTypeEditor.py:635 +#: ../controls/VariablePanel.py:829 @@ -613,7 +614,7 @@
msgid "Author Name (optional):"
-#: ../dialogs/FindInPouDialog.py:78
+#: ../dialogs/FindInPouDialog.py:79 @@ -625,21 +626,21 @@
msgid "Bad domain name at "
-#: ../canfestival/config_utils.py:342 ../canfestival/config_utils.py:624
+#: ../canfestival/config_utils.py:342 ../canfestival/config_utils.py:630 msgid "Bad location size : %s"
-#: ../dialogs/ArrayTypeDialog.py:55 ../editors/DataTypeEditor.py:174
-#: ../editors/DataTypeEditor.py:204 ../editors/DataTypeEditor.py:296
+#: ../dialogs/ArrayTypeDialog.py:55 ../editors/DataTypeEditor.py:175 +#: ../editors/DataTypeEditor.py:205 ../editors/DataTypeEditor.py:297 -#: ../editors/DataTypeEditor.py:624 ../controls/VariablePanel.py:769
+#: ../editors/DataTypeEditor.py:625 ../controls/VariablePanel.py:787
@@ -671,7 +672,7 @@
msgid "Bitwise inverting"
-#: ../editors/Viewer.py:521 ../editors/Viewer.py:2073
+#: ../editors/Viewer.py:525 ../editors/Viewer.py:2358 @@ -679,151 +680,159 @@
-#: ../editors/TextViewer.py:261
+#: ../editors/TextViewer.py:262 -#: ../editors/Viewer.py:487
+#: ../editors/Viewer.py:491 +#: ../ProjectController.py:1301 #: ../dialogs/BrowseValuesLibraryDialog.py:37
msgid "Browse %s values library"
-#: ../dialogs/BrowseLocationsDialog.py:60
+#: ../dialogs/BrowseLocationsDialog.py:65 -#: ../ProjectController.py:1668
+#: ../ProjectController.py:1769 -#: ../ProjectController.py:1166
+#: ../ProjectController.py:1235 msgid "Build directory already clean\n"
-#: ../ProjectController.py:1669
+#: ../ProjectController.py:1770 msgid "Build project into build folder"
-#: ../ProjectController.py:956
+#: ../ProjectController.py:1018 msgid "C Build crashed !\n"
-#: ../ProjectController.py:953
+#: ../ProjectController.py:1015 msgid "C Build failed.\n"
-#: ../c_ext/CFileEditor.py:40
+#: ../c_ext/CFileEditor.py:63 -#: ../ProjectController.py:1031
+#: ../ProjectController.py:1093 msgid "C code generated successfully.\n"
-#: ../targets/toolchain_makefile.py:108
+#: ../targets/toolchain_makefile.py:122 msgid "C compilation failed.\n"
-#: ../targets/toolchain_gcc.py:132
+#: ../targets/toolchain_gcc.py:156 msgid "C compilation of %s failed.\n"
-#: ../canfestival/NetworkEditor.py:29
+#: ../dialogs/AboutDialog.py:63 +#: ../canfestival/NetworkEditor.py:52 -#: ../canfestival/SlaveEditor.py:21
+#: ../canfestival/SlaveEditor.py:44
-#: ../plcopen/plcopen.py:1580 ../plcopen/plcopen.py:1594
-#: ../plcopen/plcopen.py:1615 ../plcopen/plcopen.py:1631
+#: ../plcopen/plcopen.py:1584 ../plcopen/plcopen.py:1598 +#: ../plcopen/plcopen.py:1622 ../plcopen/plcopen.py:1638 msgid "Can only generate execution order on FBD networks!"
-#: ../controls/VariablePanel.py:259
+#: ../controls/VariablePanel.py:267 msgid "Can only give a location to local or global variables"
-#: ../PLCOpenEditor.py:327
+#: ../PLCOpenEditor.py:334 msgid "Can't generate program to file %s!"
-#: ../controls/VariablePanel.py:257
+#: ../controls/VariablePanel.py:265 msgid "Can't give a location to a function block instance"
-#: ../PLCOpenEditor.py:367
+#: ../PLCOpenEditor.py:379 msgid "Can't save project to file %s!"
-#: ../controls/VariablePanel.py:303
+#: ../controls/VariablePanel.py:313 msgid "Can't set an initial value to a function block instance"
-#: ../ConfigTreeNode.py:504
-msgid "Cannot create child %s of type %s "
-#: ../ConfigTreeNode.py:429
+#: ../ConfigTreeNode.py:529 +msgid "Cannot create child {a1} of type {a2} " +#: ../ConfigTreeNode.py:454 msgid "Cannot find lower free IEC channel than %d\n"
-#: ../connectors/PYRO/__init__.py:127
+#: ../connectors/PYRO/__init__.py:131 msgid "Cannot get PLC status - connection failed.\n"
-#: ../ProjectController.py:817
+#: ../ProjectController.py:881 msgid "Cannot open/parse VARIABLES.csv!\n"
-#: ../canfestival/config_utils.py:372
-msgid "Cannot set bit offset for non bool '%s' variable (ID:%d,Idx:%x,sIdx:%x))"
-#: ../dialogs/SearchInProjectDialog.py:67 ../dialogs/FindInPouDialog.py:87
+#: ../canfestival/config_utils.py:374 +msgid "Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))" +#: ../dialogs/SearchInProjectDialog.py:59 ../dialogs/FindInPouDialog.py:88 -#: ../editors/Viewer.py:482
+#: ../editors/Viewer.py:486 -#: ../Beremiz_service.py:245
+#: ../Beremiz_service.py:266 msgid "Change IP of interface to bind"
-#: ../Beremiz_service.py:244
+#: ../Beremiz_service.py:265
msgid "Change POU Type To"
-#: ../Beremiz_service.py:246
+#: ../Beremiz_service.py:267 msgid "Change Port Number"
-#: ../Beremiz_service.py:247
+#: ../Beremiz_service.py:268 msgid "Change working directory"
@@ -831,20 +840,20 @@
-#: ../svgui/svgui.py:101
+#: ../svgui/svgui.py:125 msgid "Choose a SVG file"
-#: ../ProjectController.py:420
+#: ../ProjectController.py:451 msgid "Choose a directory to save project"
-#: ../canfestival/canfestival.py:136 ../PLCOpenEditor.py:285
-#: ../PLCOpenEditor.py:317 ../PLCOpenEditor.py:361
+#: ../canfestival/canfestival.py:160 ../PLCOpenEditor.py:292 +#: ../PLCOpenEditor.py:324 ../PLCOpenEditor.py:373 -#: ../Beremiz.py:899 ../Beremiz.py:934
+#: ../Beremiz.py:931 ../Beremiz.py:966 @@ -853,15 +862,15 @@
msgid "Choose a value for %s:"
-#: ../Beremiz_service.py:293
+#: ../Beremiz_service.py:323 msgid "Choose a working directory "
-#: ../ProjectController.py:334
+#: ../ProjectController.py:358 msgid "Chosen folder doesn't contain a program. It's not a valid project!"
-#: ../ProjectController.py:301
+#: ../ProjectController.py:325 msgid "Chosen folder isn't empty. You can't use it for a new project!"
@@ -869,7 +878,7 @@
-#: ../controls/VariablePanel.py:431
+#: ../controls/VariablePanel.py:441 @@ -877,52 +886,52 @@
-#: ../ProjectController.py:1672
+#: ../ProjectController.py:1773 -#: ../controls/LogViewer.py:317
+#: ../controls/LogViewer.py:318 msgid "Clean log messages"
-#: ../ProjectController.py:1674
+#: ../ProjectController.py:1775 msgid "Clean project build folder"
-#: ../ProjectController.py:1163
+#: ../ProjectController.py:1232 msgid "Cleaning the build directory\n"
-#: ../editors/Viewer.py:577
+#: ../editors/Viewer.py:582 msgid "Clear Execution Order"
-#: ../dialogs/FindInPouDialog.py:110
+#: ../dialogs/SearchInProjectDialog.py:105 ../dialogs/FindInPouDialog.py:111 -#: ../PLCOpenEditor.py:192 ../Beremiz.py:667
+#: ../PLCOpenEditor.py:199 ../Beremiz.py:693 msgid "Close Application"
-#: ../PLCOpenEditor.py:102 ../Beremiz.py:326 ../Beremiz.py:611
+#: ../PLCOpenEditor.py:108 ../Beremiz.py:333 ../Beremiz.py:637 -#: ../PLCOpenEditor.py:100 ../Beremiz.py:324
+#: ../PLCOpenEditor.py:106 ../Beremiz.py:331 -#: ../editors/Viewer.py:537 ../editors/Viewer.py:2084
+#: ../editors/Viewer.py:541 ../editors/Viewer.py:2366 -#: ../editors/Viewer.py:557 ../editors/LDViewer.py:506
+#: ../editors/Viewer.py:561 ../editors/LDViewer.py:506 @@ -942,7 +951,7 @@
-#: ../ProjectController.py:609
+#: ../ProjectController.py:672 msgid "Compiling IEC Program into C code...\n"
@@ -950,15 +959,15 @@
-#: ../editors/ConfTreeNodeEditor.py:206
+#: ../editors/ConfTreeNodeEditor.py:229 -#: ../editors/ProjectNodeEditor.py:13
+#: ../editors/ProjectNodeEditor.py:36 -#: ../dialogs/SearchInProjectDialog.py:47
+#: ../dialogs/SearchInProjectDialog.py:39 @@ -966,27 +975,27 @@
-#: ../editors/Viewer.py:303 ../editors/Viewer.py:333 ../editors/Viewer.py:355
-#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:340
-#: ../editors/TextViewer.py:363 ../controls/VariablePanel.py:318
+#: ../editors/Viewer.py:307 ../editors/Viewer.py:337 ../editors/Viewer.py:359 +#: ../editors/TextViewer.py:291 ../editors/TextViewer.py:342 +#: ../editors/TextViewer.py:365 ../controls/VariablePanel.py:328 msgid "Confirm or change variable name"
-#: ../ProjectController.py:1687
+#: ../ProjectController.py:1788 -#: ../ProjectController.py:1688
+#: ../ProjectController.py:1789 msgid "Connect to the target PLC"
-#: ../ProjectController.py:1212
+#: ../ProjectController.py:1292 msgid "Connected to URI: %s"
-#: ../dialogs/SFCTransitionDialog.py:75 ../editors/Viewer.py:523
-#: ../editors/Viewer.py:2075
+#: ../dialogs/SFCTransitionDialog.py:76 ../editors/Viewer.py:527 +#: ../editors/Viewer.py:2359 @@ -994,29 +1003,33 @@
msgid "Connection Properties"
-#: ../ProjectController.py:1547
+#: ../ProjectController.py:1647 msgid "Connection canceled!\n"
-#: ../ProjectController.py:1572
+#: ../ProjectController.py:1672 msgid "Connection failed to %s!\n"
-#: ../connectors/PYRO/__init__.py:98
+#: ../connectors/PYRO/__init__.py:115 ../connectors/WAMP/__init__.py:111 +msgid "Connection lost!\n" +#: ../connectors/PYRO/__init__.py:102 msgid "Connection to '%s' failed.\n"
-#: ../dialogs/ConnectionDialog.py:64 ../editors/Viewer.py:1569
+#: ../dialogs/ConnectionDialog.py:64 ../editors/Viewer.py:1594 -#: ../dialogs/SFCStepDialog.py:64
+#: ../dialogs/SFCStepDialog.py:65
@@ -1024,7 +1037,7 @@
-#: ../editors/Viewer.py:533 ../editors/Viewer.py:2080
+#: ../editors/Viewer.py:537 ../editors/Viewer.py:2362 @@ -1032,7 +1045,7 @@
msgid "Content Description (optional):"
-#: ../dialogs/ConnectionDialog.py:65 ../editors/Viewer.py:1570
+#: ../dialogs/ConnectionDialog.py:65 ../editors/Viewer.py:1595 @@ -1052,12 +1065,12 @@
msgid "Conversion to time-of-day"
-#: ../editors/Viewer.py:593 ../controls/LogViewer.py:692 ../IDEFrame.py:346
+#: ../editors/Viewer.py:597 ../controls/LogViewer.py:693 ../IDEFrame.py:370
@@ -1073,49 +1086,49 @@
-#: ../ConfigTreeNode.py:626
+#: ../ConfigTreeNode.py:656 -"Could not add child \"%s\", type %s :\n"
-#: ../py_ext/PythonFileCTNMixin.py:53
+"Could not add child \"{a1}\", type {a2} :\n" +#: ../py_ext/PythonFileCTNMixin.py:77 msgid "Couldn't import old %s file."
-#: ../ConfigTreeNode.py:598
+#: ../ConfigTreeNode.py:626 -"Couldn't load confnode base parameters %s :\n"
-#: ../ConfigTreeNode.py:614 ../CodeFileTreeNode.py:99
+"Couldn't load confnode base parameters {a1} :\n" +#: ../ConfigTreeNode.py:643 ../CodeFileTreeNode.py:124 -"Couldn't load confnode parameters %s :\n"
+"Couldn't load confnode parameters {a1} :\n" #: ../PLCControler.py:946
msgid "Couldn't paste non-POU object."
-#: ../ProjectController.py:1486
+#: ../ProjectController.py:1589 msgid "Couldn't start PLC !\n"
-#: ../ProjectController.py:1494
+#: ../ProjectController.py:1597 msgid "Couldn't stop PLC !\n"
-#: ../ProjectController.py:1458
+#: ../ProjectController.py:1561 msgid "Couldn't stop debugger.\n"
@@ -1127,71 +1140,79 @@
msgid "Create a new action"
msgid "Create a new action block"
-#: ../IDEFrame.py:84 ../IDEFrame.py:114 ../IDEFrame.py:147
+#: ../IDEFrame.py:108 ../IDEFrame.py:138 ../IDEFrame.py:171 msgid "Create a new block"
msgid "Create a new branch"
-msgid "Create a new coil"
-#: ../IDEFrame.py:78 ../IDEFrame.py:93 ../IDEFrame.py:123
-msgid "Create a new comment"
-#: ../IDEFrame.py:87 ../IDEFrame.py:117 ../IDEFrame.py:150
-msgid "Create a new connection"
-#: ../IDEFrame.py:105 ../IDEFrame.py:156
-msgid "Create a new contact"
-msgid "Create a new divergence"
-#: ../dialogs/SFCDivergenceDialog.py:51
-msgid "Create a new divergence or convergence"
+msgid "Create a new coil" +#: ../IDEFrame.py:102 ../IDEFrame.py:117 ../IDEFrame.py:147 +msgid "Create a new comment" +#: ../IDEFrame.py:111 ../IDEFrame.py:141 ../IDEFrame.py:174 +msgid "Create a new connection" +#: ../IDEFrame.py:129 ../IDEFrame.py:180 +msgid "Create a new contact" +msgid "Create a new divergence" +#: ../dialogs/SFCDivergenceDialog.py:53 +msgid "Create a new divergence or convergence" msgid "Create a new initial step"
msgid "Create a new jump"
-#: ../IDEFrame.py:96 ../IDEFrame.py:153
+#: ../IDEFrame.py:120 ../IDEFrame.py:177 msgid "Create a new power rail"
msgid "Create a new rung"
msgid "Create a new step"
-#: ../dialogs/PouTransitionDialog.py:42 ../IDEFrame.py:132
+#: ../dialogs/PouTransitionDialog.py:47 ../IDEFrame.py:156 msgid "Create a new transition"
-#: ../IDEFrame.py:81 ../IDEFrame.py:111 ../IDEFrame.py:144
+#: ../IDEFrame.py:105 ../IDEFrame.py:135 ../IDEFrame.py:168 msgid "Create a new variable"
-#: ../editors/Viewer.py:592 ../IDEFrame.py:344 ../IDEFrame.py:400
+#: ../dialogs/AboutDialog.py:105 +#: ../Beremiz_service.py:432 +msgid "Current working directory :" +#: ../editors/Viewer.py:596 ../IDEFrame.py:368 ../IDEFrame.py:424 @@ -1207,15 +1228,15 @@
-#: ../canfestival/SlaveEditor.py:53 ../canfestival/NetworkEditor.py:74
+#: ../canfestival/SlaveEditor.py:76 ../canfestival/NetworkEditor.py:97 -#: ../canfestival/SlaveEditor.py:54 ../canfestival/NetworkEditor.py:75
+#: ../canfestival/SlaveEditor.py:77 ../canfestival/NetworkEditor.py:98 -#: ../dialogs/SearchInProjectDialog.py:43
+#: ../dialogs/SearchInProjectDialog.py:35 @@ -1244,7 +1265,7 @@
-#: ../ProjectController.py:1594
+#: ../ProjectController.py:1694 msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
@@ -1252,42 +1273,42 @@
-#: ../editors/Viewer.py:1104 ../editors/Viewer.py:3596
+#: ../editors/Viewer.py:1117 ../editors/Viewer.py:3653 -#: ../ProjectController.py:1247
+#: ../ProjectController.py:1350 msgid "Debug: Unknown variable '%s'\n"
-#: ../ProjectController.py:1245
+#: ../ProjectController.py:1348 msgid "Debug: Unsupported type to debug '%s'\n"
-#: ../ProjectController.py:1427
+#: ../ProjectController.py:1530 msgid "Debugger disabled\n"
-#: ../ProjectController.py:1591
+#: ../ProjectController.py:1691 -#: ../ProjectController.py:1460
+#: ../ProjectController.py:1563 msgid "Debugger stopped.\n"
-#: ../editors/Viewer.py:568 ../Beremiz.py:1028 ../IDEFrame.py:1925
+#: ../editors/Viewer.py:572 ../Beremiz.py:1064 ../IDEFrame.py:1959 -#: ../editors/Viewer.py:510
+#: ../editors/Viewer.py:514 msgid "Delete Divergence Branch"
@@ -1295,7 +1316,7 @@
-#: ../editors/Viewer.py:497
+#: ../editors/Viewer.py:501 msgid "Delete Wire Segment"
@@ -1307,33 +1328,23 @@
msgid "Deletion (within)"
-#: ../editors/DataTypeEditor.py:152
+#: ../editors/DataTypeEditor.py:153 -#: ../plcopen/definitions.py:41
-"The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
-#: ../editors/CodeFileEditor.py:664
-#: ../controls/VariablePanel.py:422
+#: ../controls/VariablePanel.py:432 -#: ../dialogs/ArrayTypeDialog.py:61 ../editors/DataTypeEditor.py:320
+#: ../dialogs/ArrayTypeDialog.py:61 ../editors/DataTypeEditor.py:321 -#: ../dialogs/FindInPouDialog.py:67
+#: ../dialogs/FindInPouDialog.py:68 -#: ../dialogs/BrowseLocationsDialog.py:85
+#: ../dialogs/BrowseLocationsDialog.py:90 @@ -1341,15 +1352,19 @@
-#: ../ProjectController.py:1696
+#: ../ProjectController.py:1797 -#: ../ProjectController.py:1698
+#: ../ProjectController.py:1799 msgid "Disconnect from PLC"
-#: ../editors/Viewer.py:552 ../editors/Viewer.py:2061
+#: ../ProjectController.py:1302 +#: ../editors/Viewer.py:556 ../editors/Viewer.py:2354 @@ -1366,25 +1381,19 @@
-#: ../PLCOpenEditor.py:321
+#: ../PLCOpenEditor.py:328 -#: ../plcopen/definitions.py:34
-"The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
#: ../dialogs/ActionBlockDialog.py:38
-#: ../canfestival/canfestival.py:139
+#: ../canfestival/canfestival.py:163 msgid "EDS files (*.eds)|*.eds|All files|*.*"
-#: ../editors/Viewer.py:566
+#: ../editors/Viewer.py:570 @@ -1400,11 +1409,11 @@
-#: ../dialogs/SFCStepDialog.py:49
+#: ../dialogs/SFCStepDialog.py:50 -#: ../wxglade_hmi/wxglade_hmi.py:12
+#: ../wxglade_hmi/wxglade_hmi.py:36 msgid "Edit a WxWidgets GUI with WXGlade"
@@ -1416,7 +1425,7 @@
msgid "Edit array type properties"
-#: ../editors/Viewer.py:2541 ../editors/Viewer.py:2952
+#: ../editors/Viewer.py:2575 ../editors/Viewer.py:3004 @@ -1428,47 +1437,51 @@
-#: ../editors/Viewer.py:2916
+#: ../editors/Viewer.py:2963 -#: ../ProjectController.py:1710
+#: ../ProjectController.py:1811 msgid "Edit raw IEC code added to code generated by PLCGenerator"
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:799 -#: ../dialogs/SFCTransitionDialog.py:50
+#: ../dialogs/SFCTransitionDialog.py:51
-#: ../ProjectController.py:1126
+#: ../ProjectController.py:1195 -#: ../editors/DataTypeEditor.py:347
+#: ../editors/DataTypeEditor.py:348
+#: ../ProjectController.py:1300 -#: ../Beremiz_service.py:299
+#: ../Beremiz_service.py:331 -#: ../Beremiz_service.py:286
+#: ../Beremiz_service.py:316 msgid "Enter a port number "
-#: ../Beremiz_service.py:277
+#: ../Beremiz_service.py:307 msgid "Enter the IP of the interface to bind"
@@ -1481,66 +1494,67 @@
#: ../dialogs/ForceVariableDialog.py:179
-#: ../dialogs/SearchInProjectDialog.py:157 ../dialogs/SFCStepNameDialog.py:59
+#: ../dialogs/SearchInProjectDialog.py:168 ../dialogs/SFCStepNameDialog.py:60 #: ../dialogs/DurationEditorDialog.py:121
-#: ../dialogs/DurationEditorDialog.py:163 ../dialogs/PouTransitionDialog.py:107
+#: ../dialogs/DurationEditorDialog.py:163 ../dialogs/PouTransitionDialog.py:112 #: ../dialogs/BlockPreviewDialog.py:236 ../dialogs/ProjectDialog.py:71
#: ../dialogs/ArrayTypeDialog.py:97 ../dialogs/ArrayTypeDialog.py:103
-#: ../dialogs/PouNameDialog.py:53 ../dialogs/BrowseLocationsDialog.py:211
+#: ../dialogs/PouNameDialog.py:54 ../dialogs/BrowseLocationsDialog.py:216 #: ../dialogs/BrowseValuesLibraryDialog.py:83 ../dialogs/PouActionDialog.py:104
-#: ../dialogs/PouDialog.py:134 ../PLCOpenEditor.py:328 ../PLCOpenEditor.py:333
-#: ../PLCOpenEditor.py:407 ../PLCOpenEditor.py:417 ../editors/Viewer.py:419
+#: ../dialogs/PouDialog.py:134 ../PLCOpenEditor.py:335 ../PLCOpenEditor.py:340 +#: ../PLCOpenEditor.py:420 ../PLCOpenEditor.py:430 ../editors/Viewer.py:423 #: ../editors/LDViewer.py:666 ../editors/LDViewer.py:882
-#: ../editors/LDViewer.py:886 ../editors/DataTypeEditor.py:549
-#: ../editors/DataTypeEditor.py:554 ../editors/DataTypeEditor.py:578
-#: ../editors/DataTypeEditor.py:583 ../editors/DataTypeEditor.py:593
-#: ../editors/DataTypeEditor.py:744 ../editors/DataTypeEditor.py:751
-#: ../editors/TextViewer.py:387 ../editors/CodeFileEditor.py:763
-#: ../ProjectController.py:269 ../controls/FolderTree.py:217
+#: ../editors/LDViewer.py:886 ../editors/DataTypeEditor.py:550 +#: ../editors/DataTypeEditor.py:555 ../editors/DataTypeEditor.py:579 +#: ../editors/DataTypeEditor.py:584 ../editors/DataTypeEditor.py:594 +#: ../editors/DataTypeEditor.py:745 ../editors/DataTypeEditor.py:752 +#: ../editors/TextViewer.py:389 ../editors/CodeFileEditor.py:783 +#: ../ProjectController.py:293 ../ProjectController.py:421 +#: ../ProjectController.py:428 ../controls/FolderTree.py:217 #: ../controls/DebugVariablePanel/DebugVariablePanel.py:166
#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:137
-#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:225
-#: ../controls/VariablePanel.py:392 ../controls/VariablePanel.py:754
-#: ../Beremiz.py:1167 ../IDEFrame.py:975 ../IDEFrame.py:1581
-#: ../IDEFrame.py:1618 ../IDEFrame.py:1623 ../IDEFrame.py:1637
-#: ../IDEFrame.py:1642 ../Beremiz_service.py:190
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:231 +#: ../controls/VariablePanel.py:402 ../controls/VariablePanel.py:772 +#: ../Beremiz.py:1203 ../IDEFrame.py:1003 ../IDEFrame.py:1614 +#: ../IDEFrame.py:1655 ../IDEFrame.py:1660 ../IDEFrame.py:1674 +#: ../IDEFrame.py:1679 ../Beremiz_service.py:211 -#: ../ProjectController.py:663
+#: ../ProjectController.py:727 msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
-#: ../ProjectController.py:655
+#: ../ProjectController.py:719 msgid "Error : IEC to C compiler returned %d\n"
-#: ../ProjectController.py:589
+#: ../ProjectController.py:621 "Error in ST/IL/SFC code generator :\n"
-#: ../ConfigTreeNode.py:192
+#: ../ConfigTreeNode.py:216 msgid "Error while saving \"%s\"\n"
-#: ../canfestival/canfestival.py:144
+#: ../canfestival/canfestival.py:168 msgid "Error: Export slave failed\n"
-#: ../canfestival/canfestival.py:345
+#: ../canfestival/canfestival.py:369 msgid "Error: No Master generated\n"
-#: ../canfestival/canfestival.py:340
+#: ../canfestival/canfestival.py:364 msgid "Error: No PLC built\n"
-#: ../ProjectController.py:1566
+#: ../ProjectController.py:1666 msgid "Exception while connecting %s!\n"
@@ -1553,7 +1567,7 @@
msgid "Experimental web based HMI"
@@ -1565,7 +1579,7 @@
-#: ../canfestival/canfestival.py:150
+#: ../canfestival/canfestival.py:174 msgid "Export CanOpen slave to EDS file"
@@ -1573,7 +1587,7 @@
msgid "Export graph values to clipboard"
-#: ../canfestival/canfestival.py:149
+#: ../canfestival/canfestival.py:173 @@ -1585,33 +1599,32 @@
-#: ../ProjectController.py:676
+#: ../ProjectController.py:740 msgid "Extracting Located Variables...\n"
-#: ../dialogs/PouTransitionDialog.py:35 ../dialogs/PouActionDialog.py:31
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31 #: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
-#: ../ProjectController.py:1629
+#: ../ProjectController.py:1729 msgid "Failed : Must build before transfer.\n"
-#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:458
+#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:462 -#: ../plcopen/definitions.py:32
-"Falling edge detector\n"
-"The output produces a single pulse when a falling edge is detected."
-#: ../ProjectController.py:946
+#: ../ProjectController.py:1008 msgid "Fatal : cannot get builder.\n"
#: ../dialogs/DurationEditorDialog.py:160
msgid "Field %s hasn't a valid value!"
@@ -1627,16 +1640,16 @@
msgid "File '%s' already exists!"
-#: ../dialogs/FindInPouDialog.py:35 ../dialogs/FindInPouDialog.py:105
+#: ../dialogs/SearchInProjectDialog.py:100 ../dialogs/FindInPouDialog.py:36 +#: ../dialogs/FindInPouDialog.py:106 ../IDEFrame.py:375
@@ -1648,11 +1661,11 @@
-#: ../connectors/PYRO/__init__.py:159
+#: ../connectors/PYRO/__init__.py:163 msgid "Force runtime reload\n"
-#: ../editors/Viewer.py:1528
+#: ../editors/Viewer.py:1553 @@ -1660,44 +1673,40 @@
msgid "Forcing Variable Value"
-#: ../dialogs/SFCTransitionDialog.py:178 ../dialogs/PouTransitionDialog.py:97
+#: ../dialogs/SFCTransitionDialog.py:179 ../dialogs/PouTransitionDialog.py:102 #: ../dialogs/ProjectDialog.py:70 ../dialogs/PouActionDialog.py:94
#: ../dialogs/PouDialog.py:116
msgid "Form isn't complete. %s must be filled!"
-#: ../dialogs/SFCStepDialog.py:141 ../dialogs/FBDBlockDialog.py:232
+#: ../dialogs/SFCStepDialog.py:144 ../dialogs/FBDBlockDialog.py:232 #: ../dialogs/ConnectionDialog.py:160
msgid "Form isn't complete. Name must be filled!"
-#: ../dialogs/SearchInProjectDialog.py:145
-msgid "Form isn't complete. Pattern to search must be filled!"
#: ../dialogs/FBDBlockDialog.py:228
msgid "Form isn't complete. Valid block type must be selected!"
-#: ../dialogs/FindInPouDialog.py:73
+#: ../dialogs/FindInPouDialog.py:74 -#: ../dialogs/SearchInProjectDialog.py:44 ../IDEFrame.py:1712
+#: ../dialogs/SearchInProjectDialog.py:36 ../IDEFrame.py:1746
-#: ../dialogs/SearchInProjectDialog.py:45 ../IDEFrame.py:1711
+#: ../dialogs/SearchInProjectDialog.py:37 ../IDEFrame.py:1745 -#: ../controls/VariablePanel.py:807
+#: ../controls/VariablePanel.py:825 msgid "Function Block Types"
@@ -1705,11 +1714,11 @@
-#: ../editors/Viewer.py:244
+#: ../editors/Viewer.py:248 msgid "Function Blocks can't be used in Functions!"
-#: ../PLCControler.py:2336
+#: ../PLCControler.py:2337 msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
@@ -1718,11 +1727,11 @@
-#: ../PLCOpenEditor.py:109
+#: ../PLCOpenEditor.py:115 -#: ../ProjectController.py:580
+#: ../ProjectController.py:612 msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
@@ -1750,6 +1759,10 @@
+#: ../runtime/NevowServer.py:181 +msgid "HTTP interface port :" #: ../controls/ProjectPropertiesPanel.py:120
@@ -1766,62 +1779,51 @@
-#: ../plcopen/definitions.py:44
-"The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
-#: ../dialogs/PouTransitionDialog.py:35 ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouActionDialog.py:31 ../dialogs/PouDialog.py:36 -#: ../dialogs/DiscoveryDialog.py:93
+#: ../dialogs/DiscoveryDialog.py:94 -#: ../Beremiz_service.py:278 ../Beremiz_service.py:279
+#: ../Beremiz_service.py:308 ../Beremiz_service.py:309 -#: ../svgui/svgui.py:18 ../svgui/svgui.py:19
+#: ../svgui/svgui.py:42 ../svgui/svgui.py:43 -#: ../dialogs/FBDVariableDialog.py:38 ../editors/Viewer.py:1555
+#: ../dialogs/FBDVariableDialog.py:38 ../editors/Viewer.py:1580 #: ../controls/VariablePanel.py:71
-#: ../editors/Viewer.py:1087
+#: ../editors/Viewer.py:1100 -#: ../controls/VariablePanel.py:268
-msgid "Incompatible data types between \"%s\" and \"%s\""
-#: ../controls/VariablePanel.py:277
-msgid "Incompatible size of data between \"%s\" and \"%s\""
-#: ../controls/VariablePanel.py:273
+#: ../controls/VariablePanel.py:276 +msgid "Incompatible data types between \"{a1}\" and \"{a2}\"" +#: ../controls/VariablePanel.py:282 msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+#: ../controls/VariablePanel.py:286 +msgid "Incompatible size of data between \"{a1}\" and \"{a2}\"" #: ../dialogs/ActionBlockDialog.py:38
-#: ../editors/CodeFileEditor.py:663
-#: ../editors/Viewer.py:548 ../editors/Viewer.py:2058
+#: ../editors/Viewer.py:552 @@ -1830,22 +1832,24 @@
-#: ../editors/DataTypeEditor.py:184 ../editors/DataTypeEditor.py:215
-#: ../editors/DataTypeEditor.py:271 ../editors/DataTypeEditor.py:309
+#: ../editors/DataTypeEditor.py:185 ../editors/DataTypeEditor.py:216 +#: ../editors/DataTypeEditor.py:272 ../editors/DataTypeEditor.py:310
-#: ../dialogs/SFCTransitionDialog.py:74 ../dialogs/ActionBlockDialog.py:42
+#: ../dialogs/SFCTransitionDialog.py:75 ../dialogs/ActionBlockDialog.py:42 -#: ../dialogs/SFCStepDialog.py:69 ../dialogs/FBDVariableDialog.py:37
-#: ../dialogs/BrowseLocationsDialog.py:35 ../editors/Viewer.py:1553
-#: ../controls/VariablePanel.py:71
+#: ../dialogs/SFCStepDialog.py:70 ../dialogs/FBDVariableDialog.py:37 +#: ../dialogs/BrowseLocationsDialog.py:40 ../editors/Viewer.py:289 +#: ../editors/Viewer.py:1578 ../editors/TextViewer.py:307 +#: ../controls/LocationCellEditor.py:98 ../controls/VariablePanel.py:71 +#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351 @@ -1857,7 +1861,7 @@
-#: ../plcopen/plcopen.py:1684
+#: ../plcopen/plcopen.py:1691 msgid "Instance with id %d doesn't exist!"
@@ -1866,12 +1870,6 @@
-#: ../plcopen/definitions.py:40
-"The integral function block integrates the value of input XIN over time."
#: ../controls/VariablePanel.py:70
@@ -1884,48 +1882,53 @@
-#: ../PLCControler.py:2324
+#: ../PLCControler.py:2325 msgid "Invalid plcopen element(s)!!!"
-#: ../canfestival/config_utils.py:377 ../canfestival/config_utils.py:638
-msgid "Invalid type \"%s\"-> %d != %d for location\"%s\""
-#: ../dialogs/ForceVariableDialog.py:177
-msgid "Invalid value \"%s\" for \"%s\" variable!"
+#: ../canfestival/config_utils.py:381 +msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location\"{a4}\"" +#: ../canfestival/config_utils.py:645 +msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\"" #: ../controls/DebugVariablePanel/DebugVariablePanel.py:132
#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:92
-#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:160
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:166 msgid "Invalid value \"%s\" for debug variable"
-#: ../controls/VariablePanel.py:247 ../controls/VariablePanel.py:250
+#: ../controls/VariablePanel.py:255 ../controls/VariablePanel.py:258 msgid "Invalid value \"%s\" for variable grid element"
-#: ../editors/Viewer.py:229 ../editors/Viewer.py:232
+#: ../editors/Viewer.py:233 ../editors/Viewer.py:236 msgid "Invalid value \"%s\" for viewer block"
+#: ../dialogs/ForceVariableDialog.py:177 +msgid "Invalid value \"{a1}\" for \"{a2}\" variable!" #: ../dialogs/DurationEditorDialog.py:121
"You must fill a numeric value."
-#: ../editors/Viewer.py:553 ../editors/Viewer.py:2062
+#: ../editors/Viewer.py:557 ../editors/Viewer.py:2343 -#: ../dialogs/PouTransitionDialog.py:35 ../dialogs/PouActionDialog.py:31
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31 #: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
@@ -1935,7 +1938,7 @@
msgid "Ladder element with id %d is on more than one rung."
-#: ../dialogs/PouTransitionDialog.py:86 ../dialogs/PouActionDialog.py:83
+#: ../dialogs/PouTransitionDialog.py:91 ../dialogs/PouActionDialog.py:83 #: ../dialogs/PouDialog.py:104
@@ -1944,28 +1947,28 @@
msgid "Language (optional):"
-#: ../dialogs/PouTransitionDialog.py:60 ../dialogs/PouActionDialog.py:56
+#: ../dialogs/PouTransitionDialog.py:65 ../dialogs/PouActionDialog.py:56 #: ../dialogs/PouDialog.py:73
-#: ../ProjectController.py:1635
+#: ../ProjectController.py:1735 msgid "Latest build already matches current target. Transfering anyway...\n"
-#: ../Beremiz_service.py:250
+#: ../Beremiz_service.py:271 msgid "Launch WX GUI inspector"
-#: ../Beremiz_service.py:249
+#: ../Beremiz_service.py:270 msgid "Launch a live Python shell"
-#: ../editors/Viewer.py:481
+#: ../editors/Viewer.py:485 -#: ../dialogs/LDPowerRailDialog.py:61
+#: ../dialogs/LDPowerRailDialog.py:62 @@ -1981,27 +1984,31 @@
msgid "Less than or equal to"
+#: ../dialogs/AboutDialog.py:143 #: ../plcopen/iec_std.csv:73
-#: ../targets/toolchain_gcc.py:142
+#: ../targets/toolchain_gcc.py:166 -#: ../dialogs/DiscoveryDialog.py:110 ../controls/VariablePanel.py:72
+#: ../dialogs/DiscoveryDialog.py:111 ../controls/VariablePanel.py:72 -#: ../canfestival/canfestival.py:322
+#: ../canfestival/canfestival.py:346 -#: ../ProjectController.py:1541
+#: ../ProjectController.py:1641 msgid "Local service discovery failed!\n"
@@ -2009,7 +2016,7 @@
-#: ../dialogs/BrowseLocationsDialog.py:67
+#: ../dialogs/BrowseLocationsDialog.py:72 msgid "Locations available:"
@@ -2017,41 +2024,43 @@
msgid "Logarithm to base 10"
-#: ../connectors/PYRO/__init__.py:90
+#: ../connectors/PYRO/__init__.py:94 msgid "MDNS resolution failure for '%s'\n"
-#: ../canfestival/SlaveEditor.py:41 ../canfestival/NetworkEditor.py:62
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:85
msgid "Map located variables over CANopen"
-#: ../canfestival/NetworkEditor.py:83
+#: ../canfestival/NetworkEditor.py:106 -#: ../ConfigTreeNode.py:514
-msgid "Max count (%d) reached for this confnode of type %s "
+#: ../ConfigTreeNode.py:539 +msgid "Max count ({a1}) reached for this confnode of type {a2} " #: ../plcopen/iec_std.csv:71
-#: ../editors/DataTypeEditor.py:238
+#: ../editors/DataTypeEditor.py:239 -#: ../dialogs/BrowseLocationsDialog.py:37
+#: ../dialogs/BrowseLocationsDialog.py:42 ../editors/Viewer.py:289 +#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:98 +#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351
@@ -2059,7 +2068,7 @@
-#: ../editors/Viewer.py:486
+#: ../editors/Viewer.py:490 @@ -2071,7 +2080,7 @@
-#: ../editors/DataTypeEditor.py:225
+#: ../editors/DataTypeEditor.py:226 @@ -2087,9 +2096,9 @@
-#: ../PLCGenerator.py:778 ../PLCGenerator.py:1217
-msgid "More than one connector found corresponding to \"%s\" continuation in \"%s\" POU"
+#: ../PLCGenerator.py:786 ../PLCGenerator.py:1230 +msgid "More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU" #: ../dialogs/ActionBlockDialog.py:140
@@ -2104,11 +2113,11 @@
-#: ../editors/DataTypeEditor.py:354
+#: ../editors/DataTypeEditor.py:355 msgid "Move element down"
-#: ../editors/DataTypeEditor.py:353
+#: ../editors/DataTypeEditor.py:354 @@ -2128,7 +2137,7 @@
-#: ../IDEFrame.py:75 ../IDEFrame.py:90 ../IDEFrame.py:120 ../IDEFrame.py:161
+#: ../IDEFrame.py:99 ../IDEFrame.py:114 ../IDEFrame.py:144 ../IDEFrame.py:185 @@ -2136,11 +2145,11 @@
-#: ../editors/CodeFileEditor.py:643 ../controls/VariablePanel.py:443
+#: ../editors/CodeFileEditor.py:661 ../controls/VariablePanel.py:453 msgid "Move variable down"
-#: ../editors/CodeFileEditor.py:642 ../controls/VariablePanel.py:442
+#: ../editors/CodeFileEditor.py:660 ../controls/VariablePanel.py:452 @@ -2156,21 +2165,21 @@
-#: ../dialogs/DiscoveryDialog.py:91
+#: ../dialogs/DiscoveryDialog.py:92 #: ../editors/ResourceEditor.py:68 ../editors/ResourceEditor.py:83
-#: ../editors/DataTypeEditor.py:50 ../editors/CodeFileEditor.py:663
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53 +#: ../controls/VariablePanel.py:54 -#: ../Beremiz_service.py:300
+#: ../Beremiz_service.py:332 msgid "Name must not be null!"
-#: ../dialogs/SFCStepDialog.py:55 ../dialogs/FBDBlockDialog.py:83
+#: ../dialogs/SFCStepDialog.py:56 ../dialogs/FBDBlockDialog.py:83 #: ../dialogs/ConnectionDialog.py:75
@@ -2179,12 +2188,20 @@
msgid "Natural logarithm"
-#: ../dialogs/LDElementDialog.py:75 ../editors/Viewer.py:456
+#: ../dialogs/LDElementDialog.py:75 ../editors/Viewer.py:460 -#: ../PLCOpenEditor.py:96 ../PLCOpenEditor.py:138 ../Beremiz.py:314
+#: ../Beremiz_service.py:578 +msgid "Nevow Web service failed. " +#: ../Beremiz_service.py:554 +msgid "Nevow/Athena import failed :" +#: ../PLCOpenEditor.py:102 ../PLCOpenEditor.py:144 ../Beremiz.py:321 @@ -2192,71 +2209,71 @@
-#: ../editors/Viewer.py:455
+#: ../editors/Viewer.py:459 -#: ../ProjectController.py:1662
+#: ../ProjectController.py:1763 msgid "No PLC to transfer (did build succeed ?)\n"
-#: ../PLCGenerator.py:1608
+#: ../PLCGenerator.py:1631 msgid "No body defined in \"%s\" POU"
-#: ../PLCGenerator.py:797 ../PLCGenerator.py:1227
-msgid "No connector found corresponding to \"%s\" continuation in \"%s\" POU"
-#: ../PLCOpenEditor.py:340
+#: ../PLCGenerator.py:806 ../PLCGenerator.py:1241 +msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU" +#: ../PLCOpenEditor.py:347 "No documentation available.\n"
-#: ../PLCGenerator.py:819
+#: ../PLCGenerator.py:829 msgid "No informations found for \"%s\" block"
-#: ../PLCGenerator.py:1183
-msgid "No output %s variable found in block %s in POU %s. Connection must be broken"
+#: ../PLCGenerator.py:1194 +msgid "No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken" #: ../controls/SearchResultPanel.py:169
msgid "No search results available."
-#: ../svgui/svgui.py:107
+#: ../svgui/svgui.py:131 msgid "No such SVG file: %s\n"
-#: ../canfestival/config_utils.py:633
-msgid "No such index/subindex (%x,%x) (variable %s)"
+#: ../canfestival/config_utils.py:639 +msgid "No such index/subindex ({a1},{a2}) (variable {a3})" #: ../canfestival/config_utils.py:362
-msgid "No such index/subindex (%x,%x) in ID : %d (variable %s)"
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})" #: ../dialogs/BrowseValuesLibraryDialog.py:83
msgid "No valid value selected!"
-#: ../PLCGenerator.py:1606
+#: ../PLCGenerator.py:1629 msgid "No variable defined in \"%s\" POU"
#: ../canfestival/config_utils.py:355
-msgid "Non existing node ID : %d (variable %s)"
+msgid "Non existing node ID : {a1} (variable {a2})" #: ../controls/VariablePanel.py:64
@@ -2267,16 +2284,16 @@
-#: ../canfestival/config_utils.py:384
-msgid "Not PDO mappable variable : '%s' (ID:%d,Idx:%x,sIdx:%x))"
+#: ../canfestival/config_utils.py:389 +msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))" #: ../plcopen/iec_std.csv:80
-#: ../dialogs/SFCDivergenceDialog.py:78
+#: ../dialogs/SFCDivergenceDialog.py:89 msgid "Number of sequences:"
@@ -2284,40 +2301,28 @@
-#: ../plcopen/definitions.py:38
-"The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
-#: ../plcopen/definitions.py:37
-"The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
-#: ../editors/CodeFileEditor.py:664
-#: ../dialogs/SearchInProjectDialog.py:93
+#: ../dialogs/SearchInProjectDialog.py:86 -#: ../PLCOpenEditor.py:98 ../PLCOpenEditor.py:139 ../Beremiz.py:316
+#: ../PLCOpenEditor.py:104 ../PLCOpenEditor.py:145 ../Beremiz.py:323 -#: ../svgui/svgui.py:116
+#: ../svgui/svgui.py:140 -#: ../ProjectController.py:1714
+msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime." +#: ../ProjectController.py:1815 msgid "Open a file explorer to manage project files"
-#: ../wxglade_hmi/wxglade_hmi.py:114
+#: ../wxglade_hmi/wxglade_hmi.py:138 @@ -2325,7 +2330,7 @@
-#: ../dialogs/FindInPouDialog.py:82 ../editors/CodeFileEditor.py:664
+#: ../dialogs/FindInPouDialog.py:83 @@ -2333,58 +2338,69 @@
msgid "Organization (optional):"
-#: ../canfestival/SlaveEditor.py:51 ../canfestival/NetworkEditor.py:72
+#: ../canfestival/SlaveEditor.py:74 ../canfestival/NetworkEditor.py:95 -#: ../dialogs/SFCStepDialog.py:70 ../dialogs/FBDVariableDialog.py:39
-#: ../dialogs/BrowseLocationsDialog.py:36 ../editors/Viewer.py:1554
-#: ../controls/VariablePanel.py:71
+#: ../dialogs/SFCStepDialog.py:71 ../dialogs/FBDVariableDialog.py:39 +#: ../dialogs/BrowseLocationsDialog.py:41 ../editors/Viewer.py:289 +#: ../editors/Viewer.py:1579 ../editors/TextViewer.py:307 +#: ../controls/LocationCellEditor.py:98 ../controls/VariablePanel.py:71 +#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351 -#: ../canfestival/SlaveEditor.py:40 ../canfestival/NetworkEditor.py:61
+#: ../canfestival/SlaveEditor.py:63 ../canfestival/NetworkEditor.py:84 -#: ../canfestival/SlaveEditor.py:39 ../canfestival/NetworkEditor.py:60
+#: ../canfestival/SlaveEditor.py:62 ../canfestival/NetworkEditor.py:83 -#: ../plcopen/definitions.py:42
-"The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
-#: ../targets/toolchain_gcc.py:107
+#: ../targets/toolchain_gcc.py:131
-#: ../ProjectController.py:930
+#: ../ProjectController.py:992 msgid "PLC code generation failed !\n"
-#: ../PLCOpenEditor.py:189 ../PLCOpenEditor.py:302
+#: ../Beremiz_service.py:295 +msgid "PLC is empty or already started." +#: ../Beremiz_service.py:302 +msgid "PLC is not started." +#: ../PLCOpenEditor.py:196 ../PLCOpenEditor.py:309 -"PLC syntax error at line %d:\n"
-#: ../PLCOpenEditor.py:285 ../PLCOpenEditor.py:361
+"PLC syntax error at line {a1}:\n" +#: ../PLCOpenEditor.py:292 ../PLCOpenEditor.py:373 msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
-#: ../PLCOpenEditor.py:146 ../PLCOpenEditor.py:202
+#: ../PLCOpenEditor.py:152 ../PLCOpenEditor.py:209 -#: ../dialogs/DiscoveryDialog.py:94
+#: ../PLCOpenEditor.py:355 +"PLCOpenEditor is part of Beremiz project.\n" +#: ../dialogs/DiscoveryDialog.py:95 @@ -2404,17 +2420,17 @@
-#: ../connectors/PYRO/__init__.py:41
+#: ../connectors/PYRO/__init__.py:45 msgid "PYRO connecting to URI : %s\n"
-#: ../connectors/PYRO/__init__.py:57
+#: ../connectors/PYRO/__init__.py:61 msgid "PYRO using certificates in '%s' \n"
-#: ../PLCOpenEditor.py:112 ../Beremiz.py:329
+#: ../PLCOpenEditor.py:118 ../Beremiz.py:336 @@ -2422,7 +2438,7 @@
msgid "Page Size (optional):"
@@ -2431,62 +2447,66 @@
-#: ../editors/Viewer.py:594 ../IDEFrame.py:348 ../IDEFrame.py:402
+#: ../editors/Viewer.py:598 ../IDEFrame.py:372 ../IDEFrame.py:426
-#: ../dialogs/SearchInProjectDialog.py:64
+#: ../dialogs/SearchInProjectDialog.py:56 msgid "Pattern to search:"
-#: ../dialogs/LDPowerRailDialog.py:72
+#: ../dialogs/LDPowerRailDialog.py:73 -#: ../editors/Viewer.py:2672 ../editors/Viewer.py:2916
-#: ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2706 ../editors/Viewer.py:2963 +#: ../editors/SFCViewer.py:770 msgid "Please choose a target"
-#: ../editors/TextViewer.py:261
+#: ../editors/TextViewer.py:262 msgid "Please enter a block name"
-#: ../editors/Viewer.py:2542 ../editors/Viewer.py:2953
+#: ../editors/Viewer.py:2576 ../editors/Viewer.py:3005 msgid "Please enter comment text"
-#: ../editors/SFCViewer.py:359 ../editors/SFCViewer.py:381
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:433 ../editors/SFCViewer.py:455 +#: ../editors/SFCViewer.py:799 msgid "Please enter step name"
+#: ../Beremiz_service.py:194 +msgid "Please enter text" #: ../dialogs/ForceVariableDialog.py:163
msgid "Please enter value for a \"%s\" variable:"
-#: ../Beremiz_service.py:287
+#: ../Beremiz_service.py:317 msgid "Port number must be 0 <= port <= 65535!"
-#: ../Beremiz_service.py:287
+#: ../Beremiz_service.py:317 msgid "Port number must be an integer!"
-#: ../editors/Viewer.py:532 ../editors/Viewer.py:2085
+#: ../editors/Viewer.py:536 ../editors/Viewer.py:2367 -#: ../dialogs/LDPowerRailDialog.py:49
+#: ../dialogs/LDPowerRailDialog.py:50 msgid "Power Rail Properties"
-#: ../PLCOpenEditor.py:114 ../Beremiz.py:331
+#: ../PLCOpenEditor.py:120 ../Beremiz.py:338 @@ -2494,12 +2514,12 @@
-#: ../PLCOpenEditor.py:116 ../PLCOpenEditor.py:142 ../Beremiz.py:333
+#: ../PLCOpenEditor.py:122 ../PLCOpenEditor.py:148 ../Beremiz.py:340
@@ -2507,11 +2527,11 @@
-#: ../dialogs/SFCTransitionDialog.py:88
+#: ../dialogs/SFCTransitionDialog.py:89 -#: ../runtime/PLCObject.py:369
+#: ../runtime/PLCObject.py:370 msgid "Problem starting PLC : error %d"
@@ -2536,12 +2556,12 @@
msgid "Product Version (required):"
-#: ../dialogs/SearchInProjectDialog.py:46 ../IDEFrame.py:1710
+#: ../dialogs/SearchInProjectDialog.py:38 ../IDEFrame.py:1744 -#: ../PLCOpenEditor.py:330
+#: ../PLCOpenEditor.py:337 msgid "Program was successfully generated!"
@@ -2549,11 +2569,11 @@
-#: ../editors/Viewer.py:238
+#: ../editors/Viewer.py:242 msgid "Programs can't be used by other POUs!"
-#: ../controls/ProjectPropertiesPanel.py:84 ../IDEFrame.py:556
+#: ../controls/ProjectPropertiesPanel.py:84 ../IDEFrame.py:584 @@ -2562,7 +2582,7 @@
-#: ../ProjectController.py:1713
+#: ../ProjectController.py:1814 @@ -2578,19 +2598,19 @@
msgid "Project Version (optional):"
-#: ../PLCControler.py:3157
+#: ../PLCControler.py:3158 "Project file syntax error:\n"
-#: ../dialogs/ProjectDialog.py:32 ../editors/ProjectNodeEditor.py:14
+#: ../dialogs/ProjectDialog.py:32 ../editors/ProjectNodeEditor.py:37 msgid "Project properties"
-#: ../ConfigTreeNode.py:540
-msgid "Project tree layout do not match confnode.xml %s!=%s "
+#: ../ConfigTreeNode.py:566 +msgid "Project tree layout do not match confnode.xml {a1}!={a2} " #: ../dialogs/ConnectionDialog.py:94
@@ -2601,17 +2621,28 @@
-#: ../plcopen/definitions.py:36
-"The pulse timer can be used to generate output pulses of a given time duration."
-#: ../py_ext/PythonEditor.py:57
+#: ../Beremiz_service.py:440 +msgid "Publishing service on local network" +#: ../connectors/PYRO/__init__.py:118 +msgid "Pyro exception: %s\n" +#: ../Beremiz_service.py:427 +msgid "Pyro object's uri :" +#: ../Beremiz_service.py:426 +#: ../py_ext/PythonEditor.py:81
@@ -2619,62 +2650,44 @@
-#: ../PLCOpenEditor.py:122 ../Beremiz.py:336 ../Beremiz_service.py:252
+#: ../PLCOpenEditor.py:128 ../Beremiz.py:343 ../Beremiz_service.py:273 -#: ../plcopen/definitions.py:29
-"The RS bistable is a latch where the Reset dominates."
-#: ../plcopen/definitions.py:43
-"The RAMP function block is modelled on example given in the standard."
#: ../controls/DebugVariablePanel/DebugVariablePanel.py:225
-#: ../ProjectController.py:1709
+#: ../ProjectController.py:1810 -#: ../plcopen/definitions.py:39
-"The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
msgid "Really delete node '%s'?"
-#: ../IDEFrame.py:338 ../IDEFrame.py:398
+#: ../IDEFrame.py:362 ../IDEFrame.py:422 -#: ../dialogs/SFCTransitionDialog.py:73
+#: ../dialogs/SFCTransitionDialog.py:74 -#: ../dialogs/DiscoveryDialog.py:105 ../IDEFrame.py:408
+#: ../dialogs/DiscoveryDialog.py:106 ../IDEFrame.py:432 -#: ../dialogs/SearchInProjectDialog.py:73
+#: ../dialogs/SearchInProjectDialog.py:66 msgid "Regular expression"
-#: ../dialogs/FindInPouDialog.py:97
+#: ../dialogs/FindInPouDialog.py:98 msgid "Regular expressions"
-#: ../editors/Viewer.py:1531
+#: ../editors/Viewer.py:1556 @@ -2682,16 +2695,16 @@
msgid "Remainder (modulo)"
@@ -2699,7 +2712,7 @@
-#: ../editors/DataTypeEditor.py:352
+#: ../editors/DataTypeEditor.py:353 @@ -2711,7 +2724,7 @@
-#: ../canfestival/NetworkEditor.py:81
+#: ../canfestival/NetworkEditor.py:104 @@ -2719,11 +2732,11 @@
-#: ../editors/CodeFileEditor.py:641 ../controls/VariablePanel.py:441
+#: ../editors/CodeFileEditor.py:659 ../controls/VariablePanel.py:451
@@ -2731,7 +2744,7 @@
-#: ../editors/Viewer.py:498
+#: ../editors/Viewer.py:502 msgid "Replace Wire by connections"
@@ -2743,11 +2756,11 @@
-#: ../editors/Viewer.py:578
+#: ../editors/Viewer.py:583 msgid "Reset Execution Order"
msgid "Reset Perspective"
@@ -2755,7 +2768,7 @@
msgid "Reset search result"
-#: ../PLCControler.py:97 ../Beremiz.py:1039
+#: ../PLCControler.py:97 ../Beremiz.py:1075 @@ -2763,28 +2776,22 @@
-#: ../controls/VariablePanel.py:414
+#: ../controls/VariablePanel.py:424 -#: ../editors/Viewer.py:483
+#: ../editors/Viewer.py:487 -#: ../dialogs/LDPowerRailDialog.py:62
+#: ../dialogs/LDPowerRailDialog.py:63 -#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:457
+#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:461 -#: ../plcopen/definitions.py:31
-"Rising edge detector\n"
-"The output produces a single pulse when a rising edge is detected."
#: ../plcopen/iec_std.csv:65
@@ -2797,23 +2804,23 @@
-#: ../ProjectController.py:1677
+#: ../ProjectController.py:1778 -#: ../ProjectController.py:975
+#: ../ProjectController.py:1037 msgid "Runtime IO extensions C code generation failed !\n"
-#: ../ProjectController.py:984
+#: ../ProjectController.py:1046 msgid "Runtime library extensions C code generation failed !\n"
-#: ../canfestival/SlaveEditor.py:38 ../canfestival/NetworkEditor.py:59
+#: ../canfestival/SlaveEditor.py:61 ../canfestival/NetworkEditor.py:82 -#: ../canfestival/SlaveEditor.py:37 ../canfestival/NetworkEditor.py:58
+#: ../canfestival/SlaveEditor.py:60 ../canfestival/NetworkEditor.py:81 @@ -2821,51 +2828,59 @@
-#: ../plcopen/definitions.py:28
-"The SR bistable is a latch where the Set dominates."
-#: ../dialogs/PouTransitionDialog.py:35 ../dialogs/PouActionDialog.py:31
+#: ../PLCGenerator.py:1392 +msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\"" +#: ../PLCGenerator.py:773 +msgid "SFC transition in POU \"%s\" must be connected." +#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31 #: ../dialogs/PouDialog.py:36
-#: ../PLCOpenEditor.py:317
+#: ../PLCOpenEditor.py:324 msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:101
+#: ../svgui/svgui.py:125 msgid "SVG files (*.svg)|*.svg|All files|*.*"
-#: ../PLCOpenEditor.py:105 ../PLCOpenEditor.py:140 ../Beremiz.py:320
+#: ../PLCOpenEditor.py:111 ../PLCOpenEditor.py:146 ../Beremiz.py:327 -#: ../PLCOpenEditor.py:107 ../PLCOpenEditor.py:141 ../Beremiz.py:352
+#: ../PLCOpenEditor.py:113 ../PLCOpenEditor.py:147 ../Beremiz.py:359
-#: ../dialogs/SearchInProjectDialog.py:76
+#: ../ProjectController.py:420 +msgid "Save path is the same as path of a project! \n" +#: ../dialogs/SearchInProjectDialog.py:69 -#: ../dialogs/SearchInProjectDialog.py:105 ../IDEFrame.py:595
-#: ../dialogs/SearchInProjectDialog.py:52 ../IDEFrame.py:358 ../IDEFrame.py:404
+#: ../dialogs/SearchInProjectDialog.py:44 ../IDEFrame.py:382 ../IDEFrame.py:428 msgid "Search in Project"
@@ -2873,17 +2888,17 @@
-#: ../editors/Viewer.py:284 ../editors/TextViewer.py:304
-#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:280
-#: ../controls/VariablePanel.py:340
+#: ../editors/Viewer.py:288 ../editors/TextViewer.py:306 +#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:290 +#: ../controls/VariablePanel.py:350 msgid "Select a variable class:"
-#: ../ProjectController.py:1126
+#: ../ProjectController.py:1195 msgid "Select an editor:"
@@ -2891,10 +2906,14 @@
msgid "Select an instance"
+#: ../ProjectController.py:427 +msgid "Selected directory already contains another project. Overwrite? \n" #: ../plcopen/iec_std.csv:70
@@ -2907,17 +2926,11 @@
msgid "Selection Divergence"
-#: ../plcopen/definitions.py:30
-"The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
-#: ../dialogs/DiscoveryDialog.py:81
+#: ../dialogs/DiscoveryDialog.py:82 msgid "Service Discovery"
-#: ../dialogs/DiscoveryDialog.py:84
+#: ../dialogs/DiscoveryDialog.py:85 msgid "Services available:"
@@ -2933,19 +2946,19 @@
-#: ../ProjectController.py:1703
+#: ../ProjectController.py:1804 msgid "Show IEC code generated by PLCGenerator"
-#: ../canfestival/canfestival.py:363
+#: ../canfestival/canfestival.py:387 -#: ../canfestival/canfestival.py:364
+#: ../canfestival/canfestival.py:388 msgid "Show Master generated by config_utils"
-#: ../ProjectController.py:1701
+#: ../ProjectController.py:1802 @@ -2965,52 +2978,65 @@
-#: ../targets/toolchain_makefile.py:112
+#: ../targets/toolchain_makefile.py:126 msgid "Source didn't change, no build.\n"
+#: ../PLCGenerator.py:397 +msgid "Source signal has to be defined for single task '{a1}' in resource '{a2}.{a3}'." #: ../plcopen/iec_std.csv:23
msgid "Square root (base 2)"
-#: ../plcopen/definitions.py:21
+#: ../plcopen/definitions.py:46 msgid "Standard function blocks"
-#: ../ProjectController.py:1679 ../Beremiz_service.py:240
+#: ../ProjectController.py:1780 ../Beremiz_service.py:261 -#: ../ProjectController.py:922
+#: ../ProjectController.py:984 msgid "Start build in %s\n"
-#: ../ProjectController.py:1483
+#: ../ProjectController.py:1298 +#: ../ProjectController.py:1586
-#: ../editors/Viewer.py:549 ../editors/Viewer.py:2059
+#: ../editors/Viewer.py:553 ../editors/Viewer.py:2342 -#: ../ProjectController.py:1682
+#: ../ProjectController.py:1783 -#: ../Beremiz_service.py:241
+#: ../Beremiz_service.py:262 -#: ../ProjectController.py:1684
+#: ../ProjectController.py:1785 -#: ../ProjectController.py:1455
+#: ../ProjectController.py:1299 +#: ../ProjectController.py:1558 msgid "Stopping debugger...\n"
@@ -3026,15 +3052,19 @@
-#: ../ProjectController.py:961
+#: ../ProjectController.py:1023 msgid "Successfully built.\n"
-#: ../dialogs/SearchInProjectDialog.py:154
+msgid "Switch perspective" +#: ../dialogs/SearchInProjectDialog.py:165 ../dialogs/FindInPouDialog.py:172 msgid "Syntax error in regular expression of pattern to search!"
-#: ../dialogs/DiscoveryDialog.py:92
+#: ../dialogs/DiscoveryDialog.py:93 @@ -3065,16 +3095,16 @@
msgid "The group of block must be coherent!"
-#: ../Beremiz.py:614 ../IDEFrame.py:983
+#: ../Beremiz.py:640 ../IDEFrame.py:1011 msgid "There are changes, do you want to save?"
-#: ../IDEFrame.py:1618 ../IDEFrame.py:1637
+#: ../IDEFrame.py:1655 ../IDEFrame.py:1674 msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
"There was a problem printing.\n"
"Perhaps your current printer is not set correctly?"
@@ -3084,6 +3114,11 @@
msgid "This option isn't available yet!"
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:565 #: ../plcopen/iec_std.csv:40
@@ -3117,54 +3152,54 @@
msgid "Time-of-day subtraction"
-#: ../editors/Viewer.py:485
+#: ../editors/Viewer.py:489 -#: ../ProjectController.py:1691
+#: ../ProjectController.py:1792 -#: ../ProjectController.py:1693
+#: ../ProjectController.py:1794 -#: ../ProjectController.py:1658
+#: ../ProjectController.py:1758 msgid "Transfer completed successfully.\n"
-#: ../ProjectController.py:1660
+#: ../ProjectController.py:1760 msgid "Transfer failed\n"
-#: ../editors/Viewer.py:550 ../editors/Viewer.py:2060 ../editors/Viewer.py:2089
+#: ../editors/Viewer.py:554 ../editors/Viewer.py:2344 ../editors/Viewer.py:2371 -#: ../PLCGenerator.py:1499
+#: ../PLCGenerator.py:1518 msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
-#: ../dialogs/PouTransitionDialog.py:84
+#: ../dialogs/PouTransitionDialog.py:89 -#: ../dialogs/PouTransitionDialog.py:53
+#: ../dialogs/PouTransitionDialog.py:58 -#: ../PLCGenerator.py:1588
-msgid "Transition with content \"%s\" not connected to a next step in \"%s\" POU"
-#: ../PLCGenerator.py:1579
-msgid "Transition with content \"%s\" not connected to a previous step in \"%s\" POU"
-#: ../plcopen/plcopen.py:1315
+#: ../PLCGenerator.py:1609 +msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU" +#: ../PLCGenerator.py:1598 +msgid "Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU" +#: ../plcopen/plcopen.py:1318 msgid "Transition with name %s doesn't exist!"
@@ -3173,21 +3208,29 @@
+#: ../dialogs/AboutDialog.py:123 #: ../editors/ResourceEditor.py:68
+#: ../Beremiz_service.py:476 +msgid "Twisted unavailable." #: ../dialogs/ActionBlockDialog.py:38 ../editors/ResourceEditor.py:83
-#: ../editors/DataTypeEditor.py:50 ../editors/CodeFileEditor.py:663
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53 +#: ../controls/VariablePanel.py:54 -#: ../dialogs/BrowseLocationsDialog.py:43
+#: ../dialogs/BrowseLocationsDialog.py:48 msgid "Type and derivated"
-#: ../canfestival/config_utils.py:336 ../canfestival/config_utils.py:618
+#: ../canfestival/config_utils.py:336 ../canfestival/config_utils.py:624 msgid "Type conflict for location \"%s\""
@@ -3196,33 +3239,33 @@
-#: ../editors/DataTypeEditor.py:161
+#: ../editors/DataTypeEditor.py:162 -#: ../dialogs/BrowseLocationsDialog.py:44
+#: ../dialogs/BrowseLocationsDialog.py:49 -#: ../dialogs/SFCDivergenceDialog.py:57 ../dialogs/SFCTransitionDialog.py:56
-#: ../dialogs/LDPowerRailDialog.py:55 ../dialogs/BrowseLocationsDialog.py:94
+#: ../dialogs/SFCDivergenceDialog.py:59 ../dialogs/SFCTransitionDialog.py:57 +#: ../dialogs/LDPowerRailDialog.py:56 ../dialogs/BrowseLocationsDialog.py:99 #: ../dialogs/FBDBlockDialog.py:65 ../dialogs/ConnectionDialog.py:58
-#: ../canfestival/config_utils.py:456 ../canfestival/config_utils.py:470
+#: ../canfestival/config_utils.py:462 ../canfestival/config_utils.py:476 msgid "Unable to define PDO mapping for node %02x"
-#: ../targets/Xenomai/__init__.py:15
+#: ../targets/Xenomai/__init__.py:39 msgid "Unable to get Xenomai's %s \n"
-#: ../PLCGenerator.py:951 ../PLCGenerator.py:1202
-msgid "Undefined block type \"%s\" in \"%s\" POU"
+#: ../PLCGenerator.py:961 ../PLCGenerator.py:1214 +msgid "Undefined block type \"{a1}\" in \"{a2}\" POU" #: ../PLCGenerator.py:254
@@ -3230,20 +3273,20 @@
msgid "Undefined pou type \"%s\""
-#: ../IDEFrame.py:336 ../IDEFrame.py:397
+#: ../IDEFrame.py:360 ../IDEFrame.py:421 -#: ../ProjectController.py:308
+#: ../ProjectController.py:332 -#: ../editors/Viewer.py:389
+#: ../editors/Viewer.py:393 msgid "Unknown variable \"%s\" for this POU!"
-#: ../ProjectController.py:305 ../ProjectController.py:306
+#: ../ProjectController.py:329 ../ProjectController.py:330 @@ -3252,28 +3295,16 @@
-#: ../controls/VariablePanel.py:275
+#: ../controls/VariablePanel.py:284 msgid "Unrecognized data size \"%s\""
-#: ../plcopen/definitions.py:33
-"The up-counter can be used to signal when a count has reached a maximum value."
-#: ../plcopen/definitions.py:35
-"The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
-#: ../editors/DataTypeEditor.py:631 ../controls/VariablePanel.py:780
+#: ../editors/DataTypeEditor.py:632 ../controls/VariablePanel.py:798 -#: ../canfestival/SlaveEditor.py:42 ../canfestival/NetworkEditor.py:63
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:86 @@ -3285,26 +3316,32 @@
-#: ../editors/DataTypeEditor.py:258
+#: ../editors/DataTypeEditor.py:259 -#: ../dialogs/ActionBlockDialog.py:42 ../editors/Viewer.py:522
-#: ../editors/Viewer.py:2074
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/Viewer.py:526 +#: ../editors/Viewer.py:2374 +#: ../editors/Viewer.py:308 ../editors/Viewer.py:338 ../editors/Viewer.py:360 +#: ../editors/TextViewer.py:292 ../editors/TextViewer.py:343 +#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:329 #: ../dialogs/FBDVariableDialog.py:63
msgid "Variable Properties"
-#: ../editors/Viewer.py:284 ../editors/TextViewer.py:304
-#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:280
-#: ../controls/VariablePanel.py:340
+#: ../editors/Viewer.py:288 ../editors/TextViewer.py:306 +#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:290 +#: ../controls/VariablePanel.py:350 -#: ../editors/Viewer.py:391 ../editors/TextViewer.py:385
+#: ../editors/Viewer.py:395 ../editors/TextViewer.py:387 msgid "Variable don't belong to this POU!"
@@ -3320,21 +3357,29 @@
-#: ../connectors/WAMP/__init__.py:88
+#: ../Beremiz_service.py:586 +msgid "WAMP client startup failed. " +#: ../connectors/WAMP/__init__.py:91 msgid "WAMP connecting to URL : %s\n"
-#: ../connectors/WAMP/__init__.py:128
+#: ../connectors/WAMP/__init__.py:131 msgid "WAMP connection timeout"
-#: ../connectors/WAMP/__init__.py:147
+#: ../connectors/WAMP/__init__.py:150 msgid "WAMP connection to '%s' failed.\n"
-#: ../wxglade_hmi/wxglade_hmi.py:11
+#: ../Beremiz_service.py:562 +msgid "WAMP import failed :" +#: ../wxglade_hmi/wxglade_hmi.py:35 @@ -3342,11 +3387,11 @@
-#: ../ProjectController.py:584
+#: ../ProjectController.py:616 msgid "Warnings in ST/IL/SFC code generator :\n"
-#: ../dialogs/SearchInProjectDialog.py:85
+#: ../dialogs/SearchInProjectDialog.py:78 @@ -3354,27 +3399,31 @@
-#: ../dialogs/FindInPouDialog.py:92
+#: ../dialogs/FindInPouDialog.py:93
+#: ../dialogs/AboutDialog.py:122 -#: ../svgui/svgui.py:115
+#: ../svgui/svgui.py:139 "You don't have write permissions.\n"
-#: ../wxglade_hmi/wxglade_hmi.py:113
+#: ../wxglade_hmi/wxglade_hmi.py:137 "You don't have write permissions.\n"
-#: ../ProjectController.py:268
+#: ../ProjectController.py:292 "You must have permission to work on the project\n"
"Work on a project copy ?"
@@ -3388,7 +3437,7 @@
msgid "You must select the wire where a contact should be added!"
-#: ../dialogs/SFCStepNameDialog.py:47 ../dialogs/PouNameDialog.py:45
+#: ../dialogs/SFCStepNameDialog.py:48 ../dialogs/PouNameDialog.py:46 msgid "You must type a name!"
@@ -3396,29 +3445,25 @@
msgid "You must type a value!"
#: ../dialogs/DurationEditorDialog.py:151
-#: ../PLCOpenEditor.py:326
+#: ../PLCOpenEditor.py:333 -#: ../util/ProcessLogger.py:166
-msgid "exited with status %s (pid %s)\n"
-#: ../PLCOpenEditor.py:384 ../PLCOpenEditor.py:386
+#: ../util/ProcessLogger.py:169 +msgid "exited with status {a1} (pid {a2})\n" +#: ../PLCOpenEditor.py:396 ../PLCOpenEditor.py:398 @@ -3426,7 +3471,7 @@
-#: ../PLCOpenEditor.py:387
+#: ../PLCOpenEditor.py:399 @@ -3438,7 +3483,7 @@
-#: ../PLCOpenEditor.py:387
+#: ../PLCOpenEditor.py:399 @@ -3450,10 +3495,6 @@
-#: ../PLCOpenEditor.py:346
-msgid "plcopen_about.html"
#: ../dialogs/PouDialog.py:31
@@ -3474,13 +3515,30 @@
-#: ../PLCOpenEditor.py:324
+msgid "update info unavailable." +#: ../PLCOpenEditor.py:331 +#: ../PLCControler.py:970 +msgid "{a1} \"{a2}\" can't be pasted as a {a3}." +#: ../ConfigTreeNode.py:56 +"{a1} XML file doesn't follow XSD schema at line %{a2}:\n" msgid "CanFestivalSlaveNode"
@@ -3535,6 +3593,9 @@
@@ -3594,3 +3655,156 @@
+#: Extra TC6 documentation strings +msgid "0 - current time, 1 - load time from PDT" +msgid "Datetime, current or relative to PDT" +msgid "The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on." +msgid "1 = integrate, 0 = hold" +msgid "Overriding reset" +msgid "Integrated output" +msgid "The integral function block integrates the value of input XIN over time." +msgid "Input to be differentiated" +msgid "Differentiated output" +msgid "The derivative function block produces an output XOUT proportional to the rate of change of the input XIN." +msgid "0 - manual , 1 - automatic" +msgid "Process variable" +msgid "Manual output adjustment - Typically from transfer station" +msgid "Proportionality constant" +msgid "Derivative time constant" +msgid "FB for integral term" +msgid "FB for derivative term" +msgid "The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control." +msgid "0 - track X0, 1 - ramp to/track X1" +msgid "BUSY = 1 during ramping period" +msgid "Elapsed time of ramp" +msgid "The RAMP function block is modelled on example given in the standard." +msgid "The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2." +msgid "The SR bistable is a latch where the Set dominates." +msgid "The RS bistable is a latch where the Reset dominates." +msgid "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources." +msgid "The output produces a single pulse when a rising edge is detected." +msgid "The output produces a single pulse when a falling edge is detected." +msgid "The up-counter can be used to signal when a count has reached a maximum value." +msgid "The down-counter can be used to signal when a count has reached zero, on counting down from a preset value." +msgid "The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other." +msgid "first input parameter" +msgid "second input parameter" +msgid "first output parameter" +msgid "second output parameter" +msgid "internal state: 0-reset, 1-counting, 2-set" +msgid "The pulse timer can be used to generate output pulses of a given time duration." +msgid "The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true." +msgid "The off-delay timer can be used to delay setting an output false, for fixed period after input goes false." --- a/plcopen/plcopen.py Thu Feb 16 14:34:40 2017 +0500
+++ b/plcopen/plcopen.py Thu Feb 16 14:35:12 2017 +0500
@@ -1,26 +1,26 @@
-#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
-#based on the plcopen standard.
+# This file is part of Beremiz, a Integrated Development Environment for +# programming IEC 61131-3 automates supporting plcopen standard and CanFestival. -#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD -#See COPYING file for copyrights details.
+# See COPYING file for copyrights details. -#This library is free software; you can redistribute it and/or
-#modify it under the terms of the GNU General Public
-#License as published by the Free Software Foundation; either
-#version 2.1 of the License, or (at your option) any later version.
+# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. -#This library is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-#General Public License for more details.
+# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -#You should have received a copy of the GNU General Public
-#License along with this library; if not, write to the Free Software
-#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -111,10 +111,15 @@
return len(lines) - 1, len(lines[-1])
+def CompilePattern(criteria): + flag = 0 if criteria["case_sensitive"] else re.IGNORECASE + find_pattern = criteria["find_pattern"] + if not criteria["regular_expression"]: + find_pattern = re.escape(find_pattern) + criteria["pattern"] = re.compile(find_pattern, flag) def TestTextElement(text, criteria):
lines = text.splitlines()
- if not criteria["case_sensitive"]:
result = criteria["pattern"].search(text)
while result is not None:
@@ -124,6 +129,9 @@
result = criteria["pattern"].search(text, result.end())
+def TextMatched(str1, str2): + return str1 and str2 and (str1.upper() == str2.upper()) PLCOpenParser = GenerateParserFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd"))
PLCOpen_XPath = lambda xpath: etree.XPath(xpath, namespaces=PLCOpenParser.NSMAP)
@@ -285,15 +293,8 @@
def updateElementName(self, old_name, new_name):
- index = text.find(old_name)
- if index > 0 and (text[index - 1].isalnum() or text[index - 1] == "_"):
- index = text.find(old_name, index + len(old_name))
- elif index < len(text) - len(old_name) and (text[index + len(old_name)].isalnum() or text[index + len(old_name)] == "_"):
- index = text.find(old_name, index + len(old_name))
- text = text[:index] + new_name + text[index + len(old_name):]
- index = text.find(old_name, index + len(new_name))
+ pattern = re.compile('\\b' + old_name + '\\b', re.IGNORECASE) + text = pattern.sub(new_name, text) setattr(cls, "updateElementName", updateElementName)
@@ -311,14 +312,9 @@
setattr(cls, "updateElementAddress", updateElementAddress)
def hasblock(self, block_type):
- text = self.getanyText().upper()
- index = text.find(block_type.upper())
- if (not (index > 0 and (text[index - 1].isalnum() or text[index - 1] == "_")) and
- not (index < len(text) - len(block_type) and text[index + len(block_type)] != "(")):
- index = text.find(block_type.upper(), index + len(block_type))
+ text = self.getanyText() + pattern = re.compile('\\b' + block_type + '\\b', re.IGNORECASE) + return pattern.search(text) is not None setattr(cls, "hasblock", hasblock)
def Search(self, criteria, parent_infos):
@@ -492,7 +488,8 @@
def addconfigurationResource(self, config_name, name):
if self.getconfigurationResource(config_name, name) is not None:
- raise ValueError, _("\"%s\" resource already exists in \"%s\" configuration !!!") % (name, config_name)
+ msg = _("\"{a1}\" resource already exists in \"{a2}\" configuration !!!").format(a1 = name, a2 = config_name) configuration = self.getconfiguration(config_name)
if configuration is not None:
new_resource = PLCOpenParser.CreateElement("resource", "configuration")
@@ -509,7 +506,8 @@
configuration.remove(resource)
- raise ValueError, _("\"%s\" resource doesn't exist in \"%s\" configuration !!!")%(name, config_name)
+ msg = _("\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!").format(a1 = name, a2 = config_name) setattr(cls, "removeconfigurationResource", removeconfigurationResource)
def updateElementName(self, old_name, new_name):
@@ -633,9 +631,9 @@
for var in varlist.getvariable():
var_address = var.getaddress()
if var_address is not None:
- if var_address == old_name:
+ if TextMatched(var_address, old_name): - if var.getname() == old_name:
+ if TextMatched(var.getname(), old_name): def _updateConfigurationResourceElementAddress(self, address_model, new_leading):
@@ -769,9 +767,9 @@
cls = PLCOpenParser.GetElementClass("task", "resource")
def updateElementName(self, old_name, new_name):
- if self.single == old_name:
+ if TextMatched(self.single, old_name): - if self.interval == old_name:
+ if TextMatched(self.interval, old_name): for instance in self.getpouInstance():
instance.updateElementName(old_name, new_name)
@@ -794,7 +792,7 @@
cls = PLCOpenParser.GetElementClass("pouInstance")
def updateElementName(self, old_name, new_name):
- if self.typeName == old_name:
+ if TextMatched(self.typeName, old_name): setattr(cls, "updateElementName", updateElementName)
@@ -856,7 +854,7 @@
def getdataTypeElement(self, name):
elements = self.dataTypes.getdataType()
- if element.getname() == name:
+ if TextMatched(element.getname(), name): setattr(cls, "getdataTypeElement", getdataTypeElement)
@@ -875,7 +873,7 @@
def removedataTypeElement(self, name):
for element in self.dataTypes.getdataType():
- if element.getname() == name:
+ if TextMatched(element.getname(), name): self.dataTypes.remove(element)
@@ -890,14 +888,14 @@
def getpouElement(self, name):
elements = self.pous.getpou()
- if element.getname() == name:
+ if TextMatched(element.getname(), name): setattr(cls, "getpouElement", getpouElement)
def appendpouElement(self, name, pou_type, body_type):
for element in self.pous.getpou():
- if element.getname() == name:
+ if TextMatched(element.getname(), name): raise ValueError, _("\"%s\" POU already exists !!!")%name
new_pou = PLCOpenParser.CreateElement("pou", "pous")
self.pous.appendpou(new_pou)
@@ -914,7 +912,7 @@
def removepouElement(self, name):
for element in self.pous.getpou():
- if element.getname() == name:
+ if TextMatched(element.getname(), name): self.pous.remove(element)
@@ -981,7 +979,7 @@
cls = PLCOpenParser.GetElementClass("derived", "dataType")
def updateElementName(self, old_name, new_name):
- if self.name == old_name:
+ if TextMatched(self.name, old_name): setattr(cls, "updateElementName", updateElementName)
@@ -1226,9 +1224,9 @@
variables = varlist.getvariable()
- if var.getname() == old_name:
+ if TextMatched(var.getname(), old_name): vartype_content = var.gettype().getcontent()
- if vartype_content.getLocalTag() == "derived" and vartype_content.getname() == old_type:
+ if vartype_content.getLocalTag() == "derived" and TextMatched(vartype_content.getname(), old_type): vartype_content.setname(new_type)
@@ -1239,21 +1237,28 @@
content = self.interface.getcontent()
for var in varlist.getvariable():
- if var.getname() == name:
+ if TextMatched(var.getname(), name): vartype_content = var.gettype().getcontent()
- if vartype_content.getLocalTag() == "derived" and vartype_content.getname() == var_type:
+ if vartype_content.getLocalTag() == "derived" and TextMatched(vartype_content.getname(), var_type): if len(varlist.getvariable()) == 0:
self.interface.remove(varlist)
setattr(cls, "removepouVar", removepouVar)
+ def hasstep(self, name=None): + if self.getbodyType() in ["SFC"]: + for instance in self.getinstances(): + if isinstance(instance, PLCOpenParser.GetElementClass("step", "sfcObjects")) and TextMatched(instance.getname(), name): + setattr(cls, "hasstep", hasstep) def hasblock(self, name=None, block_type=None):
if self.getbodyType() in ["FBD", "LD", "SFC"]:
for instance in self.getinstances():
if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and
- (name and instance.getinstanceName() == name or
- block_type and instance.gettypeName() == block_type)):
+ (TextMatched(instance.getinstanceName(), name) or TextMatched(instance.gettypeName(), block_type))): for transition in self.transitions.gettransition():
@@ -1279,15 +1284,13 @@
transition.setbodyType(body_type)
- transition.setanyText(":= ;")
- elif body_type == "IL":
- transition.setanyText("\tST\t%s"%name)
+ transition.settext(":= ;") setattr(cls, "addtransition", addtransition)
def gettransition(self, name):
if self.transitions is not None:
for transition in self.transitions.gettransition():
- if transition.getname() == name:
+ if TextMatched(transition.getname(), name): setattr(cls, "gettransition", gettransition)
@@ -1302,7 +1305,7 @@
if self.transitions is not None:
for transition in self.transitions.gettransition():
- if transition.getname() == name:
+ if TextMatched(transition.getname(), name): if transition.getbodyType() in ["FBD", "LD", "SFC"]:
for instance in transition.getinstances():
if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")):
@@ -1328,7 +1331,7 @@
def getaction(self, name):
if self.actions is not None:
for action in self.actions.getaction():
- if action.getname() == name:
+ if TextMatched(action.getname(), name): setattr(cls, "getaction", getaction)
@@ -1343,7 +1346,7 @@
if self.actions is not None:
for action in self.actions.getaction():
- if action.getname() == name:
+ if TextMatched(action.getname(), name): if action.getbodyType() in ["FBD", "LD", "SFC"]:
for instance in action.getinstances():
if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")):
@@ -1362,13 +1365,13 @@
for var in content.getvariable():
var_address = var.getaddress()
if var_address is not None:
- if var_address == old_name:
+ if TextMatched(var_address, old_name): - if var.getname() == old_name:
+ if TextMatched(var.getname(), old_name): var_type_content = var.gettype().getcontent()
if var_type_content.getLocalTag() == "derived":
- if var_type_content.getname() == old_name:
+ if TextMatched(var_type_content.getname(), old_name): var_type_content.setname(new_name)
self.body[0].updateElementName(old_name, new_name)
for action in self.getactionList():
@@ -1395,7 +1398,7 @@
if self.interface is not None:
for content in self.interface.getcontent():
for variable in content.getvariable():
- if variable.getaddress() == address:
+ if TextMatched(variable.getaddress(), address): setattr(cls, "removeVariableByAddress", removeVariableByAddress)
@@ -1414,7 +1417,8 @@
filter = criteria["filter"]
if filter == "all" or self.getpouType() in filter:
- parent_infos = parent_infos + ["P::%s" % self.getname()]
+ parent_infos = parent_infos + ["P::%s" % self.getname()] search_result.extend(_Search([("name", self.getname())], criteria, parent_infos))
if self.interface is not None:
@@ -1486,8 +1490,7 @@
if self.getbodyType() in ["FBD", "LD", "SFC"]:
for instance in self.getinstances():
if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and
- (name and instance.getinstanceName() == name or
- block_type and instance.gettypeName() == block_type)):
+ (TextMatched(instance.getinstanceName(), name) or TextMatched(instance.gettypeName(), block_type))): elif block_type is not None:
return self.body.hasblock(block_type)
@@ -1559,7 +1562,7 @@
cls = PLCOpenParser.GetElementClass("body")
cls.currentExecutionOrderId = 0
+ cls.checkedBlocksDict = {} def resetcurrentExecutionOrderId(self):
object.__setattr__(self, "currentExecutionOrderId", 0)
setattr(cls, "resetcurrentExecutionOrderId", resetcurrentExecutionOrderId)
@@ -1576,6 +1579,7 @@
PLCOpenParser.GetElementClass("connector", "commonObjects"),
PLCOpenParser.GetElementClass("continuation", "commonObjects"))):
element.setexecutionOrderId(0)
+ self.checkedBlocksDict.clear() raise TypeError, _("Can only generate execution order on FBD networks!")
setattr(cls, "resetexecutionOrder", resetexecutionOrder)
@@ -1598,16 +1602,19 @@
if self.content.getLocalTag() == "FBD":
localid = link.getrefLocalId()
instance = self.getcontentInstance(localid)
+ self.checkedBlocksDict[localid] = True if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and instance.getexecutionOrderId() == 0:
for variable in instance.inputVariables.getvariable():
connections = variable.connectionPointIn.getconnections()
if connections and len(connections) == 1:
- self.compileelementExecutionOrder(connections[0])
- instance.setexecutionOrderId(self.getnewExecutionOrderId())
+ if (self.checkedBlocksDict.has_key(connections[0].getrefLocalId()) == False): + self.compileelementExecutionOrder(connections[0]) + if instance.getexecutionOrderId() == 0: + instance.setexecutionOrderId(self.getnewExecutionOrderId()) elif isinstance(instance, PLCOpenParser.GetElementClass("continuation", "commonObjects")) and instance.getexecutionOrderId() == 0:
- name = instance.getname()
for tmp_instance in self.getcontentInstances():
- if isinstance(tmp_instance, PLCOpenParser.GetElementClass("connector", "commonObjects")) and tmp_instance.getname() == name and tmp_instance.getexecutionOrderId() == 0:
+ if (isinstance(tmp_instance, PLCOpenParser.GetElementClass("connector", "commonObjects")) and + TextMatched(tmp_instance.getname(), instance.getname()) and tmp_instance.getexecutionOrderId() == 0): connections = tmp_instance.connectionPointIn.getconnections()
if connections and len(connections) == 1:
self.compileelementExecutionOrder(connections[0])
@@ -1907,7 +1914,7 @@
setattr(cls, "getBoundingBox", getBoundingBox)
def updateElementName(self, old_name, new_name):
- if self.typeName == old_name:
+ if TextMatched(self.typeName, old_name): setattr(cls, "updateElementName", updateElementName)
@@ -1947,7 +1954,7 @@
_initElementClass("rightPowerRail", "ldObjects", "multiple")
def _UpdateLDElementName(self, old_name, new_name):
- if self.variable == old_name:
+ if TextMatched(self.variable, old_name): def _UpdateLDElementAddress(self, address_model, new_leading):
@@ -2053,7 +2060,7 @@
content = self.condition.getcontent()
content_name = content.getLocalTag()
if content_name == "reference":
- if content.getname() == old_name:
+ if TextMatched(content.getname(), old_name): content.setname(new_name)
elif content_name == "inline":
content.updateElementName(old_name, new_name)
@@ -2125,7 +2132,7 @@
setattr(cls, "getinlineContent", getinlineContent)
def updateElementName(self, old_name, new_name):
- if self.reference is not None and self.reference.getname() == old_name:
+ if self.reference is not None and TextMatched(self.reference.getname(), old_name): self.reference.setname(new_name)
if self.inline is not None:
self.inline.updateElementName(old_name, new_name)
@@ -2215,7 +2222,7 @@
return _Search([("expression", self.expression)], criteria, parent_infos + ["io_variable", self.getlocalId()])
def _UpdateIOElementName(self, old_name, new_name):
- if self.expression == old_name:
+ if TextMatched(self.expression, old_name): self.expression = new_name
def _UpdateIOElementAddress(self, address_model, new_leading):
@@ -2248,7 +2255,7 @@
setattr(cls, "Search", _SearchInConnector)
def updateElementName(self, old_name, new_name):
- if self.name == old_name:
+ if TextMatched(self.name, old_name): setattr(cls, "updateElementName", updateElementName)
@@ -2257,7 +2264,7 @@
setattr(cls, "Search", _SearchInConnector)
def updateElementName(self, old_name, new_name):
- if self.name == old_name:
+ if TextMatched(self.name, old_name): setattr(cls, "updateElementName", updateElementName)
--- a/tests/python/plc.xml Thu Feb 16 14:34:40 2017 +0500
+++ b/tests/python/plc.xml Thu Feb 16 14:35:12 2017 +0500
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
- <fileHeader companyName="" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19"/>
- <contentHeader name="Beremiz Python Support Tests" modificationDateTime="2015-03-13T22:06:10">
+ <fileHeader companyName="" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19" contentDescription="This example shows many features in Beremiz: 1. How to implement python extensions. 2. How to implement basic C extension. 3. How to use C code in IEC POUs. 4. How to call C functions from python code. 5. How to avoid race conditions between IEC, C and python code. 6. How to convert betweet different IEC types. "/> + <contentHeader name="Beremiz Python Support Tests" modificationDateTime="2016-10-12T14:15:35"> <pageSize x="1024" y="1024"/>
@@ -54,6 +54,22 @@
<pou name="main_pytest" pouType="program">
+ <variable name="mux1_sel"> + <simpleValue value="3"/> + <variable name="mux2_sel"> + <simpleValue value="3"/> <variable name="pytest_var1">
@@ -128,17 +144,30 @@
- <simpleValue value="300"/>
+ <simpleValue value="151"/> + <variable name="Test_BCD_WRONG"> + <simpleValue value="154"/> + <variable name="Test_BCD_CONVERTED"> <variable name="Test_BCD_RESULT">
- <variable name="Test_BCD_ENO">
+ <variable name="Test_BCD_WRONG_RESULT">
<variable name="Test_DT">
@@ -208,24 +237,24 @@
- <inVariable localId="4" height="30" width="160">
- <position x="295" y="230"/>
+ <inVariable localId="4" height="30" width="160" executionOrderId="0" negated="false"> + <position x="295" y="450"/> <relPosition x="160" y="15"/>
<expression>'time.sleep(1)'</expression>
- <block localId="5" width="125" height="80" typeName="python_eval" instanceName="py1">
- <position x="650" y="180"/>
+ <block localId="5" width="125" height="80" typeName="python_eval" instanceName="py1" executionOrderId="0"> + <position x="650" y="400"/> <variable formalParameter="TRIG">
<relPosition x="0" y="35"/>
<connection refLocalId="7" formalParameter="OUT">
- <position x="650" y="215"/>
- <position x="285" y="215"/>
- <position x="285" y="260"/>
- <position x="250" y="260"/>
+ <position x="650" y="435"/> + <position x="285" y="435"/> + <position x="285" y="480"/> + <position x="250" y="480"/> @@ -233,8 +262,8 @@
<relPosition x="0" y="65"/>
<connection refLocalId="4">
- <position x="650" y="245"/>
- <position x="455" y="245"/>
+ <position x="650" y="465"/> + <position x="455" y="465"/> @@ -253,15 +282,15 @@
- <block localId="7" width="70" height="45" typeName="NOT">
- <position x="180" y="230"/>
+ <block localId="7" width="70" height="45" typeName="NOT" executionOrderId="0"> + <position x="180" y="450"/> <variable formalParameter="IN">
<relPosition x="0" y="30"/>
<connection refLocalId="3">
- <position x="180" y="260"/>
- <position x="155" y="260"/>
+ <position x="180" y="480"/> + <position x="155" y="480"/> @@ -275,17 +304,17 @@
- <inOutVariable localId="3" height="30" width="120">
- <position x="35" y="245"/>
+ <inOutVariable localId="3" height="30" width="120" executionOrderId="0" negatedOut="false" negatedIn="false"> + <position x="35" y="465"/> <relPosition x="0" y="15"/>
<connection refLocalId="7" formalParameter="OUT">
- <position x="35" y="260"/>
- <position x="25" y="260"/>
- <position x="25" y="220"/>
- <position x="270" y="220"/>
- <position x="270" y="260"/>
- <position x="250" y="260"/>
+ <position x="35" y="480"/> + <position x="25" y="480"/> + <position x="25" y="440"/> + <position x="270" y="440"/> + <position x="270" y="480"/> + <position x="250" y="480"/> @@ -293,17 +322,17 @@
<expression>pytest_var2</expression>
- <block localId="8" width="125" height="80" typeName="python_eval" instanceName="Block1">
- <position x="650" y="295"/>
+ <block localId="8" width="125" height="80" typeName="python_eval" instanceName="Block1" executionOrderId="0"> + <position x="650" y="515"/> <variable formalParameter="TRIG">
<relPosition x="0" y="35"/>
<connection refLocalId="7" formalParameter="OUT">
- <position x="650" y="330"/>
- <position x="285" y="330"/>
- <position x="285" y="260"/>
- <position x="250" y="260"/>
+ <position x="650" y="550"/> + <position x="285" y="550"/> + <position x="285" y="480"/> + <position x="250" y="480"/> @@ -311,8 +340,8 @@
<relPosition x="0" y="65"/>
<connection refLocalId="9">
- <position x="650" y="360"/>
- <position x="585" y="360"/>
+ <position x="650" y="580"/> + <position x="585" y="580"/> @@ -331,31 +360,31 @@
- <inVariable localId="9" height="30" width="290">
- <position x="295" y="345"/>
+ <inVariable localId="9" height="30" width="290" executionOrderId="0" negated="false"> + <position x="295" y="565"/> <relPosition x="290" y="15"/>
<expression>'sys.stdout.write("FBID :"+str(FBID)+"\n")'</expression>
- <inVariable localId="11" height="30" width="290">
- <position x="295" y="465"/>
+ <inVariable localId="11" height="30" width="290" executionOrderId="0" negated="false"> + <position x="295" y="685"/> <relPosition x="290" y="15"/>
<expression>'PLCBinary.Simple_C_Call(5678)'</expression>
- <block localId="12" width="125" height="80" typeName="python_eval" instanceName="Block2">
- <position x="650" y="417"/>
+ <block localId="12" width="125" height="80" typeName="python_eval" instanceName="Block2" executionOrderId="0"> + <position x="650" y="637"/> <variable formalParameter="TRIG">
<relPosition x="0" y="33"/>
<connection refLocalId="7" formalParameter="OUT">
- <position x="650" y="450"/>
- <position x="285" y="450"/>
- <position x="285" y="260"/>
- <position x="250" y="260"/>
+ <position x="650" y="670"/> + <position x="285" y="670"/> + <position x="285" y="480"/> + <position x="250" y="480"/> @@ -363,8 +392,8 @@
<relPosition x="0" y="63"/>
<connection refLocalId="11">
- <position x="650" y="480"/>
- <position x="585" y="480"/>
+ <position x="650" y="700"/> + <position x="585" y="700"/> @@ -383,24 +412,24 @@
- <inVariable localId="14" height="30" width="290">
- <position x="290" y="590"/>
+ <inVariable localId="14" height="30" width="290" executionOrderId="0" negated="false"> + <position x="290" y="810"/> <relPosition x="290" y="15"/>
<expression>'MyPythonFunc(42)'</expression>
- <block localId="15" width="125" height="80" typeName="python_eval" instanceName="Block3">
- <position x="650" y="542"/>
+ <block localId="15" width="125" height="80" typeName="python_eval" instanceName="Block3" executionOrderId="0"> + <position x="650" y="762"/> <variable formalParameter="TRIG">
<relPosition x="0" y="33"/>
<connection refLocalId="7" formalParameter="OUT">
- <position x="650" y="575"/>
- <position x="285" y="575"/>
- <position x="285" y="260"/>
- <position x="250" y="260"/>
+ <position x="650" y="795"/> + <position x="285" y="795"/> + <position x="285" y="480"/> + <position x="250" y="480"/> @@ -408,8 +437,8 @@
<relPosition x="0" y="63"/>
<connection refLocalId="14">
- <position x="650" y="605"/>
- <position x="580" y="605"/>
+ <position x="650" y="825"/> + <position x="580" y="825"/> @@ -429,20 +458,22 @@
<comment localId="16" height="90" width="680">
- <position x="50" y="25"/>
+ <position x="35" y="275"/> - <xhtml:p><![CDATA[This example test that, despite of 2T period clock stimulating TRIG pin of pyth_eval blocks, blocks keep executing one after the other, in respect of execution order.]]></xhtml:p>
+ <xhtml:p><![CDATA[This part of the example test that, despite of 2T period clock stimulating TRIG pin of pyth_eval blocks, blocks keep executing one after the other, in respect of execution order.]]></xhtml:p> - <block localId="17" width="80" height="120" typeName="MUX">
- <position x="1065" y="495"/>
+ <block localId="17" width="80" height="120" typeName="MUX" executionOrderId="0"> + <position x="1065" y="715"/> <variable formalParameter="K">
<relPosition x="0" y="30"/>
<connection refLocalId="18">
- <position x="1065" y="525"/>
- <position x="1030" y="525"/>
+ <position x="1065" y="745"/> + <position x="1040" y="745"/> + <position x="1040" y="735"/> + <position x="1015" y="735"/> @@ -450,10 +481,10 @@
<relPosition x="0" y="50"/>
<connection refLocalId="5" formalParameter="RESULT">
- <position x="1065" y="545"/>
- <position x="905" y="545"/>
- <position x="905" y="245"/>
- <position x="775" y="245"/>
+ <position x="1065" y="765"/> + <position x="905" y="765"/> + <position x="905" y="465"/> + <position x="775" y="465"/> @@ -461,10 +492,10 @@
<relPosition x="0" y="70"/>
<connection refLocalId="8" formalParameter="RESULT">
- <position x="1065" y="565"/>
- <position x="890" y="565"/>
- <position x="890" y="360"/>
- <position x="775" y="360"/>
+ <position x="1065" y="785"/> + <position x="890" y="785"/> + <position x="890" y="580"/> + <position x="775" y="580"/> @@ -472,10 +503,10 @@
<relPosition x="0" y="90"/>
<connection refLocalId="12" formalParameter="RESULT">
- <position x="1065" y="585"/>
- <position x="875" y="585"/>
- <position x="875" y="480"/>
- <position x="775" y="480"/>
+ <position x="1065" y="805"/> + <position x="875" y="805"/> + <position x="875" y="700"/> + <position x="775" y="700"/> @@ -483,8 +514,8 @@
<relPosition x="0" y="110"/>
<connection refLocalId="15" formalParameter="RESULT">
- <position x="1065" y="605"/>
- <position x="775" y="605"/>
+ <position x="1065" y="825"/> + <position x="775" y="825"/> @@ -498,33 +529,28 @@
- <inVariable localId="18" height="30" width="20">
- <position x="1010" y="510"/>
- <relPosition x="20" y="15"/>
- <expression>3</expression>
- <outVariable localId="19" height="35" width="125">
- <position x="1185" y="510"/>
+ <outVariable localId="19" height="35" width="125" executionOrderId="0" negated="false"> + <position x="1235" y="730"/> <relPosition x="0" y="15"/>
<connection refLocalId="17" formalParameter="OUT">
- <position x="1185" y="525"/>
- <position x="1145" y="525"/>
+ <position x="1235" y="745"/> + <position x="1145" y="745"/> <expression>pytest_var1</expression>
- <block localId="21" width="80" height="120" typeName="MUX">
- <position x="985" y="165"/>
+ <block localId="21" width="80" height="120" typeName="MUX" executionOrderId="0"> + <position x="1070" y="385"/> <variable formalParameter="K">
<relPosition x="0" y="30"/>
<connection refLocalId="22">
- <position x="985" y="195"/>
- <position x="950" y="195"/>
+ <position x="1070" y="415"/> + <position x="1040" y="415"/> + <position x="1040" y="405"/> + <position x="1010" y="405"/> @@ -532,8 +558,8 @@
<relPosition x="0" y="50"/>
<connection refLocalId="5" formalParameter="ACK">
- <position x="985" y="215"/>
- <position x="775" y="215"/>
+ <position x="1070" y="435"/> + <position x="775" y="435"/> @@ -541,10 +567,10 @@
<relPosition x="0" y="70"/>
<connection refLocalId="8" formalParameter="ACK">
- <position x="985" y="235"/>
- <position x="805" y="235"/>
- <position x="805" y="330"/>
- <position x="775" y="330"/>
+ <position x="1070" y="455"/> + <position x="805" y="455"/> + <position x="805" y="550"/> + <position x="775" y="550"/> @@ -552,10 +578,10 @@
<relPosition x="0" y="90"/>
<connection refLocalId="12" formalParameter="ACK">
- <position x="985" y="255"/>
- <position x="820" y="255"/>
- <position x="820" y="450"/>
- <position x="775" y="450"/>
+ <position x="1070" y="475"/> + <position x="820" y="475"/> + <position x="820" y="670"/> + <position x="775" y="670"/> @@ -563,10 +589,10 @@
<relPosition x="0" y="110"/>
<connection refLocalId="15" formalParameter="ACK">
- <position x="985" y="275"/>
- <position x="835" y="275"/>
- <position x="835" y="575"/>
- <position x="775" y="575"/>
+ <position x="1070" y="495"/> + <position x="835" y="495"/> + <position x="835" y="795"/> + <position x="775" y="795"/> @@ -580,51 +606,51 @@
- <inVariable localId="22" height="30" width="20">
- <position x="930" y="180"/>
+ <inVariable localId="22" height="30" width="65" executionOrderId="0" negated="false"> + <position x="945" y="390"/> - <relPosition x="20" y="15"/>
+ <relPosition x="65" y="15"/> - <expression>3</expression>
+ <expression>mux1_sel</expression> - <outVariable localId="23" height="35" width="125">
- <position x="1150" y="180"/>
+ <outVariable localId="23" height="35" width="125" executionOrderId="0" negated="false"> + <position x="1235" y="400"/> <relPosition x="0" y="15"/>
<connection refLocalId="21" formalParameter="OUT">
- <position x="1150" y="195"/>
- <position x="1065" y="195"/>
+ <position x="1235" y="415"/> + <position x="1150" y="415"/> <expression>pytest_var3</expression>
- <outVariable localId="25" height="30" width="60">
- <position x="520" y="655"/>
+ <outVariable localId="25" height="30" width="60" executionOrderId="0" negated="false"> + <position x="320" y="1075"/> <relPosition x="0" y="15"/>
<connection refLocalId="26" formalParameter="OUT">
- <position x="520" y="670"/>
- <position x="465" y="670"/>
+ <position x="320" y="1090"/> + <position x="265" y="1090"/> <expression>FromC</expression>
- <inVariable localId="1" height="30" width="30">
- <position x="305" y="655"/>
+ <inVariable localId="1" height="30" width="30" executionOrderId="0" negated="false"> + <position x="105" y="1075"/> <relPosition x="30" y="15"/>
<expression>23</expression>
- <block localId="26" width="80" height="45" typeName="C_Pragma" instanceName="C_Pragma0">
- <position x="385" y="640"/>
+ <block localId="26" width="80" height="45" typeName="C_Pragma" instanceName="C_Pragma0" executionOrderId="0"> + <position x="185" y="1060"/> <variable formalParameter="IN">
<relPosition x="0" y="30"/>
<connection refLocalId="1">
- <position x="385" y="670"/>
- <position x="335" y="670"/>
+ <position x="185" y="1090"/> + <position x="135" y="1090"/> @@ -638,139 +664,129 @@
- <inVariable localId="27" height="30" width="90">
- <position x="300" y="770"/>
+ <inVariable localId="27" height="30" width="90" executionOrderId="0" negated="false"> + <position x="100" y="1190"/> <relPosition x="90" y="15"/>
<expression>TestInput</expression>
- <outVariable localId="28" height="30" width="105">
- <position x="395" y="705"/>
+ <outVariable localId="28" height="30" width="105" executionOrderId="0" negated="false"> + <position x="195" y="1125"/> <relPosition x="0" y="15"/>
<connection refLocalId="2">
- <position x="395" y="720"/>
- <position x="340" y="720"/>
+ <position x="195" y="1140"/> + <position x="140" y="1140"/> <expression>TestOutput</expression>
- <outVariable localId="29" height="30" width="85">
- <position x="415" y="770"/>
+ <outVariable localId="29" height="30" width="85" executionOrderId="0" negated="false"> + <position x="215" y="1190"/> <relPosition x="0" y="15"/>
<connection refLocalId="27">
- <position x="415" y="785"/>
- <position x="390" y="785"/>
+ <position x="215" y="1205"/> + <position x="190" y="1205"/> <expression>FromInput</expression>
- <inVariable localId="2" height="30" width="30">
- <position x="310" y="705"/>
+ <inVariable localId="2" height="30" width="30" executionOrderId="0" negated="false"> + <position x="110" y="1125"/> <relPosition x="30" y="15"/>
<expression>10</expression>
- <comment localId="30" height="90" width="405">
- <position x="245" y="825"/>
+ <comment localId="30" height="75" width="465"> + <position x="50" y="945"/> <xhtml:p><![CDATA[You will be ready to use beremiz with C and Python when you will understand why "FromInput" is equal to 75.
+Happy hacking! ]]></xhtml:p> <comment localId="31" height="60" width="345">
- <position x="295" y="265"/>
+ <position x="295" y="485"/> <xhtml:p><![CDATA[Sleep here is bad. It blocks other py_eval instances. Whith a wxGlade GUI, GUI freeze for a second.]]></xhtml:p>
<comment localId="6" height="60" width="345">
- <position x="295" y="380"/>
+ <position x="295" y="600"/> <xhtml:p><![CDATA[Prints FBID to stdout of PLC runtime. FBID is a unique reference to py_eval instance.]]></xhtml:p>
<comment localId="10" height="60" width="345">
- <position x="295" y="500"/>
+ <position x="295" y="720"/> <xhtml:p><![CDATA[Simple_C_Call is declared in C_File "1.x:c_code". See python ctypes manual for details on typing.]]></xhtml:p>
<comment localId="32" height="105" width="235">
- <position x="25" y="285"/>
+ <position x="25" y="505"/> <xhtml:p><![CDATA[Fast clock, at least faster that sleep(1). See what happens when python takes time to answer : PLC continues.]]></xhtml:p>
- <outVariable localId="33" height="30" width="130">
- <position x="1060" y="740"/>
+ <outVariable localId="33" height="30" width="130" executionOrderId="0" negated="false"> + <position x="580" y="1564"/> - <relPosition x="0" y="15"/>
+ <relPosition x="0" y="16"/> <connection refLocalId="35" formalParameter="OUT">
- <position x="1060" y="755"/>
- <position x="1005" y="755"/>
+ <position x="580" y="1580"/> + <position x="370" y="1580"/> <expression>Test_BCD_RESULT</expression>
- <inVariable localId="34" height="30" width="75">
- <position x="785" y="740"/>
+ <inVariable localId="34" height="30" width="75" executionOrderId="0" negated="false"> + <position x="60" y="1564"/> - <relPosition x="75" y="15"/>
+ <relPosition x="75" y="16"/> <expression>Test_BCD</expression>
- <block localId="35" width="105" height="60" typeName="BCD_TO_UINT">
- <position x="900" y="705"/>
+ <block localId="35" width="105" height="60" typeName="BCD_TO_UINT" executionOrderId="0"> + <position x="265" y="1539"/> - <variable formalParameter="EN">
- <relPosition x="0" y="30"/>
<variable formalParameter="IN">
- <relPosition x="0" y="50"/>
+ <relPosition x="0" y="41"/> <connection refLocalId="34">
- <position x="900" y="755"/>
- <position x="860" y="755"/>
+ <position x="265" y="1580"/> + <position x="135" y="1580"/> - <variable formalParameter="ENO">
- <relPosition x="105" y="30"/>
<variable formalParameter="OUT">
- <relPosition x="105" y="50"/>
+ <relPosition x="105" y="41"/> - <inVariable localId="36" height="30" width="65">
- <position x="790" y="815"/>
+ <inVariable localId="36" height="30" width="65" executionOrderId="0" negated="false"> + <position x="60" y="1774"/> - <relPosition x="65" y="15"/>
+ <relPosition x="65" y="16"/> <expression>Test_DT</expression>
- <block localId="37" width="255" height="45" typeName="DATE_AND_TIME_TO_TIME_OF_DAY">
- <position x="900" y="800"/>
+ <block localId="37" width="255" height="45" typeName="DATE_AND_TIME_TO_TIME_OF_DAY" executionOrderId="0"> + <position x="265" y="1759"/> <variable formalParameter="IN">
- <relPosition x="0" y="30"/>
+ <relPosition x="0" y="31"/> <connection refLocalId="36">
- <position x="900" y="830"/>
- <position x="855" y="830"/>
+ <position x="265" y="1790"/> + <position x="125" y="1790"/> @@ -779,22 +795,22 @@
<variable formalParameter="OUT">
- <relPosition x="255" y="30"/>
+ <relPosition x="255" y="31"/> - <block localId="38" width="195" height="45" typeName="DATE_AND_TIME_TO_DATE">
- <position x="900" y="875"/>
+ <block localId="38" width="195" height="45" typeName="DATE_AND_TIME_TO_DATE" executionOrderId="0"> + <position x="265" y="1834"/> <variable formalParameter="IN">
- <relPosition x="0" y="30"/>
+ <relPosition x="0" y="31"/> <connection refLocalId="36">
- <position x="900" y="905"/>
- <position x="877" y="905"/>
- <position x="877" y="830"/>
- <position x="855" y="830"/>
+ <position x="265" y="1865"/> + <position x="242" y="1865"/> + <position x="242" y="1790"/> + <position x="125" y="1790"/> @@ -803,53 +819,53 @@
<variable formalParameter="OUT">
- <relPosition x="195" y="30"/>
+ <relPosition x="195" y="31"/> - <outVariable localId="40" height="30" width="80">
- <position x="1215" y="890"/>
+ <outVariable localId="40" height="30" width="80" executionOrderId="0" negated="false"> + <position x="580" y="1849"/> - <relPosition x="0" y="15"/>
+ <relPosition x="0" y="16"/> <connection refLocalId="38" formalParameter="OUT">
- <position x="1215" y="905"/>
- <position x="1095" y="905"/>
+ <position x="580" y="1865"/> + <position x="460" y="1865"/> <expression>Test_Date</expression>
- <outVariable localId="42" height="30" width="90">
- <position x="1100" y="985"/>
+ <outVariable localId="42" height="30" width="90" executionOrderId="0" negated="false"> + <position x="465" y="1944"/> - <relPosition x="0" y="15"/>
+ <relPosition x="0" y="16"/> <connection refLocalId="46" formalParameter="OUT">
- <position x="1100" y="1000"/>
- <position x="1030" y="1000"/>
+ <position x="465" y="1960"/> + <position x="395" y="1960"/> <expression>Test_String</expression>
- <outVariable localId="43" height="30" width="80">
- <position x="1100" y="1055"/>
+ <outVariable localId="43" height="30" width="80" executionOrderId="0" negated="false"> + <position x="465" y="2014"/> - <relPosition x="0" y="15"/>
+ <relPosition x="0" y="16"/> <connection refLocalId="44" formalParameter="OUT">
- <position x="1100" y="1070"/>
- <position x="1035" y="1070"/>
+ <position x="465" y="2030"/> + <position x="400" y="2030"/> <expression>Test_Bool</expression>
- <block localId="44" width="135" height="45" typeName="STRING_TO_BOOL">
- <position x="900" y="1040"/>
+ <block localId="44" width="135" height="45" typeName="STRING_TO_BOOL" executionOrderId="0"> + <position x="265" y="1999"/> <variable formalParameter="IN">
- <relPosition x="0" y="30"/>
+ <relPosition x="0" y="31"/> <connection refLocalId="45">
- <position x="900" y="1070"/>
- <position x="850" y="1070"/>
+ <position x="265" y="2030"/> + <position x="115" y="2030"/> @@ -858,27 +874,27 @@
<variable formalParameter="OUT">
- <relPosition x="135" y="30"/>
+ <relPosition x="135" y="31"/> - <inVariable localId="45" height="30" width="55">
- <position x="795" y="1055"/>
+ <inVariable localId="45" height="30" width="55" executionOrderId="0" negated="false"> + <position x="60" y="2014"/> - <relPosition x="55" y="15"/>
+ <relPosition x="55" y="16"/> <expression>'True'</expression>
- <block localId="46" width="130" height="45" typeName="INT_TO_STRING">
- <position x="900" y="970"/>
+ <block localId="46" width="130" height="45" typeName="INT_TO_STRING" executionOrderId="0"> + <position x="265" y="1929"/> <variable formalParameter="IN">
- <relPosition x="0" y="30"/>
+ <relPosition x="0" y="31"/> <connection refLocalId="58">
- <position x="900" y="1000"/>
- <position x="840" y="1000"/>
+ <position x="265" y="1960"/> + <position x="205" y="1960"/> @@ -887,27 +903,27 @@
<variable formalParameter="OUT">
- <relPosition x="130" y="30"/>
+ <relPosition x="130" y="31"/> <inVariable localId="50" height="30" width="105" executionOrderId="0" negated="false">
- <position x="200" y="1085"/>
+ <position x="75" y="2275"/> <relPosition x="105" y="15"/>
<expression>Global_RS.Q1</expression>
<block localId="51" width="70" height="85" typeName="AND" executionOrderId="0">
- <position x="365" y="1065"/>
+ <position x="240" y="2255"/> <variable formalParameter="IN1" negated="true">
<relPosition x="0" y="35"/>
<connection refLocalId="50">
- <position x="365" y="1100"/>
- <position x="305" y="1100"/>
+ <position x="240" y="2290"/> + <position x="180" y="2290"/> @@ -915,8 +931,8 @@
<relPosition x="0" y="70"/>
<connection refLocalId="52">
- <position x="365" y="1135"/>
- <position x="305" y="1135"/>
+ <position x="240" y="2325"/> + <position x="180" y="2325"/> @@ -930,51 +946,51 @@
- <inVariable localId="52" height="30" width="95">
- <position x="210" y="1120"/>
+ <inVariable localId="52" height="30" width="105" executionOrderId="0" negated="false"> + <position x="75" y="2310"/> - <relPosition x="95" y="15"/>
+ <relPosition x="105" y="15"/> <expression>BOOL#TRUE</expression>
<outVariable localId="13" height="30" width="105" executionOrderId="0" negated="false">
- <position x="510" y="1085"/>
+ <position x="385" y="2275"/> <relPosition x="0" y="15"/>
<connection refLocalId="51" formalParameter="OUT">
- <position x="510" y="1100"/>
- <position x="435" y="1100"/>
+ <position x="385" y="2290"/> + <position x="310" y="2290"/> <expression>Global_RS.S</expression>
<outVariable localId="20" height="30" width="105" executionOrderId="0" negated="false">
- <position x="510" y="1200"/>
+ <position x="385" y="2390"/> <relPosition x="0" y="15"/>
<connection refLocalId="41" formalParameter="OUT">
- <position x="510" y="1215"/>
- <position x="435" y="1215"/>
+ <position x="385" y="2405"/> + <position x="310" y="2405"/> <expression>Global_RS.R1</expression>
<inVariable localId="24" height="30" width="105" executionOrderId="0" negated="false">
- <position x="200" y="1200"/>
+ <position x="75" y="2390"/> <relPosition x="105" y="15"/>
<expression>Global_RS.Q1</expression>
<block localId="41" width="70" height="85" typeName="OR" executionOrderId="0">
- <position x="365" y="1180"/>
+ <position x="240" y="2370"/> <variable formalParameter="IN1">
<relPosition x="0" y="35"/>
<connection refLocalId="24">
- <position x="365" y="1215"/>
- <position x="305" y="1215"/>
+ <position x="240" y="2405"/> + <position x="180" y="2405"/> @@ -982,8 +998,8 @@
<relPosition x="0" y="70"/>
<connection refLocalId="48">
- <position x="365" y="1250"/>
- <position x="305" y="1250"/>
+ <position x="240" y="2440"/> + <position x="180" y="2440"/> @@ -997,46 +1013,33 @@
- <inVariable localId="48" height="30" width="100">
- <position x="205" y="1235"/>
+ <inVariable localId="48" height="30" width="105" executionOrderId="0" negated="false"> + <position x="75" y="2425"/> - <relPosition x="100" y="15"/>
+ <relPosition x="105" y="15"/> <expression>BOOL#FALSE</expression>
- <outVariable localId="53" height="30" width="115">
- <position x="1060" y="700"/>
+ <outVariable localId="54" height="30" width="135" executionOrderId="0" negated="false"> + <position x="930" y="1774"/> - <relPosition x="0" y="15"/>
- <connection refLocalId="35" formalParameter="ENO">
- <position x="1060" y="715"/>
- <position x="1032" y="715"/>
- <position x="1032" y="735"/>
- <position x="1005" y="735"/>
- <expression>Test_BCD_ENO</expression>
- <outVariable localId="54" height="30" width="135">
- <position x="1565" y="815"/>
- <relPosition x="0" y="15"/>
+ <relPosition x="0" y="16"/> <connection refLocalId="55" formalParameter="OUT">
- <position x="1565" y="830"/>
- <position x="1490" y="830"/>
+ <position x="930" y="1790"/> + <position x="855" y="1790"/> <expression>Test_TOD_STRING</expression>
- <block localId="55" width="125" height="45" typeName="TOD_TO_STRING">
- <position x="1365" y="800"/>
+ <block localId="55" width="125" height="45" typeName="TOD_TO_STRING" executionOrderId="0"> + <position x="730" y="1759"/> <variable formalParameter="IN">
- <relPosition x="0" y="30"/>
+ <relPosition x="0" y="31"/> <connection refLocalId="39">
- <position x="1365" y="830"/>
- <position x="1290" y="830"/>
+ <position x="730" y="1790"/> + <position x="655" y="1790"/> @@ -1045,90 +1048,90 @@
<variable formalParameter="OUT">
- <relPosition x="125" y="30"/>
+ <relPosition x="125" y="31"/> - <inOutVariable localId="39" height="30" width="75">
- <position x="1215" y="815"/>
+ <inOutVariable localId="39" height="30" width="75" executionOrderId="0" negatedOut="false" negatedIn="false"> + <position x="580" y="1774"/> - <relPosition x="0" y="15"/>
+ <relPosition x="0" y="16"/> <connection refLocalId="37" formalParameter="OUT">
- <position x="1215" y="830"/>
- <position x="1155" y="830"/>
+ <position x="580" y="1790"/> + <position x="520" y="1790"/> - <relPosition x="75" y="15"/>
+ <relPosition x="75" y="16"/> <expression>Test_TOD</expression>
- <inVariable localId="49" height="30" width="30">
- <position x="765" y="1200"/>
+ <inVariable localId="49" height="30" width="30" executionOrderId="0" negated="false"> + <position x="160" y="2510"/> <relPosition x="30" y="15"/>
<expression>42</expression>
- <outVariable localId="57" height="30" width="50">
- <position x="845" y="1200"/>
+ <outVariable localId="57" height="30" width="50" executionOrderId="0" negated="false"> + <position x="240" y="2510"/> <relPosition x="0" y="15"/>
<connection refLocalId="49">
- <position x="845" y="1215"/>
- <position x="795" y="1215"/>
+ <position x="240" y="2525"/> + <position x="190" y="2525"/> <expression>TOTO</expression>
- <outVariable localId="56" height="30" width="50">
- <position x="845" y="1240"/>
+ <outVariable localId="56" height="30" width="50" executionOrderId="0" negated="false"> + <position x="240" y="2550"/> <relPosition x="0" y="15"/>
<connection refLocalId="49">
- <position x="845" y="1255"/>
- <position x="820" y="1255"/>
- <position x="820" y="1215"/>
- <position x="795" y="1215"/>
+ <position x="240" y="2565"/> + <position x="215" y="2565"/> + <position x="215" y="2525"/> + <position x="190" y="2525"/> <expression>TUTU</expression>
- <inVariable localId="58" height="30" width="145">
- <position x="715" y="985"/>
+ <inVariable localId="58" height="30" width="145" executionOrderId="0" negated="false"> + <position x="60" y="1944"/> - <relPosition x="145" y="15"/>
+ <relPosition x="145" y="16"/> <expression>Second_Python_Var</expression>
- <outVariable localId="47" height="30" width="125">
- <position x="400" y="975"/>
+ <outVariable localId="47" height="30" width="125" executionOrderId="0" negated="false"> + <position x="200" y="1385"/> <relPosition x="0" y="15"/>
<connection refLocalId="59">
- <position x="400" y="990"/>
- <position x="330" y="990"/>
+ <position x="200" y="1400"/> + <position x="130" y="1400"/> <expression>Test_Python_Var</expression>
- <inVariable localId="59" height="30" width="30">
- <position x="300" y="975"/>
+ <inVariable localId="59" height="30" width="30" executionOrderId="0" negated="false"> + <position x="100" y="1385"/> <relPosition x="30" y="15"/>
<expression>23</expression>
<block localId="61" typeName="function0" executionOrderId="0" height="45" width="110">
- <position x="1680" y="255"/>
+ <position x="760" y="1170"/> <variable formalParameter="LocalVar0">
<relPosition x="0" y="30"/>
<connection refLocalId="62">
- <position x="1680" y="285"/>
- <position x="1640" y="285"/>
+ <position x="760" y="1200"/> + <position x="720" y="1200"/> @@ -1143,23 +1146,147 @@
<inVariable localId="62" executionOrderId="0" height="30" width="55" negated="false">
- <position x="1585" y="270"/>
+ <position x="665" y="1185"/> <relPosition x="55" y="15"/>
<expression>fefvsd</expression>
<outVariable localId="63" executionOrderId="0" height="30" width="55" negated="false">
- <position x="1825" y="270"/>
+ <position x="905" y="1185"/> <relPosition x="0" y="15"/>
<connection refLocalId="61" formalParameter="OUT">
- <position x="1825" y="285"/>
- <position x="1790" y="285"/>
+ <position x="905" y="1200"/> + <position x="870" y="1200"/> <expression>fefvsd</expression>
+ <comment localId="53" height="65" width="420"> + <position x="75" y="2160"/> + <xhtml:p><![CDATA[Shows global variables access from resource configuration (res_pytest) and from project's configuration.]]></xhtml:p> + <inVariable localId="18" height="30" width="65" executionOrderId="0" negated="false"> + <position x="950" y="720"/> + <relPosition x="65" y="15"/> + <expression>mux2_sel</expression> + <comment localId="60" height="45" width="930"> + <position x="60" y="1480"/> + <xhtml:p><![CDATA[Here is shown how to convert values between different types (BCD, DT, TOD, STRING and others) using standard functions.]]></xhtml:p> + <comment localId="64" height="55" width="300"> + <position x="665" y="1095"/> + <xhtml:p><![CDATA[Example of usage of user-defined function.]]></xhtml:p> + <comment localId="65" height="45" width="410"> + <position x="55" y="1315"/> + <xhtml:p><![CDATA[Shows access variable defined in python extension. ]]></xhtml:p> + <inVariable localId="66" height="30" width="130" executionOrderId="0" negated="false"> + <position x="60" y="1685"/> + <relPosition x="130" y="15"/> + <expression>Test_BCD_WRONG</expression> + <block localId="67" width="105" height="100" typeName="BCD_TO_UINT" executionOrderId="0"> + <position x="265" y="1620"/> + <variable formalParameter="EN"> + <relPosition x="0" y="40"/> + <variable formalParameter="IN"> + <relPosition x="0" y="80"/> + <connection refLocalId="66"> + <position x="265" y="1700"/> + <position x="255" y="1700"/> + <position x="255" y="1700"/> + <position x="345" y="1700"/> + <position x="345" y="1700"/> + <position x="190" y="1700"/> + <variable formalParameter="ENO"> + <relPosition x="105" y="40"/> + <variable formalParameter="OUT"> + <relPosition x="105" y="80"/> + <outVariable localId="68" height="30" width="185" executionOrderId="0" negated="false"> + <position x="580" y="1685"/> + <relPosition x="0" y="15"/> + <connection refLocalId="67" formalParameter="OUT"> + <position x="580" y="1700"/> + <position x="370" y="1700"/> + <expression>Test_BCD_WRONG_RESULT</expression> + <comment localId="69" height="135" width="375"> + <position x="795" y="1590"/> + <xhtml:p><![CDATA[Incorrect BCD number is not converted to UINT. +151 (16#97) is good BCD number , but +Try this out and look at value of Test_BCD_CONVERTED variable. + <outVariable localId="70" height="30" width="185" executionOrderId="0" negated="false"> + <position x="580" y="1645"/> + <relPosition x="0" y="15"/> + <connection refLocalId="67" formalParameter="ENO"> + <position x="580" y="1660"/> + <position x="370" y="1660"/> + <expression>Test_BCD_CONVERTED</expression> + <comment localId="71" height="170" width="680"> + <position x="35" y="30"/> + <xhtml:p><![CDATA[This example shows many features in Beremiz: + 1. How to implement python extensions. + 2. How to implement basic C extension. + 3. How to use C code in IEC POUs. + 4. How to call C functions from python code. + 5. How to avoid race conditions between IEC, C and python code. + 6. How to convert betweet different IEC types. @@ -1243,7 +1370,7 @@
SetFbVar(COORDS, somebyte, .table[4]);
-(* If you do not use __GET_VAR and _SET_VAR macro, expect unexpected *)
+(* If you do not use GetFbVar and SetFbVar macros, expect unexpected behaviour*)