Так и будет, только задом на перёд :rolleyes:
Код:CLI_GI_0000:= BYTE_TO_WORD(PACK(
HMI_DI_80,
HMI_DI_81,
HMI_DI_82,
HMI_DI_83,
HMI_DI_84,
HMI_DI_85,
HMI_DI_86,
HMI_DI_87));
Вид для печати
а так правильно будет?
Код:CLI_GI_0000:= BYTE_TO_WORD(PACK(
HMI_DI_0080,
HMI_DI_0081,
HMI_DI_0082,
HMI_DI_0083,
HMI_DI_0084,
HMI_DI_0085,
FALSE,
FALSE));
Ребята ну подскажите еще раз пж. как в ST это реализовать??
Вложение 38901
Добрый день. Искал по форумам, но похожих тем не нашёл. Если было - извините.
В связи с тем, что проекты всё чаще стали попадаться однотипные - решил перейти с LD на ST для оптимизации разработки. Потому как описывать руками по 50+ одинаковых действий для разных входов выходов очень геморно, и решил перейти на циклы.
Первым делом решил загнать все отдельные переменные в массивы, для удобства. И понял что ни где не описано как реализовывать перебор адресов для цикла. Ну т.е. для массива можно указать порядковый номер как переменную типа INT и потом её просто увеличивать. А как в адрес вставить такую переменную не понятно.
Вот как пример то, с чем я сейчас работаю - есть массив переменных типа BYTE для Modbus. Они прописаны в настройках ПЛК. И есть массив, куда я хочу их все собрать, что бы не обращаться к каждой переменной отдельно. Всего переменных 120, с %QB6.1.0 до %QB6.120.0, однако указать часть адреса как динамическую переменную не получается.
Представлял что должно получится что-то вроде этого:
HMI_Array: ARRAY [0..120] OF BYTE;
n := INT;
IF n<= 120 THEN
HMI_Array[n] := %QB6.[n].0;
n++;
ELSE
n := 0;
END_IF
Кто-то сталкивался с такими задачами? В какую сторону смотреть?
Заранее спасибо :)
Можно сделать и без копирования
При объявлении массива HMI_Array использовать ключевое слово АТ с указанием адрес первого элемента 8bits
Вложение 38903
И работать с элементами массива HMI_Array
Вложение 38904
Не знал что так можно объявлять. Спасибо))
Всем доброго времени суток. Вот и я дожил до управления фонтана ОВЕНом )) Задача проста, но опыта в программировании не имею, увы... Есть ПЛК154, есть 3 насоса и 3 ПЧ.(управление по RS-485 планировалось) Есть интервал времени, скажем 60сек, за который должны пройти 3-4 различные программы с различной частотой на двигателях. Может простецкие базовые программы существуют, которые можно уже руками немного поправить "под себя". Или может опыт у кого подобный был. Управление только ПЧ нужно, подсветка сама по себе. Заранее спасибо за ответы и советы
Если задача простенькая ,то и оборудование нужно простое,тем более опыта в программировании не имеете - ПР200 более чем за глаза для управления по RS485 3 ПЧ и проект помогут
подскажите как преобразовать word в отдельные биты? на СFC
в библиотеке есть word to byte. Но в word 2 байта, а на выходе 1 переменная.
А дальше как вычленить отдельные биты и с ними работать?
блок unpack работает только с байтом.
как обратится к отдельному биту, когда надо считать отдельный бит со входного модуля
чтото я запутался. подскажите куда посмотреть.
у меня так....
Код:VAR_INPUT
INPUT: WORD;
END_VAR
VAR_OUTPUT
INPUT01: BOOL;
INPUT02: BOOL;
INPUT03: BOOL;
INPUT04: BOOL;
INPUT05: BOOL;
INPUT06: BOOL;
INPUT07: BOOL;
INPUT08: BOOL;
INPUT09: BOOL;
INPUT10: BOOL;
INPUT11: BOOL;
INPUT12: BOOL;
INPUT13: BOOL;
INPUT14: BOOL;
INPUT15: BOOL;
INPUT16: BOOL;
END_VAR
INPUT01:=INPUT.0;
INPUT02:=INPUT.1;
INPUT03:=INPUT.2;
INPUT04:=INPUT.3;
INPUT05:=INPUT.4;
INPUT06:=INPUT.5;
INPUT07:=INPUT.6;
INPUT08:=INPUT.7;
INPUT09:=INPUT.8;
INPUT10:=INPUT.9;
INPUT11:=INPUT.10;
INPUT12:=INPUT.11;
INPUT13:=INPUT.12;
INPUT14:=INPUT.13;
INPUT15:=INPUT.14;
INPUT16:=INPUT.15;
спасибо но стало ещё больше непонятно
есть входной register input module у которого данные в формате word
адрес этой переменной %IW7.1.0.0
так вот как с нее получить отдельные 16 бит на языке cfc? вроде както можно напрямую указать адрес конкретного бита, но как это сделать для переменной word я не понимаю.
Вложение 38913
по вашему коду мне непонятно
VAR_INPUT
INPUT: WORD;
END_VAR
это объявление переменной INPUT. это понятно. Но она же вроде должна быть глобальной, если она "входная", то зачем её снова объявлять?
а вот дальше
VAR_OUTPUT
INPUT01: BOOL;
INPUT02: BOOL;
......
INPUT16: BOOL;
END_VAR
это объявление переменных с именами INPUT01 и т.д.? почему они в OUTPUT?
а вот дальше что? идёт присвоение объявленной переменной INPUT01:значения первого бита переменной INPUT.0 ?
если я правильно понимаю то получается вот так?
Вложение 38912
странно что нет стандартного блока. или я плохо искал?
рад что смог удивить профессионалов, но хотелось бы узнать что делаю не так
Вложение 38914
word1.1 - это второй бит с первой глобальной переменной word
word2.1 - это второй бит со второй переменной word.
так правильно?
или надо делать только через пользовательский блок?
Вложение 38915Вложение 38916
Документацию вовсю читаю, разбираюмь, смотрю видеоуроки. Написал и Залил даже "тестовую" программу для связи плк с пчв. )
Просто с подачи знающих людей можно быстрее разобраться с дальнейшими действиями, ну и проще, я думаю
а что за олдскульная дедовщина такая? вопрос задан в теме для новичков, вместо этого прям возмущение какие тупые новички пошли
странно что для регистрации на форуме ещё не сделали тест на типа егэ. у вас я бы точно его не прошёл
вы за всех решаете, какие подсказки и в чём им нужны?
и снова здравствуйте......
такой вопросик.....
есть ФБ HYSTERESIS
как ограничить SET_TEMPERATURE + 10 чтобы не превышало допустим 100...??Код:HYSTERESIS (IN:= DAT_TT_001_R_0002, HIGH:= SET_TEMPERATURE + 10, LOW:= SET_TEMPERATURE - 5, OUT=> );
Лимит поставить.
Вложение 38937
Код:PROGRAM PLC_PRG
VAR
DAT_TT_001_R_0002: INT;
SET_TEMPERATURE: INT;
HYSTERESIS_01: HYSTERESIS;
END_VAR
HYSTERESIS_01 (IN:= DAT_TT_001_R_0002, HIGH:= LIMIT(100, SET_TEMPERATURE + 10, 0), LOW:= LIMIT(100, SET_TEMPERATURE - 5, 0), OUT=> );
capzap petera спасибо!! разбираюсь...
Вложение 38937
Код:PROGRAM PLC_PRG
VAR
DAT_TT_001_R_0002: INT;
SET_TEMPERATURE: INT;
HYSTERESIS_01: HYSTERESIS;
END_VAR
HYSTERESIS_01 (IN:= DAT_TT_001_R_0002, HIGH:= LIMIT(100, SET_TEMPERATURE + 10, 0), LOW:= LIMIT(100, SET_TEMPERATURE - 5, 0), OUT=> );
ребята что я делаю не так....?
КДС ругается
Вложение 38943Код:IF HMI_AI_0018 < 2400 THEN PLC_DO_0012 := TRUE; ELSIF HMI_AI_0018 > 2600 THEN PLC_DO_0012 := FALSE; END_IF
Пытаюсь создать проект светофора описанный в руководстве по codesys 2.3
подскажите пожалуйста как будет выглядеть раздел объявлений переменных в законченном
виде после выбора типа переменной off, какой выбрать тип переменной( может BOOL?) и класс переменной var input, var output, var?
такой раздел объявлений
FUNCTION_BLOCK TRAFFICSIGNAL
VAR_INPUT
STATUS: INT;
END_VAR
VAR_OUTPUT
GREEN: BOOL;
YELLOW: BOOL;
RED: BOOL;
END_VAR
VAR
OFF: BOOL;
END_VAR
Заранее благодарен)
Анатолий.Вложение 39021
Добрый день! Вопрос: как запрограммировать выход в исходное состояние при подаче питания на ПЛК110 ? Заранее спасибо за ответ!