переменная x1 у вас как локальная, ее нужно перенести в VAR_INPUT. это можно сразу делать в окне объявление переменных. Также там можно указать физический адрес контроллера(это не всегда удобно). Также переменная y1 должна быть перенесена в VAR_OUT. Я обычно делаю так: удаляю переменную в таблице переменных, потом нахожу этот элемент стираю название и пишу заново, но уже выбираю каком разделе она должна быть(как на рисунке). Адреса входов и выходов смотрю в конфигураторе) Программу загрузил и изменил, попробуйте ее отправить прямо на ПЛК110-32 и проверить работу, задействован первый вход и первый выход. Потом отпишитесь.
Простите великодушно, но не могу не вмешаться, так как проскальзывают не совсем верные утверждения.
Итак,
Рамиль, вы выложили пример некой пограммы, которая как-то работает, и что в ней правильно, а что нет, кроме вас никто не знает. Одно маленькое НО. В ней не указана целевая платформа, поэтому она годится только для работы в эмуляторе.
Кроме того, вы жаловались, что сделали простую программу с одним входом и одним выходом и она не работает. Вот ее и выкладывайте, будем начинать с простого.
Теперь о неверных или частично неверных утверждениях:
Flicker говорит о том, что привязки переменных к аппаратным входам и выходам нужно делать путем явного указания AT в разделе описания переменных. Можно делать так, а можно и по другому. Но в любом случае нужно выбрать целевую платформу и тогда в окне конфигурации ПЛК появится выбранный вами контроллер с его набором входов и выходов с конкретными обозначениями, которые вы можете прописывать после AT%.
Второй способ привязки переменных к физическим входам и выходам состоит в их внесении в конфигурацию. Об этом достаточно подробно рассказано в книге, которая начинает рождаться на сайте кодесис.рф усилиями Кирилла Гайнутдинова, за что ему огромное спасибо скажут многие, кто эту книгу прчитает. Так вот, если в конфирурации выделить один из входов или выходов, и щелкнуть по нему левой клавишей мышки, откроется квадратик для внесения имени переменной, которая будет связана с этим входом или выходом. НО (большое и жирное НО, потому что на эти грабли наступают почти все) эта переменная не должна дублироваться вами в программе. То есть вручную ее не нужно объявлять ни в разделе локальных переменных, ни в разделе глобальных.
Она сама попадет куда надо и будет иметь характер глобальной.
И теперь, если вы хотите ее использовать в программе, просто указывайте ее имя, и все будет работать. А чтобы не делать синтаксческих ошибок, удобно пользоваться ассистентом ввода. Выделяете в программе имя элемента, нажимаете А2 и получаете список всех доступных имен. Там в разделе глобальных переменных уже будет то имя, которое вы присвоили в входу в конфигурации. БОЛЬШЕЕГО НИГДЕ ОБЪЯВЛЯТЬ НЕ НУЖНО, В ПРОТИВНОМ СЛУЧАЕ, ИМЯ, ОБЪЯВЛЕННОЕ В ДРУГОМ МЕСТЕ, ПЕРЕОПРЕДЕЛИТ ЕГО, И СВЯЗЬ С ВХОДОМ ПОТЕРЯЕТСЯ.
Второе неверное утверждение Flickeraкасается Var_Input b Var_Output.
Эты типы переменных предназначены не для привязки к входам и выходам контроллера, а для создания функциональных блоков. Когда вы пишете не основную программу, а свой собственный функциональный блок, то там они реально нужны. Еу пкркменные, которые будут входами вашего функционального блока, нужно объявлять как var_Input, те, которые будут выходами - как Var_Output. Переменные для внутрениих нужд - как обычные var. А для связи с физическими выходами и входами этого вовсе не требуется. Для этого требуется ИЛИ прописать их в конфигурации ИЛИ прописать их в разделе описания переменных (в том числе при помощи окна автоопределения).
Ну и напоследок еще раз для Рамиля - выкладывайте маленькую программку, с ней разберемся, пойдете дальше, всё будет щелкать релюшками в соответствии с программой.
Добрый день. В работе в среде CoDeSyS я новичок, да и в программировании тоже особо не силен.
Подскажите, пожалуйста, как преобразовать два идущих подряд элемента массива ARRAY [0..255] OF BYTE в одно значение типа WORD (или INT)? Массив играет роль буфера, откуда выполняется чтение/запись при работе по modbus RTU. Вроде, что-то в него записывается, а понять, что именно, не получается. :-) Т.к. чтение-запись идут в виде регистров, а не байтов.
Все вроде получилось. :-) Может, подскажете еще, можно ли как-нибудь сделать очистку буферного массива? Чтобы он заполнялся при чтении-записи, а потом очищался бы. Чтобы всякой фигней левой, хранящейся в нем, не смущать. Я в том, плане, может есть какая стандартный метод или встроенная функция, без придумывания своих велосипедов (типа заполениня его нулями в цикле, перед тем, как делать чтение-запись регистров слэйвов и т.п.).
UPD: И еще такой вопрос, значения-то я получил в формате INT. Устройство -- ТРМ202. Только значение немного не похоже на значение температуры на экранчике самого прибора. В инструкции к ТРМке сказано, что по адресу 0x0001 лежит значение температуры по каналу 1. Однако, то, что я вижу в INT-массиве, немного не сходится с тем, что показывает ТРМка. Может, надо еще какие преобразования выполнять?
Кажется есть такая функция SysMemSet из библиотеки SysLibMemВсе вроде получилось. :-) Может, подскажете еще, можно ли как-нибудь сделать очистку буферного массива? Чтобы он заполнялся при чтении-записи, а потом очищался бы. Чтобы всякой фигней левой, хранящейся в нем, не смущать. Я в том, плане, может есть какая стандартный метод или встроенная функция, без придумывания своих велосипедов (типа заполениня его нулями в цикле, перед тем, как делать чтение-запись регистров слэйвов и т.п.).
Инициализирует блок памяти указанным значением. Как аргументы принимает адрес блока памяти, его размер, и значение для инициализации, например 0.
42 is the answer